commit 8675c2df3a303008f227fb930e174d44c345a868 Author: Anton Afanasyeu Date: Tue Jun 23 12:30:10 2026 +0200 initial diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..5ce0344 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,17 @@ +[submodule "third-party/libvpx"] + path = third-party/libvpx + url = https://chromium.googlesource.com/webm/libvpx + branch = main +[submodule "third-party/opus"] + path = third-party/opus + url = https://github.com/xiph/opus +[submodule "third-party/speex"] + path = third-party/speex + url = https://github.com/xiph/speex/ +[submodule "third-party/wireguard-android"] + path = third-party/wireguard-android + url = https://git.zx2c4.com/wireguard-android +[submodule "backend/url-shortener"] + path = backend/url-shortener + url = git://f0xx.org/androidcast_project/url-shortener + branch = next diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..89f10bd --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,23 @@ +# Cursor / agent bootstrap + +## Maintainer + +| | | +|---|---| +| **Canonical ID** | `a.afanasieff@gmail.com` | +| **Name** | Anton Afanasyeu | +| **Nick** | foxx (common) | +| **Aliases** | `aafanasyeu`, `a.afanasieff@gmail.com` in commits/footer — not the primary login/email label | + +Use **a.afanasieff@gmail.com** when referring to the user’s identity; **foxx** is fine informally. + +After a **reset** or new session on deploy/infra work: + +0. **[docs/README.md](docs/README.md)** — documentation index (linked TOCs for all guides in `docs/`). +1. Read **[docs/INFRA.md](docs/INFRA.md)** end-to-end (topology, **no :8089** for androidcast, BE `listen 80`, sshfs `tmp/` paths). +2. For hub deploy only: **[examples/app_hub/DEPLOY.md](examples/app_hub/DEPLOY.md)**. +3. For PHP/DB/tickets: **[examples/crash_reporter/backend/README.md](examples/crash_reporter/backend/README.md)**. +4. For git branches: **[docs/GIT_FLOW.md](docs/GIT_FLOW.md)** — work on `feature/*` from `next`; do not commit unless asked. +5. **URL shortener** is a **git submodule** at `backend/url-shortener` → `git://f0xx.org/androidcast_project/url-shortener`. **Never** edit shorten API PHP in the monorepo tree without committing inside the submodule first. Flow: `cd backend/url-shortener` → commit & push `next` → parent repo `git add backend/url-shortener` → bump submodule SHA. See [backend/README.md](backend/README.md). + +**Hard rule:** Port **8089** is **not** the androidcast vhost (Janus/other). Public apps path is **`https://apps.f0xx.org`** → BE **`http://artc0.intra.raptor.org:80`**. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b5aa58c --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# ac-mobile-android + +Android app + ndk + third-party submodules. + +Remote: `git://f0xx.org/ac/ac-mobile-android` + +Init: `git submodule update --init --recursive` diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/query/client-agp/cache-v2 new file mode 100644 index 0000000..e69de29 diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/query/client-agp/cmakeFiles-v1 new file mode 100644 index 0000000..e69de29 diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/query/client-agp/codemodel-v2 new file mode 100644 index 0000000..e69de29 diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/cache-v2-1b71821a45a80d18d4b9.json b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/cache-v2-1b71821a45a80d18d4b9.json new file mode 100644 index 0000000..58e97df --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/cache-v2-1b71821a45a80d18d4b9.json @@ -0,0 +1,1267 @@ +{ + "entries" : + [ + { + "name" : "ANDROID_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "arm64-v8a" + }, + { + "name" : "ANDROID_CCACHE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/usr/bin/ccache" + }, + { + "name" : "ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973" + }, + { + "name" : "ANDROID_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "android-29" + }, + { + "name" : "ANDROID_STL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "c++_shared" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-addr2line" + }, + { + "name" : "CMAKE_ANDROID_ARCH_ABI", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "arm64-v8a" + }, + { + "name" : "CMAKE_ANDROID_NDK", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Archiver" + } + ], + "type" : "FILEPATH", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_ASM_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_ASM_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ..." + } + ], + "type" : "STRING", + "value" : "Debug" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "22" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "/home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "/home/foxx/Android/Sdk/cmake/3.22.1/bin/cpack" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ctest" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "LLVM archiver" + } + ], + "type" : "FILEPATH", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Generate index for LLVM archive" + } + ], + "type" : "FILEPATH", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during debug builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the compiler during release builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_STANDARD_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Libraries linked by default with all C applications." + } + ], + "type" : "STRING", + "value" : "-latomic -lm" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-dlltool" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "ON" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Ninja" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "/home/foxx/repos/My Projects/android cast/ndk" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "/usr/local" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "0" + }, + { + "name" : "CMAKE_LIBRARY_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/ld.lld" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-nm" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objcopy" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objdump" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "androidcast_codecs" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Ranlib" + } + ], + "type" : "FILEPATH", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-readelf" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22" + }, + { + "name" : "CMAKE_RUNTIME_OUTPUT_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of dll's." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Strip" + } + ], + "type" : "FILEPATH", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip" + }, + { + "name" : "CMAKE_SYSTEM_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "Android" + }, + { + "name" : "CMAKE_SYSTEM_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "29" + }, + { + "name" : "CMAKE_TOOLCHAIN_FILE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "UNINITIALIZED", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "name" : "CMAKE_UNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "uname command" + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/uname" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "android-lib", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/libandroid.so" + }, + { + "name" : "androidcast_codecs_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a" + }, + { + "name" : "androidcast_codecs_IS_TOP_LEVEL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "ON" + }, + { + "name" : "androidcast_codecs_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/home/foxx/repos/My Projects/android cast/ndk" + }, + { + "name" : "dl-lib", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/libdl.so" + }, + { + "name" : "log-lib", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/liblog.so" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-ad3d2f3e3882cd2150d3.json b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-ad3d2f3e3882cd2150d3.json new file mode 100644 index 0000000..39f353d --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/cmakeFiles-v1-ad3d2f3e3882cd2150d3.json @@ -0,0 +1,149 @@ +{ + "inputs" : + [ + { + "path" : "CMakeLists.txt" + }, + { + "isGenerated" : true, + "path" : "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake" + }, + { + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake" + }, + { + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/abis.cmake" + }, + { + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/platforms.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake" + }, + { + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake" + }, + { + "isGenerated" : true, + "path" : "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake" + }, + { + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake" + }, + { + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/flags.cmake" + }, + { + "isCMake" : true, + "isExternal" : true, + "path" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake" + } + ], + "kind" : "cmakeFiles", + "paths" : + { + "build" : "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a", + "source" : "/home/foxx/repos/My Projects/android cast/ndk" + }, + "version" : + { + "major" : 1, + "minor" : 0 + } +} diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-65cdbfd28da355b531f9.json b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-65cdbfd28da355b531f9.json new file mode 100644 index 0000000..1b64e97 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/codemodel-v2-65cdbfd28da355b531f9.json @@ -0,0 +1,69 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "jsonFile" : "directory-.-Debug-f5ebdc15457944623624.json", + "minimumCMakeVersion" : + { + "string" : "3.6.0" + }, + "projectIndex" : 0, + "source" : ".", + "targetIndexes" : + [ + 0, + 1 + ] + } + ], + "name" : "Debug", + "projects" : + [ + { + "directoryIndexes" : + [ + 0 + ], + "name" : "androidcast_codecs", + "targetIndexes" : + [ + 0, + 1 + ] + } + ], + "targets" : + [ + { + "directoryIndex" : 0, + "id" : "androidcast_codecs::@6890427a1f51a3e7e1df", + "jsonFile" : "target-androidcast_codecs-Debug-218837eab6928fcd753c.json", + "name" : "androidcast_codecs", + "projectIndex" : 0 + }, + { + "directoryIndex" : 0, + "id" : "androidcast_entitlements::@6890427a1f51a3e7e1df", + "jsonFile" : "target-androidcast_entitlements-Debug-491402da12faa527d7b7.json", + "name" : "androidcast_entitlements", + "projectIndex" : 0 + } + ] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a", + "source" : "/home/foxx/repos/My Projects/android cast/ndk" + }, + "version" : + { + "major" : 2, + "minor" : 3 + } +} diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json new file mode 100644 index 0000000..3a67af9 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json @@ -0,0 +1,14 @@ +{ + "backtraceGraph" : + { + "commands" : [], + "files" : [], + "nodes" : [] + }, + "installers" : [], + "paths" : + { + "build" : ".", + "source" : "." + } +} diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/index-2026-06-19T15-04-56-0911.json b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/index-2026-06-19T15-04-56-0911.json new file mode 100644 index 0000000..1c9bd5b --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/index-2026-06-19T15-04-56-0911.json @@ -0,0 +1,92 @@ +{ + "cmake" : + { + "generator" : + { + "multiConfig" : false, + "name" : "Ninja" + }, + "paths" : + { + "cmake" : "/home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake", + "cpack" : "/home/foxx/Android/Sdk/cmake/3.22.1/bin/cpack", + "ctest" : "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ctest", + "root" : "/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22" + }, + "version" : + { + "isDirty" : false, + "major" : 3, + "minor" : 22, + "patch" : 1, + "string" : "3.22.1-g37088a8", + "suffix" : "g37088a8" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-65cdbfd28da355b531f9.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 3 + } + }, + { + "jsonFile" : "cache-v2-1b71821a45a80d18d4b9.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cmakeFiles-v1-ad3d2f3e3882cd2150d3.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 0 + } + } + ], + "reply" : + { + "client-agp" : + { + "cache-v2" : + { + "jsonFile" : "cache-v2-1b71821a45a80d18d4b9.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + "cmakeFiles-v1" : + { + "jsonFile" : "cmakeFiles-v1-ad3d2f3e3882cd2150d3.json", + "kind" : "cmakeFiles", + "version" : + { + "major" : 1, + "minor" : 0 + } + }, + "codemodel-v2" : + { + "jsonFile" : "codemodel-v2-65cdbfd28da355b531f9.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 3 + } + } + } + } +} diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/target-androidcast_codecs-Debug-218837eab6928fcd753c.json b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/target-androidcast_codecs-Debug-218837eab6928fcd753c.json new file mode 100644 index 0000000..137b0ff --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/target-androidcast_codecs-Debug-218837eab6928fcd753c.json @@ -0,0 +1,288 @@ +{ + "artifacts" : + [ + { + "path" : "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_codecs.so" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "target_link_libraries", + "target_compile_definitions", + "target_include_directories" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 10, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 40, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 66, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 91, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 102, + "parent" : 0 + }, + { + "command" : 2, + "file" : 0, + "line" : 39, + "parent" : 0 + }, + { + "command" : 2, + "file" : 0, + "line" : 65, + "parent" : 0 + }, + { + "command" : 2, + "file" : 0, + "line" : 90, + "parent" : 0 + }, + { + "command" : 3, + "file" : 0, + "line" : 18, + "parent" : 0 + }, + { + "command" : 3, + "file" : 0, + "line" : 42, + "parent" : 0 + }, + { + "command" : 3, + "file" : 0, + "line" : 43, + "parent" : 0 + }, + { + "command" : 3, + "file" : 0, + "line" : 68, + "parent" : 0 + }, + { + "command" : 3, + "file" : 0, + "line" : 93, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC" + }, + { + "fragment" : "-std=gnu11" + } + ], + "defines" : + [ + { + "backtrace" : 6, + "define" : "ANDROIDCAST_HAVE_LIBVPX=1" + }, + { + "backtrace" : 7, + "define" : "ANDROIDCAST_HAVE_OPUS=1" + }, + { + "backtrace" : 8, + "define" : "ANDROIDCAST_HAVE_SPEEX=1" + }, + { + "define" : "androidcast_codecs_EXPORTS" + } + ], + "includes" : + [ + { + "backtrace" : 9, + "path" : "/home/foxx/repos/My Projects/android cast/ndk/jni" + }, + { + "backtrace" : 10, + "path" : "/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx" + }, + { + "backtrace" : 11, + "path" : "/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx" + }, + { + "backtrace" : 12, + "path" : "/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include" + }, + { + "backtrace" : 13, + "path" : "/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include" + } + ], + "language" : "C", + "languageStandard" : + { + "backtraces" : + [ + 1 + ], + "standard" : "11" + }, + "sourceIndexes" : + [ + 0, + 1, + 2, + 3, + 4 + ], + "sysroot" : + { + "path" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot" + } + } + ], + "id" : "androidcast_codecs::@6890427a1f51a3e7e1df", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments", + "role" : "flags" + }, + { + "backtrace" : 2, + "fragment" : "\"/home/foxx/repos/My Projects/android cast/ndk/../build/native/arm64-v8a/libvpx.a\"", + "role" : "libraries" + }, + { + "backtrace" : 3, + "fragment" : "\"/home/foxx/repos/My Projects/android cast/ndk/../build/native/arm64-v8a/libopus.a\"", + "role" : "libraries" + }, + { + "backtrace" : 4, + "fragment" : "\"/home/foxx/repos/My Projects/android cast/ndk/../build/native/arm64-v8a/libspeex.a\"", + "role" : "libraries" + }, + { + "backtrace" : 5, + "fragment" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/liblog.so", + "role" : "libraries" + }, + { + "backtrace" : 5, + "fragment" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/libandroid.so", + "role" : "libraries" + }, + { + "backtrace" : 5, + "fragment" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/libdl.so", + "role" : "libraries" + }, + { + "fragment" : "-latomic -lm", + "role" : "libraries" + } + ], + "language" : "C", + "sysroot" : + { + "path" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot" + } + }, + "name" : "androidcast_codecs", + "nameOnDisk" : "libandroidcast_codecs.so", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0, + 1, + 2, + 3, + 4 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "jni/androidcast_codecs.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "jni/libvpx_bridge.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "jni/opus_bridge.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "jni/speex_bridge.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "jni/crash_hook.c", + "sourceGroupIndex" : 0 + } + ], + "type" : "SHARED_LIBRARY" +} diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/target-androidcast_entitlements-Debug-491402da12faa527d7b7.json b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/target-androidcast_entitlements-Debug-491402da12faa527d7b7.json new file mode 100644 index 0000000..266b7e4 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/.cmake/api/v1/reply/target-androidcast_entitlements-Debug-491402da12faa527d7b7.json @@ -0,0 +1,177 @@ +{ + "artifacts" : + [ + { + "path" : "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_entitlements.so" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "target_link_libraries", + "target_compile_options", + "target_include_directories" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 107, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 118, + "parent" : 0 + }, + { + "command" : 2, + "file" : 0, + "line" : 117, + "parent" : 0 + }, + { + "command" : 3, + "file" : 0, + "line" : 113, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC" + }, + { + "backtrace" : 3, + "fragment" : "-std=c11" + }, + { + "backtrace" : 3, + "fragment" : "-Wall" + }, + { + "backtrace" : 3, + "fragment" : "-Wextra" + }, + { + "fragment" : "-std=gnu11" + } + ], + "defines" : + [ + { + "define" : "androidcast_entitlements_EXPORTS" + } + ], + "includes" : + [ + { + "backtrace" : 4, + "path" : "/home/foxx/repos/My Projects/android cast/ndk/obfuscate" + } + ], + "language" : "C", + "languageStandard" : + { + "backtraces" : + [ + 1 + ], + "standard" : "11" + }, + "sourceIndexes" : + [ + 0, + 1, + 2 + ], + "sysroot" : + { + "path" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot" + } + } + ], + "id" : "androidcast_entitlements::@6890427a1f51a3e7e1df", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments", + "role" : "flags" + }, + { + "backtrace" : 2, + "fragment" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/liblog.so", + "role" : "libraries" + }, + { + "fragment" : "-latomic -lm", + "role" : "libraries" + } + ], + "language" : "C", + "sysroot" : + { + "path" : "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot" + } + }, + "name" : "androidcast_entitlements", + "nameOnDisk" : "libandroidcast_entitlements.so", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0, + 1, + 2 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "jni/entitlements_jni.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "obfuscate/obfuscate.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "obfuscate/obfuscate_file.c", + "sourceGroupIndex" : 0 + } + ], + "type" : "SHARED_LIBRARY" +} diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/.ninja_deps b/app/.cxx/Debug/505h1w6m/arm64-v8a/.ninja_deps new file mode 100644 index 0000000..9f022bb Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/arm64-v8a/.ninja_deps differ diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/.ninja_log b/app/.cxx/Debug/505h1w6m/arm64-v8a/.ninja_log new file mode 100644 index 0000000..6fe6f5e --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/.ninja_log @@ -0,0 +1,11 @@ +# ninja log v5 +11 52 1781698363952733746 /home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_codecs.so 7f2f88dbc17292d5 +2 11 1781698363919937969 CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o dca62c8935862ef8 +4 9 1781698363913956338 CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o 6cc0914f78648beb +0 4 1781698363909399857 CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o 943807046d0b67cc +0 7 1781698363912911760 CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o 819699fba87ff999 +0 7 1781698363913024293 CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o 95a2c19c67081979 +0 41 1781881497025843951 CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o dfa83a2193adef80 +0 59 1781881497042510839 CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o 44decd2bb97e6e45 +0 63 1781881497049478266 CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o 2e9f8bb21d94c7f2 +63 75 1781881497064152579 /home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_entitlements.so f77a71b65ac495fd diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeCache.txt b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeCache.txt new file mode 100644 index 0000000..10b6d54 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeCache.txt @@ -0,0 +1,377 @@ +# This is the CMakeCache file. +# For build in directory: /home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a +# It was generated by CMake: /home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//No help, variable specified on the command line. +ANDROID_ABI:UNINITIALIZED=arm64-v8a + +//No help, variable specified on the command line. +ANDROID_CCACHE:UNINITIALIZED=/usr/bin/ccache + +//No help, variable specified on the command line. +ANDROID_NDK:UNINITIALIZED=/home/foxx/Android/Sdk/ndk/27.0.12077973 + +//No help, variable specified on the command line. +ANDROID_PLATFORM:UNINITIALIZED=android-29 + +//No help, variable specified on the command line. +ANDROID_STL:UNINITIALIZED=c++_shared + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-addr2line + +//No help, variable specified on the command line. +CMAKE_ANDROID_ARCH_ABI:UNINITIALIZED=arm64-v8a + +//No help, variable specified on the command line. +CMAKE_ANDROID_NDK:UNINITIALIZED=/home/foxx/Android/Sdk/ndk/27.0.12077973 + +//Archiver +CMAKE_AR:FILEPATH=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar + +//Flags used by the compiler during all build types. +CMAKE_ASM_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_ASM_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_ASM_FLAGS_RELEASE:STRING= + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=Debug + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING= + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING= + +//LLVM archiver +CMAKE_C_COMPILER_AR:FILEPATH=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar + +//Generate index for LLVM archive +CMAKE_C_COMPILER_RANLIB:FILEPATH=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING= + +//Flags used by the C compiler during MINSIZEREL builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING= + +//Flags used by the C compiler during RELWITHDEBINFO builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Libraries linked by default with all C applications. +CMAKE_C_STANDARD_LIBRARIES:STRING=-latomic -lm + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-dlltool + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//No help, variable specified on the command line. +CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//No help, variable specified on the command line. +CMAKE_LIBRARY_OUTPUT_DIRECTORY:UNINITIALIZED=/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a + +//Path to a program. +CMAKE_LINKER:FILEPATH=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/ld.lld + +//No help, variable specified on the command line. +CMAKE_MAKE_PROGRAM:UNINITIALIZED=/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objdump + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=androidcast_codecs + +//Ranlib +CMAKE_RANLIB:FILEPATH=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-readelf + +//No help, variable specified on the command line. +CMAKE_RUNTIME_OUTPUT_DIRECTORY:UNINITIALIZED=/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Strip +CMAKE_STRIP:FILEPATH=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-strip + +//No help, variable specified on the command line. +CMAKE_SYSTEM_NAME:UNINITIALIZED=Android + +//No help, variable specified on the command line. +CMAKE_SYSTEM_VERSION:UNINITIALIZED=29 + +//No help, variable specified on the command line. +CMAKE_TOOLCHAIN_FILE:UNINITIALIZED=/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Path to a library. +android-lib:FILEPATH=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/libandroid.so + +//Value Computed by CMake +androidcast_codecs_BINARY_DIR:STATIC=/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a + +//Value Computed by CMake +androidcast_codecs_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +androidcast_codecs_SOURCE_DIR:STATIC=/home/foxx/repos/My Projects/android cast/ndk + +//Path to a library. +dl-lib:FILEPATH=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/libdl.so + +//Path to a library. +log-lib:FILEPATH=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/liblog.so + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=22 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/home/foxx/Android/Sdk/cmake/3.22.1/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/home/foxx/Android/Sdk/cmake/3.22.1/bin/ctest +//ADVANCED property for variable: CMAKE_C_COMPILER_AR +CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB +CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_STANDARD_LIBRARIES +CMAKE_C_STANDARD_LIBRARIES-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/foxx/repos/My Projects/android cast/ndk +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 + diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake new file mode 100644 index 0000000..158438c --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake @@ -0,0 +1,72 @@ +set(CMAKE_C_COMPILER "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "Clang") +set(CMAKE_C_COMPILER_VERSION "18.0.1") +set(CMAKE_C_COMPILER_VERSION_INTERNAL "") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "17") +set(CMAKE_C_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert;c_std_17;c_std_23") +set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") +set(CMAKE_C17_COMPILE_FEATURES "c_std_17") +set(CMAKE_C23_COMPILE_FEATURES "c_std_23") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_C_SIMULATE_VERSION "") + + + + +set(CMAKE_AR "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar") +set(CMAKE_C_COMPILER_AR "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar") +set(CMAKE_RANLIB "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib") +set(CMAKE_C_COMPILER_RANLIB "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ranlib") +set(CMAKE_LINKER "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/ld.lld") +set(CMAKE_MT "") +set(CMAKE_COMPILER_IS_GNUCC ) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_C_LIBRARY_ARCHITECTURE "") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include") +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "-l:libunwind.a;dl;c;-l:libunwind.a;dl") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/aarch64;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_C.bin b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000..ce021df Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeDetermineCompilerABI_C.bin differ diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake new file mode 100644 index 0000000..c072560 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Linux-6.18.33-gentoo-r1") +set(CMAKE_HOST_SYSTEM_NAME "Linux") +set(CMAKE_HOST_SYSTEM_VERSION "6.18.33-gentoo-r1") +set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") + +include("/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake") + +set(CMAKE_SYSTEM "Android-1") +set(CMAKE_SYSTEM_NAME "Android") +set(CMAKE_SYSTEM_VERSION "1") +set(CMAKE_SYSTEM_PROCESSOR "aarch64") + +set(CMAKE_CROSSCOMPILING "TRUE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.c b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..41b99d7 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,803 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif +#if defined(__CLASSIC_C__) +/* cv-qualifiers did not exist in K&R C */ +# define const +# define volatile +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif __STDC_VERSION__ > 201710L +# define C_VERSION "23" +#elif __STDC_VERSION__ >= 201710L +# define C_VERSION "17" +#elif __STDC_VERSION__ >= 201000L +# define C_VERSION "11" +#elif __STDC_VERSION__ >= 199901L +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ +#if (defined(__clang__) || defined(__GNUC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) && !defined(_MSC_VER) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000..adfea80 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o differ diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/CMakeOutput.log b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/CMakeOutput.log new file mode 100644 index 0000000..c949b39 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/CMakeOutput.log @@ -0,0 +1,129 @@ +The target system is: Android - 1 - aarch64 +The host system is: Linux - 6.18.33-gentoo-r1 - x86_64 +Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. +Compiler: /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang +Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security; +Id flags: -c;--target=aarch64-none-linux-android29 + +The output was: +0 + + +Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" + +The C compiler identification is Clang, found in "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o" + +Detecting C compiler ABI info compiled with the following output: +Change Dir: /home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/CMakeTmp + +Run Build Command(s):/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja cmTC_46a1c && [1/2] Building C object CMakeFiles/cmTC_46a1c.dir/CMakeCCompilerABI.c.o +Android (12027248, +pgo, +bolt, +lto, +mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) +Target: aarch64-none-linux-android29 +Thread model: posix +InstalledDir: /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin + (in-process) + "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang" -cc1 -triple aarch64-none-linux-android29 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu generic -target-feature +neon -target-feature +v8a -target-feature +fix-cortex-a53-835769 -target-abi aapcs -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb "-fdebug-compilation-dir=/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/CMakeTmp" -v -ffunction-sections -fdata-sections "-fcoverage-compilation-dir=/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/CMakeTmp" -resource-dir /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_7a63b.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_7a63b.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -internal-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include -internal-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/include -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -fcolor-diagnostics -target-feature +outline-atomics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_7a63b.dir/CMakeCCompilerABI.c.o -x c /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c +clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-unknown-linux-gnu +ignoring nonexistent directory "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include" +ignoring nonexistent directory "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/include" +#include "..." search starts here: +#include <...> search starts here: + /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include + /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android + /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include +End of search list. +[2/2] Linking C executable cmTC_46a1c +Android (12027248, +pgo, +bolt, +lto, +mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) +Target: aarch64-none-linux-android29 +Thread model: posix +InstalledDir: /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin + "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/ld.lld" --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -EL --fix-cortex-a53-843419 -z now -z relro -z max-page-size=4096 --hash-style=gnu --eh-frame-hdr -m aarch64linux -pie -dynamic-linker /system/bin/linker64 -o cmTC_46a1c /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/crtbegin_dynamic.o -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/aarch64 -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29 -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_46a1c.dir/CMakeCCompilerABI.c.o /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl -lc /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/crtend_android.o + + + +Parsed C implicit include dir info from above output: rv=done + found start of include info + found start of implicit include info + add: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include] + add: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android] + add: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include] + collapse include dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android] + collapse include dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include] + implicit include dirs: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include] + + +Parsed C implicit link information from above output: + link line regex: [^( *|.*[/\])(ld\.lld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command(s):/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja cmTC_46a1c && [1/2] Building C object CMakeFiles/cmTC_46a1c.dir/CMakeCCompilerABI.c.o] + ignore line: [Android (12027248 +pgo +bolt +lto +mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: aarch64-none-linux-android29] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang" -cc1 -triple aarch64-none-linux-android29 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=non-leaf -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu generic -target-feature +neon -target-feature +v8a -target-feature +fix-cortex-a53-835769 -target-abi aapcs -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb "-fdebug-compilation-dir=/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/CMakeTmp" -v -ffunction-sections -fdata-sections "-fcoverage-compilation-dir=/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/CMakeTmp" -resource-dir /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_7a63b.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_7a63b.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -internal-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include -internal-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/include -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -fcolor-diagnostics -target-feature +outline-atomics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_7a63b.dir/CMakeCCompilerABI.c.o -x c /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-unknown-linux-gnu] + ignore line: [ignoring nonexistent directory "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include] + ignore line: [ /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/aarch64-linux-android] + ignore line: [ /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] Linking C executable cmTC_46a1c] + ignore line: [Android (12027248 +pgo +bolt +lto +mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: aarch64-none-linux-android29] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin] + link line: [ "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/ld.lld" --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -EL --fix-cortex-a53-843419 -z now -z relro -z max-page-size=4096 --hash-style=gnu --eh-frame-hdr -m aarch64linux -pie -dynamic-linker /system/bin/linker64 -o cmTC_46a1c /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/crtbegin_dynamic.o -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/aarch64 -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29 -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_46a1c.dir/CMakeCCompilerABI.c.o /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl -lc /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a -l:libunwind.a -ldl /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/crtend_android.o] + arg [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot] ==> ignore + arg [-EL] ==> ignore + arg [--fix-cortex-a53-843419] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-zmax-page-size=4096] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [aarch64linux] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker64] ==> ignore + arg [-o] ==> ignore + arg [cmTC_46a1c] ==> ignore + arg [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/crtbegin_dynamic.o] ==> obj [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/crtbegin_dynamic.o] + arg [-L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/aarch64] ==> dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/aarch64] + arg [-L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29] ==> dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29] + arg [-L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android] + arg [-L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib] ==> dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_46a1c.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] ==> lib [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] ==> lib [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/crtend_android.o] ==> obj [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/crtend_android.o] + remove lib [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + remove lib [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-aarch64-android.a] + collapse library dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/aarch64] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/aarch64] + collapse library dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29] + collapse library dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android] + collapse library dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib] + implicit libs: [-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/crtbegin_dynamic.o;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/crtend_android.o] + implicit dirs: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/aarch64;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib] + implicit fwks: [] + + diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/TargetDirectories.txt b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..cd92fe3 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,4 @@ +/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_codecs.dir +/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_entitlements.dir +/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/edit_cache.dir +/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/rebuild_cache.dir diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o new file mode 100644 index 0000000..7d45feb Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o new file mode 100644 index 0000000..b51d1d5 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o new file mode 100644 index 0000000..dcd1b99 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o new file mode 100644 index 0000000..117682e Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o new file mode 100644 index 0000000..5bec1f6 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o new file mode 100644 index 0000000..f3bb24a Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o new file mode 100644 index 0000000..2b82471 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o new file mode 100644 index 0000000..874238a Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/cmake.check_cache b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/rules.ninja b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/rules.ninja new file mode 100644 index 0000000..21b6358 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/CMakeFiles/rules.ninja @@ -0,0 +1,83 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.22 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: androidcast_codecs +# Configurations: Debug +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for compiling C files. + +rule C_COMPILER__androidcast_codecs_Debug + depfile = $DEP_FILE + deps = gcc + command = /usr/bin/ccache /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=aarch64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building C object $out + + +############################################# +# Rule for linking C shared library. + +rule C_SHARED_LIBRARY_LINKER__androidcast_codecs_Debug + command = $PRE_LINK && /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=aarch64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking C shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for compiling C files. + +rule C_COMPILER__androidcast_entitlements_Debug + depfile = $DEP_FILE + deps = gcc + command = /usr/bin/ccache /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=aarch64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building C object $out + + +############################################# +# Rule for linking C shared library. + +rule C_SHARED_LIBRARY_LINKER__androidcast_entitlements_Debug + command = $PRE_LINK && /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=aarch64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking C shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = /home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake --regenerate-during-build -S"/home/foxx/repos/My Projects/android cast/ndk" -B"/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a" + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = /home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = /home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja -t targets + description = All primary targets available: + diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/additional_project_files.txt b/app/.cxx/Debug/505h1w6m/arm64-v8a/additional_project_files.txt new file mode 100644 index 0000000..e69de29 diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/android_gradle_build.json b/app/.cxx/Debug/505h1w6m/arm64-v8a/android_gradle_build.json new file mode 100644 index 0000000..ac94352 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/android_gradle_build.json @@ -0,0 +1,45 @@ +{ + "buildFiles": [ + "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "-C", + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "-C", + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "androidcast_codecs::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "arm64-v8a", + "artifactName": "androidcast_codecs", + "output": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_codecs.so", + "runtimeFiles": [] + }, + "androidcast_entitlements::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "arm64-v8a", + "artifactName": "androidcast_entitlements", + "output": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_entitlements.so", + "runtimeFiles": [] + } + }, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang.lld", + "cppCompilerExecutable": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++.lld" + } + }, + "cFileExtensions": [ + "c" + ], + "cppFileExtensions": [] +} \ No newline at end of file diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/android_gradle_build_mini.json b/app/.cxx/Debug/505h1w6m/arm64-v8a/android_gradle_build_mini.json new file mode 100644 index 0000000..d0e2d4d --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/android_gradle_build_mini.json @@ -0,0 +1,33 @@ +{ + "buildFiles": [ + "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "-C", + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "-C", + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "androidcast_codecs::@6890427a1f51a3e7e1df": { + "artifactName": "androidcast_codecs", + "abi": "arm64-v8a", + "output": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_codecs.so", + "runtimeFiles": [] + }, + "androidcast_entitlements::@6890427a1f51a3e7e1df": { + "artifactName": "androidcast_entitlements", + "abi": "arm64-v8a", + "output": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_entitlements.so", + "runtimeFiles": [] + } + } +} \ No newline at end of file diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/build.ninja b/app/.cxx/Debug/505h1w6m/arm64-v8a/build.ninja new file mode 100644 index 0000000..bbf4fef --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/build.ninja @@ -0,0 +1,241 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.22 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: androidcast_codecs +# Configurations: Debug +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = Debug +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = /home/foxx/repos/My$ Projects/android$ cast/app/.cxx/Debug/505h1w6m/arm64-v8a/ +# ============================================================================= +# Object build statements for SHARED_LIBRARY target androidcast_codecs + + +############################################# +# Order-only phony target for androidcast_codecs + +build cmake_object_order_depends_target_androidcast_codecs: phony || CMakeFiles/androidcast_codecs.dir + +build CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o: C_COMPILER__androidcast_codecs_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/androidcast_codecs.c || cmake_object_order_depends_target_androidcast_codecs + DEFINES = -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS + DEP_FILE = CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/jni" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include" + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_codecs.dir/jni + +build CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o: C_COMPILER__androidcast_codecs_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/libvpx_bridge.c || cmake_object_order_depends_target_androidcast_codecs + DEFINES = -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS + DEP_FILE = CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/jni" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include" + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_codecs.dir/jni + +build CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o: C_COMPILER__androidcast_codecs_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/opus_bridge.c || cmake_object_order_depends_target_androidcast_codecs + DEFINES = -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS + DEP_FILE = CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/jni" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include" + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_codecs.dir/jni + +build CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o: C_COMPILER__androidcast_codecs_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/speex_bridge.c || cmake_object_order_depends_target_androidcast_codecs + DEFINES = -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS + DEP_FILE = CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/jni" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include" + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_codecs.dir/jni + +build CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o: C_COMPILER__androidcast_codecs_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/crash_hook.c || cmake_object_order_depends_target_androidcast_codecs + DEFINES = -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS + DEP_FILE = CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/jni" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include" + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_codecs.dir/jni + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target androidcast_codecs + + +############################################# +# Link the shared library /home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_codecs.so + +build /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_codecs.so: C_SHARED_LIBRARY_LINKER__androidcast_codecs_Debug CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o | /home/foxx/repos/My$ Projects/android$ cast/ndk/../build/native/arm64-v8a/libvpx.a /home/foxx/repos/My$ Projects/android$ cast/ndk/../build/native/arm64-v8a/libopus.a /home/foxx/repos/My$ Projects/android$ cast/ndk/../build/native/arm64-v8a/libspeex.a /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/liblog.so /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/libandroid.so /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/libdl.so + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info + LINK_FLAGS = -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments + LINK_LIBRARIES = "/home/foxx/repos/My Projects/android cast/ndk/../build/native/arm64-v8a/libvpx.a" "/home/foxx/repos/My Projects/android cast/ndk/../build/native/arm64-v8a/libopus.a" "/home/foxx/repos/My Projects/android cast/ndk/../build/native/arm64-v8a/libspeex.a" /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/liblog.so /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/libandroid.so /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/libdl.so -latomic -lm + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libandroidcast_codecs.so + SONAME_FLAG = -Wl,-soname, + TARGET_FILE = "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_codecs.so" + TARGET_PDB = androidcast_codecs.so.dbg + +# ============================================================================= +# Object build statements for SHARED_LIBRARY target androidcast_entitlements + + +############################################# +# Order-only phony target for androidcast_entitlements + +build cmake_object_order_depends_target_androidcast_entitlements: phony || CMakeFiles/androidcast_entitlements.dir + +build CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o: C_COMPILER__androidcast_entitlements_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/entitlements_jni.c || cmake_object_order_depends_target_androidcast_entitlements + DEFINES = -Dandroidcast_entitlements_EXPORTS + DEP_FILE = CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/obfuscate" + OBJECT_DIR = CMakeFiles/androidcast_entitlements.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_entitlements.dir/jni + +build CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o: C_COMPILER__androidcast_entitlements_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/obfuscate/obfuscate.c || cmake_object_order_depends_target_androidcast_entitlements + DEFINES = -Dandroidcast_entitlements_EXPORTS + DEP_FILE = CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/obfuscate" + OBJECT_DIR = CMakeFiles/androidcast_entitlements.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_entitlements.dir/obfuscate + +build CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o: C_COMPILER__androidcast_entitlements_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/obfuscate/obfuscate_file.c || cmake_object_order_depends_target_androidcast_entitlements + DEFINES = -Dandroidcast_entitlements_EXPORTS + DEP_FILE = CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/obfuscate" + OBJECT_DIR = CMakeFiles/androidcast_entitlements.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_entitlements.dir/obfuscate + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target androidcast_entitlements + + +############################################# +# Link the shared library /home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_entitlements.so + +build /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_entitlements.so: C_SHARED_LIBRARY_LINKER__androidcast_entitlements_Debug CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o | /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/liblog.so + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info + LINK_FLAGS = -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments + LINK_LIBRARIES = /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/29/liblog.so -latomic -lm + OBJECT_DIR = CMakeFiles/androidcast_entitlements.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libandroidcast_entitlements.so + SONAME_FLAG = -Wl,-soname, + TARGET_FILE = "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_entitlements.so" + TARGET_PDB = androidcast_entitlements.so.dbg + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cd "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a" && /home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. + DESC = No interactive CMake dialog available... + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cd "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a" && /home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake --regenerate-during-build -S"/home/foxx/repos/My Projects/android cast/ndk" -B"/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a" + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +build androidcast_codecs: phony /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_codecs.so + +build androidcast_entitlements: phony /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_entitlements.so + +build libandroidcast_codecs.so: phony /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_codecs.so + +build libandroidcast_entitlements.so: phony /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_entitlements.so + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: /home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a + +build all: phony /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_codecs.so /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_entitlements.so + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/abis.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/flags.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /home/foxx/repos/My$ Projects/android$ cast/ndk/CMakeLists.txt CMakeCache.txt CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/abis.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/flags.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /home/foxx/repos/My$ Projects/android$ cast/ndk/CMakeLists.txt CMakeCache.txt CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/build_file_index.txt b/app/.cxx/Debug/505h1w6m/arm64-v8a/build_file_index.txt new file mode 100644 index 0000000..51f14ee --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/build_file_index.txt @@ -0,0 +1 @@ +/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt \ No newline at end of file diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/cmake_install.cmake b/app/.cxx/Debug/505h1w6m/arm64-v8a/cmake_install.cmake new file mode 100644 index 0000000..0416933 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/cmake_install.cmake @@ -0,0 +1,54 @@ +# Install script for directory: /home/foxx/repos/My Projects/android cast/ndk + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objdump") +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/compile_commands.json b/app/.cxx/Debug/505h1w6m/arm64-v8a/compile_commands.json new file mode 100644 index 0000000..978c9b8 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/compile_commands.json @@ -0,0 +1,42 @@ +[ +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=aarch64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/jni\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 -o CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/androidcast_codecs.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/androidcast_codecs.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=aarch64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/jni\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 -o CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/libvpx_bridge.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/libvpx_bridge.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=aarch64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/jni\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 -o CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/opus_bridge.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/opus_bridge.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=aarch64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/jni\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 -o CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/speex_bridge.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/speex_bridge.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=aarch64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/jni\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 -o CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/crash_hook.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/crash_hook.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=aarch64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -Dandroidcast_entitlements_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/obfuscate\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 -o CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/entitlements_jni.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/entitlements_jni.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=aarch64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -Dandroidcast_entitlements_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/obfuscate\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 -o CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/obfuscate/obfuscate.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/obfuscate/obfuscate.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=aarch64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -Dandroidcast_entitlements_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/obfuscate\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 -o CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/obfuscate/obfuscate_file.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/obfuscate/obfuscate_file.c" +} +] \ No newline at end of file diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/compile_commands.json.bin b/app/.cxx/Debug/505h1w6m/arm64-v8a/compile_commands.json.bin new file mode 100644 index 0000000..e10c3c9 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/arm64-v8a/compile_commands.json.bin differ diff --git a/app/.cxx/Debug/505h1w6m/arm64-v8a/configure_fingerprint.bin b/app/.cxx/Debug/505h1w6m/arm64-v8a/configure_fingerprint.bin new file mode 100644 index 0000000..1fd9f0b --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/arm64-v8a/configure_fingerprint.bin @@ -0,0 +1,28 @@ +C/C++ Structured Logl +j +h/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  3  ʧ3i +g +e/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/android_gradle_build.json  3 ʧ3n +l +j/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/android_gradle_build_mini.json  3 ʧ3[ +Y +W/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/build.ninja  3 ʧ3_ +] +[/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/build.ninja.txt  3d +b +`/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/build_file_index.txt  3 < 3e +c +a/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/compile_commands.json  3E ʧ3i +g +e/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/compile_commands.json.bin  3  ʧ3o +m +k/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/metadata_generation_command.txt  3 + 3b +` +^/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/prefab_config.json  3  ( 3g +e +c/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/symbol_folder_index.txt  3  b 3@ +> +>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif __STDC_VERSION__ > 201710L +# define C_VERSION "23" +#elif __STDC_VERSION__ >= 201710L +# define C_VERSION "17" +#elif __STDC_VERSION__ >= 201000L +# define C_VERSION "11" +#elif __STDC_VERSION__ >= 199901L +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ +#if (defined(__clang__) || defined(__GNUC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) && !defined(_MSC_VER) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000..02b3935 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o differ diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/CMakeOutput.log b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/CMakeOutput.log new file mode 100644 index 0000000..197dfcd --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/CMakeOutput.log @@ -0,0 +1,131 @@ +The target system is: Android - 1 - armv7-a +The host system is: Linux - 6.18.33-gentoo-r1 - x86_64 +Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. +Compiler: /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang +Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-march=armv7-a;-mthumb;-Wformat;-Werror=format-security; +Id flags: -c;--target=armv7-none-linux-androideabi29 + +The output was: +0 + + +Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" + +The C compiler identification is Clang, found in "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o" + +Detecting C compiler ABI info compiled with the following output: +Change Dir: /home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/CMakeTmp + +Run Build Command(s):/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja cmTC_b893f && [1/2] Building C object CMakeFiles/cmTC_b893f.dir/CMakeCCompilerABI.c.o +Android (12027248, +pgo, +bolt, +lto, +mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) +Target: armv7-none-linux-android29 +Thread model: posix +InstalledDir: /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin + (in-process) + "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang" -cc1 -triple thumbv7-none-linux-android29 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=1 -target-cpu generic -target-feature +soft-float-abi -target-feature +vfp2 -target-feature +vfp2sp -target-feature +vfp3 -target-feature +vfp3d16 -target-feature +vfp3d16sp -target-feature +vfp3sp -target-feature -fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature -vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature +fp64 -target-feature +d32 -target-feature +neon -target-feature -sha2 -target-feature -aes -target-feature -fp16fml -target-abi aapcs-linux -mfloat-abi soft -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb "-fdebug-compilation-dir=/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/CMakeTmp" -v -ffunction-sections -fdata-sections "-fcoverage-compilation-dir=/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/CMakeTmp" -resource-dir /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_690ac.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_690ac.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -internal-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include -internal-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/include -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -fcolor-diagnostics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_690ac.dir/CMakeCCompilerABI.c.o -x c /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c +clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-unknown-linux-gnu +ignoring nonexistent directory "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include" +ignoring nonexistent directory "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/include" +#include "..." search starts here: +#include <...> search starts here: + /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include + /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi + /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include +End of search list. +[2/2] Linking C executable cmTC_b893f +Android (12027248, +pgo, +bolt, +lto, +mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) +Target: armv7-none-linux-android29 +Thread model: posix +InstalledDir: /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin + "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/ld.lld" --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -EL -z now -z relro -z max-page-size=4096 -X --hash-style=gnu --eh-frame-hdr -m armelf_linux_eabi -pie -dynamic-linker /system/bin/linker -o cmTC_b893f /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/crtbegin_dynamic.o -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/arm -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29 -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/../lib -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_b893f.dir/CMakeCCompilerABI.c.o /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl -lc /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/crtend_android.o + + + +Parsed C implicit include dir info from above output: rv=done + found start of include info + found start of implicit include info + add: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include] + add: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi] + add: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include] + collapse include dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi] + collapse include dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include] + implicit include dirs: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include] + + +Parsed C implicit link information from above output: + link line regex: [^( *|.*[/\])(ld\.lld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command(s):/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja cmTC_b893f && [1/2] Building C object CMakeFiles/cmTC_b893f.dir/CMakeCCompilerABI.c.o] + ignore line: [Android (12027248 +pgo +bolt +lto +mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: armv7-none-linux-android29] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang" -cc1 -triple thumbv7-none-linux-android29 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=1 -target-cpu generic -target-feature +soft-float-abi -target-feature +vfp2 -target-feature +vfp2sp -target-feature +vfp3 -target-feature +vfp3d16 -target-feature +vfp3d16sp -target-feature +vfp3sp -target-feature -fp16 -target-feature -vfp4 -target-feature -vfp4d16 -target-feature -vfp4d16sp -target-feature -vfp4sp -target-feature -fp-armv8 -target-feature -fp-armv8d16 -target-feature -fp-armv8d16sp -target-feature -fp-armv8sp -target-feature -fullfp16 -target-feature +fp64 -target-feature +d32 -target-feature +neon -target-feature -sha2 -target-feature -aes -target-feature -fp16fml -target-abi aapcs-linux -mfloat-abi soft -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb "-fdebug-compilation-dir=/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/CMakeTmp" -v -ffunction-sections -fdata-sections "-fcoverage-compilation-dir=/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/CMakeTmp" -resource-dir /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_690ac.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_690ac.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -internal-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include -internal-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/include -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -stack-protector 2 -fno-signed-char -fgnuc-version=4.2.1 -fcolor-diagnostics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_690ac.dir/CMakeCCompilerABI.c.o -x c /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-unknown-linux-gnu] + ignore line: [ignoring nonexistent directory "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include] + ignore line: [ /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/arm-linux-androideabi] + ignore line: [ /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] Linking C executable cmTC_b893f] + ignore line: [Android (12027248 +pgo +bolt +lto +mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: armv7-none-linux-android29] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin] + link line: [ "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/ld.lld" --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -EL -z now -z relro -z max-page-size=4096 -X --hash-style=gnu --eh-frame-hdr -m armelf_linux_eabi -pie -dynamic-linker /system/bin/linker -o cmTC_b893f /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/crtbegin_dynamic.o -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/arm -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29 -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/../lib -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_b893f.dir/CMakeCCompilerABI.c.o /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl -lc /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a -l:libunwind.a -ldl /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/crtend_android.o] + arg [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot] ==> ignore + arg [-EL] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [-zmax-page-size=4096] ==> ignore + arg [-X] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [armelf_linux_eabi] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker] ==> ignore + arg [-o] ==> ignore + arg [cmTC_b893f] ==> ignore + arg [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/crtbegin_dynamic.o] ==> obj [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/crtbegin_dynamic.o] + arg [-L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/arm] ==> dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/arm] + arg [-L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29] ==> dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29] + arg [-L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi] + arg [-L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/../lib] ==> dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/../lib] + arg [-L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib] ==> dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_b893f.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] ==> lib [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] ==> lib [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/crtend_android.o] ==> obj [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/crtend_android.o] + remove lib [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + remove lib [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-arm-android.a] + collapse library dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/arm] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/arm] + collapse library dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29] + collapse library dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi] + collapse library dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/../lib] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib] + collapse library dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib] + implicit libs: [-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/crtbegin_dynamic.o;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/crtend_android.o] + implicit dirs: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/arm;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib] + implicit fwks: [] + + diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/TargetDirectories.txt b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..85888ff --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,4 @@ +/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_codecs.dir +/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_entitlements.dir +/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/edit_cache.dir +/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/rebuild_cache.dir diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o new file mode 100644 index 0000000..b5ba9bf Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o new file mode 100644 index 0000000..0de8ec9 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o new file mode 100644 index 0000000..8178a65 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o new file mode 100644 index 0000000..329c688 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o new file mode 100644 index 0000000..c9a2e34 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o new file mode 100644 index 0000000..3ef94ca Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o new file mode 100644 index 0000000..461b276 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o new file mode 100644 index 0000000..407d3bc Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/cmake.check_cache b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/rules.ninja b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/rules.ninja new file mode 100644 index 0000000..c932cdf --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/armeabi-v7a/CMakeFiles/rules.ninja @@ -0,0 +1,83 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.22 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: androidcast_codecs +# Configurations: Debug +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for compiling C files. + +rule C_COMPILER__androidcast_codecs_Debug + depfile = $DEP_FILE + deps = gcc + command = /usr/bin/ccache /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building C object $out + + +############################################# +# Rule for linking C shared library. + +rule C_SHARED_LIBRARY_LINKER__androidcast_codecs_Debug + command = $PRE_LINK && /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking C shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for compiling C files. + +rule C_COMPILER__androidcast_entitlements_Debug + depfile = $DEP_FILE + deps = gcc + command = /usr/bin/ccache /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building C object $out + + +############################################# +# Rule for linking C shared library. + +rule C_SHARED_LIBRARY_LINKER__androidcast_entitlements_Debug + command = $PRE_LINK && /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking C shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = /home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake --regenerate-during-build -S"/home/foxx/repos/My Projects/android cast/ndk" -B"/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a" + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = /home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = /home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja -t targets + description = All primary targets available: + diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/additional_project_files.txt b/app/.cxx/Debug/505h1w6m/armeabi-v7a/additional_project_files.txt new file mode 100644 index 0000000..e69de29 diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/android_gradle_build.json b/app/.cxx/Debug/505h1w6m/armeabi-v7a/android_gradle_build.json new file mode 100644 index 0000000..bd9d934 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/armeabi-v7a/android_gradle_build.json @@ -0,0 +1,45 @@ +{ + "buildFiles": [ + "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "-C", + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "-C", + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "androidcast_codecs::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "armeabi-v7a", + "artifactName": "androidcast_codecs", + "output": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_codecs.so", + "runtimeFiles": [] + }, + "androidcast_entitlements::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "armeabi-v7a", + "artifactName": "androidcast_entitlements", + "output": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_entitlements.so", + "runtimeFiles": [] + } + }, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang.lld", + "cppCompilerExecutable": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++.lld" + } + }, + "cFileExtensions": [ + "c" + ], + "cppFileExtensions": [] +} \ No newline at end of file diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/android_gradle_build_mini.json b/app/.cxx/Debug/505h1w6m/armeabi-v7a/android_gradle_build_mini.json new file mode 100644 index 0000000..1a1fd45 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/armeabi-v7a/android_gradle_build_mini.json @@ -0,0 +1,33 @@ +{ + "buildFiles": [ + "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "-C", + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "-C", + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "androidcast_codecs::@6890427a1f51a3e7e1df": { + "artifactName": "androidcast_codecs", + "abi": "armeabi-v7a", + "output": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_codecs.so", + "runtimeFiles": [] + }, + "androidcast_entitlements::@6890427a1f51a3e7e1df": { + "artifactName": "androidcast_entitlements", + "abi": "armeabi-v7a", + "output": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_entitlements.so", + "runtimeFiles": [] + } + } +} \ No newline at end of file diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/build.ninja b/app/.cxx/Debug/505h1w6m/armeabi-v7a/build.ninja new file mode 100644 index 0000000..ffc9e8d --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/armeabi-v7a/build.ninja @@ -0,0 +1,241 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.22 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: androidcast_codecs +# Configurations: Debug +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = Debug +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = /home/foxx/repos/My$ Projects/android$ cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/ +# ============================================================================= +# Object build statements for SHARED_LIBRARY target androidcast_codecs + + +############################################# +# Order-only phony target for androidcast_codecs + +build cmake_object_order_depends_target_androidcast_codecs: phony || CMakeFiles/androidcast_codecs.dir + +build CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o: C_COMPILER__androidcast_codecs_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/androidcast_codecs.c || cmake_object_order_depends_target_androidcast_codecs + DEFINES = -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS + DEP_FILE = CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/jni" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include" + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_codecs.dir/jni + +build CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o: C_COMPILER__androidcast_codecs_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/libvpx_bridge.c || cmake_object_order_depends_target_androidcast_codecs + DEFINES = -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS + DEP_FILE = CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/jni" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include" + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_codecs.dir/jni + +build CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o: C_COMPILER__androidcast_codecs_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/opus_bridge.c || cmake_object_order_depends_target_androidcast_codecs + DEFINES = -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS + DEP_FILE = CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/jni" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include" + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_codecs.dir/jni + +build CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o: C_COMPILER__androidcast_codecs_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/speex_bridge.c || cmake_object_order_depends_target_androidcast_codecs + DEFINES = -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS + DEP_FILE = CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/jni" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include" + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_codecs.dir/jni + +build CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o: C_COMPILER__androidcast_codecs_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/crash_hook.c || cmake_object_order_depends_target_androidcast_codecs + DEFINES = -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS + DEP_FILE = CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/jni" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include" + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_codecs.dir/jni + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target androidcast_codecs + + +############################################# +# Link the shared library /home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_codecs.so + +build /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_codecs.so: C_SHARED_LIBRARY_LINKER__androidcast_codecs_Debug CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o | /home/foxx/repos/My$ Projects/android$ cast/ndk/../build/native/armeabi-v7a/libvpx.a /home/foxx/repos/My$ Projects/android$ cast/ndk/../build/native/armeabi-v7a/libopus.a /home/foxx/repos/My$ Projects/android$ cast/ndk/../build/native/armeabi-v7a/libspeex.a /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/liblog.so /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/libandroid.so /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/libdl.so + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info + LINK_FLAGS = -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments + LINK_LIBRARIES = "/home/foxx/repos/My Projects/android cast/ndk/../build/native/armeabi-v7a/libvpx.a" "/home/foxx/repos/My Projects/android cast/ndk/../build/native/armeabi-v7a/libopus.a" "/home/foxx/repos/My Projects/android cast/ndk/../build/native/armeabi-v7a/libspeex.a" /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/liblog.so /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/libandroid.so /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/libdl.so -latomic -lm + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libandroidcast_codecs.so + SONAME_FLAG = -Wl,-soname, + TARGET_FILE = "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_codecs.so" + TARGET_PDB = androidcast_codecs.so.dbg + +# ============================================================================= +# Object build statements for SHARED_LIBRARY target androidcast_entitlements + + +############################################# +# Order-only phony target for androidcast_entitlements + +build cmake_object_order_depends_target_androidcast_entitlements: phony || CMakeFiles/androidcast_entitlements.dir + +build CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o: C_COMPILER__androidcast_entitlements_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/entitlements_jni.c || cmake_object_order_depends_target_androidcast_entitlements + DEFINES = -Dandroidcast_entitlements_EXPORTS + DEP_FILE = CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/obfuscate" + OBJECT_DIR = CMakeFiles/androidcast_entitlements.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_entitlements.dir/jni + +build CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o: C_COMPILER__androidcast_entitlements_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/obfuscate/obfuscate.c || cmake_object_order_depends_target_androidcast_entitlements + DEFINES = -Dandroidcast_entitlements_EXPORTS + DEP_FILE = CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/obfuscate" + OBJECT_DIR = CMakeFiles/androidcast_entitlements.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_entitlements.dir/obfuscate + +build CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o: C_COMPILER__androidcast_entitlements_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/obfuscate/obfuscate_file.c || cmake_object_order_depends_target_androidcast_entitlements + DEFINES = -Dandroidcast_entitlements_EXPORTS + DEP_FILE = CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/obfuscate" + OBJECT_DIR = CMakeFiles/androidcast_entitlements.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_entitlements.dir/obfuscate + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target androidcast_entitlements + + +############################################# +# Link the shared library /home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_entitlements.so + +build /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_entitlements.so: C_SHARED_LIBRARY_LINKER__androidcast_entitlements_Debug CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o | /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/liblog.so + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info + LINK_FLAGS = -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments + LINK_LIBRARIES = /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/29/liblog.so -latomic -lm + OBJECT_DIR = CMakeFiles/androidcast_entitlements.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libandroidcast_entitlements.so + SONAME_FLAG = -Wl,-soname, + TARGET_FILE = "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_entitlements.so" + TARGET_PDB = androidcast_entitlements.so.dbg + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cd "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a" && /home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. + DESC = No interactive CMake dialog available... + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cd "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a" && /home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake --regenerate-during-build -S"/home/foxx/repos/My Projects/android cast/ndk" -B"/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a" + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +build androidcast_codecs: phony /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_codecs.so + +build androidcast_entitlements: phony /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_entitlements.so + +build libandroidcast_codecs.so: phony /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_codecs.so + +build libandroidcast_entitlements.so: phony /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_entitlements.so + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: /home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a + +build all: phony /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_codecs.so /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_entitlements.so + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/abis.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/flags.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /home/foxx/repos/My$ Projects/android$ cast/ndk/CMakeLists.txt CMakeCache.txt CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/abis.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/flags.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /home/foxx/repos/My$ Projects/android$ cast/ndk/CMakeLists.txt CMakeCache.txt CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/build_file_index.txt b/app/.cxx/Debug/505h1w6m/armeabi-v7a/build_file_index.txt new file mode 100644 index 0000000..51f14ee --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/armeabi-v7a/build_file_index.txt @@ -0,0 +1 @@ +/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt \ No newline at end of file diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/cmake_install.cmake b/app/.cxx/Debug/505h1w6m/armeabi-v7a/cmake_install.cmake new file mode 100644 index 0000000..8fef626 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/armeabi-v7a/cmake_install.cmake @@ -0,0 +1,54 @@ +# Install script for directory: /home/foxx/repos/My Projects/android cast/ndk + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objdump") +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/compile_commands.json b/app/.cxx/Debug/505h1w6m/armeabi-v7a/compile_commands.json new file mode 100644 index 0000000..ad93a6c --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/armeabi-v7a/compile_commands.json @@ -0,0 +1,42 @@ +[ +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/jni\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 -o CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/androidcast_codecs.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/androidcast_codecs.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/jni\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 -o CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/libvpx_bridge.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/libvpx_bridge.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/jni\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 -o CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/opus_bridge.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/opus_bridge.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/jni\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 -o CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/speex_bridge.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/speex_bridge.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/jni\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 -o CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/crash_hook.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/crash_hook.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -Dandroidcast_entitlements_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/obfuscate\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 -o CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/entitlements_jni.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/entitlements_jni.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -Dandroidcast_entitlements_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/obfuscate\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 -o CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/obfuscate/obfuscate.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/obfuscate/obfuscate.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=armv7-none-linux-androideabi29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -Dandroidcast_entitlements_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/obfuscate\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -mthumb -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 -o CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/obfuscate/obfuscate_file.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/obfuscate/obfuscate_file.c" +} +] \ No newline at end of file diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/compile_commands.json.bin b/app/.cxx/Debug/505h1w6m/armeabi-v7a/compile_commands.json.bin new file mode 100644 index 0000000..f174048 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/armeabi-v7a/compile_commands.json.bin differ diff --git a/app/.cxx/Debug/505h1w6m/armeabi-v7a/configure_fingerprint.bin b/app/.cxx/Debug/505h1w6m/armeabi-v7a/configure_fingerprint.bin new file mode 100644 index 0000000..1e1bee4 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/armeabi-v7a/configure_fingerprint.bin @@ -0,0 +1,28 @@ +C/C++ Structured Logn +l +j/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  3  ̧3k +i +g/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/android_gradle_build.json  3 ̧3p +n +l/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/android_gradle_build_mini.json  3 ̧3] +[ +Y/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/build.ninja  3ð ˧3a +_ +]/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/build.ninja.txt  3f +d +b/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/build_file_index.txt  3 < 3g +e +c/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/compile_commands.json  3F ˧3k +i +g/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/compile_commands.json.bin  3  ˧3q +o +m/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/metadata_generation_command.txt  3 + 3d +b +`/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/prefab_config.json  3  ( 3i +g +e/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/symbol_folder_index.txt  3  d 3@ +> +>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__BCC__) +# define COMPILER_ID "Bruce" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) +# define COMPILER_ID "SDCC" +# if defined(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) +# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) +# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) +# else + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#if !defined(__STDC__) && !defined(__clang__) +# if defined(_MSC_VER) || defined(__ibmxl__) || defined(__IBMC__) +# define C_VERSION "90" +# else +# define C_VERSION +# endif +#elif __STDC_VERSION__ > 201710L +# define C_VERSION "23" +#elif __STDC_VERSION__ >= 201710L +# define C_VERSION "17" +#elif __STDC_VERSION__ >= 201000L +# define C_VERSION "11" +#elif __STDC_VERSION__ >= 199901L +# define C_VERSION "99" +#else +# define C_VERSION "90" +#endif +const char* info_language_standard_default = + "INFO" ":" "standard_default[" C_VERSION "]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +/* !defined(_MSC_VER) to exclude Clang's MSVC compatibility mode. */ +#if (defined(__clang__) || defined(__GNUC__) || \ + defined(__TI_COMPILER_VERSION__)) && \ + !defined(__STRICT_ANSI__) && !defined(_MSC_VER) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +# if defined(__CLASSIC_C__) +int main(argc, argv) int argc; char *argv[]; +# else +int main(int argc, char* argv[]) +# endif +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef COMPILER_VERSION_INTERNAL + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o new file mode 100644 index 0000000..019e082 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o differ diff --git a/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/CMakeOutput.log b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/CMakeOutput.log new file mode 100644 index 0000000..8afdf04 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/CMakeOutput.log @@ -0,0 +1,126 @@ +The target system is: Android - 1 - x86_64 +The host system is: Linux - 6.18.33-gentoo-r1 - x86_64 +Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. +Compiler: /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang +Build flags: -g;-DANDROID;-fdata-sections;-ffunction-sections;-funwind-tables;-fstack-protector-strong;-no-canonical-prefixes;-D_FORTIFY_SOURCE=2;-Wformat;-Werror=format-security; +Id flags: -c;--target=x86_64-none-linux-android29 + +The output was: +0 + + +Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "CMakeCCompilerId.o" + +The C compiler identification is Clang, found in "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/3.22.1-g37088a8/CompilerIdC/CMakeCCompilerId.o" + +Detecting C compiler ABI info compiled with the following output: +Change Dir: /home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/CMakeTmp + +Run Build Command(s):/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja cmTC_15151 && [1/2] Building C object CMakeFiles/cmTC_15151.dir/CMakeCCompilerABI.c.o +Android (12027248, +pgo, +bolt, +lto, +mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) +Target: x86_64-none-linux-android29 +Thread model: posix +InstalledDir: /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin + (in-process) + "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang" -cc1 -triple x86_64-none-linux-android29 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +sse4.2 -target-feature +popcnt -target-feature +cx16 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb "-fdebug-compilation-dir=/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/CMakeTmp" -v -ffunction-sections -fdata-sections "-fcoverage-compilation-dir=/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/CMakeTmp" -resource-dir /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_a1ba9.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_a1ba9.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -internal-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include -internal-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/include -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -stack-protector 2 -fgnuc-version=4.2.1 -fcolor-diagnostics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_a1ba9.dir/CMakeCCompilerABI.c.o -x c /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c +clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-unknown-linux-gnu +ignoring nonexistent directory "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include" +ignoring nonexistent directory "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/include" +#include "..." search starts here: +#include <...> search starts here: + /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include + /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android + /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include +End of search list. +[2/2] Linking C executable cmTC_15151 +Android (12027248, +pgo, +bolt, +lto, +mlgo, based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262) +Target: x86_64-none-linux-android29 +Thread model: posix +InstalledDir: /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin + "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/ld.lld" --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /system/bin/linker64 -o cmTC_15151 /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/crtbegin_dynamic.o -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/x86_64 -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29 -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_15151.dir/CMakeCCompilerABI.c.o /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl -lc /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/crtend_android.o + + + +Parsed C implicit include dir info from above output: rv=done + found start of include info + found start of implicit include info + add: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include] + add: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android] + add: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include] + end of search list found + collapse include dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include] + collapse include dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android] + collapse include dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include] + implicit include dirs: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include] + + +Parsed C implicit link information from above output: + link line regex: [^( *|.*[/\])(ld\.lld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command(s):/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja cmTC_15151 && [1/2] Building C object CMakeFiles/cmTC_15151.dir/CMakeCCompilerABI.c.o] + ignore line: [Android (12027248 +pgo +bolt +lto +mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: x86_64-none-linux-android29] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin] + ignore line: [ (in-process)] + ignore line: [ "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang" -cc1 -triple x86_64-none-linux-android29 -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name CMakeCCompilerABI.c -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -target-feature +sse4.2 -target-feature +popcnt -target-feature +cx16 -tune-cpu generic -debug-info-kind=constructor -dwarf-version=4 -debugger-tuning=gdb "-fdebug-compilation-dir=/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/CMakeTmp" -v -ffunction-sections -fdata-sections "-fcoverage-compilation-dir=/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/CMakeTmp" -resource-dir /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18 -dependency-file CMakeFiles/cmTC_a1ba9.dir/CMakeCCompilerABI.c.o.d -MT CMakeFiles/cmTC_a1ba9.dir/CMakeCCompilerABI.c.o -sys-header-deps -D ANDROID -D _FORTIFY_SOURCE=2 -isysroot /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -internal-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include -internal-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/include -internal-externc-isystem /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include -Wformat -ferror-limit 19 -stack-protector 2 -fgnuc-version=4.2.1 -fcolor-diagnostics -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o CMakeFiles/cmTC_a1ba9.dir/CMakeCCompilerABI.c.o -x c /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCCompilerABI.c] + ignore line: [clang -cc1 version 18.0.1 based upon LLVM 18.0.1 default target x86_64-unknown-linux-gnu] + ignore line: [ignoring nonexistent directory "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/local/include"] + ignore line: [ignoring nonexistent directory "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/include] + ignore line: [ /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/x86_64-linux-android] + ignore line: [ /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include] + ignore line: [End of search list.] + ignore line: [[2/2] Linking C executable cmTC_15151] + ignore line: [Android (12027248 +pgo +bolt +lto +mlgo based on r522817) clang version 18.0.1 (https://android.googlesource.com/toolchain/llvm-project d8003a456d14a3deb8054cdaa529ffbf02d9b262)] + ignore line: [Target: x86_64-none-linux-android29] + ignore line: [Thread model: posix] + ignore line: [InstalledDir: /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin] + link line: [ "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/ld.lld" --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -z now -z relro --hash-style=gnu --eh-frame-hdr -m elf_x86_64 -pie -dynamic-linker /system/bin/linker64 -o cmTC_15151 /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/crtbegin_dynamic.o -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/x86_64 -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29 -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android -L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib --build-id=sha1 --no-rosegment --no-undefined-version --fatal-warnings --no-undefined CMakeFiles/cmTC_15151.dir/CMakeCCompilerABI.c.o /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl -lc /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a -l:libunwind.a -ldl /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/crtend_android.o] + arg [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/ld.lld] ==> ignore + arg [--sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot] ==> ignore + arg [-znow] ==> ignore + arg [-zrelro] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [-pie] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/system/bin/linker64] ==> ignore + arg [-o] ==> ignore + arg [cmTC_15151] ==> ignore + arg [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/crtbegin_dynamic.o] ==> obj [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/crtbegin_dynamic.o] + arg [-L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/x86_64] ==> dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/x86_64] + arg [-L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29] ==> dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29] + arg [-L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android] + arg [-L/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib] ==> dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib] + arg [--build-id=sha1] ==> ignore + arg [--no-rosegment] ==> ignore + arg [--no-undefined-version] ==> ignore + arg [--fatal-warnings] ==> ignore + arg [--no-undefined] ==> ignore + arg [CMakeFiles/cmTC_15151.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] ==> lib [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [-lc] ==> lib [c] + arg [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] ==> lib [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + arg [-l:libunwind.a] ==> lib [-l:libunwind.a] + arg [-ldl] ==> lib [dl] + arg [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/crtend_android.o] ==> obj [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/crtend_android.o] + remove lib [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + remove lib [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/libclang_rt.builtins-x86_64-android.a] + collapse library dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/x86_64] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/x86_64] + collapse library dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29] + collapse library dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android] + collapse library dir [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib] ==> [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib] + implicit libs: [-l:libunwind.a;dl;c;-l:libunwind.a;dl] + implicit objs: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/crtbegin_dynamic.o;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/crtend_android.o] + implicit dirs: [/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/lib/clang/18/lib/linux/x86_64;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android;/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib] + implicit fwks: [] + + diff --git a/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/TargetDirectories.txt b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..908cd6a --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,4 @@ +/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_codecs.dir +/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_entitlements.dir +/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/edit_cache.dir +/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/rebuild_cache.dir diff --git a/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o new file mode 100644 index 0000000..9edb463 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o new file mode 100644 index 0000000..95d5dd0 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o new file mode 100644 index 0000000..5ee22dd Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o new file mode 100644 index 0000000..978a0e0 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o new file mode 100644 index 0000000..453a400 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o new file mode 100644 index 0000000..cbcdc2f Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o new file mode 100644 index 0000000..05c3fff Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o new file mode 100644 index 0000000..307ca3a Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o differ diff --git a/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/cmake.check_cache b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/rules.ninja b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/rules.ninja new file mode 100644 index 0000000..9d0f559 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/x86_64/CMakeFiles/rules.ninja @@ -0,0 +1,83 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.22 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: androidcast_codecs +# Configurations: Debug +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for compiling C files. + +rule C_COMPILER__androidcast_codecs_Debug + depfile = $DEP_FILE + deps = gcc + command = /usr/bin/ccache /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=x86_64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building C object $out + + +############################################# +# Rule for linking C shared library. + +rule C_SHARED_LIBRARY_LINKER__androidcast_codecs_Debug + command = $PRE_LINK && /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=x86_64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking C shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for compiling C files. + +rule C_COMPILER__androidcast_entitlements_Debug + depfile = $DEP_FILE + deps = gcc + command = /usr/bin/ccache /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=x86_64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building C object $out + + +############################################# +# Rule for linking C shared library. + +rule C_SHARED_LIBRARY_LINKER__androidcast_entitlements_Debug + command = $PRE_LINK && /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=x86_64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -fPIC $LANGUAGE_COMPILE_FLAGS $ARCH_FLAGS $LINK_FLAGS -shared $SONAME_FLAG$SONAME -o $TARGET_FILE $in $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking C shared library $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = /home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake --regenerate-during-build -S"/home/foxx/repos/My Projects/android cast/ndk" -B"/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64" + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = /home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = /home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja -t targets + description = All primary targets available: + diff --git a/app/.cxx/Debug/505h1w6m/x86_64/additional_project_files.txt b/app/.cxx/Debug/505h1w6m/x86_64/additional_project_files.txt new file mode 100644 index 0000000..e69de29 diff --git a/app/.cxx/Debug/505h1w6m/x86_64/android_gradle_build.json b/app/.cxx/Debug/505h1w6m/x86_64/android_gradle_build.json new file mode 100644 index 0000000..0147e31 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/x86_64/android_gradle_build.json @@ -0,0 +1,45 @@ +{ + "buildFiles": [ + "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "-C", + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "-C", + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "androidcast_codecs::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "x86_64", + "artifactName": "androidcast_codecs", + "output": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_codecs.so", + "runtimeFiles": [] + }, + "androidcast_entitlements::@6890427a1f51a3e7e1df": { + "toolchain": "toolchain", + "abi": "x86_64", + "artifactName": "androidcast_entitlements", + "output": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_entitlements.so", + "runtimeFiles": [] + } + }, + "toolchains": { + "toolchain": { + "cCompilerExecutable": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang.lld", + "cppCompilerExecutable": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++.lld" + } + }, + "cFileExtensions": [ + "c" + ], + "cppFileExtensions": [] +} \ No newline at end of file diff --git a/app/.cxx/Debug/505h1w6m/x86_64/android_gradle_build_mini.json b/app/.cxx/Debug/505h1w6m/x86_64/android_gradle_build_mini.json new file mode 100644 index 0000000..315b671 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/x86_64/android_gradle_build_mini.json @@ -0,0 +1,33 @@ +{ + "buildFiles": [ + "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt" + ], + "cleanCommandsComponents": [ + [ + "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "-C", + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64", + "clean" + ] + ], + "buildTargetsCommandComponents": [ + "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "-C", + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64", + "{LIST_OF_TARGETS_TO_BUILD}" + ], + "libraries": { + "androidcast_codecs::@6890427a1f51a3e7e1df": { + "artifactName": "androidcast_codecs", + "abi": "x86_64", + "output": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_codecs.so", + "runtimeFiles": [] + }, + "androidcast_entitlements::@6890427a1f51a3e7e1df": { + "artifactName": "androidcast_entitlements", + "abi": "x86_64", + "output": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_entitlements.so", + "runtimeFiles": [] + } + } +} \ No newline at end of file diff --git a/app/.cxx/Debug/505h1w6m/x86_64/build.ninja b/app/.cxx/Debug/505h1w6m/x86_64/build.ninja new file mode 100644 index 0000000..11e2482 --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/x86_64/build.ninja @@ -0,0 +1,241 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 3.22 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: androidcast_codecs +# Configurations: Debug +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = Debug +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = /home/foxx/repos/My$ Projects/android$ cast/app/.cxx/Debug/505h1w6m/x86_64/ +# ============================================================================= +# Object build statements for SHARED_LIBRARY target androidcast_codecs + + +############################################# +# Order-only phony target for androidcast_codecs + +build cmake_object_order_depends_target_androidcast_codecs: phony || CMakeFiles/androidcast_codecs.dir + +build CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o: C_COMPILER__androidcast_codecs_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/androidcast_codecs.c || cmake_object_order_depends_target_androidcast_codecs + DEFINES = -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS + DEP_FILE = CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/jni" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include" + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_codecs.dir/jni + +build CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o: C_COMPILER__androidcast_codecs_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/libvpx_bridge.c || cmake_object_order_depends_target_androidcast_codecs + DEFINES = -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS + DEP_FILE = CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/jni" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include" + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_codecs.dir/jni + +build CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o: C_COMPILER__androidcast_codecs_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/opus_bridge.c || cmake_object_order_depends_target_androidcast_codecs + DEFINES = -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS + DEP_FILE = CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/jni" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include" + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_codecs.dir/jni + +build CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o: C_COMPILER__androidcast_codecs_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/speex_bridge.c || cmake_object_order_depends_target_androidcast_codecs + DEFINES = -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS + DEP_FILE = CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/jni" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include" + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_codecs.dir/jni + +build CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o: C_COMPILER__androidcast_codecs_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/crash_hook.c || cmake_object_order_depends_target_androidcast_codecs + DEFINES = -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS + DEP_FILE = CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/jni" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include" -I"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include" + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_codecs.dir/jni + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target androidcast_codecs + + +############################################# +# Link the shared library /home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_codecs.so + +build /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_codecs.so: C_SHARED_LIBRARY_LINKER__androidcast_codecs_Debug CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o | /home/foxx/repos/My$ Projects/android$ cast/ndk/../build/native/x86_64/libvpx.a /home/foxx/repos/My$ Projects/android$ cast/ndk/../build/native/x86_64/libopus.a /home/foxx/repos/My$ Projects/android$ cast/ndk/../build/native/x86_64/libspeex.a /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/liblog.so /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/libandroid.so /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/libdl.so + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info + LINK_FLAGS = -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments + LINK_LIBRARIES = "/home/foxx/repos/My Projects/android cast/ndk/../build/native/x86_64/libvpx.a" "/home/foxx/repos/My Projects/android cast/ndk/../build/native/x86_64/libopus.a" "/home/foxx/repos/My Projects/android cast/ndk/../build/native/x86_64/libspeex.a" /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/liblog.so /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/libandroid.so /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/libdl.so -latomic -lm + OBJECT_DIR = CMakeFiles/androidcast_codecs.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libandroidcast_codecs.so + SONAME_FLAG = -Wl,-soname, + TARGET_FILE = "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_codecs.so" + TARGET_PDB = androidcast_codecs.so.dbg + +# ============================================================================= +# Object build statements for SHARED_LIBRARY target androidcast_entitlements + + +############################################# +# Order-only phony target for androidcast_entitlements + +build cmake_object_order_depends_target_androidcast_entitlements: phony || CMakeFiles/androidcast_entitlements.dir + +build CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o: C_COMPILER__androidcast_entitlements_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/jni/entitlements_jni.c || cmake_object_order_depends_target_androidcast_entitlements + DEFINES = -Dandroidcast_entitlements_EXPORTS + DEP_FILE = CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/obfuscate" + OBJECT_DIR = CMakeFiles/androidcast_entitlements.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_entitlements.dir/jni + +build CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o: C_COMPILER__androidcast_entitlements_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/obfuscate/obfuscate.c || cmake_object_order_depends_target_androidcast_entitlements + DEFINES = -Dandroidcast_entitlements_EXPORTS + DEP_FILE = CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/obfuscate" + OBJECT_DIR = CMakeFiles/androidcast_entitlements.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_entitlements.dir/obfuscate + +build CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o: C_COMPILER__androidcast_entitlements_Debug /home/foxx/repos/My$ Projects/android$ cast/ndk/obfuscate/obfuscate_file.c || cmake_object_order_depends_target_androidcast_entitlements + DEFINES = -Dandroidcast_entitlements_EXPORTS + DEP_FILE = CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o.d + FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 + INCLUDES = -I"/home/foxx/repos/My Projects/android cast/ndk/obfuscate" + OBJECT_DIR = CMakeFiles/androidcast_entitlements.dir + OBJECT_FILE_DIR = CMakeFiles/androidcast_entitlements.dir/obfuscate + + +# ============================================================================= +# Link build statements for SHARED_LIBRARY target androidcast_entitlements + + +############################################# +# Link the shared library /home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_entitlements.so + +build /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_entitlements.so: C_SHARED_LIBRARY_LINKER__androidcast_entitlements_Debug CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o | /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/liblog.so + LANGUAGE_COMPILE_FLAGS = -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info + LINK_FLAGS = -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments + LINK_LIBRARIES = /home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/29/liblog.so -latomic -lm + OBJECT_DIR = CMakeFiles/androidcast_entitlements.dir + POST_BUILD = : + PRE_LINK = : + SONAME = libandroidcast_entitlements.so + SONAME_FLAG = -Wl,-soname, + TARGET_FILE = "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_entitlements.so" + TARGET_PDB = androidcast_entitlements.so.dbg + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cd "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64" && /home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. + DESC = No interactive CMake dialog available... + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cd "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64" && /home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake --regenerate-during-build -S"/home/foxx/repos/My Projects/android cast/ndk" -B"/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64" + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +build androidcast_codecs: phony /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_codecs.so + +build androidcast_entitlements: phony /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_entitlements.so + +build libandroidcast_codecs.so: phony /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_codecs.so + +build libandroidcast_entitlements.so: phony /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_entitlements.so + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: /home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64 + +build all: phony /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_codecs.so /home/foxx/repos/My$ Projects/android$ cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_entitlements.so + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja: RERUN_CMAKE | /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/abis.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/flags.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /home/foxx/repos/My$ Projects/android$ cast/ndk/CMakeLists.txt CMakeCache.txt CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeCommonLanguageInclude.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeGenericSystem.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeInitializeConfigs.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeLanguageInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInformation.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/CMakeSystemSpecificInitialize.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/CMakeCommonCompilerMacros.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang-C.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/Clang.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Compiler/GNU.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang-C.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Clang.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android-Initialize.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Android.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/Linux.cmake /home/foxx/Android/Sdk/cmake/3.22.1/share/cmake-3.22/Modules/Platform/UnixPaths.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/abis.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android-legacy.toolchain.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/flags.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Clang.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android-Initialize.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/hooks/pre/Android.cmake /home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/platforms.cmake /home/foxx/repos/My$ Projects/android$ cast/ndk/CMakeLists.txt CMakeCache.txt CMakeFiles/3.22.1-g37088a8/CMakeCCompiler.cmake CMakeFiles/3.22.1-g37088a8/CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/app/.cxx/Debug/505h1w6m/x86_64/build_file_index.txt b/app/.cxx/Debug/505h1w6m/x86_64/build_file_index.txt new file mode 100644 index 0000000..51f14ee --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/x86_64/build_file_index.txt @@ -0,0 +1 @@ +/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt \ No newline at end of file diff --git a/app/.cxx/Debug/505h1w6m/x86_64/cmake_install.cmake b/app/.cxx/Debug/505h1w6m/x86_64/cmake_install.cmake new file mode 100644 index 0000000..ce8eb2d --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/x86_64/cmake_install.cmake @@ -0,0 +1,54 @@ +# Install script for directory: /home/foxx/repos/My Projects/android cast/ndk + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "TRUE") +endif() + +# Set default install directory permissions. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-objdump") +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/app/.cxx/Debug/505h1w6m/x86_64/compile_commands.json b/app/.cxx/Debug/505h1w6m/x86_64/compile_commands.json new file mode 100644 index 0000000..1a08dfe --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/x86_64/compile_commands.json @@ -0,0 +1,42 @@ +[ +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=x86_64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/jni\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 -o CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/androidcast_codecs.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/androidcast_codecs.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=x86_64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/jni\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 -o CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/libvpx_bridge.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/libvpx_bridge.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=x86_64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/jni\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 -o CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/opus_bridge.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/opus_bridge.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=x86_64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/jni\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 -o CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/speex_bridge.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/speex_bridge.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=x86_64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -DANDROIDCAST_HAVE_LIBVPX=1 -DANDROIDCAST_HAVE_OPUS=1 -DANDROIDCAST_HAVE_SPEEX=1 -Dandroidcast_codecs_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/jni\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/libvpx/vpx\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/opus/include\" -I\"/home/foxx/repos/My Projects/android cast/ndk/../third-party/speex/include\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=gnu11 -o CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/crash_hook.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/crash_hook.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=x86_64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -Dandroidcast_entitlements_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/obfuscate\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 -o CMakeFiles/androidcast_entitlements.dir/jni/entitlements_jni.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/jni/entitlements_jni.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/jni/entitlements_jni.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=x86_64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -Dandroidcast_entitlements_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/obfuscate\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 -o CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/obfuscate/obfuscate.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/obfuscate/obfuscate.c" +}, +{ + "directory": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64", + "command": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --target=x86_64-none-linux-android29 --sysroot=/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot -Dandroidcast_entitlements_EXPORTS -I\"/home/foxx/repos/My Projects/android cast/ndk/obfuscate\" -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -fPIC -std=c11 -Wall -Wextra -std=gnu11 -o CMakeFiles/androidcast_entitlements.dir/obfuscate/obfuscate_file.c.o -c \"/home/foxx/repos/My Projects/android cast/ndk/obfuscate/obfuscate_file.c\"", + "file": "/home/foxx/repos/My Projects/android cast/ndk/obfuscate/obfuscate_file.c" +} +] \ No newline at end of file diff --git a/app/.cxx/Debug/505h1w6m/x86_64/compile_commands.json.bin b/app/.cxx/Debug/505h1w6m/x86_64/compile_commands.json.bin new file mode 100644 index 0000000..cc6b137 Binary files /dev/null and b/app/.cxx/Debug/505h1w6m/x86_64/compile_commands.json.bin differ diff --git a/app/.cxx/Debug/505h1w6m/x86_64/configure_fingerprint.bin b/app/.cxx/Debug/505h1w6m/x86_64/configure_fingerprint.bin new file mode 100644 index 0000000..2388a8c --- /dev/null +++ b/app/.cxx/Debug/505h1w6m/x86_64/configure_fingerprint.bin @@ -0,0 +1,28 @@ +C/C++ Structured Logi +g +e/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/additional_project_files.txtC +A +?com.android.build.gradle.internal.cxx.io.EncodedFileFingerPrint  3  ̧3f +d +b/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/android_gradle_build.json  3 ̧3k +i +g/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/android_gradle_build_mini.json  3 ̧3X +V +T/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/build.ninja  3 ̧3\ +Z +X/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/build.ninja.txt  3a +_ +]/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/build_file_index.txt  3 < 3b +` +^/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/compile_commands.json  3D ̧3f +d +b/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/compile_commands.json.bin  3  ̧3l +j +h/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/metadata_generation_command.txt  3 + 3_ +] +[/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/prefab_config.json  3  ( 3d +b +`/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/symbol_folder_index.txt  3  _ 3@ +> += android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) { + data.enforceInterface(descriptor); + } + switch (code) + { + case INTERFACE_TRANSACTION: + { + reply.writeString(descriptor); + return true; + } + } + switch (code) + { + case TRANSACTION_registerCallback: + { + com.foxx.androidcast.ICastStatusCallback _arg0; + _arg0 = com.foxx.androidcast.ICastStatusCallback.Stub.asInterface(data.readStrongBinder()); + this.registerCallback(_arg0); + reply.writeNoException(); + break; + } + case TRANSACTION_unregisterCallback: + { + com.foxx.androidcast.ICastStatusCallback _arg0; + _arg0 = com.foxx.androidcast.ICastStatusCallback.Stub.asInterface(data.readStrongBinder()); + this.unregisterCallback(_arg0); + reply.writeNoException(); + break; + } + case TRANSACTION_getStatus: + { + java.lang.String _result = this.getStatus(); + reply.writeNoException(); + reply.writeString(_result); + break; + } + case TRANSACTION_attachVideoSurface: + { + android.view.Surface _arg0; + _arg0 = _Parcel.readTypedObject(data, android.view.Surface.CREATOR); + this.attachVideoSurface(_arg0); + reply.writeNoException(); + break; + } + case TRANSACTION_detachVideoSurface: + { + this.detachVideoSurface(); + reply.writeNoException(); + break; + } + case TRANSACTION_stopReceiving: + { + this.stopReceiving(); + reply.writeNoException(); + break; + } + case TRANSACTION_getDiagnosticsText: + { + java.lang.String _result = this.getDiagnosticsText(); + reply.writeNoException(); + reply.writeString(_result); + break; + } + default: + { + return super.onTransact(code, data, reply, flags); + } + } + return true; + } + private static class Proxy implements com.foxx.androidcast.ICastReceiverService + { + private android.os.IBinder mRemote; + Proxy(android.os.IBinder remote) + { + mRemote = remote; + } + @Override public android.os.IBinder asBinder() + { + return mRemote; + } + public java.lang.String getInterfaceDescriptor() + { + return DESCRIPTOR; + } + @Override public void registerCallback(com.foxx.androidcast.ICastStatusCallback callback) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeStrongInterface(callback); + boolean _status = mRemote.transact(Stub.TRANSACTION_registerCallback, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void unregisterCallback(com.foxx.androidcast.ICastStatusCallback callback) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeStrongInterface(callback); + boolean _status = mRemote.transact(Stub.TRANSACTION_unregisterCallback, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public java.lang.String getStatus() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + java.lang.String _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_getStatus, _data, _reply, 0); + _reply.readException(); + _result = _reply.readString(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + @Override public void attachVideoSurface(android.view.Surface surface) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _Parcel.writeTypedObject(_data, surface, 0); + boolean _status = mRemote.transact(Stub.TRANSACTION_attachVideoSurface, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void detachVideoSurface() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_detachVideoSurface, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void stopReceiving() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_stopReceiving, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public java.lang.String getDiagnosticsText() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + java.lang.String _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_getDiagnosticsText, _data, _reply, 0); + _reply.readException(); + _result = _reply.readString(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + } + static final int TRANSACTION_registerCallback = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); + static final int TRANSACTION_unregisterCallback = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); + static final int TRANSACTION_getStatus = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2); + static final int TRANSACTION_attachVideoSurface = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3); + static final int TRANSACTION_detachVideoSurface = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4); + static final int TRANSACTION_stopReceiving = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5); + static final int TRANSACTION_getDiagnosticsText = (android.os.IBinder.FIRST_CALL_TRANSACTION + 6); + } + public static final java.lang.String DESCRIPTOR = "com.foxx.androidcast.ICastReceiverService"; + public void registerCallback(com.foxx.androidcast.ICastStatusCallback callback) throws android.os.RemoteException; + public void unregisterCallback(com.foxx.androidcast.ICastStatusCallback callback) throws android.os.RemoteException; + public java.lang.String getStatus() throws android.os.RemoteException; + public void attachVideoSurface(android.view.Surface surface) throws android.os.RemoteException; + public void detachVideoSurface() throws android.os.RemoteException; + public void stopReceiving() throws android.os.RemoteException; + public java.lang.String getDiagnosticsText() throws android.os.RemoteException; + /** @hide */ + static class _Parcel { + static private T readTypedObject( + android.os.Parcel parcel, + android.os.Parcelable.Creator c) { + if (parcel.readInt() != 0) { + return c.createFromParcel(parcel); + } else { + return null; + } + } + static private void writeTypedObject( + android.os.Parcel parcel, T value, int parcelableFlags) { + if (value != null) { + parcel.writeInt(1); + value.writeToParcel(parcel, parcelableFlags); + } else { + parcel.writeInt(0); + } + } + } +} diff --git a/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/ICastSenderService.java b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/ICastSenderService.java new file mode 100644 index 0000000..ed54df3 --- /dev/null +++ b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/ICastSenderService.java @@ -0,0 +1,224 @@ +/* + * This file is auto-generated. DO NOT MODIFY. + */ +package com.foxx.androidcast; +public interface ICastSenderService extends android.os.IInterface +{ + /** Default implementation for ICastSenderService. */ + public static class Default implements com.foxx.androidcast.ICastSenderService + { + @Override public void registerCallback(com.foxx.androidcast.ICastStatusCallback callback) throws android.os.RemoteException + { + } + @Override public void unregisterCallback(com.foxx.androidcast.ICastStatusCallback callback) throws android.os.RemoteException + { + } + @Override public java.lang.String getStatus() throws android.os.RemoteException + { + return null; + } + @Override public boolean isCasting() throws android.os.RemoteException + { + return false; + } + @Override public void stopCasting() throws android.os.RemoteException + { + } + @Override + public android.os.IBinder asBinder() { + return null; + } + } + /** Local-side IPC implementation stub class. */ + public static abstract class Stub extends android.os.Binder implements com.foxx.androidcast.ICastSenderService + { + /** Construct the stub at attach it to the interface. */ + public Stub() + { + this.attachInterface(this, DESCRIPTOR); + } + /** + * Cast an IBinder object into an com.foxx.androidcast.ICastSenderService interface, + * generating a proxy if needed. + */ + public static com.foxx.androidcast.ICastSenderService asInterface(android.os.IBinder obj) + { + if ((obj==null)) { + return null; + } + android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); + if (((iin!=null)&&(iin instanceof com.foxx.androidcast.ICastSenderService))) { + return ((com.foxx.androidcast.ICastSenderService)iin); + } + return new com.foxx.androidcast.ICastSenderService.Stub.Proxy(obj); + } + @Override public android.os.IBinder asBinder() + { + return this; + } + @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException + { + java.lang.String descriptor = DESCRIPTOR; + if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) { + data.enforceInterface(descriptor); + } + switch (code) + { + case INTERFACE_TRANSACTION: + { + reply.writeString(descriptor); + return true; + } + } + switch (code) + { + case TRANSACTION_registerCallback: + { + com.foxx.androidcast.ICastStatusCallback _arg0; + _arg0 = com.foxx.androidcast.ICastStatusCallback.Stub.asInterface(data.readStrongBinder()); + this.registerCallback(_arg0); + reply.writeNoException(); + break; + } + case TRANSACTION_unregisterCallback: + { + com.foxx.androidcast.ICastStatusCallback _arg0; + _arg0 = com.foxx.androidcast.ICastStatusCallback.Stub.asInterface(data.readStrongBinder()); + this.unregisterCallback(_arg0); + reply.writeNoException(); + break; + } + case TRANSACTION_getStatus: + { + java.lang.String _result = this.getStatus(); + reply.writeNoException(); + reply.writeString(_result); + break; + } + case TRANSACTION_isCasting: + { + boolean _result = this.isCasting(); + reply.writeNoException(); + reply.writeInt(((_result)?(1):(0))); + break; + } + case TRANSACTION_stopCasting: + { + this.stopCasting(); + reply.writeNoException(); + break; + } + default: + { + return super.onTransact(code, data, reply, flags); + } + } + return true; + } + private static class Proxy implements com.foxx.androidcast.ICastSenderService + { + private android.os.IBinder mRemote; + Proxy(android.os.IBinder remote) + { + mRemote = remote; + } + @Override public android.os.IBinder asBinder() + { + return mRemote; + } + public java.lang.String getInterfaceDescriptor() + { + return DESCRIPTOR; + } + @Override public void registerCallback(com.foxx.androidcast.ICastStatusCallback callback) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeStrongInterface(callback); + boolean _status = mRemote.transact(Stub.TRANSACTION_registerCallback, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void unregisterCallback(com.foxx.androidcast.ICastStatusCallback callback) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeStrongInterface(callback); + boolean _status = mRemote.transact(Stub.TRANSACTION_unregisterCallback, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public java.lang.String getStatus() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + java.lang.String _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_getStatus, _data, _reply, 0); + _reply.readException(); + _result = _reply.readString(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + @Override public boolean isCasting() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + boolean _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_isCasting, _data, _reply, 0); + _reply.readException(); + _result = (0!=_reply.readInt()); + } + finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + @Override public void stopCasting() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_stopCasting, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + } + static final int TRANSACTION_registerCallback = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); + static final int TRANSACTION_unregisterCallback = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); + static final int TRANSACTION_getStatus = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2); + static final int TRANSACTION_isCasting = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3); + static final int TRANSACTION_stopCasting = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4); + } + public static final java.lang.String DESCRIPTOR = "com.foxx.androidcast.ICastSenderService"; + public void registerCallback(com.foxx.androidcast.ICastStatusCallback callback) throws android.os.RemoteException; + public void unregisterCallback(com.foxx.androidcast.ICastStatusCallback callback) throws android.os.RemoteException; + public java.lang.String getStatus() throws android.os.RemoteException; + public boolean isCasting() throws android.os.RemoteException; + public void stopCasting() throws android.os.RemoteException; +} diff --git a/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/ICastStatusCallback.java b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/ICastStatusCallback.java new file mode 100644 index 0000000..b595064 --- /dev/null +++ b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/ICastStatusCallback.java @@ -0,0 +1,258 @@ +/* + * This file is auto-generated. DO NOT MODIFY. + */ +package com.foxx.androidcast; +/** + * ******************************************************************* + * ICastStatusCallback.aidl + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * interface ICastStatusCallback + * Contributors: + * - Anton Afanasyeu (4 commits, 17 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 79f92d714d03f17af1c4b83280397518976e2fe3f4c4940de60faf655243dd5a + * ******************************************************************** + */ +public interface ICastStatusCallback extends android.os.IInterface +{ + /** Default implementation for ICastStatusCallback. */ + public static class Default implements com.foxx.androidcast.ICastStatusCallback + { + @Override public void onStatus(java.lang.String status) throws android.os.RemoteException + { + } + @Override public void onAuthenticated(java.lang.String senderName) throws android.os.RemoteException + { + } + @Override public void onStreamStarted(int width, int height) throws android.os.RemoteException + { + } + @Override public void onVideoRendering() throws android.os.RemoteException + { + } + @Override public void onStreamIdle() throws android.os.RemoteException + { + } + @Override public void onDisconnected() throws android.os.RemoteException + { + } + @Override + public android.os.IBinder asBinder() { + return null; + } + } + /** Local-side IPC implementation stub class. */ + public static abstract class Stub extends android.os.Binder implements com.foxx.androidcast.ICastStatusCallback + { + /** Construct the stub at attach it to the interface. */ + public Stub() + { + this.attachInterface(this, DESCRIPTOR); + } + /** + * Cast an IBinder object into an com.foxx.androidcast.ICastStatusCallback interface, + * generating a proxy if needed. + */ + public static com.foxx.androidcast.ICastStatusCallback asInterface(android.os.IBinder obj) + { + if ((obj==null)) { + return null; + } + android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); + if (((iin!=null)&&(iin instanceof com.foxx.androidcast.ICastStatusCallback))) { + return ((com.foxx.androidcast.ICastStatusCallback)iin); + } + return new com.foxx.androidcast.ICastStatusCallback.Stub.Proxy(obj); + } + @Override public android.os.IBinder asBinder() + { + return this; + } + @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException + { + java.lang.String descriptor = DESCRIPTOR; + if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) { + data.enforceInterface(descriptor); + } + switch (code) + { + case INTERFACE_TRANSACTION: + { + reply.writeString(descriptor); + return true; + } + } + switch (code) + { + case TRANSACTION_onStatus: + { + java.lang.String _arg0; + _arg0 = data.readString(); + this.onStatus(_arg0); + reply.writeNoException(); + break; + } + case TRANSACTION_onAuthenticated: + { + java.lang.String _arg0; + _arg0 = data.readString(); + this.onAuthenticated(_arg0); + reply.writeNoException(); + break; + } + case TRANSACTION_onStreamStarted: + { + int _arg0; + _arg0 = data.readInt(); + int _arg1; + _arg1 = data.readInt(); + this.onStreamStarted(_arg0, _arg1); + reply.writeNoException(); + break; + } + case TRANSACTION_onVideoRendering: + { + this.onVideoRendering(); + reply.writeNoException(); + break; + } + case TRANSACTION_onStreamIdle: + { + this.onStreamIdle(); + reply.writeNoException(); + break; + } + case TRANSACTION_onDisconnected: + { + this.onDisconnected(); + reply.writeNoException(); + break; + } + default: + { + return super.onTransact(code, data, reply, flags); + } + } + return true; + } + private static class Proxy implements com.foxx.androidcast.ICastStatusCallback + { + private android.os.IBinder mRemote; + Proxy(android.os.IBinder remote) + { + mRemote = remote; + } + @Override public android.os.IBinder asBinder() + { + return mRemote; + } + public java.lang.String getInterfaceDescriptor() + { + return DESCRIPTOR; + } + @Override public void onStatus(java.lang.String status) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeString(status); + boolean _status = mRemote.transact(Stub.TRANSACTION_onStatus, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void onAuthenticated(java.lang.String senderName) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeString(senderName); + boolean _status = mRemote.transact(Stub.TRANSACTION_onAuthenticated, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void onStreamStarted(int width, int height) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeInt(width); + _data.writeInt(height); + boolean _status = mRemote.transact(Stub.TRANSACTION_onStreamStarted, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void onVideoRendering() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_onVideoRendering, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void onStreamIdle() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_onStreamIdle, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void onDisconnected() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_onDisconnected, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + } + static final int TRANSACTION_onStatus = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); + static final int TRANSACTION_onAuthenticated = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); + static final int TRANSACTION_onStreamStarted = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2); + static final int TRANSACTION_onVideoRendering = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3); + static final int TRANSACTION_onStreamIdle = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4); + static final int TRANSACTION_onDisconnected = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5); + } + public static final java.lang.String DESCRIPTOR = "com.foxx.androidcast.ICastStatusCallback"; + public void onStatus(java.lang.String status) throws android.os.RemoteException; + public void onAuthenticated(java.lang.String senderName) throws android.os.RemoteException; + public void onStreamStarted(int width, int height) throws android.os.RemoteException; + public void onVideoRendering() throws android.os.RemoteException; + public void onStreamIdle() throws android.os.RemoteException; + public void onDisconnected() throws android.os.RemoteException; +} diff --git a/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/INetworkChangeListener.java b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/INetworkChangeListener.java new file mode 100644 index 0000000..f37154e --- /dev/null +++ b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/INetworkChangeListener.java @@ -0,0 +1,132 @@ +/* + * This file is auto-generated. DO NOT MODIFY. + */ +package com.foxx.androidcast; +public interface INetworkChangeListener extends android.os.IInterface +{ + /** Default implementation for INetworkChangeListener. */ + public static class Default implements com.foxx.androidcast.INetworkChangeListener + { + @Override public void onNetworkConditionChange(com.foxx.androidcast.NetworkConditions aidlNetworkConditions) throws android.os.RemoteException + { + } + @Override + public android.os.IBinder asBinder() { + return null; + } + } + /** Local-side IPC implementation stub class. */ + public static abstract class Stub extends android.os.Binder implements com.foxx.androidcast.INetworkChangeListener + { + /** Construct the stub at attach it to the interface. */ + public Stub() + { + this.attachInterface(this, DESCRIPTOR); + } + /** + * Cast an IBinder object into an com.foxx.androidcast.INetworkChangeListener interface, + * generating a proxy if needed. + */ + public static com.foxx.androidcast.INetworkChangeListener asInterface(android.os.IBinder obj) + { + if ((obj==null)) { + return null; + } + android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); + if (((iin!=null)&&(iin instanceof com.foxx.androidcast.INetworkChangeListener))) { + return ((com.foxx.androidcast.INetworkChangeListener)iin); + } + return new com.foxx.androidcast.INetworkChangeListener.Stub.Proxy(obj); + } + @Override public android.os.IBinder asBinder() + { + return this; + } + @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException + { + java.lang.String descriptor = DESCRIPTOR; + if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) { + data.enforceInterface(descriptor); + } + switch (code) + { + case INTERFACE_TRANSACTION: + { + reply.writeString(descriptor); + return true; + } + } + switch (code) + { + case TRANSACTION_onNetworkConditionChange: + { + com.foxx.androidcast.NetworkConditions _arg0; + _arg0 = _Parcel.readTypedObject(data, com.foxx.androidcast.NetworkConditions.CREATOR); + this.onNetworkConditionChange(_arg0); + reply.writeNoException(); + break; + } + default: + { + return super.onTransact(code, data, reply, flags); + } + } + return true; + } + private static class Proxy implements com.foxx.androidcast.INetworkChangeListener + { + private android.os.IBinder mRemote; + Proxy(android.os.IBinder remote) + { + mRemote = remote; + } + @Override public android.os.IBinder asBinder() + { + return mRemote; + } + public java.lang.String getInterfaceDescriptor() + { + return DESCRIPTOR; + } + @Override public void onNetworkConditionChange(com.foxx.androidcast.NetworkConditions aidlNetworkConditions) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _Parcel.writeTypedObject(_data, aidlNetworkConditions, 0); + boolean _status = mRemote.transact(Stub.TRANSACTION_onNetworkConditionChange, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + } + static final int TRANSACTION_onNetworkConditionChange = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); + } + public static final java.lang.String DESCRIPTOR = "com.foxx.androidcast.INetworkChangeListener"; + public void onNetworkConditionChange(com.foxx.androidcast.NetworkConditions aidlNetworkConditions) throws android.os.RemoteException; + /** @hide */ + static class _Parcel { + static private T readTypedObject( + android.os.Parcel parcel, + android.os.Parcelable.Creator c) { + if (parcel.readInt() != 0) { + return c.createFromParcel(parcel); + } else { + return null; + } + } + static private void writeTypedObject( + android.os.Parcel parcel, T value, int parcelableFlags) { + if (value != null) { + parcel.writeInt(1); + value.writeToParcel(parcel, parcelableFlags); + } else { + parcel.writeInt(0); + } + } + } +} diff --git a/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/INetworkSelfTestService.java b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/INetworkSelfTestService.java new file mode 100644 index 0000000..a814dde --- /dev/null +++ b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/INetworkSelfTestService.java @@ -0,0 +1,353 @@ +/* + * This file is auto-generated. DO NOT MODIFY. + */ +package com.foxx.androidcast; +public interface INetworkSelfTestService extends android.os.IInterface +{ + /** Default implementation for INetworkSelfTestService. */ + public static class Default implements com.foxx.androidcast.INetworkSelfTestService + { + @Override public com.foxx.androidcast.NetworkConditions getCachedConditions() throws android.os.RemoteException + { + return null; + } + @Override public void requestRefresh() throws android.os.RemoteException + { + } + @Override public boolean isRefreshing() throws android.os.RemoteException + { + return false; + } + @Override public void addListener(com.foxx.androidcast.INetworkChangeListener listener) throws android.os.RemoteException + { + } + @Override public void removeListener(com.foxx.androidcast.INetworkChangeListener listener) throws android.os.RemoteException + { + } + @Override public void startCapture() throws android.os.RemoteException + { + } + @Override public void stopCapture() throws android.os.RemoteException + { + } + @Override public void setPeriodicIntervalMinutes(int minutes) throws android.os.RemoteException + { + } + @Override public int getPeriodicIntervalMinutes() throws android.os.RemoteException + { + return 0; + } + @Override + public android.os.IBinder asBinder() { + return null; + } + } + /** Local-side IPC implementation stub class. */ + public static abstract class Stub extends android.os.Binder implements com.foxx.androidcast.INetworkSelfTestService + { + /** Construct the stub at attach it to the interface. */ + public Stub() + { + this.attachInterface(this, DESCRIPTOR); + } + /** + * Cast an IBinder object into an com.foxx.androidcast.INetworkSelfTestService interface, + * generating a proxy if needed. + */ + public static com.foxx.androidcast.INetworkSelfTestService asInterface(android.os.IBinder obj) + { + if ((obj==null)) { + return null; + } + android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); + if (((iin!=null)&&(iin instanceof com.foxx.androidcast.INetworkSelfTestService))) { + return ((com.foxx.androidcast.INetworkSelfTestService)iin); + } + return new com.foxx.androidcast.INetworkSelfTestService.Stub.Proxy(obj); + } + @Override public android.os.IBinder asBinder() + { + return this; + } + @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException + { + java.lang.String descriptor = DESCRIPTOR; + if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) { + data.enforceInterface(descriptor); + } + switch (code) + { + case INTERFACE_TRANSACTION: + { + reply.writeString(descriptor); + return true; + } + } + switch (code) + { + case TRANSACTION_getCachedConditions: + { + com.foxx.androidcast.NetworkConditions _result = this.getCachedConditions(); + reply.writeNoException(); + _Parcel.writeTypedObject(reply, _result, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); + break; + } + case TRANSACTION_requestRefresh: + { + this.requestRefresh(); + reply.writeNoException(); + break; + } + case TRANSACTION_isRefreshing: + { + boolean _result = this.isRefreshing(); + reply.writeNoException(); + reply.writeInt(((_result)?(1):(0))); + break; + } + case TRANSACTION_addListener: + { + com.foxx.androidcast.INetworkChangeListener _arg0; + _arg0 = com.foxx.androidcast.INetworkChangeListener.Stub.asInterface(data.readStrongBinder()); + this.addListener(_arg0); + reply.writeNoException(); + break; + } + case TRANSACTION_removeListener: + { + com.foxx.androidcast.INetworkChangeListener _arg0; + _arg0 = com.foxx.androidcast.INetworkChangeListener.Stub.asInterface(data.readStrongBinder()); + this.removeListener(_arg0); + reply.writeNoException(); + break; + } + case TRANSACTION_startCapture: + { + this.startCapture(); + reply.writeNoException(); + break; + } + case TRANSACTION_stopCapture: + { + this.stopCapture(); + reply.writeNoException(); + break; + } + case TRANSACTION_setPeriodicIntervalMinutes: + { + int _arg0; + _arg0 = data.readInt(); + this.setPeriodicIntervalMinutes(_arg0); + reply.writeNoException(); + break; + } + case TRANSACTION_getPeriodicIntervalMinutes: + { + int _result = this.getPeriodicIntervalMinutes(); + reply.writeNoException(); + reply.writeInt(_result); + break; + } + default: + { + return super.onTransact(code, data, reply, flags); + } + } + return true; + } + private static class Proxy implements com.foxx.androidcast.INetworkSelfTestService + { + private android.os.IBinder mRemote; + Proxy(android.os.IBinder remote) + { + mRemote = remote; + } + @Override public android.os.IBinder asBinder() + { + return mRemote; + } + public java.lang.String getInterfaceDescriptor() + { + return DESCRIPTOR; + } + @Override public com.foxx.androidcast.NetworkConditions getCachedConditions() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + com.foxx.androidcast.NetworkConditions _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_getCachedConditions, _data, _reply, 0); + _reply.readException(); + _result = _Parcel.readTypedObject(_reply, com.foxx.androidcast.NetworkConditions.CREATOR); + } + finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + @Override public void requestRefresh() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_requestRefresh, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public boolean isRefreshing() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + boolean _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_isRefreshing, _data, _reply, 0); + _reply.readException(); + _result = (0!=_reply.readInt()); + } + finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + @Override public void addListener(com.foxx.androidcast.INetworkChangeListener listener) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeStrongInterface(listener); + boolean _status = mRemote.transact(Stub.TRANSACTION_addListener, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void removeListener(com.foxx.androidcast.INetworkChangeListener listener) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeStrongInterface(listener); + boolean _status = mRemote.transact(Stub.TRANSACTION_removeListener, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void startCapture() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_startCapture, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void stopCapture() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_stopCapture, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void setPeriodicIntervalMinutes(int minutes) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeInt(minutes); + boolean _status = mRemote.transact(Stub.TRANSACTION_setPeriodicIntervalMinutes, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public int getPeriodicIntervalMinutes() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + int _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_getPeriodicIntervalMinutes, _data, _reply, 0); + _reply.readException(); + _result = _reply.readInt(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + } + static final int TRANSACTION_getCachedConditions = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); + static final int TRANSACTION_requestRefresh = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); + static final int TRANSACTION_isRefreshing = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2); + static final int TRANSACTION_addListener = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3); + static final int TRANSACTION_removeListener = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4); + static final int TRANSACTION_startCapture = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5); + static final int TRANSACTION_stopCapture = (android.os.IBinder.FIRST_CALL_TRANSACTION + 6); + static final int TRANSACTION_setPeriodicIntervalMinutes = (android.os.IBinder.FIRST_CALL_TRANSACTION + 7); + static final int TRANSACTION_getPeriodicIntervalMinutes = (android.os.IBinder.FIRST_CALL_TRANSACTION + 8); + } + public static final java.lang.String DESCRIPTOR = "com.foxx.androidcast.INetworkSelfTestService"; + public com.foxx.androidcast.NetworkConditions getCachedConditions() throws android.os.RemoteException; + public void requestRefresh() throws android.os.RemoteException; + public boolean isRefreshing() throws android.os.RemoteException; + public void addListener(com.foxx.androidcast.INetworkChangeListener listener) throws android.os.RemoteException; + public void removeListener(com.foxx.androidcast.INetworkChangeListener listener) throws android.os.RemoteException; + public void startCapture() throws android.os.RemoteException; + public void stopCapture() throws android.os.RemoteException; + public void setPeriodicIntervalMinutes(int minutes) throws android.os.RemoteException; + public int getPeriodicIntervalMinutes() throws android.os.RemoteException; + /** @hide */ + static class _Parcel { + static private T readTypedObject( + android.os.Parcel parcel, + android.os.Parcelable.Creator c) { + if (parcel.readInt() != 0) { + return c.createFromParcel(parcel); + } else { + return null; + } + } + static private void writeTypedObject( + android.os.Parcel parcel, T value, int parcelableFlags) { + if (value != null) { + parcel.writeInt(1); + value.writeToParcel(parcel, parcelableFlags); + } else { + parcel.writeInt(0); + } + } + } +} diff --git a/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/IRemoteAccessControlHost.java b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/IRemoteAccessControlHost.java new file mode 100644 index 0000000..df52ca8 --- /dev/null +++ b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/IRemoteAccessControlHost.java @@ -0,0 +1,177 @@ +/* + * This file is auto-generated. DO NOT MODIFY. + */ +package com.foxx.androidcast; +/** Main-process bridge: settings reads/writes and diagnostics for the RA control HTTP UI. */ +public interface IRemoteAccessControlHost extends android.os.IInterface +{ + /** Default implementation for IRemoteAccessControlHost. */ + public static class Default implements com.foxx.androidcast.IRemoteAccessControlHost + { + @Override public java.lang.String getSettingsJson() throws android.os.RemoteException + { + return null; + } + @Override public java.lang.String applySettingsJson(java.lang.String bodyJson) throws android.os.RemoteException + { + return null; + } + @Override public java.lang.String getInternalsJson() throws android.os.RemoteException + { + return null; + } + @Override + public android.os.IBinder asBinder() { + return null; + } + } + /** Local-side IPC implementation stub class. */ + public static abstract class Stub extends android.os.Binder implements com.foxx.androidcast.IRemoteAccessControlHost + { + /** Construct the stub at attach it to the interface. */ + public Stub() + { + this.attachInterface(this, DESCRIPTOR); + } + /** + * Cast an IBinder object into an com.foxx.androidcast.IRemoteAccessControlHost interface, + * generating a proxy if needed. + */ + public static com.foxx.androidcast.IRemoteAccessControlHost asInterface(android.os.IBinder obj) + { + if ((obj==null)) { + return null; + } + android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); + if (((iin!=null)&&(iin instanceof com.foxx.androidcast.IRemoteAccessControlHost))) { + return ((com.foxx.androidcast.IRemoteAccessControlHost)iin); + } + return new com.foxx.androidcast.IRemoteAccessControlHost.Stub.Proxy(obj); + } + @Override public android.os.IBinder asBinder() + { + return this; + } + @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException + { + java.lang.String descriptor = DESCRIPTOR; + if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) { + data.enforceInterface(descriptor); + } + switch (code) + { + case INTERFACE_TRANSACTION: + { + reply.writeString(descriptor); + return true; + } + } + switch (code) + { + case TRANSACTION_getSettingsJson: + { + java.lang.String _result = this.getSettingsJson(); + reply.writeNoException(); + reply.writeString(_result); + break; + } + case TRANSACTION_applySettingsJson: + { + java.lang.String _arg0; + _arg0 = data.readString(); + java.lang.String _result = this.applySettingsJson(_arg0); + reply.writeNoException(); + reply.writeString(_result); + break; + } + case TRANSACTION_getInternalsJson: + { + java.lang.String _result = this.getInternalsJson(); + reply.writeNoException(); + reply.writeString(_result); + break; + } + default: + { + return super.onTransact(code, data, reply, flags); + } + } + return true; + } + private static class Proxy implements com.foxx.androidcast.IRemoteAccessControlHost + { + private android.os.IBinder mRemote; + Proxy(android.os.IBinder remote) + { + mRemote = remote; + } + @Override public android.os.IBinder asBinder() + { + return mRemote; + } + public java.lang.String getInterfaceDescriptor() + { + return DESCRIPTOR; + } + @Override public java.lang.String getSettingsJson() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + java.lang.String _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_getSettingsJson, _data, _reply, 0); + _reply.readException(); + _result = _reply.readString(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + @Override public java.lang.String applySettingsJson(java.lang.String bodyJson) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + java.lang.String _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeString(bodyJson); + boolean _status = mRemote.transact(Stub.TRANSACTION_applySettingsJson, _data, _reply, 0); + _reply.readException(); + _result = _reply.readString(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + @Override public java.lang.String getInternalsJson() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + java.lang.String _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_getInternalsJson, _data, _reply, 0); + _reply.readException(); + _result = _reply.readString(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + } + static final int TRANSACTION_getSettingsJson = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); + static final int TRANSACTION_applySettingsJson = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); + static final int TRANSACTION_getInternalsJson = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2); + } + public static final java.lang.String DESCRIPTOR = "com.foxx.androidcast.IRemoteAccessControlHost"; + public java.lang.String getSettingsJson() throws android.os.RemoteException; + public java.lang.String applySettingsJson(java.lang.String bodyJson) throws android.os.RemoteException; + public java.lang.String getInternalsJson() throws android.os.RemoteException; +} diff --git a/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/IRemoteAccessControlService.java b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/IRemoteAccessControlService.java new file mode 100644 index 0000000..19d90aa --- /dev/null +++ b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/IRemoteAccessControlService.java @@ -0,0 +1,286 @@ +/* + * This file is auto-generated. DO NOT MODIFY. + */ +package com.foxx.androidcast; +/** + * Standalone RA control plane ({@code com.foxx.androidcast:ra_control}). + * Serves template HTTP UI + WebSocket shell; prefs via {@link IRemoteAccessControlHost}. + */ +public interface IRemoteAccessControlService extends android.os.IInterface +{ + /** Default implementation for IRemoteAccessControlService. */ + public static class Default implements com.foxx.androidcast.IRemoteAccessControlService + { + @Override public void registerHost(com.foxx.androidcast.IRemoteAccessControlHost host) throws android.os.RemoteException + { + } + @Override public void unregisterHost() throws android.os.RemoteException + { + } + @Override public void start(com.foxx.androidcast.IVpnOperationCallback callback) throws android.os.RemoteException + { + } + @Override public void stop(com.foxx.androidcast.IVpnOperationCallback callback) throws android.os.RemoteException + { + } + @Override public boolean isRunning() throws android.os.RemoteException + { + return false; + } + @Override public int getListenPort() throws android.os.RemoteException + { + return 0; + } + @Override public java.lang.String getAuthToken() throws android.os.RemoteException + { + return null; + } + @Override + public android.os.IBinder asBinder() { + return null; + } + } + /** Local-side IPC implementation stub class. */ + public static abstract class Stub extends android.os.Binder implements com.foxx.androidcast.IRemoteAccessControlService + { + /** Construct the stub at attach it to the interface. */ + public Stub() + { + this.attachInterface(this, DESCRIPTOR); + } + /** + * Cast an IBinder object into an com.foxx.androidcast.IRemoteAccessControlService interface, + * generating a proxy if needed. + */ + public static com.foxx.androidcast.IRemoteAccessControlService asInterface(android.os.IBinder obj) + { + if ((obj==null)) { + return null; + } + android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); + if (((iin!=null)&&(iin instanceof com.foxx.androidcast.IRemoteAccessControlService))) { + return ((com.foxx.androidcast.IRemoteAccessControlService)iin); + } + return new com.foxx.androidcast.IRemoteAccessControlService.Stub.Proxy(obj); + } + @Override public android.os.IBinder asBinder() + { + return this; + } + @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException + { + java.lang.String descriptor = DESCRIPTOR; + if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) { + data.enforceInterface(descriptor); + } + switch (code) + { + case INTERFACE_TRANSACTION: + { + reply.writeString(descriptor); + return true; + } + } + switch (code) + { + case TRANSACTION_registerHost: + { + com.foxx.androidcast.IRemoteAccessControlHost _arg0; + _arg0 = com.foxx.androidcast.IRemoteAccessControlHost.Stub.asInterface(data.readStrongBinder()); + this.registerHost(_arg0); + reply.writeNoException(); + break; + } + case TRANSACTION_unregisterHost: + { + this.unregisterHost(); + reply.writeNoException(); + break; + } + case TRANSACTION_start: + { + com.foxx.androidcast.IVpnOperationCallback _arg0; + _arg0 = com.foxx.androidcast.IVpnOperationCallback.Stub.asInterface(data.readStrongBinder()); + this.start(_arg0); + reply.writeNoException(); + break; + } + case TRANSACTION_stop: + { + com.foxx.androidcast.IVpnOperationCallback _arg0; + _arg0 = com.foxx.androidcast.IVpnOperationCallback.Stub.asInterface(data.readStrongBinder()); + this.stop(_arg0); + reply.writeNoException(); + break; + } + case TRANSACTION_isRunning: + { + boolean _result = this.isRunning(); + reply.writeNoException(); + reply.writeInt(((_result)?(1):(0))); + break; + } + case TRANSACTION_getListenPort: + { + int _result = this.getListenPort(); + reply.writeNoException(); + reply.writeInt(_result); + break; + } + case TRANSACTION_getAuthToken: + { + java.lang.String _result = this.getAuthToken(); + reply.writeNoException(); + reply.writeString(_result); + break; + } + default: + { + return super.onTransact(code, data, reply, flags); + } + } + return true; + } + private static class Proxy implements com.foxx.androidcast.IRemoteAccessControlService + { + private android.os.IBinder mRemote; + Proxy(android.os.IBinder remote) + { + mRemote = remote; + } + @Override public android.os.IBinder asBinder() + { + return mRemote; + } + public java.lang.String getInterfaceDescriptor() + { + return DESCRIPTOR; + } + @Override public void registerHost(com.foxx.androidcast.IRemoteAccessControlHost host) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeStrongInterface(host); + boolean _status = mRemote.transact(Stub.TRANSACTION_registerHost, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void unregisterHost() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_unregisterHost, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void start(com.foxx.androidcast.IVpnOperationCallback callback) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeStrongInterface(callback); + boolean _status = mRemote.transact(Stub.TRANSACTION_start, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void stop(com.foxx.androidcast.IVpnOperationCallback callback) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeStrongInterface(callback); + boolean _status = mRemote.transact(Stub.TRANSACTION_stop, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public boolean isRunning() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + boolean _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_isRunning, _data, _reply, 0); + _reply.readException(); + _result = (0!=_reply.readInt()); + } + finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + @Override public int getListenPort() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + int _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_getListenPort, _data, _reply, 0); + _reply.readException(); + _result = _reply.readInt(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + @Override public java.lang.String getAuthToken() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + java.lang.String _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_getAuthToken, _data, _reply, 0); + _reply.readException(); + _result = _reply.readString(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + } + static final int TRANSACTION_registerHost = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); + static final int TRANSACTION_unregisterHost = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); + static final int TRANSACTION_start = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2); + static final int TRANSACTION_stop = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3); + static final int TRANSACTION_isRunning = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4); + static final int TRANSACTION_getListenPort = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5); + static final int TRANSACTION_getAuthToken = (android.os.IBinder.FIRST_CALL_TRANSACTION + 6); + } + public static final java.lang.String DESCRIPTOR = "com.foxx.androidcast.IRemoteAccessControlService"; + public void registerHost(com.foxx.androidcast.IRemoteAccessControlHost host) throws android.os.RemoteException; + public void unregisterHost() throws android.os.RemoteException; + public void start(com.foxx.androidcast.IVpnOperationCallback callback) throws android.os.RemoteException; + public void stop(com.foxx.androidcast.IVpnOperationCallback callback) throws android.os.RemoteException; + public boolean isRunning() throws android.os.RemoteException; + public int getListenPort() throws android.os.RemoteException; + public java.lang.String getAuthToken() throws android.os.RemoteException; +} diff --git a/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/IVpnOperationCallback.java b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/IVpnOperationCallback.java new file mode 100644 index 0000000..fc2e408 --- /dev/null +++ b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/IVpnOperationCallback.java @@ -0,0 +1,129 @@ +/* + * This file is auto-generated. DO NOT MODIFY. + */ +package com.foxx.androidcast; +/** One-shot result for apply / tearDown. */ +public interface IVpnOperationCallback extends android.os.IInterface +{ + /** Default implementation for IVpnOperationCallback. */ + public static class Default implements com.foxx.androidcast.IVpnOperationCallback + { + @Override public void onSuccess() throws android.os.RemoteException + { + } + @Override public void onFailure(java.lang.String reason) throws android.os.RemoteException + { + } + @Override + public android.os.IBinder asBinder() { + return null; + } + } + /** Local-side IPC implementation stub class. */ + public static abstract class Stub extends android.os.Binder implements com.foxx.androidcast.IVpnOperationCallback + { + /** Construct the stub at attach it to the interface. */ + public Stub() + { + this.attachInterface(this, DESCRIPTOR); + } + /** + * Cast an IBinder object into an com.foxx.androidcast.IVpnOperationCallback interface, + * generating a proxy if needed. + */ + public static com.foxx.androidcast.IVpnOperationCallback asInterface(android.os.IBinder obj) + { + if ((obj==null)) { + return null; + } + android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); + if (((iin!=null)&&(iin instanceof com.foxx.androidcast.IVpnOperationCallback))) { + return ((com.foxx.androidcast.IVpnOperationCallback)iin); + } + return new com.foxx.androidcast.IVpnOperationCallback.Stub.Proxy(obj); + } + @Override public android.os.IBinder asBinder() + { + return this; + } + @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException + { + java.lang.String descriptor = DESCRIPTOR; + if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) { + data.enforceInterface(descriptor); + } + switch (code) + { + case INTERFACE_TRANSACTION: + { + reply.writeString(descriptor); + return true; + } + } + switch (code) + { + case TRANSACTION_onSuccess: + { + this.onSuccess(); + break; + } + case TRANSACTION_onFailure: + { + java.lang.String _arg0; + _arg0 = data.readString(); + this.onFailure(_arg0); + break; + } + default: + { + return super.onTransact(code, data, reply, flags); + } + } + return true; + } + private static class Proxy implements com.foxx.androidcast.IVpnOperationCallback + { + private android.os.IBinder mRemote; + Proxy(android.os.IBinder remote) + { + mRemote = remote; + } + @Override public android.os.IBinder asBinder() + { + return mRemote; + } + public java.lang.String getInterfaceDescriptor() + { + return DESCRIPTOR; + } + @Override public void onSuccess() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_onSuccess, _data, null, android.os.IBinder.FLAG_ONEWAY); + } + finally { + _data.recycle(); + } + } + @Override public void onFailure(java.lang.String reason) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeString(reason); + boolean _status = mRemote.transact(Stub.TRANSACTION_onFailure, _data, null, android.os.IBinder.FLAG_ONEWAY); + } + finally { + _data.recycle(); + } + } + } + static final int TRANSACTION_onSuccess = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); + static final int TRANSACTION_onFailure = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); + } + public static final java.lang.String DESCRIPTOR = "com.foxx.androidcast.IVpnOperationCallback"; + public void onSuccess() throws android.os.RemoteException; + public void onFailure(java.lang.String reason) throws android.os.RemoteException; +} diff --git a/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/IVpnService.java b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/IVpnService.java new file mode 100644 index 0000000..bdbbc1f --- /dev/null +++ b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/IVpnService.java @@ -0,0 +1,326 @@ +/* + * This file is auto-generated. DO NOT MODIFY. + */ +package com.foxx.androidcast; +/** + * Standalone VPN control plane (process com.foxx.androidcast:vpn). + * WireGuard userspace + TUN fallback run only in the VPN process. + */ +public interface IVpnService extends android.os.IInterface +{ + /** Default implementation for IVpnService. */ + public static class Default implements com.foxx.androidcast.IVpnService + { + @Override public void registerStateCallback(com.foxx.androidcast.IVpnStateCallback callback) throws android.os.RemoteException + { + } + @Override public void unregisterStateCallback(com.foxx.androidcast.IVpnStateCallback callback) throws android.os.RemoteException + { + } + @Override public int getState() throws android.os.RemoteException + { + return 0; + } + @Override public java.lang.String getStateDetail() throws android.os.RemoteException + { + return null; + } + @Override public boolean isVpnPermissionGranted() throws android.os.RemoteException + { + return false; + } + @Override public void applyWireGuardConfig(java.lang.String wgQuickConfig, com.foxx.androidcast.IVpnOperationCallback callback) throws android.os.RemoteException + { + } + @Override public void tearDown(com.foxx.androidcast.IVpnOperationCallback callback) throws android.os.RemoteException + { + } + /** Debug/lab only — records a synthetic crash from the VPN process (no process kill). */ + @Override public void simulateCrashForTest(int sequence, com.foxx.androidcast.IVpnOperationCallback callback) throws android.os.RemoteException + { + } + @Override + public android.os.IBinder asBinder() { + return null; + } + } + /** Local-side IPC implementation stub class. */ + public static abstract class Stub extends android.os.Binder implements com.foxx.androidcast.IVpnService + { + /** Construct the stub at attach it to the interface. */ + public Stub() + { + this.attachInterface(this, DESCRIPTOR); + } + /** + * Cast an IBinder object into an com.foxx.androidcast.IVpnService interface, + * generating a proxy if needed. + */ + public static com.foxx.androidcast.IVpnService asInterface(android.os.IBinder obj) + { + if ((obj==null)) { + return null; + } + android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); + if (((iin!=null)&&(iin instanceof com.foxx.androidcast.IVpnService))) { + return ((com.foxx.androidcast.IVpnService)iin); + } + return new com.foxx.androidcast.IVpnService.Stub.Proxy(obj); + } + @Override public android.os.IBinder asBinder() + { + return this; + } + @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException + { + java.lang.String descriptor = DESCRIPTOR; + if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) { + data.enforceInterface(descriptor); + } + switch (code) + { + case INTERFACE_TRANSACTION: + { + reply.writeString(descriptor); + return true; + } + } + switch (code) + { + case TRANSACTION_registerStateCallback: + { + com.foxx.androidcast.IVpnStateCallback _arg0; + _arg0 = com.foxx.androidcast.IVpnStateCallback.Stub.asInterface(data.readStrongBinder()); + this.registerStateCallback(_arg0); + reply.writeNoException(); + break; + } + case TRANSACTION_unregisterStateCallback: + { + com.foxx.androidcast.IVpnStateCallback _arg0; + _arg0 = com.foxx.androidcast.IVpnStateCallback.Stub.asInterface(data.readStrongBinder()); + this.unregisterStateCallback(_arg0); + reply.writeNoException(); + break; + } + case TRANSACTION_getState: + { + int _result = this.getState(); + reply.writeNoException(); + reply.writeInt(_result); + break; + } + case TRANSACTION_getStateDetail: + { + java.lang.String _result = this.getStateDetail(); + reply.writeNoException(); + reply.writeString(_result); + break; + } + case TRANSACTION_isVpnPermissionGranted: + { + boolean _result = this.isVpnPermissionGranted(); + reply.writeNoException(); + reply.writeInt(((_result)?(1):(0))); + break; + } + case TRANSACTION_applyWireGuardConfig: + { + java.lang.String _arg0; + _arg0 = data.readString(); + com.foxx.androidcast.IVpnOperationCallback _arg1; + _arg1 = com.foxx.androidcast.IVpnOperationCallback.Stub.asInterface(data.readStrongBinder()); + this.applyWireGuardConfig(_arg0, _arg1); + reply.writeNoException(); + break; + } + case TRANSACTION_tearDown: + { + com.foxx.androidcast.IVpnOperationCallback _arg0; + _arg0 = com.foxx.androidcast.IVpnOperationCallback.Stub.asInterface(data.readStrongBinder()); + this.tearDown(_arg0); + reply.writeNoException(); + break; + } + case TRANSACTION_simulateCrashForTest: + { + int _arg0; + _arg0 = data.readInt(); + com.foxx.androidcast.IVpnOperationCallback _arg1; + _arg1 = com.foxx.androidcast.IVpnOperationCallback.Stub.asInterface(data.readStrongBinder()); + this.simulateCrashForTest(_arg0, _arg1); + reply.writeNoException(); + break; + } + default: + { + return super.onTransact(code, data, reply, flags); + } + } + return true; + } + private static class Proxy implements com.foxx.androidcast.IVpnService + { + private android.os.IBinder mRemote; + Proxy(android.os.IBinder remote) + { + mRemote = remote; + } + @Override public android.os.IBinder asBinder() + { + return mRemote; + } + public java.lang.String getInterfaceDescriptor() + { + return DESCRIPTOR; + } + @Override public void registerStateCallback(com.foxx.androidcast.IVpnStateCallback callback) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeStrongInterface(callback); + boolean _status = mRemote.transact(Stub.TRANSACTION_registerStateCallback, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void unregisterStateCallback(com.foxx.androidcast.IVpnStateCallback callback) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeStrongInterface(callback); + boolean _status = mRemote.transact(Stub.TRANSACTION_unregisterStateCallback, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public int getState() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + int _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_getState, _data, _reply, 0); + _reply.readException(); + _result = _reply.readInt(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + @Override public java.lang.String getStateDetail() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + java.lang.String _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_getStateDetail, _data, _reply, 0); + _reply.readException(); + _result = _reply.readString(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + @Override public boolean isVpnPermissionGranted() throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + boolean _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + boolean _status = mRemote.transact(Stub.TRANSACTION_isVpnPermissionGranted, _data, _reply, 0); + _reply.readException(); + _result = (0!=_reply.readInt()); + } + finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + @Override public void applyWireGuardConfig(java.lang.String wgQuickConfig, com.foxx.androidcast.IVpnOperationCallback callback) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeString(wgQuickConfig); + _data.writeStrongInterface(callback); + boolean _status = mRemote.transact(Stub.TRANSACTION_applyWireGuardConfig, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + @Override public void tearDown(com.foxx.androidcast.IVpnOperationCallback callback) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeStrongInterface(callback); + boolean _status = mRemote.transact(Stub.TRANSACTION_tearDown, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + /** Debug/lab only — records a synthetic crash from the VPN process (no process kill). */ + @Override public void simulateCrashForTest(int sequence, com.foxx.androidcast.IVpnOperationCallback callback) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + android.os.Parcel _reply = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeInt(sequence); + _data.writeStrongInterface(callback); + boolean _status = mRemote.transact(Stub.TRANSACTION_simulateCrashForTest, _data, _reply, 0); + _reply.readException(); + } + finally { + _reply.recycle(); + _data.recycle(); + } + } + } + static final int TRANSACTION_registerStateCallback = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); + static final int TRANSACTION_unregisterStateCallback = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); + static final int TRANSACTION_getState = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2); + static final int TRANSACTION_getStateDetail = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3); + static final int TRANSACTION_isVpnPermissionGranted = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4); + static final int TRANSACTION_applyWireGuardConfig = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5); + static final int TRANSACTION_tearDown = (android.os.IBinder.FIRST_CALL_TRANSACTION + 6); + static final int TRANSACTION_simulateCrashForTest = (android.os.IBinder.FIRST_CALL_TRANSACTION + 7); + } + public static final java.lang.String DESCRIPTOR = "com.foxx.androidcast.IVpnService"; + public void registerStateCallback(com.foxx.androidcast.IVpnStateCallback callback) throws android.os.RemoteException; + public void unregisterStateCallback(com.foxx.androidcast.IVpnStateCallback callback) throws android.os.RemoteException; + public int getState() throws android.os.RemoteException; + public java.lang.String getStateDetail() throws android.os.RemoteException; + public boolean isVpnPermissionGranted() throws android.os.RemoteException; + public void applyWireGuardConfig(java.lang.String wgQuickConfig, com.foxx.androidcast.IVpnOperationCallback callback) throws android.os.RemoteException; + public void tearDown(com.foxx.androidcast.IVpnOperationCallback callback) throws android.os.RemoteException; + /** Debug/lab only — records a synthetic crash from the VPN process (no process kill). */ + public void simulateCrashForTest(int sequence, com.foxx.androidcast.IVpnOperationCallback callback) throws android.os.RemoteException; +} diff --git a/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/IVpnStateCallback.java b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/IVpnStateCallback.java new file mode 100644 index 0000000..50aa00e --- /dev/null +++ b/app/build/generated/aidl_source_output_dir/debug/out/com/foxx/androidcast/IVpnStateCallback.java @@ -0,0 +1,111 @@ +/* + * This file is auto-generated. DO NOT MODIFY. + */ +package com.foxx.androidcast; +/** Async VPN state updates from the :vpn process. */ +public interface IVpnStateCallback extends android.os.IInterface +{ + /** Default implementation for IVpnStateCallback. */ + public static class Default implements com.foxx.androidcast.IVpnStateCallback + { + @Override public void onStateChanged(int state, java.lang.String detail) throws android.os.RemoteException + { + } + @Override + public android.os.IBinder asBinder() { + return null; + } + } + /** Local-side IPC implementation stub class. */ + public static abstract class Stub extends android.os.Binder implements com.foxx.androidcast.IVpnStateCallback + { + /** Construct the stub at attach it to the interface. */ + public Stub() + { + this.attachInterface(this, DESCRIPTOR); + } + /** + * Cast an IBinder object into an com.foxx.androidcast.IVpnStateCallback interface, + * generating a proxy if needed. + */ + public static com.foxx.androidcast.IVpnStateCallback asInterface(android.os.IBinder obj) + { + if ((obj==null)) { + return null; + } + android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); + if (((iin!=null)&&(iin instanceof com.foxx.androidcast.IVpnStateCallback))) { + return ((com.foxx.androidcast.IVpnStateCallback)iin); + } + return new com.foxx.androidcast.IVpnStateCallback.Stub.Proxy(obj); + } + @Override public android.os.IBinder asBinder() + { + return this; + } + @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException + { + java.lang.String descriptor = DESCRIPTOR; + if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) { + data.enforceInterface(descriptor); + } + switch (code) + { + case INTERFACE_TRANSACTION: + { + reply.writeString(descriptor); + return true; + } + } + switch (code) + { + case TRANSACTION_onStateChanged: + { + int _arg0; + _arg0 = data.readInt(); + java.lang.String _arg1; + _arg1 = data.readString(); + this.onStateChanged(_arg0, _arg1); + break; + } + default: + { + return super.onTransact(code, data, reply, flags); + } + } + return true; + } + private static class Proxy implements com.foxx.androidcast.IVpnStateCallback + { + private android.os.IBinder mRemote; + Proxy(android.os.IBinder remote) + { + mRemote = remote; + } + @Override public android.os.IBinder asBinder() + { + return mRemote; + } + public java.lang.String getInterfaceDescriptor() + { + return DESCRIPTOR; + } + @Override public void onStateChanged(int state, java.lang.String detail) throws android.os.RemoteException + { + android.os.Parcel _data = android.os.Parcel.obtain(); + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeInt(state); + _data.writeString(detail); + boolean _status = mRemote.transact(Stub.TRANSACTION_onStateChanged, _data, null, android.os.IBinder.FLAG_ONEWAY); + } + finally { + _data.recycle(); + } + } + } + static final int TRANSACTION_onStateChanged = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); + } + public static final java.lang.String DESCRIPTOR = "com.foxx.androidcast.IVpnStateCallback"; + public void onStateChanged(int state, java.lang.String detail) throws android.os.RemoteException; +} diff --git a/app/build/generated/source/buildConfig/debug/com/foxx/androidcast/BuildConfig.java b/app/build/generated/source/buildConfig/debug/com/foxx/androidcast/BuildConfig.java new file mode 100644 index 0000000..b86d182 --- /dev/null +++ b/app/build/generated/source/buildConfig/debug/com/foxx/androidcast/BuildConfig.java @@ -0,0 +1,32 @@ +/** + * Automatically generated file. DO NOT MODIFY + */ +package com.foxx.androidcast; + +public final class BuildConfig { + public static final boolean DEBUG = Boolean.parseBoolean("true"); + public static final String APPLICATION_ID = "com.foxx.androidcast"; + public static final String BUILD_TYPE = "debug"; + public static final int VERSION_CODE = 100; + public static final String VERSION_NAME = "0.1.0"; + // Field from default config. + public static final String BUILD_TIME_DISPLAY = "2026-06-20 18:32:09 CEST"; + // Field from default config. + public static final long BUILD_TIME_EPOCH_MS = 1781973129571L; + // Field from default config. + public static final String BUILD_TIME_ZONE_ID = "Europe/Warsaw"; + // Field from default config. + public static final String GIT_COMMIT_AUTHOR = "Anton Afanasyeu"; + // Field from default config. + public static final String GIT_COMMIT_SHORT = "b9f94fe"; + // Field from default config. + public static final String OTA_CHANNEL_URL_DEFAULT = ""; + // Field from default config. + public static final String OTA_MANIFEST_URL_DEFAULT = ""; + // Field from default config. + public static final int VERSION_BUILD = 0; + // Field from default config. + public static final int VERSION_MAJOR = 0; + // Field from default config. + public static final int VERSION_MINOR = 1; +} diff --git a/app/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json b/app/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/app/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/app/build/intermediates/annotation_processor_list/debugUnitTest/javaPreCompileDebugUnitTest/annotationProcessors.json b/app/build/intermediates/annotation_processor_list/debugUnitTest/javaPreCompileDebugUnitTest/annotationProcessors.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/app/build/intermediates/annotation_processor_list/debugUnitTest/javaPreCompileDebugUnitTest/annotationProcessors.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/app/build/intermediates/apk_for_local_test/debugUnitTest/packageDebugUnitTestForUnitTest/apk-for-local-test.ap_ b/app/build/intermediates/apk_for_local_test/debugUnitTest/packageDebugUnitTestForUnitTest/apk-for-local-test.ap_ new file mode 100644 index 0000000..8c68cdf Binary files /dev/null and b/app/build/intermediates/apk_for_local_test/debugUnitTest/packageDebugUnitTestForUnitTest/apk-for-local-test.ap_ differ diff --git a/app/build/intermediates/apk_ide_redirect_file/debug/createDebugApkListingFileRedirect/redirect.txt b/app/build/intermediates/apk_ide_redirect_file/debug/createDebugApkListingFileRedirect/redirect.txt new file mode 100644 index 0000000..8ed2aa0 --- /dev/null +++ b/app/build/intermediates/apk_ide_redirect_file/debug/createDebugApkListingFileRedirect/redirect.txt @@ -0,0 +1,2 @@ +#- File Locator - +listingFile=../../../../outputs/apk/debug/output-metadata.json diff --git a/app/build/intermediates/app_metadata/debug/writeDebugAppMetadata/app-metadata.properties b/app/build/intermediates/app_metadata/debug/writeDebugAppMetadata/app-metadata.properties new file mode 100644 index 0000000..d3f8884 --- /dev/null +++ b/app/build/intermediates/app_metadata/debug/writeDebugAppMetadata/app-metadata.properties @@ -0,0 +1,2 @@ +appMetadataVersion=1.1 +androidGradlePluginVersion=8.7.3 diff --git a/app/build/intermediates/assets/debug/mergeDebugAssets/codecs.json b/app/build/intermediates/assets/debug/mergeDebugAssets/codecs.json new file mode 100644 index 0000000..322fb0e --- /dev/null +++ b/app/build/intermediates/assets/debug/mergeDebugAssets/codecs.json @@ -0,0 +1,34 @@ +{ + "_comment": "Optional overrides for codec priority (lower total score = higher priority). Tier bases: HW=0, SW=500, passthrough/raw=1000. Default audio order: Opus < AAC < Speex < PCM.", + "video": { + "h264": { + "priority_override_score": 0 + }, + "h265": { + "priority_override_score": 0 + }, + "vp8": { + "priority_override_score": 0 + }, + "vp9": { + "priority_override_score": 0 + }, + "passthrough": { + "priority_override_score": 0 + } + }, + "audio": { + "aac": { + "priority_override_score": 0 + }, + "opus": { + "priority_override_score": 0 + }, + "speex": { + "priority_override_score": 0 + }, + "pcm": { + "priority_override_score": 0 + } + } +} diff --git a/app/build/intermediates/assets/debug/mergeDebugAssets/licenses/combined.html b/app/build/intermediates/assets/debug/mergeDebugAssets/licenses/combined.html new file mode 100644 index 0000000..a09de93 --- /dev/null +++ b/app/build/intermediates/assets/debug/mergeDebugAssets/licenses/combined.html @@ -0,0 +1,38 @@ +

Android Cast (application)

+

Copyright © Android Cast contributors.

+

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

+
    +
  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. +
  3. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  4. +
  5. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
  6. +
+

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+ +

Android Open Source components (Gradle)

+
    +
  • AndroidX AppCompat — Apache License 2.0
  • +
  • AndroidX ConstraintLayout — Apache License 2.0
  • +
  • AndroidX RecyclerView — Apache License 2.0
  • +
  • Google Material Components for Android — Apache License 2.0
  • +
  • Google Play services Cronet — BSD 3-Clause (Chromium Cronet)
  • +
  • Google Play Billing Library — Google Play SDK terms (proprietary; see Google Play Console / developer policies)
  • +
  • Google Play In-App Review — Google Play SDK terms
  • +
  • Eclipse Paho MQTT client — Eclipse Public License 1.0 and Eclipse Distribution License 1.0 (dual-licensed)
  • +
  • JSch (mwiede fork) — BSD 3-Clause License (reverse SSH remote access)
  • +
  • Apache MINA SSHD — Apache License 2.0 (embedded local SSH/SFTP for RSSH alpha)
  • +
  • Bouncy Castle — MIT-style license (SSHD crypto on Android)
  • +
+ +

JUnit 4

+

Licensed under the Eclipse Public License 1.0 (test dependency only; not shipped in release APK).

+ +

Native codecs (optional; linked when built)

+

Built from git submodules under third-party/ via scripts/build-native-codecs.sh. CMake sets ANDROIDCAST_HAVE_* when build/native/<abi>/lib*.a exists for each ABI in the APK. JNI encode/decode sinks may still be partial while libraries are linked.

+
    +
  • libvpx (VP8/VP9) — BSD-style license (Xiph.org). See third-party/libvpx/LICENSE.
  • +
  • Opus — BSD-style license (Xiph.org et al.). See third-party/opus/COPYING.
  • +
  • Speex — Revised BSD license (Xiph.org Foundation). See third-party/speex/COPYING.
  • +
+ +

WireGuard tunnel module (third-party/wireguard-android)

+

The app links the WireGuard Android tunnel library from git submodule third-party/wireguard-android (Apache License 2.0; see upstream COPYING and https://git.zx2c4.com/wireguard-android). WireGuard lab mode uses Android VpnService (system VPN permission) via GoBackend.

diff --git a/app/build/intermediates/assets/debug/mergeDebugAssets/ra_control/control.css b/app/build/intermediates/assets/debug/mergeDebugAssets/ra_control/control.css new file mode 100644 index 0000000..7e85f04 --- /dev/null +++ b/app/build/intermediates/assets/debug/mergeDebugAssets/ra_control/control.css @@ -0,0 +1,57 @@ +body { + font-family: system-ui, sans-serif; + margin: 1rem; + max-width: 52rem; + background: #111; + color: #eee; +} +header h1 { + font-size: 1.25rem; + margin: 0 0 0.25rem; +} +.meta { + color: #888; + font-size: 0.85rem; +} +nav { + margin: 1rem 0; + display: flex; + gap: 0.75rem; + align-items: center; +} +a, button { + color: #8cf; +} +form label { + display: block; + margin: 0.75rem 0; +} +select, input, button { + display: block; + margin-top: 0.25rem; + min-width: 16rem; + background: #222; + color: #eee; + border: 1px solid #444; + padding: 0.35rem 0.5rem; +} +pre { + background: #000; + padding: 0.75rem; + overflow: auto; + font-size: 0.8rem; + border: 1px solid #333; +} +.shell-page pre#term { + min-height: 18rem; + white-space: pre-wrap; + word-break: break-word; +} +.readonly { + color: #aaa; + font-size: 0.85rem; +} +#settingsStatus { + margin-left: 0.5rem; + color: #8f8; +} diff --git a/app/build/intermediates/assets/debug/mergeDebugAssets/ra_control/index.html b/app/build/intermediates/assets/debug/mergeDebugAssets/ra_control/index.html new file mode 100644 index 0000000..6adc45d --- /dev/null +++ b/app/build/intermediates/assets/debug/mergeDebugAssets/ra_control/index.html @@ -0,0 +1,112 @@ + + + + + + Android Cast — remote control + + + +
+

Remote access control

+

Port __LISTEN_PORT__ · token injected at serve time

+
+ + + +
+

Remote access settings

+
+ + + +

+ + +
+
+ +
+

Internals

+
Loading…
+
+ + + + diff --git a/app/build/intermediates/assets/debug/mergeDebugAssets/ra_control/shell.html b/app/build/intermediates/assets/debug/mergeDebugAssets/ra_control/shell.html new file mode 100644 index 0000000..8a1c2f2 --- /dev/null +++ b/app/build/intermediates/assets/debug/mergeDebugAssets/ra_control/shell.html @@ -0,0 +1,46 @@ + + + + + + Android Cast — shell + + + +
+

Sandbox shell

+

← Settings

+
+

+  
+ +
+ + + diff --git a/app/build/intermediates/compatible_screen_manifest/debug/createDebugCompatibleScreenManifests/output-metadata.json b/app/build/intermediates/compatible_screen_manifest/debug/createDebugCompatibleScreenManifests/output-metadata.json new file mode 100644 index 0000000..a149674 --- /dev/null +++ b/app/build/intermediates/compatible_screen_manifest/debug/createDebugCompatibleScreenManifests/output-metadata.json @@ -0,0 +1,10 @@ +{ + "version": 3, + "artifactType": { + "type": "COMPATIBLE_SCREEN_MANIFEST", + "kind": "Directory" + }, + "applicationId": "com.foxx.androidcast", + "variantName": "debug", + "elements": [] +} \ No newline at end of file diff --git a/app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/processDebugResources/R.jar b/app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/processDebugResources/R.jar new file mode 100644 index 0000000..bd4b1a9 Binary files /dev/null and b/app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/processDebugResources/R.jar differ diff --git a/app/build/intermediates/compile_app_classes_jar/debug/bundleDebugClassesToCompileJar/classes.jar b/app/build/intermediates/compile_app_classes_jar/debug/bundleDebugClassesToCompileJar/classes.jar new file mode 100644 index 0000000..f7527a2 Binary files /dev/null and b/app/build/intermediates/compile_app_classes_jar/debug/bundleDebugClassesToCompileJar/classes.jar differ diff --git a/app/build/intermediates/compressed_assets/debug/compressDebugAssets/out/assets/codecs.json.jar b/app/build/intermediates/compressed_assets/debug/compressDebugAssets/out/assets/codecs.json.jar new file mode 100644 index 0000000..ce2305e Binary files /dev/null and b/app/build/intermediates/compressed_assets/debug/compressDebugAssets/out/assets/codecs.json.jar differ diff --git a/app/build/intermediates/compressed_assets/debug/compressDebugAssets/out/assets/licenses/combined.html.jar b/app/build/intermediates/compressed_assets/debug/compressDebugAssets/out/assets/licenses/combined.html.jar new file mode 100644 index 0000000..13cdd41 Binary files /dev/null and b/app/build/intermediates/compressed_assets/debug/compressDebugAssets/out/assets/licenses/combined.html.jar differ diff --git a/app/build/intermediates/compressed_assets/debug/compressDebugAssets/out/assets/ra_control/control.css.jar b/app/build/intermediates/compressed_assets/debug/compressDebugAssets/out/assets/ra_control/control.css.jar new file mode 100644 index 0000000..deb3a8f Binary files /dev/null and b/app/build/intermediates/compressed_assets/debug/compressDebugAssets/out/assets/ra_control/control.css.jar differ diff --git a/app/build/intermediates/compressed_assets/debug/compressDebugAssets/out/assets/ra_control/index.html.jar b/app/build/intermediates/compressed_assets/debug/compressDebugAssets/out/assets/ra_control/index.html.jar new file mode 100644 index 0000000..bea0bb2 Binary files /dev/null and b/app/build/intermediates/compressed_assets/debug/compressDebugAssets/out/assets/ra_control/index.html.jar differ diff --git a/app/build/intermediates/compressed_assets/debug/compressDebugAssets/out/assets/ra_control/shell.html.jar b/app/build/intermediates/compressed_assets/debug/compressDebugAssets/out/assets/ra_control/shell.html.jar new file mode 100644 index 0000000..61fe0f8 Binary files /dev/null and b/app/build/intermediates/compressed_assets/debug/compressDebugAssets/out/assets/ra_control/shell.html.jar differ diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_command_androidcast_codecs b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_command_androidcast_codecs new file mode 100755 index 0000000..59d78f3 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_command_androidcast_codecs @@ -0,0 +1,4 @@ +/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja \ + -C \ + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a" \ + androidcast_codecs diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_command_targets b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_command_targets new file mode 100755 index 0000000..073576d --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_command_targets @@ -0,0 +1,5 @@ +/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja \ + -C \ + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a" \ + androidcast_codecs \ + androidcast_entitlements diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_model.json b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_model.json new file mode 100644 index 0000000..5a6934c --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_model.json @@ -0,0 +1,202 @@ +{ + "info": { + "name": "arm64-v8a", + "bitness": 64, + "isDefault": true, + "isDeprecated": false, + "architecture": "arm64", + "triple": "aarch64-linux-android", + "llvmTriple": "aarch64-none-linux-android" + }, + "cxxBuildFolder": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a", + "soFolder": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a", + "soRepublishFolder": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cmake/debug/obj/arm64-v8a", + "abiPlatformVersion": 29, + "cmake": { + "effectiveConfiguration": { + "inheritEnvironments": [], + "variables": [] + } + }, + "variant": { + "buildSystemArgumentList": [ + "-DANDROID_STL\u003dc++_shared", + "-DANDROID_CCACHE\u003d/usr/bin/ccache" + ], + "cFlagsList": [], + "cppFlagsList": [ + "" + ], + "variantName": "debug", + "isDebuggableEnabled": true, + "validAbiList": [ + "armeabi-v7a", + "arm64-v8a", + "x86_64" + ], + "buildTargetSet": [], + "implicitBuildTargetSet": [], + "cmakeSettingsConfiguration": "android-gradle-plugin-predetermined-name", + "module": { + "cxxFolder": "/home/foxx/repos/My Projects/android cast/app/.cxx", + "intermediatesBaseFolder": "/home/foxx/repos/My Projects/android cast/app/build/intermediates", + "intermediatesFolder": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx", + "gradleModulePathName": ":app", + "moduleRootFolder": "/home/foxx/repos/My Projects/android cast/app", + "moduleBuildFile": "/home/foxx/repos/My Projects/android cast/app/build.gradle", + "makeFile": "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt", + "buildSystem": "CMAKE", + "ndkFolder": "/home/foxx/Android/Sdk/ndk/27.0.12077973", + "ndkFolderBeforeSymLinking": "/home/foxx/Android/Sdk/ndk/27.0.12077973", + "ndkVersion": "27.0.12077973", + "ndkSupportedAbiList": [ + "armeabi-v7a", + "arm64-v8a", + "riscv64", + "x86", + "x86_64" + ], + "ndkDefaultAbiList": [ + "armeabi-v7a", + "arm64-v8a", + "x86", + "x86_64" + ], + "ndkDefaultStl": "LIBCXX_STATIC", + "ndkMetaPlatforms": { + "min": 21, + "max": 35, + "aliases": { + "20": 19, + "25": 24, + "J": 16, + "J-MR1": 17, + "J-MR2": 18, + "K": 19, + "L": 21, + "L-MR1": 22, + "M": 23, + "N": 24, + "N-MR1": 24, + "O": 26, + "O-MR1": 27, + "P": 28, + "Q": 29, + "R": 30, + "S": 31, + "Sv2": 32, + "Tiramisu": 33, + "UpsideDownCake": 34, + "VanillaIceCream": 35 + } + }, + "ndkMetaAbiList": [ + { + "name": "armeabi-v7a", + "bitness": 32, + "isDefault": true, + "isDeprecated": false, + "architecture": "arm", + "triple": "arm-linux-androideabi", + "llvmTriple": "armv7-none-linux-androideabi" + }, + { + "name": "arm64-v8a", + "bitness": 64, + "isDefault": true, + "isDeprecated": false, + "architecture": "arm64", + "triple": "aarch64-linux-android", + "llvmTriple": "aarch64-none-linux-android" + }, + { + "name": "riscv64", + "bitness": 64, + "isDefault": false, + "isDeprecated": false, + "architecture": "riscv64", + "triple": "riscv64-linux-android", + "llvmTriple": "riscv64-none-linux-android" + }, + { + "name": "x86", + "bitness": 32, + "isDefault": true, + "isDeprecated": false, + "architecture": "x86", + "triple": "i686-linux-android", + "llvmTriple": "i686-none-linux-android" + }, + { + "name": "x86_64", + "bitness": 64, + "isDefault": true, + "isDeprecated": false, + "architecture": "x86_64", + "triple": "x86_64-linux-android", + "llvmTriple": "x86_64-none-linux-android" + } + ], + "cmakeToolchainFile": "/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake", + "cmake": { + "cmakeExe": "/home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake" + }, + "stlSharedObjectMap": { + "LIBCXX_SHARED": { + "armeabi-v7a": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so", + "arm64-v8a": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so", + "riscv64": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/riscv64-linux-android/libc++_shared.so", + "x86": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.so", + "x86_64": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so" + }, + "LIBCXX_STATIC": {}, + "NONE": {}, + "SYSTEM": {} + }, + "project": { + "rootBuildGradleFolder": "/home/foxx/repos/My Projects/android cast", + "sdkFolder": "/home/foxx/Android/Sdk", + "isBuildOnlyTargetAbiEnabled": true, + "isCmakeBuildCohabitationEnabled": false, + "isPrefabEnabled": false + }, + "outputOptions": [], + "ninjaExe": "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "hasBuildTimeInformation": true + }, + "prefabClassPaths": [], + "prefabPackages": [], + "prefabPackageConfigurations": [], + "stlType": "c++_shared", + "optimizationTag": "Debug" + }, + "buildSettings": { + "environmentVariables": [] + }, + "prefabFolder": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/prefab/arm64-v8a", + "isActiveAbi": true, + "fullConfigurationHash": "505h1w6m1t1m5g4a1v5md4xi552b2611s6i5p4s2g6f2167k61404w6i3x3u", + "fullConfigurationHashKey": "# Values used to calculate the hash in this folder name.\n# Should not depend on the absolute path of the project itself.\n# - AGP: 8.7.3.\n# - $NDK is the path to NDK 27.0.12077973.\n# - $PROJECT is the path to the parent folder of the root Gradle build file.\n# - $ABI is the ABI to be built with. The specific value doesn\u0027t contribute to the value of the hash.\n# - $HASH is the hash value computed from this text.\n# - $CMAKE is the path to CMake 3.22.1.\n# - $NINJA is the path to Ninja.\n-H$PROJECT/ndk\n-DCMAKE_SYSTEM_NAME\u003dAndroid\n-DCMAKE_EXPORT_COMPILE_COMMANDS\u003dON\n-DCMAKE_SYSTEM_VERSION\u003d29\n-DANDROID_PLATFORM\u003dandroid-29\n-DANDROID_ABI\u003d$ABI\n-DCMAKE_ANDROID_ARCH_ABI\u003d$ABI\n-DANDROID_NDK\u003d$NDK\n-DCMAKE_ANDROID_NDK\u003d$NDK\n-DCMAKE_TOOLCHAIN_FILE\u003d$NDK/build/cmake/android.toolchain.cmake\n-DCMAKE_MAKE_PROGRAM\u003d$NINJA\n-DCMAKE_LIBRARY_OUTPUT_DIRECTORY\u003d$PROJECT/app/build/intermediates/cxx/Debug/$HASH/obj/$ABI\n-DCMAKE_RUNTIME_OUTPUT_DIRECTORY\u003d$PROJECT/app/build/intermediates/cxx/Debug/$HASH/obj/$ABI\n-DCMAKE_BUILD_TYPE\u003dDebug\n-B$PROJECT/app/.cxx/Debug/$HASH/$ABI\n-GNinja\n-DANDROID_STL\u003dc++_shared\n-DANDROID_CCACHE\u003d/usr/bin/ccache", + "configurationArguments": [ + "-H/home/foxx/repos/My Projects/android cast/ndk", + "-DCMAKE_SYSTEM_NAME\u003dAndroid", + "-DCMAKE_EXPORT_COMPILE_COMMANDS\u003dON", + "-DCMAKE_SYSTEM_VERSION\u003d29", + "-DANDROID_PLATFORM\u003dandroid-29", + "-DANDROID_ABI\u003darm64-v8a", + "-DCMAKE_ANDROID_ARCH_ABI\u003darm64-v8a", + "-DANDROID_NDK\u003d/home/foxx/Android/Sdk/ndk/27.0.12077973", + "-DCMAKE_ANDROID_NDK\u003d/home/foxx/Android/Sdk/ndk/27.0.12077973", + "-DCMAKE_TOOLCHAIN_FILE\u003d/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake", + "-DCMAKE_MAKE_PROGRAM\u003d/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY\u003d/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a", + "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY\u003d/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a", + "-DCMAKE_BUILD_TYPE\u003dDebug", + "-B/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a", + "-GNinja", + "-DANDROID_STL\u003dc++_shared", + "-DANDROID_CCACHE\u003d/usr/bin/ccache" + ], + "stlLibraryFile": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so", + "intermediatesParentFolder": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m" +} \ No newline at end of file diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_stderr_androidcast_codecs.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_stderr_androidcast_codecs.txt new file mode 100644 index 0000000..e69de29 diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_stderr_targets.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_stderr_targets.txt new file mode 100644 index 0000000..e69de29 diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_stdout_androidcast_codecs.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_stdout_androidcast_codecs.txt new file mode 100644 index 0000000..5951de4 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_stdout_androidcast_codecs.txt @@ -0,0 +1,7 @@ +ninja: Entering directory `/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a' +[1/6] Building C object CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o +[2/6] Building C object CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o +[3/6] Building C object CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o +[4/6] Building C object CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o +[5/6] Building C object CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o +[6/6] Linking C shared library "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_codecs.so" diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_stdout_targets.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_stdout_targets.txt new file mode 100644 index 0000000..05f680f --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/build_stdout_targets.txt @@ -0,0 +1,2 @@ +ninja: Entering directory `/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a' +ninja: no work to do. diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/configure_command b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/configure_command new file mode 100755 index 0000000..5059be7 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/configure_command @@ -0,0 +1,19 @@ +/home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake \ + "-H/home/foxx/repos/My Projects/android cast/ndk" \ + -DCMAKE_SYSTEM_NAME=Android \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DCMAKE_SYSTEM_VERSION=29 \ + -DANDROID_PLATFORM=android-29 \ + -DANDROID_ABI=arm64-v8a \ + -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \ + -DANDROID_NDK=/home/foxx/Android/Sdk/ndk/27.0.12077973 \ + -DCMAKE_ANDROID_NDK=/home/foxx/Android/Sdk/ndk/27.0.12077973 \ + -DCMAKE_TOOLCHAIN_FILE=/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake \ + -DCMAKE_MAKE_PROGRAM=/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja \ + "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a" \ + "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a" \ + -DCMAKE_BUILD_TYPE=Debug \ + "-B/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a" \ + -GNinja \ + -DANDROID_STL=c++_shared \ + -DANDROID_CCACHE=/usr/bin/ccache diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/configure_stderr.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/configure_stderr.txt new file mode 100644 index 0000000..e69de29 diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/configure_stdout.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/configure_stdout.txt new file mode 100644 index 0000000..c94f749 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/configure_stdout.txt @@ -0,0 +1,6 @@ +-- Linking libvpx for arm64-v8a: /home/foxx/repos/My Projects/android cast/ndk/../build/native/arm64-v8a/libvpx.a +-- Linking libopus for arm64-v8a: /home/foxx/repos/My Projects/android cast/ndk/../build/native/arm64-v8a/libopus.a +-- Linking libspeex for arm64-v8a: /home/foxx/repos/My Projects/android cast/ndk/../build/native/arm64-v8a/libspeex.a +-- Configuring done +-- Generating done +-- Build files have been written to: /home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/generate_cxx_metadata_106_timing.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/generate_cxx_metadata_106_timing.txt new file mode 100644 index 0000000..738ae22 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/generate_cxx_metadata_106_timing.txt @@ -0,0 +1,10 @@ +# C/C++ build system timings +generate_cxx_metadata + create-invalidation-state 64ms + execute-generate-process + exec-configure 27ms + [gap of 43ms] + execute-generate-process completed in 71ms + [gap of 19ms] +generate_cxx_metadata completed in 166ms + diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/generate_cxx_metadata_108_timing.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/generate_cxx_metadata_108_timing.txt new file mode 100644 index 0000000..75c05b1 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/generate_cxx_metadata_108_timing.txt @@ -0,0 +1,7 @@ +# C/C++ build system timings +generate_cxx_metadata + [gap of 11ms] + create-invalidation-state 43ms + [gap of 15ms] +generate_cxx_metadata completed in 69ms + diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/generate_cxx_metadata_157_timing.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/generate_cxx_metadata_157_timing.txt new file mode 100644 index 0000000..7d8d457 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/generate_cxx_metadata_157_timing.txt @@ -0,0 +1,7 @@ +# C/C++ build system timings +generate_cxx_metadata + execute-generate-process + exec-configure 81ms + execute-generate-process completed in 89ms +generate_cxx_metadata completed in 93ms + diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/metadata_generation_record.json b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/metadata_generation_record.json new file mode 100644 index 0000000..edd07b5 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/arm64-v8a/metadata_generation_record.json @@ -0,0 +1,41 @@ +[ + { + "level_": 0, + "message_": "Start JSON generation. Platform version: 29 min SDK version: arm64-v8a", + "file_": "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt", + "tag_": "debug|arm64-v8a", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {} + }, + "memoizedSize": -1, + "memoizedHashCode": 0 + }, + { + "level_": 0, + "message_": "JSON \u0027/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/arm64-v8a/android_gradle_build.json\u0027 was up-to-date", + "file_": "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt", + "tag_": "debug|arm64-v8a", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {} + }, + "memoizedSize": -1, + "memoizedHashCode": 0 + }, + { + "level_": 0, + "message_": "JSON generation completed without problems", + "file_": "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt", + "tag_": "debug|arm64-v8a", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {} + }, + "memoizedSize": -1, + "memoizedHashCode": 0 + } +] \ No newline at end of file diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_command_androidcast_codecs b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_command_androidcast_codecs new file mode 100755 index 0000000..c1c6fca --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_command_androidcast_codecs @@ -0,0 +1,4 @@ +/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja \ + -C \ + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a" \ + androidcast_codecs diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_command_targets b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_command_targets new file mode 100755 index 0000000..bf4a5b1 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_command_targets @@ -0,0 +1,5 @@ +/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja \ + -C \ + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a" \ + androidcast_codecs \ + androidcast_entitlements diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_model.json b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_model.json new file mode 100644 index 0000000..b68110f --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_model.json @@ -0,0 +1,202 @@ +{ + "info": { + "name": "armeabi-v7a", + "bitness": 32, + "isDefault": true, + "isDeprecated": false, + "architecture": "arm", + "triple": "arm-linux-androideabi", + "llvmTriple": "armv7-none-linux-androideabi" + }, + "cxxBuildFolder": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a", + "soFolder": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a", + "soRepublishFolder": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cmake/debug/obj/armeabi-v7a", + "abiPlatformVersion": 29, + "cmake": { + "effectiveConfiguration": { + "inheritEnvironments": [], + "variables": [] + } + }, + "variant": { + "buildSystemArgumentList": [ + "-DANDROID_STL\u003dc++_shared", + "-DANDROID_CCACHE\u003d/usr/bin/ccache" + ], + "cFlagsList": [], + "cppFlagsList": [ + "" + ], + "variantName": "debug", + "isDebuggableEnabled": true, + "validAbiList": [ + "armeabi-v7a", + "arm64-v8a", + "x86_64" + ], + "buildTargetSet": [], + "implicitBuildTargetSet": [], + "cmakeSettingsConfiguration": "android-gradle-plugin-predetermined-name", + "module": { + "cxxFolder": "/home/foxx/repos/My Projects/android cast/app/.cxx", + "intermediatesBaseFolder": "/home/foxx/repos/My Projects/android cast/app/build/intermediates", + "intermediatesFolder": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx", + "gradleModulePathName": ":app", + "moduleRootFolder": "/home/foxx/repos/My Projects/android cast/app", + "moduleBuildFile": "/home/foxx/repos/My Projects/android cast/app/build.gradle", + "makeFile": "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt", + "buildSystem": "CMAKE", + "ndkFolder": "/home/foxx/Android/Sdk/ndk/27.0.12077973", + "ndkFolderBeforeSymLinking": "/home/foxx/Android/Sdk/ndk/27.0.12077973", + "ndkVersion": "27.0.12077973", + "ndkSupportedAbiList": [ + "armeabi-v7a", + "arm64-v8a", + "riscv64", + "x86", + "x86_64" + ], + "ndkDefaultAbiList": [ + "armeabi-v7a", + "arm64-v8a", + "x86", + "x86_64" + ], + "ndkDefaultStl": "LIBCXX_STATIC", + "ndkMetaPlatforms": { + "min": 21, + "max": 35, + "aliases": { + "20": 19, + "25": 24, + "J": 16, + "J-MR1": 17, + "J-MR2": 18, + "K": 19, + "L": 21, + "L-MR1": 22, + "M": 23, + "N": 24, + "N-MR1": 24, + "O": 26, + "O-MR1": 27, + "P": 28, + "Q": 29, + "R": 30, + "S": 31, + "Sv2": 32, + "Tiramisu": 33, + "UpsideDownCake": 34, + "VanillaIceCream": 35 + } + }, + "ndkMetaAbiList": [ + { + "name": "armeabi-v7a", + "bitness": 32, + "isDefault": true, + "isDeprecated": false, + "architecture": "arm", + "triple": "arm-linux-androideabi", + "llvmTriple": "armv7-none-linux-androideabi" + }, + { + "name": "arm64-v8a", + "bitness": 64, + "isDefault": true, + "isDeprecated": false, + "architecture": "arm64", + "triple": "aarch64-linux-android", + "llvmTriple": "aarch64-none-linux-android" + }, + { + "name": "riscv64", + "bitness": 64, + "isDefault": false, + "isDeprecated": false, + "architecture": "riscv64", + "triple": "riscv64-linux-android", + "llvmTriple": "riscv64-none-linux-android" + }, + { + "name": "x86", + "bitness": 32, + "isDefault": true, + "isDeprecated": false, + "architecture": "x86", + "triple": "i686-linux-android", + "llvmTriple": "i686-none-linux-android" + }, + { + "name": "x86_64", + "bitness": 64, + "isDefault": true, + "isDeprecated": false, + "architecture": "x86_64", + "triple": "x86_64-linux-android", + "llvmTriple": "x86_64-none-linux-android" + } + ], + "cmakeToolchainFile": "/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake", + "cmake": { + "cmakeExe": "/home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake" + }, + "stlSharedObjectMap": { + "LIBCXX_SHARED": { + "armeabi-v7a": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so", + "arm64-v8a": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so", + "riscv64": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/riscv64-linux-android/libc++_shared.so", + "x86": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.so", + "x86_64": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so" + }, + "LIBCXX_STATIC": {}, + "NONE": {}, + "SYSTEM": {} + }, + "project": { + "rootBuildGradleFolder": "/home/foxx/repos/My Projects/android cast", + "sdkFolder": "/home/foxx/Android/Sdk", + "isBuildOnlyTargetAbiEnabled": true, + "isCmakeBuildCohabitationEnabled": false, + "isPrefabEnabled": false + }, + "outputOptions": [], + "ninjaExe": "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "hasBuildTimeInformation": true + }, + "prefabClassPaths": [], + "prefabPackages": [], + "prefabPackageConfigurations": [], + "stlType": "c++_shared", + "optimizationTag": "Debug" + }, + "buildSettings": { + "environmentVariables": [] + }, + "prefabFolder": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/prefab/armeabi-v7a", + "isActiveAbi": true, + "fullConfigurationHash": "505h1w6m1t1m5g4a1v5md4xi552b2611s6i5p4s2g6f2167k61404w6i3x3u", + "fullConfigurationHashKey": "# Values used to calculate the hash in this folder name.\n# Should not depend on the absolute path of the project itself.\n# - AGP: 8.7.3.\n# - $NDK is the path to NDK 27.0.12077973.\n# - $PROJECT is the path to the parent folder of the root Gradle build file.\n# - $ABI is the ABI to be built with. The specific value doesn\u0027t contribute to the value of the hash.\n# - $HASH is the hash value computed from this text.\n# - $CMAKE is the path to CMake 3.22.1.\n# - $NINJA is the path to Ninja.\n-H$PROJECT/ndk\n-DCMAKE_SYSTEM_NAME\u003dAndroid\n-DCMAKE_EXPORT_COMPILE_COMMANDS\u003dON\n-DCMAKE_SYSTEM_VERSION\u003d29\n-DANDROID_PLATFORM\u003dandroid-29\n-DANDROID_ABI\u003d$ABI\n-DCMAKE_ANDROID_ARCH_ABI\u003d$ABI\n-DANDROID_NDK\u003d$NDK\n-DCMAKE_ANDROID_NDK\u003d$NDK\n-DCMAKE_TOOLCHAIN_FILE\u003d$NDK/build/cmake/android.toolchain.cmake\n-DCMAKE_MAKE_PROGRAM\u003d$NINJA\n-DCMAKE_LIBRARY_OUTPUT_DIRECTORY\u003d$PROJECT/app/build/intermediates/cxx/Debug/$HASH/obj/$ABI\n-DCMAKE_RUNTIME_OUTPUT_DIRECTORY\u003d$PROJECT/app/build/intermediates/cxx/Debug/$HASH/obj/$ABI\n-DCMAKE_BUILD_TYPE\u003dDebug\n-B$PROJECT/app/.cxx/Debug/$HASH/$ABI\n-GNinja\n-DANDROID_STL\u003dc++_shared\n-DANDROID_CCACHE\u003d/usr/bin/ccache", + "configurationArguments": [ + "-H/home/foxx/repos/My Projects/android cast/ndk", + "-DCMAKE_SYSTEM_NAME\u003dAndroid", + "-DCMAKE_EXPORT_COMPILE_COMMANDS\u003dON", + "-DCMAKE_SYSTEM_VERSION\u003d29", + "-DANDROID_PLATFORM\u003dandroid-29", + "-DANDROID_ABI\u003darmeabi-v7a", + "-DCMAKE_ANDROID_ARCH_ABI\u003darmeabi-v7a", + "-DANDROID_NDK\u003d/home/foxx/Android/Sdk/ndk/27.0.12077973", + "-DCMAKE_ANDROID_NDK\u003d/home/foxx/Android/Sdk/ndk/27.0.12077973", + "-DCMAKE_TOOLCHAIN_FILE\u003d/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake", + "-DCMAKE_MAKE_PROGRAM\u003d/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY\u003d/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a", + "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY\u003d/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a", + "-DCMAKE_BUILD_TYPE\u003dDebug", + "-B/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a", + "-GNinja", + "-DANDROID_STL\u003dc++_shared", + "-DANDROID_CCACHE\u003d/usr/bin/ccache" + ], + "stlLibraryFile": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so", + "intermediatesParentFolder": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m" +} \ No newline at end of file diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_stderr_androidcast_codecs.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_stderr_androidcast_codecs.txt new file mode 100644 index 0000000..e69de29 diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_stderr_targets.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_stderr_targets.txt new file mode 100644 index 0000000..e69de29 diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_stdout_androidcast_codecs.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_stdout_androidcast_codecs.txt new file mode 100644 index 0000000..5ffc29b --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_stdout_androidcast_codecs.txt @@ -0,0 +1,7 @@ +ninja: Entering directory `/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a' +[1/6] Building C object CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o +[2/6] Building C object CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o +[3/6] Building C object CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o +[4/6] Building C object CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o +[5/6] Building C object CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o +[6/6] Linking C shared library "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_codecs.so" diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_stdout_targets.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_stdout_targets.txt new file mode 100644 index 0000000..fac1a0e --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/build_stdout_targets.txt @@ -0,0 +1,2 @@ +ninja: Entering directory `/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a' +ninja: no work to do. diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/configure_command b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/configure_command new file mode 100755 index 0000000..64afa69 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/configure_command @@ -0,0 +1,19 @@ +/home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake \ + "-H/home/foxx/repos/My Projects/android cast/ndk" \ + -DCMAKE_SYSTEM_NAME=Android \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DCMAKE_SYSTEM_VERSION=29 \ + -DANDROID_PLATFORM=android-29 \ + -DANDROID_ABI=armeabi-v7a \ + -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a \ + -DANDROID_NDK=/home/foxx/Android/Sdk/ndk/27.0.12077973 \ + -DCMAKE_ANDROID_NDK=/home/foxx/Android/Sdk/ndk/27.0.12077973 \ + -DCMAKE_TOOLCHAIN_FILE=/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake \ + -DCMAKE_MAKE_PROGRAM=/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja \ + "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a" \ + "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a" \ + -DCMAKE_BUILD_TYPE=Debug \ + "-B/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a" \ + -GNinja \ + -DANDROID_STL=c++_shared \ + -DANDROID_CCACHE=/usr/bin/ccache diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/configure_stderr.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/configure_stderr.txt new file mode 100644 index 0000000..e69de29 diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/configure_stdout.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/configure_stdout.txt new file mode 100644 index 0000000..3bf8ab8 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/configure_stdout.txt @@ -0,0 +1,6 @@ +-- Linking libvpx for armeabi-v7a: /home/foxx/repos/My Projects/android cast/ndk/../build/native/armeabi-v7a/libvpx.a +-- Linking libopus for armeabi-v7a: /home/foxx/repos/My Projects/android cast/ndk/../build/native/armeabi-v7a/libopus.a +-- Linking libspeex for armeabi-v7a: /home/foxx/repos/My Projects/android cast/ndk/../build/native/armeabi-v7a/libspeex.a +-- Configuring done +-- Generating done +-- Build files have been written to: /home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/generate_cxx_metadata_104_timing.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/generate_cxx_metadata_104_timing.txt new file mode 100644 index 0000000..9708df4 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/generate_cxx_metadata_104_timing.txt @@ -0,0 +1,2 @@ +# C/C++ build system timings + diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/generate_cxx_metadata_106_timing.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/generate_cxx_metadata_106_timing.txt new file mode 100644 index 0000000..54ea647 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/generate_cxx_metadata_106_timing.txt @@ -0,0 +1,7 @@ +# C/C++ build system timings +generate_cxx_metadata + execute-generate-process + exec-configure 15ms + execute-generate-process completed in 25ms +generate_cxx_metadata completed in 29ms + diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/generate_cxx_metadata_151_timing.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/generate_cxx_metadata_151_timing.txt new file mode 100644 index 0000000..f9fd529 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/generate_cxx_metadata_151_timing.txt @@ -0,0 +1,8 @@ +# C/C++ build system timings +generate_cxx_metadata + execute-generate-process + exec-configure 146ms + [gap of 40ms] + execute-generate-process completed in 186ms +generate_cxx_metadata completed in 194ms + diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/metadata_generation_record.json b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/metadata_generation_record.json new file mode 100644 index 0000000..6ed5a8a --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/armeabi-v7a/metadata_generation_record.json @@ -0,0 +1,41 @@ +[ + { + "level_": 0, + "message_": "Start JSON generation. Platform version: 29 min SDK version: armeabi-v7a", + "file_": "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt", + "tag_": "debug|armeabi-v7a", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {} + }, + "memoizedSize": -1, + "memoizedHashCode": 0 + }, + { + "level_": 0, + "message_": "JSON \u0027/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/armeabi-v7a/android_gradle_build.json\u0027 was up-to-date", + "file_": "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt", + "tag_": "debug|armeabi-v7a", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {} + }, + "memoizedSize": -1, + "memoizedHashCode": 0 + }, + { + "level_": 0, + "message_": "JSON generation completed without problems", + "file_": "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt", + "tag_": "debug|armeabi-v7a", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {} + }, + "memoizedSize": -1, + "memoizedHashCode": 0 + } +] \ No newline at end of file diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_command_androidcast_codecs b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_command_androidcast_codecs new file mode 100755 index 0000000..b0f1558 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_command_androidcast_codecs @@ -0,0 +1,4 @@ +/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja \ + -C \ + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64" \ + androidcast_codecs diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_command_targets b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_command_targets new file mode 100755 index 0000000..54ae4e2 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_command_targets @@ -0,0 +1,5 @@ +/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja \ + -C \ + "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64" \ + androidcast_codecs \ + androidcast_entitlements diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_model.json b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_model.json new file mode 100644 index 0000000..83fc7b8 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_model.json @@ -0,0 +1,202 @@ +{ + "info": { + "name": "x86_64", + "bitness": 64, + "isDefault": true, + "isDeprecated": false, + "architecture": "x86_64", + "triple": "x86_64-linux-android", + "llvmTriple": "x86_64-none-linux-android" + }, + "cxxBuildFolder": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64", + "soFolder": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64", + "soRepublishFolder": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cmake/debug/obj/x86_64", + "abiPlatformVersion": 29, + "cmake": { + "effectiveConfiguration": { + "inheritEnvironments": [], + "variables": [] + } + }, + "variant": { + "buildSystemArgumentList": [ + "-DANDROID_STL\u003dc++_shared", + "-DANDROID_CCACHE\u003d/usr/bin/ccache" + ], + "cFlagsList": [], + "cppFlagsList": [ + "" + ], + "variantName": "debug", + "isDebuggableEnabled": true, + "validAbiList": [ + "armeabi-v7a", + "arm64-v8a", + "x86_64" + ], + "buildTargetSet": [], + "implicitBuildTargetSet": [], + "cmakeSettingsConfiguration": "android-gradle-plugin-predetermined-name", + "module": { + "cxxFolder": "/home/foxx/repos/My Projects/android cast/app/.cxx", + "intermediatesBaseFolder": "/home/foxx/repos/My Projects/android cast/app/build/intermediates", + "intermediatesFolder": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx", + "gradleModulePathName": ":app", + "moduleRootFolder": "/home/foxx/repos/My Projects/android cast/app", + "moduleBuildFile": "/home/foxx/repos/My Projects/android cast/app/build.gradle", + "makeFile": "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt", + "buildSystem": "CMAKE", + "ndkFolder": "/home/foxx/Android/Sdk/ndk/27.0.12077973", + "ndkFolderBeforeSymLinking": "/home/foxx/Android/Sdk/ndk/27.0.12077973", + "ndkVersion": "27.0.12077973", + "ndkSupportedAbiList": [ + "armeabi-v7a", + "arm64-v8a", + "riscv64", + "x86", + "x86_64" + ], + "ndkDefaultAbiList": [ + "armeabi-v7a", + "arm64-v8a", + "x86", + "x86_64" + ], + "ndkDefaultStl": "LIBCXX_STATIC", + "ndkMetaPlatforms": { + "min": 21, + "max": 35, + "aliases": { + "20": 19, + "25": 24, + "J": 16, + "J-MR1": 17, + "J-MR2": 18, + "K": 19, + "L": 21, + "L-MR1": 22, + "M": 23, + "N": 24, + "N-MR1": 24, + "O": 26, + "O-MR1": 27, + "P": 28, + "Q": 29, + "R": 30, + "S": 31, + "Sv2": 32, + "Tiramisu": 33, + "UpsideDownCake": 34, + "VanillaIceCream": 35 + } + }, + "ndkMetaAbiList": [ + { + "name": "armeabi-v7a", + "bitness": 32, + "isDefault": true, + "isDeprecated": false, + "architecture": "arm", + "triple": "arm-linux-androideabi", + "llvmTriple": "armv7-none-linux-androideabi" + }, + { + "name": "arm64-v8a", + "bitness": 64, + "isDefault": true, + "isDeprecated": false, + "architecture": "arm64", + "triple": "aarch64-linux-android", + "llvmTriple": "aarch64-none-linux-android" + }, + { + "name": "riscv64", + "bitness": 64, + "isDefault": false, + "isDeprecated": false, + "architecture": "riscv64", + "triple": "riscv64-linux-android", + "llvmTriple": "riscv64-none-linux-android" + }, + { + "name": "x86", + "bitness": 32, + "isDefault": true, + "isDeprecated": false, + "architecture": "x86", + "triple": "i686-linux-android", + "llvmTriple": "i686-none-linux-android" + }, + { + "name": "x86_64", + "bitness": 64, + "isDefault": true, + "isDeprecated": false, + "architecture": "x86_64", + "triple": "x86_64-linux-android", + "llvmTriple": "x86_64-none-linux-android" + } + ], + "cmakeToolchainFile": "/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake", + "cmake": { + "cmakeExe": "/home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake" + }, + "stlSharedObjectMap": { + "LIBCXX_SHARED": { + "armeabi-v7a": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/arm-linux-androideabi/libc++_shared.so", + "arm64-v8a": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so", + "riscv64": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/riscv64-linux-android/libc++_shared.so", + "x86": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/i686-linux-android/libc++_shared.so", + "x86_64": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so" + }, + "LIBCXX_STATIC": {}, + "NONE": {}, + "SYSTEM": {} + }, + "project": { + "rootBuildGradleFolder": "/home/foxx/repos/My Projects/android cast", + "sdkFolder": "/home/foxx/Android/Sdk", + "isBuildOnlyTargetAbiEnabled": true, + "isCmakeBuildCohabitationEnabled": false, + "isPrefabEnabled": false + }, + "outputOptions": [], + "ninjaExe": "/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "hasBuildTimeInformation": true + }, + "prefabClassPaths": [], + "prefabPackages": [], + "prefabPackageConfigurations": [], + "stlType": "c++_shared", + "optimizationTag": "Debug" + }, + "buildSettings": { + "environmentVariables": [] + }, + "prefabFolder": "/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/prefab/x86_64", + "isActiveAbi": true, + "fullConfigurationHash": "505h1w6m1t1m5g4a1v5md4xi552b2611s6i5p4s2g6f2167k61404w6i3x3u", + "fullConfigurationHashKey": "# Values used to calculate the hash in this folder name.\n# Should not depend on the absolute path of the project itself.\n# - AGP: 8.7.3.\n# - $NDK is the path to NDK 27.0.12077973.\n# - $PROJECT is the path to the parent folder of the root Gradle build file.\n# - $ABI is the ABI to be built with. The specific value doesn\u0027t contribute to the value of the hash.\n# - $HASH is the hash value computed from this text.\n# - $CMAKE is the path to CMake 3.22.1.\n# - $NINJA is the path to Ninja.\n-H$PROJECT/ndk\n-DCMAKE_SYSTEM_NAME\u003dAndroid\n-DCMAKE_EXPORT_COMPILE_COMMANDS\u003dON\n-DCMAKE_SYSTEM_VERSION\u003d29\n-DANDROID_PLATFORM\u003dandroid-29\n-DANDROID_ABI\u003d$ABI\n-DCMAKE_ANDROID_ARCH_ABI\u003d$ABI\n-DANDROID_NDK\u003d$NDK\n-DCMAKE_ANDROID_NDK\u003d$NDK\n-DCMAKE_TOOLCHAIN_FILE\u003d$NDK/build/cmake/android.toolchain.cmake\n-DCMAKE_MAKE_PROGRAM\u003d$NINJA\n-DCMAKE_LIBRARY_OUTPUT_DIRECTORY\u003d$PROJECT/app/build/intermediates/cxx/Debug/$HASH/obj/$ABI\n-DCMAKE_RUNTIME_OUTPUT_DIRECTORY\u003d$PROJECT/app/build/intermediates/cxx/Debug/$HASH/obj/$ABI\n-DCMAKE_BUILD_TYPE\u003dDebug\n-B$PROJECT/app/.cxx/Debug/$HASH/$ABI\n-GNinja\n-DANDROID_STL\u003dc++_shared\n-DANDROID_CCACHE\u003d/usr/bin/ccache", + "configurationArguments": [ + "-H/home/foxx/repos/My Projects/android cast/ndk", + "-DCMAKE_SYSTEM_NAME\u003dAndroid", + "-DCMAKE_EXPORT_COMPILE_COMMANDS\u003dON", + "-DCMAKE_SYSTEM_VERSION\u003d29", + "-DANDROID_PLATFORM\u003dandroid-29", + "-DANDROID_ABI\u003dx86_64", + "-DCMAKE_ANDROID_ARCH_ABI\u003dx86_64", + "-DANDROID_NDK\u003d/home/foxx/Android/Sdk/ndk/27.0.12077973", + "-DCMAKE_ANDROID_NDK\u003d/home/foxx/Android/Sdk/ndk/27.0.12077973", + "-DCMAKE_TOOLCHAIN_FILE\u003d/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake", + "-DCMAKE_MAKE_PROGRAM\u003d/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja", + "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY\u003d/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64", + "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY\u003d/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64", + "-DCMAKE_BUILD_TYPE\u003dDebug", + "-B/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64", + "-GNinja", + "-DANDROID_STL\u003dc++_shared", + "-DANDROID_CCACHE\u003d/usr/bin/ccache" + ], + "stlLibraryFile": "/home/foxx/Android/Sdk/ndk/27.0.12077973/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/libc++_shared.so", + "intermediatesParentFolder": "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m" +} \ No newline at end of file diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_stderr_androidcast_codecs.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_stderr_androidcast_codecs.txt new file mode 100644 index 0000000..e69de29 diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_stderr_targets.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_stderr_targets.txt new file mode 100644 index 0000000..e69de29 diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_stdout_androidcast_codecs.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_stdout_androidcast_codecs.txt new file mode 100644 index 0000000..8c827dd --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_stdout_androidcast_codecs.txt @@ -0,0 +1,7 @@ +ninja: Entering directory `/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64' +[1/6] Building C object CMakeFiles/androidcast_codecs.dir/jni/opus_bridge.c.o +[2/6] Building C object CMakeFiles/androidcast_codecs.dir/jni/androidcast_codecs.c.o +[3/6] Building C object CMakeFiles/androidcast_codecs.dir/jni/libvpx_bridge.c.o +[4/6] Building C object CMakeFiles/androidcast_codecs.dir/jni/speex_bridge.c.o +[5/6] Building C object CMakeFiles/androidcast_codecs.dir/jni/crash_hook.c.o +[6/6] Linking C shared library "/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_codecs.so" diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_stdout_targets.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_stdout_targets.txt new file mode 100644 index 0000000..b99e52d --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/build_stdout_targets.txt @@ -0,0 +1,2 @@ +ninja: Entering directory `/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64' +ninja: no work to do. diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/configure_command b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/configure_command new file mode 100755 index 0000000..7649697 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/configure_command @@ -0,0 +1,19 @@ +/home/foxx/Android/Sdk/cmake/3.22.1/bin/cmake \ + "-H/home/foxx/repos/My Projects/android cast/ndk" \ + -DCMAKE_SYSTEM_NAME=Android \ + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + -DCMAKE_SYSTEM_VERSION=29 \ + -DANDROID_PLATFORM=android-29 \ + -DANDROID_ABI=x86_64 \ + -DCMAKE_ANDROID_ARCH_ABI=x86_64 \ + -DANDROID_NDK=/home/foxx/Android/Sdk/ndk/27.0.12077973 \ + -DCMAKE_ANDROID_NDK=/home/foxx/Android/Sdk/ndk/27.0.12077973 \ + -DCMAKE_TOOLCHAIN_FILE=/home/foxx/Android/Sdk/ndk/27.0.12077973/build/cmake/android.toolchain.cmake \ + -DCMAKE_MAKE_PROGRAM=/home/foxx/Android/Sdk/cmake/3.22.1/bin/ninja \ + "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64" \ + "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/home/foxx/repos/My Projects/android cast/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64" \ + -DCMAKE_BUILD_TYPE=Debug \ + "-B/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64" \ + -GNinja \ + -DANDROID_STL=c++_shared \ + -DANDROID_CCACHE=/usr/bin/ccache diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/configure_stderr.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/configure_stderr.txt new file mode 100644 index 0000000..e69de29 diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/configure_stdout.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/configure_stdout.txt new file mode 100644 index 0000000..d31d5fa --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/configure_stdout.txt @@ -0,0 +1,6 @@ +-- Linking libvpx for x86_64: /home/foxx/repos/My Projects/android cast/ndk/../build/native/x86_64/libvpx.a +-- Linking libopus for x86_64: /home/foxx/repos/My Projects/android cast/ndk/../build/native/x86_64/libopus.a +-- Linking libspeex for x86_64: /home/foxx/repos/My Projects/android cast/ndk/../build/native/x86_64/libspeex.a +-- Configuring done +-- Generating done +-- Build files have been written to: /home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64 diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/generate_cxx_metadata_107_timing.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/generate_cxx_metadata_107_timing.txt new file mode 100644 index 0000000..5608956 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/generate_cxx_metadata_107_timing.txt @@ -0,0 +1,7 @@ +# C/C++ build system timings +generate_cxx_metadata + execute-generate-process + exec-configure 15ms + execute-generate-process completed in 22ms +generate_cxx_metadata completed in 27ms + diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/generate_cxx_metadata_108_timing.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/generate_cxx_metadata_108_timing.txt new file mode 100644 index 0000000..9708df4 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/generate_cxx_metadata_108_timing.txt @@ -0,0 +1,2 @@ +# C/C++ build system timings + diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/generate_cxx_metadata_154_timing.txt b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/generate_cxx_metadata_154_timing.txt new file mode 100644 index 0000000..0f989ef --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/generate_cxx_metadata_154_timing.txt @@ -0,0 +1,7 @@ +# C/C++ build system timings +generate_cxx_metadata + execute-generate-process + exec-configure 67ms + execute-generate-process completed in 73ms +generate_cxx_metadata completed in 78ms + diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/metadata_generation_record.json b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/metadata_generation_record.json new file mode 100644 index 0000000..4744c39 --- /dev/null +++ b/app/build/intermediates/cxx/Debug/505h1w6m/logs/x86_64/metadata_generation_record.json @@ -0,0 +1,41 @@ +[ + { + "level_": 0, + "message_": "Start JSON generation. Platform version: 29 min SDK version: x86_64", + "file_": "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt", + "tag_": "debug|x86_64", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {} + }, + "memoizedSize": -1, + "memoizedHashCode": 0 + }, + { + "level_": 0, + "message_": "JSON \u0027/home/foxx/repos/My Projects/android cast/app/.cxx/Debug/505h1w6m/x86_64/android_gradle_build.json\u0027 was up-to-date", + "file_": "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt", + "tag_": "debug|x86_64", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {} + }, + "memoizedSize": -1, + "memoizedHashCode": 0 + }, + { + "level_": 0, + "message_": "JSON generation completed without problems", + "file_": "/home/foxx/repos/My Projects/android cast/ndk/CMakeLists.txt", + "tag_": "debug|x86_64", + "diagnosticCode_": 0, + "memoizedIsInitialized": 1, + "unknownFields": { + "fields": {} + }, + "memoizedSize": -1, + "memoizedHashCode": 0 + } +] \ No newline at end of file diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_codecs.so b/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_codecs.so new file mode 100755 index 0000000..eb5493c Binary files /dev/null and b/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_codecs.so differ diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_entitlements.so b/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_entitlements.so new file mode 100755 index 0000000..69dcdc5 Binary files /dev/null and b/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libandroidcast_entitlements.so differ diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libc++_shared.so b/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libc++_shared.so new file mode 100755 index 0000000..a80c8b3 Binary files /dev/null and b/app/build/intermediates/cxx/Debug/505h1w6m/obj/arm64-v8a/libc++_shared.so differ diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_codecs.so b/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_codecs.so new file mode 100755 index 0000000..d91c449 Binary files /dev/null and b/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_codecs.so differ diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_entitlements.so b/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_entitlements.so new file mode 100755 index 0000000..132c1a6 Binary files /dev/null and b/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libandroidcast_entitlements.so differ diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libc++_shared.so b/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libc++_shared.so new file mode 100755 index 0000000..cbff8a9 Binary files /dev/null and b/app/build/intermediates/cxx/Debug/505h1w6m/obj/armeabi-v7a/libc++_shared.so differ diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_codecs.so b/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_codecs.so new file mode 100755 index 0000000..01d8427 Binary files /dev/null and b/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_codecs.so differ diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_entitlements.so b/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_entitlements.so new file mode 100755 index 0000000..c3ab209 Binary files /dev/null and b/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libandroidcast_entitlements.so differ diff --git a/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libc++_shared.so b/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libc++_shared.so new file mode 100755 index 0000000..a373f86 Binary files /dev/null and b/app/build/intermediates/cxx/Debug/505h1w6m/obj/x86_64/libc++_shared.so differ diff --git a/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_0/graph.bin b/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_0/graph.bin new file mode 100644 index 0000000..21f18e5 Binary files /dev/null and b/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_0/graph.bin differ diff --git a/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_1/graph.bin b/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_1/graph.bin new file mode 100644 index 0000000..581845a Binary files /dev/null and b/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_1/graph.bin differ diff --git a/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_2/graph.bin b/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_2/graph.bin new file mode 100644 index 0000000..035e8fb Binary files /dev/null and b/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_2/graph.bin differ diff --git a/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_3/graph.bin b/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_3/graph.bin new file mode 100644 index 0000000..c07b382 Binary files /dev/null and b/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_3/graph.bin differ diff --git a/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_5484b637cbf5b2a6a1de44ea7902f46e87a91f7de7e925eae04e5454715aeecd_bucket_0/graph.bin b/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_5484b637cbf5b2a6a1de44ea7902f46e87a91f7de7e925eae04e5454715aeecd_bucket_0/graph.bin new file mode 100644 index 0000000..601f245 Binary files /dev/null and b/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_5484b637cbf5b2a6a1de44ea7902f46e87a91f7de7e925eae04e5454715aeecd_bucket_0/graph.bin differ diff --git a/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_5484b637cbf5b2a6a1de44ea7902f46e87a91f7de7e925eae04e5454715aeecd_bucket_1/graph.bin b/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_5484b637cbf5b2a6a1de44ea7902f46e87a91f7de7e925eae04e5454715aeecd_bucket_1/graph.bin new file mode 100644 index 0000000..601f245 Binary files /dev/null and b/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_5484b637cbf5b2a6a1de44ea7902f46e87a91f7de7e925eae04e5454715aeecd_bucket_1/graph.bin differ diff --git a/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_5484b637cbf5b2a6a1de44ea7902f46e87a91f7de7e925eae04e5454715aeecd_bucket_2/graph.bin b/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_5484b637cbf5b2a6a1de44ea7902f46e87a91f7de7e925eae04e5454715aeecd_bucket_2/graph.bin new file mode 100644 index 0000000..601f245 Binary files /dev/null and b/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_5484b637cbf5b2a6a1de44ea7902f46e87a91f7de7e925eae04e5454715aeecd_bucket_2/graph.bin differ diff --git a/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_5484b637cbf5b2a6a1de44ea7902f46e87a91f7de7e925eae04e5454715aeecd_bucket_3/graph.bin b/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_5484b637cbf5b2a6a1de44ea7902f46e87a91f7de7e925eae04e5454715aeecd_bucket_3/graph.bin new file mode 100644 index 0000000..601f245 Binary files /dev/null and b/app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_5484b637cbf5b2a6a1de44ea7902f46e87a91f7de7e925eae04e5454715aeecd_bucket_3/graph.bin differ diff --git a/app/build/intermediates/dex/debug/mergeExtDexDebug/classes.dex b/app/build/intermediates/dex/debug/mergeExtDexDebug/classes.dex new file mode 100644 index 0000000..6ebff88 Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeExtDexDebug/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeExtDexDebug/classes2.dex b/app/build/intermediates/dex/debug/mergeExtDexDebug/classes2.dex new file mode 100644 index 0000000..89a1655 Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeExtDexDebug/classes2.dex differ diff --git a/app/build/intermediates/dex/debug/mergeLibDexDebug/14/classes.dex b/app/build/intermediates/dex/debug/mergeLibDexDebug/14/classes.dex new file mode 100644 index 0000000..b83cf2b Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeLibDexDebug/14/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeLibDexDebug/6/classes.dex b/app/build/intermediates/dex/debug/mergeLibDexDebug/6/classes.dex new file mode 100644 index 0000000..c2b6adc Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeLibDexDebug/6/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeLibDexDebug/8/classes.dex b/app/build/intermediates/dex/debug/mergeLibDexDebug/8/classes.dex new file mode 100644 index 0000000..538a4af Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeLibDexDebug/8/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeLibDexDebug/9/classes.dex b/app/build/intermediates/dex/debug/mergeLibDexDebug/9/classes.dex new file mode 100644 index 0000000..66445df Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeLibDexDebug/9/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeProjectDexDebug/0/classes.dex b/app/build/intermediates/dex/debug/mergeProjectDexDebug/0/classes.dex new file mode 100644 index 0000000..34e50cf Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeProjectDexDebug/0/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeProjectDexDebug/1/classes.dex b/app/build/intermediates/dex/debug/mergeProjectDexDebug/1/classes.dex new file mode 100644 index 0000000..9fcd5ab Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeProjectDexDebug/1/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeProjectDexDebug/10/classes.dex b/app/build/intermediates/dex/debug/mergeProjectDexDebug/10/classes.dex new file mode 100644 index 0000000..cba3f39 Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeProjectDexDebug/10/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeProjectDexDebug/11/classes.dex b/app/build/intermediates/dex/debug/mergeProjectDexDebug/11/classes.dex new file mode 100644 index 0000000..d51d6a9 Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeProjectDexDebug/11/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeProjectDexDebug/12/classes.dex b/app/build/intermediates/dex/debug/mergeProjectDexDebug/12/classes.dex new file mode 100644 index 0000000..5b0cb0f Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeProjectDexDebug/12/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeProjectDexDebug/13/classes.dex b/app/build/intermediates/dex/debug/mergeProjectDexDebug/13/classes.dex new file mode 100644 index 0000000..215b2d9 Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeProjectDexDebug/13/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeProjectDexDebug/14/classes.dex b/app/build/intermediates/dex/debug/mergeProjectDexDebug/14/classes.dex new file mode 100644 index 0000000..3462f01 Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeProjectDexDebug/14/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeProjectDexDebug/15/classes.dex b/app/build/intermediates/dex/debug/mergeProjectDexDebug/15/classes.dex new file mode 100644 index 0000000..0603fa3 Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeProjectDexDebug/15/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeProjectDexDebug/2/classes.dex b/app/build/intermediates/dex/debug/mergeProjectDexDebug/2/classes.dex new file mode 100644 index 0000000..a4558d1 Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeProjectDexDebug/2/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeProjectDexDebug/3/classes.dex b/app/build/intermediates/dex/debug/mergeProjectDexDebug/3/classes.dex new file mode 100644 index 0000000..acf70a2 Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeProjectDexDebug/3/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeProjectDexDebug/4/classes.dex b/app/build/intermediates/dex/debug/mergeProjectDexDebug/4/classes.dex new file mode 100644 index 0000000..fa2e96b Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeProjectDexDebug/4/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeProjectDexDebug/5/classes.dex b/app/build/intermediates/dex/debug/mergeProjectDexDebug/5/classes.dex new file mode 100644 index 0000000..af05290 Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeProjectDexDebug/5/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeProjectDexDebug/7/classes.dex b/app/build/intermediates/dex/debug/mergeProjectDexDebug/7/classes.dex new file mode 100644 index 0000000..f68ff5a Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeProjectDexDebug/7/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeProjectDexDebug/8/classes.dex b/app/build/intermediates/dex/debug/mergeProjectDexDebug/8/classes.dex new file mode 100644 index 0000000..84e9d5f Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeProjectDexDebug/8/classes.dex differ diff --git a/app/build/intermediates/dex/debug/mergeProjectDexDebug/9/classes.dex b/app/build/intermediates/dex/debug/mergeProjectDexDebug/9/classes.dex new file mode 100644 index 0000000..b10ee4b Binary files /dev/null and b/app/build/intermediates/dex/debug/mergeProjectDexDebug/9/classes.dex differ diff --git a/app/build/intermediates/dex_archive_input_jar_hashes/debug/dexBuilderDebug/out b/app/build/intermediates/dex_archive_input_jar_hashes/debug/dexBuilderDebug/out new file mode 100644 index 0000000..b4e1338 Binary files /dev/null and b/app/build/intermediates/dex_archive_input_jar_hashes/debug/dexBuilderDebug/out differ diff --git a/app/build/intermediates/dex_number_of_buckets_file/debug/dexBuilderDebug/out b/app/build/intermediates/dex_number_of_buckets_file/debug/dexBuilderDebug/out new file mode 100644 index 0000000..bf0d87a --- /dev/null +++ b/app/build/intermediates/dex_number_of_buckets_file/debug/dexBuilderDebug/out @@ -0,0 +1 @@ +4 \ No newline at end of file diff --git a/app/build/intermediates/global_synthetics_dex/debug/mergeDebugGlobalSynthetics/classes.dex b/app/build/intermediates/global_synthetics_dex/debug/mergeDebugGlobalSynthetics/classes.dex new file mode 100644 index 0000000..e694997 Binary files /dev/null and b/app/build/intermediates/global_synthetics_dex/debug/mergeDebugGlobalSynthetics/classes.dex differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/merge-state b/app/build/intermediates/incremental/debug-mergeJavaRes/merge-state new file mode 100644 index 0000000..4942ead Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/merge-state differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/0G85dKUkAygDYLKl+EoYN6pC888= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/0G85dKUkAygDYLKl+EoYN6pC888= new file mode 100644 index 0000000..24f3591 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/0G85dKUkAygDYLKl+EoYN6pC888= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/2OWKvjv2JUn_iIpn_TXR7wL4bLU= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/2OWKvjv2JUn_iIpn_TXR7wL4bLU= new file mode 100644 index 0000000..ae9d872 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/2OWKvjv2JUn_iIpn_TXR7wL4bLU= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/4OxVBC5CpIISkLAIUBXL0oJbNaI= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/4OxVBC5CpIISkLAIUBXL0oJbNaI= new file mode 100644 index 0000000..6ec2aba Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/4OxVBC5CpIISkLAIUBXL0oJbNaI= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/4yDlP1XW9c8QotKHJ+jP5Ozawxk= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/4yDlP1XW9c8QotKHJ+jP5Ozawxk= new file mode 100644 index 0000000..1ffce77 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/4yDlP1XW9c8QotKHJ+jP5Ozawxk= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/5gStxtOxbYojjUKGdW2JTHOSRXk= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/5gStxtOxbYojjUKGdW2JTHOSRXk= new file mode 100644 index 0000000..6967976 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/5gStxtOxbYojjUKGdW2JTHOSRXk= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/6RoAtXUNtehxvOMm1PQbOM5GOak= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/6RoAtXUNtehxvOMm1PQbOM5GOak= new file mode 100644 index 0000000..66f1278 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/6RoAtXUNtehxvOMm1PQbOM5GOak= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7IMhprtsrCicV2tKZUAipZqq2rg= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7IMhprtsrCicV2tKZUAipZqq2rg= new file mode 100644 index 0000000..289c817 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7IMhprtsrCicV2tKZUAipZqq2rg= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7VtvLqwmFrKIUsCc7YZRYJpS3HA= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7VtvLqwmFrKIUsCc7YZRYJpS3HA= new file mode 100644 index 0000000..f3fd80a Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7VtvLqwmFrKIUsCc7YZRYJpS3HA= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7d7LOL1ylMEZXLWGNREgp9v1xlY= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7d7LOL1ylMEZXLWGNREgp9v1xlY= new file mode 100644 index 0000000..b2efafc Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7d7LOL1ylMEZXLWGNREgp9v1xlY= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/865ulXYnsAiv0CE50VC6b++cAaQ= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/865ulXYnsAiv0CE50VC6b++cAaQ= new file mode 100644 index 0000000..2c4d543 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/865ulXYnsAiv0CE50VC6b++cAaQ= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/8ayfemddTc9TOoAa6lqtXdZvJhI= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/8ayfemddTc9TOoAa6lqtXdZvJhI= new file mode 100644 index 0000000..ede49a3 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/8ayfemddTc9TOoAa6lqtXdZvJhI= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/8vRuhAc1SnbjGbKCg7wrbe2HNUM= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/8vRuhAc1SnbjGbKCg7wrbe2HNUM= new file mode 100644 index 0000000..42e5f24 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/8vRuhAc1SnbjGbKCg7wrbe2HNUM= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/8yso6BUOwlqY4SyDDdJNq44GngA= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/8yso6BUOwlqY4SyDDdJNq44GngA= new file mode 100644 index 0000000..63edd05 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/8yso6BUOwlqY4SyDDdJNq44GngA= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/A2QedeKIUeMMIyp80VfwF2RT1yM= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/A2QedeKIUeMMIyp80VfwF2RT1yM= new file mode 100644 index 0000000..ae62e0d Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/A2QedeKIUeMMIyp80VfwF2RT1yM= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/AcMqx2aeDUOmQgC01FQS5gMFH4E= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/AcMqx2aeDUOmQgC01FQS5gMFH4E= new file mode 100644 index 0000000..6c9803f Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/AcMqx2aeDUOmQgC01FQS5gMFH4E= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/BC77uQO9dlM2l8aTeWeiSf_qL88= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/BC77uQO9dlM2l8aTeWeiSf_qL88= new file mode 100644 index 0000000..6845853 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/BC77uQO9dlM2l8aTeWeiSf_qL88= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/CeckB8Jab1XUS+aSb5svAV49BK0= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/CeckB8Jab1XUS+aSb5svAV49BK0= new file mode 100644 index 0000000..8bf936d Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/CeckB8Jab1XUS+aSb5svAV49BK0= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Cs5OPwLd0658y4_xT49_eV5YKyA= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Cs5OPwLd0658y4_xT49_eV5YKyA= new file mode 100644 index 0000000..846dea1 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Cs5OPwLd0658y4_xT49_eV5YKyA= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/DsrMuAOYWv5u8HAnQShzTPP7Ink= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/DsrMuAOYWv5u8HAnQShzTPP7Ink= new file mode 100644 index 0000000..8568b5b Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/DsrMuAOYWv5u8HAnQShzTPP7Ink= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/H0Bso8xc0_BpJnRuP0XUchnKT3A= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/H0Bso8xc0_BpJnRuP0XUchnKT3A= new file mode 100644 index 0000000..ff3b59a Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/H0Bso8xc0_BpJnRuP0XUchnKT3A= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/HXFvbPsmlxtMuaGbUSt3E3Awx64= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/HXFvbPsmlxtMuaGbUSt3E3Awx64= new file mode 100644 index 0000000..dccab6f Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/HXFvbPsmlxtMuaGbUSt3E3Awx64= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/HhOB6u9Cn6o0P+uQ_nwCAHoqDQw= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/HhOB6u9Cn6o0P+uQ_nwCAHoqDQw= new file mode 100644 index 0000000..dcde0b9 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/HhOB6u9Cn6o0P+uQ_nwCAHoqDQw= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/J7j3x1UW6Nc0xxBSvZ+yGTmdf3A= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/J7j3x1UW6Nc0xxBSvZ+yGTmdf3A= new file mode 100644 index 0000000..7d3ce68 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/J7j3x1UW6Nc0xxBSvZ+yGTmdf3A= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/JAeZtuzBwq2KeXI7WhVsqSk7lMo= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/JAeZtuzBwq2KeXI7WhVsqSk7lMo= new file mode 100644 index 0000000..0f39dde Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/JAeZtuzBwq2KeXI7WhVsqSk7lMo= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/JyPG1lF8rLOnDPKZOUZf4QLA_uI= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/JyPG1lF8rLOnDPKZOUZf4QLA_uI= new file mode 100644 index 0000000..30ca1d1 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/JyPG1lF8rLOnDPKZOUZf4QLA_uI= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Keu3K0+9JJ39ULPIVWnmAQWmnUM= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Keu3K0+9JJ39ULPIVWnmAQWmnUM= new file mode 100644 index 0000000..dc7b90e Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Keu3K0+9JJ39ULPIVWnmAQWmnUM= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/M9CXMYH4vE_ufAqsjnq8m2Uolaw= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/M9CXMYH4vE_ufAqsjnq8m2Uolaw= new file mode 100644 index 0000000..95d68ea Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/M9CXMYH4vE_ufAqsjnq8m2Uolaw= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/NEUDj2VCZsSpN2cnP0Lc14JJBWo= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/NEUDj2VCZsSpN2cnP0Lc14JJBWo= new file mode 100644 index 0000000..3ecd7d5 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/NEUDj2VCZsSpN2cnP0Lc14JJBWo= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/NKkPFN2mYmNtIk9BYhnL79kjeF8= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/NKkPFN2mYmNtIk9BYhnL79kjeF8= new file mode 100644 index 0000000..fb794be Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/NKkPFN2mYmNtIk9BYhnL79kjeF8= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Nc6Ah8qLfUr0cHwKU3OK2r1buFU= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Nc6Ah8qLfUr0cHwKU3OK2r1buFU= new file mode 100644 index 0000000..07b7738 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Nc6Ah8qLfUr0cHwKU3OK2r1buFU= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/OVm5UwKQFvL6vKfoq+ZW0PeBeM8= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/OVm5UwKQFvL6vKfoq+ZW0PeBeM8= new file mode 100644 index 0000000..90d5279 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/OVm5UwKQFvL6vKfoq+ZW0PeBeM8= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Och2BJbotH6RyorihCaKFSp454Q= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Och2BJbotH6RyorihCaKFSp454Q= new file mode 100644 index 0000000..1849ad8 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Och2BJbotH6RyorihCaKFSp454Q= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/OoEZelK9H3NRH7x8frnu3roJC5M= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/OoEZelK9H3NRH7x8frnu3roJC5M= new file mode 100644 index 0000000..427b655 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/OoEZelK9H3NRH7x8frnu3roJC5M= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/PF0D9l31Rf+ZHv9nZR99Hrilvf4= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/PF0D9l31Rf+ZHv9nZR99Hrilvf4= new file mode 100644 index 0000000..fd5e6f2 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/PF0D9l31Rf+ZHv9nZR99Hrilvf4= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Q9D+LFe+hCsTqCpvwZafOI358ok= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Q9D+LFe+hCsTqCpvwZafOI358ok= new file mode 100644 index 0000000..fb7d7d9 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Q9D+LFe+hCsTqCpvwZafOI358ok= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/QZA8y+iys775aPQ78jRhsbzPyA4= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/QZA8y+iys775aPQ78jRhsbzPyA4= new file mode 100644 index 0000000..2218128 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/QZA8y+iys775aPQ78jRhsbzPyA4= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/SfI94pCoU1sj6ow8Y4ufpCklTls= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/SfI94pCoU1sj6ow8Y4ufpCklTls= new file mode 100644 index 0000000..2510a5a Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/SfI94pCoU1sj6ow8Y4ufpCklTls= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UIDJk1xC3POcVJOqX60ExEmkqIY= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UIDJk1xC3POcVJOqX60ExEmkqIY= new file mode 100644 index 0000000..1e14f1e Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UIDJk1xC3POcVJOqX60ExEmkqIY= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UhXOYEc+TeZOCgz82NrJ6CzcHSo= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UhXOYEc+TeZOCgz82NrJ6CzcHSo= new file mode 100644 index 0000000..c68ea7a Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UhXOYEc+TeZOCgz82NrJ6CzcHSo= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Vqr9YAryketUYyn0p0COvOzaIII= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Vqr9YAryketUYyn0p0COvOzaIII= new file mode 100644 index 0000000..99f5ba0 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Vqr9YAryketUYyn0p0COvOzaIII= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/W95o95ca5kyMrQQK77XaU8nD34Y= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/W95o95ca5kyMrQQK77XaU8nD34Y= new file mode 100644 index 0000000..4c9f52f Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/W95o95ca5kyMrQQK77XaU8nD34Y= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/WNwckCYBoIBLWL7qXiu+A5PLO6E= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/WNwckCYBoIBLWL7qXiu+A5PLO6E= new file mode 100644 index 0000000..3d3224d Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/WNwckCYBoIBLWL7qXiu+A5PLO6E= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Wx_j09HSi+GH7AD247YEFMhyiDM= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Wx_j09HSi+GH7AD247YEFMhyiDM= new file mode 100644 index 0000000..86c0d45 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Wx_j09HSi+GH7AD247YEFMhyiDM= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/XbWCkQSdsMvVVgNH2zgf6pyDJMY= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/XbWCkQSdsMvVVgNH2zgf6pyDJMY= new file mode 100644 index 0000000..6ccda32 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/XbWCkQSdsMvVVgNH2zgf6pyDJMY= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Y+2FS+irc9HXsUnLCRG+oyMAs3c= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Y+2FS+irc9HXsUnLCRG+oyMAs3c= new file mode 100644 index 0000000..9426e40 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Y+2FS+irc9HXsUnLCRG+oyMAs3c= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/_W3hdWmUNnaGZ_3p8g2OKZDwKqo= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/_W3hdWmUNnaGZ_3p8g2OKZDwKqo= new file mode 100644 index 0000000..f751937 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/_W3hdWmUNnaGZ_3p8g2OKZDwKqo= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/__DuJ4fsz+I4km7rtSeTK2LWQQA= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/__DuJ4fsz+I4km7rtSeTK2LWQQA= new file mode 100644 index 0000000..8fd6cd4 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/__DuJ4fsz+I4km7rtSeTK2LWQQA= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/_hS6ORy9dmOG0oBaRiPig35DNA4= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/_hS6ORy9dmOG0oBaRiPig35DNA4= new file mode 100644 index 0000000..29999b7 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/_hS6ORy9dmOG0oBaRiPig35DNA4= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/aIhafC77SC8z0TYFGKSmKmniesw= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/aIhafC77SC8z0TYFGKSmKmniesw= new file mode 100644 index 0000000..833b095 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/aIhafC77SC8z0TYFGKSmKmniesw= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/b9zcDKPM0L1JWm7IfMOYiWRAnEQ= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/b9zcDKPM0L1JWm7IfMOYiWRAnEQ= new file mode 100644 index 0000000..819381c Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/b9zcDKPM0L1JWm7IfMOYiWRAnEQ= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/bNdZd1V1ykFalYP4S7nF+UrvwTQ= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/bNdZd1V1ykFalYP4S7nF+UrvwTQ= new file mode 100644 index 0000000..511891c Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/bNdZd1V1ykFalYP4S7nF+UrvwTQ= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/bVvAJzVy40YdZGOdKDY36JID2+w= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/bVvAJzVy40YdZGOdKDY36JID2+w= new file mode 100644 index 0000000..1497faa Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/bVvAJzVy40YdZGOdKDY36JID2+w= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/bwjyB_p1157P5fTemctRu+VNHjc= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/bwjyB_p1157P5fTemctRu+VNHjc= new file mode 100644 index 0000000..6bc3b42 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/bwjyB_p1157P5fTemctRu+VNHjc= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/ehQl93kmqpHUtAd_YRvFcgJg75o= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/ehQl93kmqpHUtAd_YRvFcgJg75o= new file mode 100644 index 0000000..bff7b3b Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/ehQl93kmqpHUtAd_YRvFcgJg75o= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/fLraYWG5VwqQokVaId_s6sQOhXQ= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/fLraYWG5VwqQokVaId_s6sQOhXQ= new file mode 100644 index 0000000..5e67692 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/fLraYWG5VwqQokVaId_s6sQOhXQ= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/gsX8uzvqaGZWM1vhP3SvULvrUqY= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/gsX8uzvqaGZWM1vhP3SvULvrUqY= new file mode 100644 index 0000000..4ba6311 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/gsX8uzvqaGZWM1vhP3SvULvrUqY= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/iLvBvBy6peuOj77XiA2vlGxqsd8= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/iLvBvBy6peuOj77XiA2vlGxqsd8= new file mode 100644 index 0000000..31b2786 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/iLvBvBy6peuOj77XiA2vlGxqsd8= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/id39JVwNxk8CxjXe8hdiqnUng6A= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/id39JVwNxk8CxjXe8hdiqnUng6A= new file mode 100644 index 0000000..2ba6503 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/id39JVwNxk8CxjXe8hdiqnUng6A= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/j9vXKJ2ombI7G4Fivqa+a3RxSf0= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/j9vXKJ2ombI7G4Fivqa+a3RxSf0= new file mode 100644 index 0000000..21e1755 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/j9vXKJ2ombI7G4Fivqa+a3RxSf0= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/l8GVxRpVgSIbvhkNgw1uveY+L5c= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/l8GVxRpVgSIbvhkNgw1uveY+L5c= new file mode 100644 index 0000000..ac6c1db Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/l8GVxRpVgSIbvhkNgw1uveY+L5c= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/lFGV+2JvTjXx6GKRm6szPS6Y1yo= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/lFGV+2JvTjXx6GKRm6szPS6Y1yo= new file mode 100644 index 0000000..ba19014 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/lFGV+2JvTjXx6GKRm6szPS6Y1yo= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/manZBA0gpJ8BpsvsEg2Ui5vfPac= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/manZBA0gpJ8BpsvsEg2Ui5vfPac= new file mode 100644 index 0000000..8236e91 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/manZBA0gpJ8BpsvsEg2Ui5vfPac= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/nFjS4HcAP5iI97UNnlw_Yug3At4= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/nFjS4HcAP5iI97UNnlw_Yug3At4= new file mode 100644 index 0000000..fd3a7e7 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/nFjS4HcAP5iI97UNnlw_Yug3At4= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/nW1zfChjUR0Ux03UPviSphmKJFc= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/nW1zfChjUR0Ux03UPviSphmKJFc= new file mode 100644 index 0000000..fd6b42c Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/nW1zfChjUR0Ux03UPviSphmKJFc= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/oFp7V32SNmC+8R_ZkDfxIDfWKo0= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/oFp7V32SNmC+8R_ZkDfxIDfWKo0= new file mode 100644 index 0000000..565445a Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/oFp7V32SNmC+8R_ZkDfxIDfWKo0= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/pS5xRNu3yT0vCkOjpSsSstg_kFM= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/pS5xRNu3yT0vCkOjpSsSstg_kFM= new file mode 100644 index 0000000..5c88b2b Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/pS5xRNu3yT0vCkOjpSsSstg_kFM= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/pYWdSP7y61_2pqxzci9aesf0Zgo= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/pYWdSP7y61_2pqxzci9aesf0Zgo= new file mode 100644 index 0000000..de755d1 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/pYWdSP7y61_2pqxzci9aesf0Zgo= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/pkBq4Ux84bzapOe+4OYh4IZUMJo= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/pkBq4Ux84bzapOe+4OYh4IZUMJo= new file mode 100644 index 0000000..21eb307 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/pkBq4Ux84bzapOe+4OYh4IZUMJo= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/q2xkdQulGS+8Tq7CavSLI4hdwEQ= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/q2xkdQulGS+8Tq7CavSLI4hdwEQ= new file mode 100644 index 0000000..c3eef53 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/q2xkdQulGS+8Tq7CavSLI4hdwEQ= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/qG0Vt_9REzw9Awh4hHqnEFryBTY= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/qG0Vt_9REzw9Awh4hHqnEFryBTY= new file mode 100644 index 0000000..466b875 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/qG0Vt_9REzw9Awh4hHqnEFryBTY= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/rF6bn7eILhTQN5tfvnNoyouqoi0= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/rF6bn7eILhTQN5tfvnNoyouqoi0= new file mode 100644 index 0000000..dd51769 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/rF6bn7eILhTQN5tfvnNoyouqoi0= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/rNv3IA4e3g2SrwL00ByLkE4JvgQ= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/rNv3IA4e3g2SrwL00ByLkE4JvgQ= new file mode 100644 index 0000000..2cec677 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/rNv3IA4e3g2SrwL00ByLkE4JvgQ= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/sjatE+g8+EeDKxh5nxk4WknF__0= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/sjatE+g8+EeDKxh5nxk4WknF__0= new file mode 100644 index 0000000..945c57c Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/sjatE+g8+EeDKxh5nxk4WknF__0= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/t6O5abC1uh4AjIYgWeGfk+03vg8= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/t6O5abC1uh4AjIYgWeGfk+03vg8= new file mode 100644 index 0000000..5e9d2aa Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/t6O5abC1uh4AjIYgWeGfk+03vg8= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/tJnFjLJ7FeNQXSEnQbgdYLpSGEQ= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/tJnFjLJ7FeNQXSEnQbgdYLpSGEQ= new file mode 100644 index 0000000..7a7e32c Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/tJnFjLJ7FeNQXSEnQbgdYLpSGEQ= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/uW4NlXKEvbxtCxujmHOFGQ9ggQ4= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/uW4NlXKEvbxtCxujmHOFGQ9ggQ4= new file mode 100644 index 0000000..b2a9d0b Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/uW4NlXKEvbxtCxujmHOFGQ9ggQ4= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/ulwd9izFDf4XyIad5rHGFi8LgHM= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/ulwd9izFDf4XyIad5rHGFi8LgHM= new file mode 100644 index 0000000..88f5191 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/ulwd9izFDf4XyIad5rHGFi8LgHM= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/vKuaqksiDh8beg+EakC_teUxWOY= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/vKuaqksiDh8beg+EakC_teUxWOY= new file mode 100644 index 0000000..6726f83 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/vKuaqksiDh8beg+EakC_teUxWOY= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/w7b5R6uMGvQXk7aDownYgJRa5l0= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/w7b5R6uMGvQXk7aDownYgJRa5l0= new file mode 100644 index 0000000..aacaa36 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/w7b5R6uMGvQXk7aDownYgJRa5l0= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/wYR_ShVzMrSSVVSan01k6PMf0ak= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/wYR_ShVzMrSSVVSan01k6PMf0ak= new file mode 100644 index 0000000..55a3f5c Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/wYR_ShVzMrSSVVSan01k6PMf0ak= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/wntTIB4BzJVx8GK37vM5ILLT3X0= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/wntTIB4BzJVx8GK37vM5ILLT3X0= new file mode 100644 index 0000000..4f1af9b Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/wntTIB4BzJVx8GK37vM5ILLT3X0= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/xDow5JJJS3ogmuOp7UTUTLU3vlY= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/xDow5JJJS3ogmuOp7UTUTLU3vlY= new file mode 100644 index 0000000..b73828b Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/xDow5JJJS3ogmuOp7UTUTLU3vlY= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/xGDDTmPC7A8+WtloxtXhP8n4wTA= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/xGDDTmPC7A8+WtloxtXhP8n4wTA= new file mode 100644 index 0000000..567d422 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/xGDDTmPC7A8+WtloxtXhP8n4wTA= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/y0qbvATfKDG7+EkPBkhWLguYNaA= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/y0qbvATfKDG7+EkPBkhWLguYNaA= new file mode 100644 index 0000000..4ca9347 Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/y0qbvATfKDG7+EkPBkhWLguYNaA= differ diff --git a/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/yN15Sgz92s3JkgXwC9NSlUCKyHY= b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/yN15Sgz92s3JkgXwC9NSlUCKyHY= new file mode 100644 index 0000000..b6609af Binary files /dev/null and b/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/yN15Sgz92s3JkgXwC9NSlUCKyHY= differ diff --git a/app/build/intermediates/incremental/debug/mergeDebugResources/compile-file-map.properties b/app/build/intermediates/incremental/debug/mergeDebugResources/compile-file-map.properties new file mode 100644 index 0000000..0393abc --- /dev/null +++ b/app/build/intermediates/incremental/debug/mergeDebugResources/compile-file-map.properties @@ -0,0 +1,49 @@ +#Sat Jun 20 18:32:12 CEST 2026 +com.foxx.androidcast.app-main-40\:/anim/robot_dance.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/anim_robot_dance.xml.flat +com.foxx.androidcast.app-main-40\:/color/device_item_text.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/color_device_item_text.xml.flat +com.foxx.androidcast.app-main-40\:/color/settings_spinner_text.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/color_settings_spinner_text.xml.flat +com.foxx.androidcast.app-main-40\:/drawable-nodpi/calibration_chart_reference.png=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable-nodpi_calibration_chart_reference.png.flat +com.foxx.androidcast.app-main-40\:/drawable/bg_settings_drawer_handle.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_drawer_handle.xml.flat +com.foxx.androidcast.app-main-40\:/drawable/bg_settings_section_header.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_section_header.xml.flat +com.foxx.androidcast.app-main-40\:/drawable/bg_settings_spinner.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_spinner.xml.flat +com.foxx.androidcast.app-main-40\:/drawable/bg_settings_spinner_item.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_spinner_item.xml.flat +com.foxx.androidcast.app-main-40\:/drawable/bg_settings_spinner_item_selected.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_spinner_item_selected.xml.flat +com.foxx.androidcast.app-main-40\:/drawable/bg_settings_spinner_popup.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_spinner_popup.xml.flat +com.foxx.androidcast.app-main-40\:/drawable/bg_spinner_item_underline_dark.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_spinner_item_underline_dark.xml.flat +com.foxx.androidcast.app-main-40\:/drawable/bg_spinner_item_underline_light.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_spinner_item_underline_light.xml.flat +com.foxx.androidcast.app-main-40\:/drawable/device_item_background.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_device_item_background.xml.flat +com.foxx.androidcast.app-main-40\:/drawable/device_item_live_border.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_device_item_live_border.xml.flat +com.foxx.androidcast.app-main-40\:/drawable/ic_android_robot.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_android_robot.xml.flat +com.foxx.androidcast.app-main-40\:/drawable/ic_launcher_foreground.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_launcher_foreground.xml.flat +com.foxx.androidcast.app-main-40\:/drawable/ic_notification.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_notification.xml.flat +com.foxx.androidcast.app-main-40\:/drawable/ic_picture_in_picture.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_picture_in_picture.xml.flat +com.foxx.androidcast.app-main-40\:/drawable/settings_app_info_divider.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_settings_app_info_divider.xml.flat +com.foxx.androidcast.app-main-40\:/layout-land/activity_sender.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout-land_activity_sender.xml.flat +com.foxx.androidcast.app-main-40\:/layout/activity_cast_settings.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_cast_settings.xml.flat +com.foxx.androidcast.app-main-40\:/layout/activity_dev_diagnostics_panel.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_dev_diagnostics_panel.xml.flat +com.foxx.androidcast.app-main-40\:/layout/activity_dev_network_selftest_panel.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_dev_network_selftest_panel.xml.flat +com.foxx.androidcast.app-main-40\:/layout/activity_dev_settings_panel.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_dev_settings_panel.xml.flat +com.foxx.androidcast.app-main-40\:/layout/activity_developer_settings.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_developer_settings.xml.flat +com.foxx.androidcast.app-main-40\:/layout/activity_drawer_host.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_drawer_host.xml.flat +com.foxx.androidcast.app-main-40\:/layout/activity_licenses.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_licenses.xml.flat +com.foxx.androidcast.app-main-40\:/layout/activity_main.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_main.xml.flat +com.foxx.androidcast.app-main-40\:/layout/activity_playback.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_playback.xml.flat +com.foxx.androidcast.app-main-40\:/layout/activity_sender.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_sender.xml.flat +com.foxx.androidcast.app-main-40\:/layout/activity_session_stats_analyzer.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_session_stats_analyzer.xml.flat +com.foxx.androidcast.app-main-40\:/layout/activity_settings_panel.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_settings_panel.xml.flat +com.foxx.androidcast.app-main-40\:/layout/dialog_ota_download.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_dialog_ota_download.xml.flat +com.foxx.androidcast.app-main-40\:/layout/fragment_cast_settings.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_fragment_cast_settings.xml.flat +com.foxx.androidcast.app-main-40\:/layout/include_app_info_section.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_include_app_info_section.xml.flat +com.foxx.androidcast.app-main-40\:/layout/include_settings_section_header.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_include_settings_section_header.xml.flat +com.foxx.androidcast.app-main-40\:/layout/item_device.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_item_device.xml.flat +com.foxx.androidcast.app-main-40\:/layout/item_session_stats.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_item_session_stats.xml.flat +com.foxx.androidcast.app-main-40\:/layout/overlay_cast_diagnostics.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_overlay_cast_diagnostics.xml.flat +com.foxx.androidcast.app-main-40\:/layout/overlay_stream_awaiting.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_overlay_stream_awaiting.xml.flat +com.foxx.androidcast.app-main-40\:/layout/spinner_dropdown_item_scored.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_spinner_dropdown_item_scored.xml.flat +com.foxx.androidcast.app-main-40\:/layout/spinner_dropdown_item_settings.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_spinner_dropdown_item_settings.xml.flat +com.foxx.androidcast.app-main-40\:/layout/spinner_item_scored.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_spinner_item_scored.xml.flat +com.foxx.androidcast.app-main-40\:/layout/spinner_item_settings.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_spinner_item_settings.xml.flat +com.foxx.androidcast.app-main-40\:/layout/view_dev_diag_card.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_view_dev_diag_card.xml.flat +com.foxx.androidcast.app-main-40\:/layout/view_settings_drawer_handle.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_view_settings_drawer_handle.xml.flat +com.foxx.androidcast.app-main-40\:/mipmap-anydpi-v26/ic_launcher.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/mipmap-anydpi-v26_ic_launcher.xml.flat +com.foxx.androidcast.app-main-40\:/xml/file_paths.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/merged_res/debug/mergeDebugResources/xml_file_paths.xml.flat diff --git a/app/build/intermediates/incremental/debug/mergeDebugResources/merged.dir/values/values.xml b/app/build/intermediates/incremental/debug/mergeDebugResources/merged.dir/values/values.xml new file mode 100644 index 0000000..a1a38e8 --- /dev/null +++ b/app/build/intermediates/incremental/debug/mergeDebugResources/merged.dir/values/values.xml @@ -0,0 +1,14372 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + true + #ff000000 + #ffffffff + #7fa87f + @android:color/black + @android:color/black + @color/material_deep_teal_200 + @color/material_deep_teal_500 + #1f000000 + #8a000000 + @color/material_grey_800 + @android:color/white + @color/material_grey_850 + @color/material_grey_50 + #80ffffff + #80000000 + @color/bright_foreground_material_light + @color/bright_foreground_material_dark + @android:color/white + @android:color/black + #ff5a595b + #ffd6d7d7 + #1d873b + #d93025 + #FF424242 + #FFFFFFFF + #03000000 + #37000000 + @android:color/white + #1F000000 + @android:color/black + @android:color/white + #90000000 + #1F000000 + #90000000 + #DE000000 + #14000000 + #121212 + #CF6679 + #FFFFFF + #000000 + #000000 + #000000 + #FFFFFF + #BA86FC + #000000 + #3700B3 + #03DAC6 + #03DAC6 + #121212 + #FFFFFF + #B00020 + #000000 + #FFFFFF + #FFFFFF + #000000 + #000000 + #6200EE + #3700B3 + #3700B3 + #03DAC6 + #018786 + #FFFFFF + @android:color/transparent + #14000000 + #44000000 + #0A000000 + #0F000000 + #1AFFFFFF + #2EFFFFFF + #323232 + #331565C0 + #FF34D399 + #80bebebe + #80323232 + #ffbebebe + #ff323232 + #ff7043 + #ff5722 + @android:color/white + @android:color/black + #6680cbc4 + #66009688 + #1565C0 + #FF212121 + #FFF5F5F5 + #ff000000 + #ff000000 + #ff410e0b + #ffffffff + #ff601410 + #ff8c1d18 + #ffb3261e + #ffdc362e + #ffe46962 + #ffec928e + #fff2b8b5 + #fff9dedc + #fffceeee + #fffffbf9 + #ff000000 + #ff1d1b20 + #ffffffff + #ff211f26 + #ff2b2930 + #ff322f35 + #ff36343b + #ff3b383e + #ff48464c + #ff0f0d13 + #ff605d64 + #ff79767d + #ff141218 + #ff938f96 + #ffaea9b1 + #ffcac5cd + #ffded8e1 + #ffe6e0e9 + #ffece6f0 + #fff3edf7 + #fff5eff7 + #fff7f2fa + #fffef7ff + #fffffbff + #ff000000 + #ff1d1a22 + #ffffffff + #ff322f37 + #ff49454f + #ff605d66 + #ff79747e + #ff938f99 + #ffaea9b4 + #ffcac4d0 + #ffe7e0ec + #fff5eefa + #fffffbfe + #ff000000 + #ff21005d + #ffffffff + #ff381e72 + #ff4f378b + #ff6750a4 + #ff7f67be + #ff9a82db + #ffb69df8 + #ffd0bcff + #ffeaddff + #fff6edff + #fffffbfe + #ff000000 + #ff1d192b + #ffffffff + #ff332d41 + #ff4a4458 + #ff625b71 + #ff7a7289 + #ff958da5 + #ffb0a7c0 + #ffccc2dc + #ffe8def8 + #fff6edff + #fffffbfe + #ff000000 + #ff31111d + #ffffffff + #ff492532 + #ff633b48 + #ff7d5260 + #ff986977 + #ffb58392 + #ffd29dac + #ffefb8c8 + #ffffd8e4 + #ffffecf1 + #fffffbfa + #ffffffff + @color/m3_ref_palette_neutral6 + @color/m3_ref_palette_error80 + @color/m3_ref_palette_error30 + @color/m3_ref_palette_neutral20 + @color/m3_ref_palette_primary40 + @color/m3_ref_palette_neutral90 + @color/m3_ref_palette_neutral90 + @color/m3_ref_palette_error20 + @color/m3_ref_palette_error90 + @color/m3_ref_palette_primary20 + @color/m3_ref_palette_primary90 + @color/m3_ref_palette_secondary20 + @color/m3_ref_palette_secondary90 + @color/m3_ref_palette_neutral90 + @color/m3_ref_palette_neutral_variant80 + @color/m3_ref_palette_tertiary20 + @color/m3_ref_palette_tertiary90 + @color/m3_ref_palette_neutral_variant60 + @color/m3_ref_palette_neutral_variant30 + @color/m3_ref_palette_primary80 + @color/m3_ref_palette_primary30 + @color/m3_ref_palette_secondary80 + @color/m3_ref_palette_secondary30 + @color/m3_ref_palette_neutral6 + @color/m3_ref_palette_neutral24 + @color/m3_ref_palette_neutral12 + @color/m3_ref_palette_neutral17 + @color/m3_ref_palette_neutral22 + @color/m3_ref_palette_neutral10 + @color/m3_ref_palette_neutral4 + @color/m3_ref_palette_neutral6 + @color/m3_ref_palette_neutral_variant30 + @color/m3_ref_palette_tertiary80 + @color/m3_ref_palette_tertiary30 + @color/m3_ref_palette_neutral98 + @color/m3_ref_palette_error40 + @color/m3_ref_palette_error90 + @color/m3_ref_palette_neutral95 + @color/m3_ref_palette_primary80 + @color/m3_ref_palette_neutral20 + @color/m3_ref_palette_neutral10 + @color/m3_ref_palette_error100 + @color/m3_ref_palette_error10 + @color/m3_ref_palette_primary100 + @color/m3_ref_palette_primary10 + @color/m3_ref_palette_secondary100 + @color/m3_ref_palette_secondary10 + @color/m3_ref_palette_neutral10 + @color/m3_ref_palette_neutral_variant30 + @color/m3_ref_palette_tertiary100 + @color/m3_ref_palette_tertiary10 + @color/m3_ref_palette_neutral_variant50 + @color/m3_ref_palette_neutral_variant80 + @color/m3_ref_palette_primary40 + @color/m3_ref_palette_primary90 + @color/m3_ref_palette_secondary40 + @color/m3_ref_palette_secondary90 + @color/m3_ref_palette_neutral98 + @color/m3_ref_palette_neutral98 + @color/m3_ref_palette_neutral94 + @color/m3_ref_palette_neutral92 + @color/m3_ref_palette_neutral90 + @color/m3_ref_palette_neutral96 + @color/m3_ref_palette_neutral100 + @color/m3_ref_palette_neutral87 + @color/m3_ref_palette_neutral_variant90 + @color/m3_ref_palette_tertiary40 + @color/m3_ref_palette_tertiary90 + @color/m3_ref_palette_primary10 + @color/m3_ref_palette_primary30 + @color/m3_ref_palette_secondary10 + @color/m3_ref_palette_secondary30 + @color/m3_ref_palette_tertiary10 + @color/m3_ref_palette_tertiary30 + @color/m3_ref_palette_primary90 + @color/m3_ref_palette_primary80 + @color/m3_ref_palette_secondary90 + @color/m3_ref_palette_secondary80 + @color/m3_ref_palette_tertiary90 + @color/m3_ref_palette_tertiary80 + #ff37474f + #ff263238 + #ff21272b + #ff80cbc4 + #ff008577 + #fff5f5f5 + #ffe0e0e0 + #fffafafa + #ff757575 + #ff424242 + #ff303030 + #ff212121 + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #FFFFFF + #61000000 + #00ffffff + #52000000 + #6B000000 + #1F000000 + #0A000000 + #00000000 + #DE000000 + #ffffffff + #ff9e9e9e + @android:color/black + @color/material_grey_600 + @color/material_grey_900 + @color/material_grey_100 + #ffffffff + #de000000 + #4Dffffff + #39000000 + #33ffffff + #1f000000 + #b3ffffff + #8a000000 + #36ffffff + #24000000 + #66000000 + #FF212121 + #FF1565C0 + #66000000 + #FFFFFFFF + #FFFFFFFF + #AA000000 + #ff616161 + #ffbdbdbd + #ffbdbdbd + #fff1f1f1 + #e6616161 + #e6FFFFFF + 16dp + 72dp + 56dp + 0dp + 0dp + 4dp + 16dp + 10dp + 6dp + 48dp + 180dp + 5dp + -3dp + 48dp + 48dp + 36dp + 48dp + 48dp + @dimen/abc_control_inset_material + 6dp + 8dp + @dimen/abc_control_padding_material + 720dp + 320dp + 2dp + 4dp + 4dp + 2dp + 80% + 100% + 320dp + 320dp + 8dp + 8dp + 65% + 95% + 24dp + 18dp + 8dp + 0.30 + 0.26 + 32dip + 8dip + 8dip + 7dp + 4dp + 10dp + 16dp + 80dp + 64dp + 48dp + @dimen/abc_action_bar_content_inset_material + 296dp + 4dp + 48dip + 320dip + 2dp + 2dp + 20dp + 48dp + 36dp + 16dp + 3dp + 14sp + 14sp + 14sp + 12sp + 34sp + 45sp + 56sp + 112sp + 24sp + 22sp + 18sp + 14sp + 16sp + 14sp + 16sp + 16dp + 20sp + 20dp + 16dp + 1dp + 2dp + 2dp + 64dp + 4dp + 6dp + 8dp + 4dp + 2dp + 320dp + 320dp + 10dp + 4dp + 168dp + 96dp + 14sp + 8dp + 56dp + 24dp + 96dp + 56dp + 10dp + 8dp + 1dp + 12sp + 8dp + 16dp + 64dp + 0.5dp + 6dp + 24dp + 40dp + 56dp + 6dp + 6dp + 16dp + 32dp + 24dp + 16dp + 32dp + 4dp + 280dp + 8dp + 8dp + 128dp + 1.0 + 0dp + 6dp + 0dp + -1px + -1px + 12dp + 14dp + 16dp + 14sp + 264dp + 72dp + 14sp + 12sp + 5dp + 0.30 + 0.26 + 8dp + 0dp + 50dp + 0.26 + 0.20 + 0.12 + 0.50 + 0.38 + 0.70 + 0.54 + 20dp + 800dp + 120dp + 14dp + 14dp + 28dp + @dimen/m3_sys_elevation_level3 + 16dp + 24dp + 16dp + 16dp + 16dp + 96dp + 112dp + 112dp + @dimen/m3_comp_top_app_bar_small_container_height + @dimen/m3_comp_top_app_bar_large_container_height + @dimen/m3_comp_top_app_bar_medium_container_height + 48dp + 24dp + 24dp + 8dp + 12dp + 24dp + 48dp + 1.5dp + 6dp + @dimen/m3_comp_badge_size + 1.5dp + 3dp + 12dp + @dimen/m3_comp_badge_large_size + 4dp + 2dp + @dimen/m3_comp_navigation_bar_active_indicator_height + 4dp + @dimen/m3_comp_navigation_bar_active_indicator_width + 16dp + 12dp + @dimen/m3_comp_navigation_bar_container_height + 20dp + @dimen/m3_sys_elevation_level1 + @dimen/m3_sys_elevation_level1 + 6dp + 4dp + 12dp + 16dp + @dimen/m3_comp_bottom_app_bar_container_height + 4dp + 64dp + 8dp + 0dp + 0dp + @dimen/m3_comp_elevated_button_container_elevation + 0dp + 16dp + 24dp + 10dp + 20dp + 0dp + 20dp + 4dp + 320dp + 6dp + 24dp + 24dp + 6dp + 1dp + 12dp + 16dp + 12dp + 12dp + 0dp + 1dp + 0dp + 6dp + 0dp + 7dp + @dimen/m3_comp_elevated_card_container_elevation + 2dp + @dimen/m3_sys_elevation_level0 + 1dp + 1dp + 2dp + 10dp + 1dp + 28dp + 56dp + 40dp + 1dp + 8dp + -1dp + 7dp + 1dp + 2dp + 18dp + 32dp + @dimen/m3_sys_elevation_level1 + @dimen/m3_sys_elevation_level0 + 1dp + 18dp + 16dp + 6dp + @dimen/m3_sys_elevation_level2 + 80dp + 0.38 + 1dp + 120dp + 128dp + 1dp + @dimen/m3_sys_elevation_level1 + @dimen/m3_sys_elevation_level0 + @dimen/m3_sys_elevation_level1 + 24dp + @dimen/m3_sys_elevation_level3 + 56dp + @dimen/m3_sys_elevation_level3 + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_elevation_level4 + @dimen/m3_sys_state_hover_state_layer_opacity + 24dp + @dimen/m3_sys_elevation_level3 + @dimen/m3_sys_state_pressed_state_layer_opacity + @dimen/m3_sys_elevation_level3 + 56dp + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_elevation_level4 + @dimen/m3_sys_state_hover_state_layer_opacity + 24dp + 96dp + 36dp + @dimen/m3_sys_elevation_level3 + @dimen/m3_sys_state_pressed_state_layer_opacity + 40dp + 24dp + @dimen/m3_sys_elevation_level2 + @dimen/m3_sys_elevation_level0 + 18dp + @dimen/m3_sys_elevation_level0 + @dimen/m3_sys_state_dragged_state_layer_opacity + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_state_hover_state_layer_opacity + 24dp + @dimen/m3_sys_state_pressed_state_layer_opacity + 0.38 + 32dp + @dimen/m3_sys_elevation_level1 + @dimen/m3_sys_elevation_level0 + 1dp + 18dp + @dimen/m3_sys_elevation_level0 + 32dp + 1dp + 24dp + 18dp + @dimen/m3_sys_elevation_level2 + 32dp + 64dp + @dimen/m3_sys_elevation_level2 + 80dp + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_state_hover_state_layer_opacity + 24dp + @dimen/m3_sys_state_pressed_state_layer_opacity + 360dp + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_state_hover_state_layer_opacity + 24dp + @dimen/m3_sys_elevation_level1 + @dimen/m3_sys_state_pressed_state_layer_opacity + @dimen/m3_sys_elevation_level0 + 32dp + 56dp + @dimen/m3_sys_elevation_level0 + 80dp + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_state_hover_state_layer_opacity + 24dp + @dimen/m3_sys_state_pressed_state_layer_opacity + @dimen/m3_sys_elevation_level2 + 0.12 + 1dp + @dimen/m3_sys_elevation_level0 + 0.12 + 24dp + 1dp + 1dp + 0.38 + 0.38 + 0.38 + 2dp + 1dp + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_state_hover_state_layer_opacity + 3dp + @dimen/m3_sys_state_pressed_state_layer_opacity + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_state_hover_state_layer_opacity + @dimen/m3_sys_state_pressed_state_layer_opacity + 24dp + 4dp + 4dp + 4dp + 0.38 + 0.38 + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_state_hover_state_layer_opacity + @dimen/m3_sys_state_pressed_state_layer_opacity + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_state_hover_state_layer_opacity + @dimen/m3_sys_state_pressed_state_layer_opacity + 0.32 + 30dp + @dimen/m3_sys_elevation_level3 + 56dp + @dimen/m3_sys_state_hover_state_layer_opacity + @dimen/m3_sys_state_pressed_state_layer_opacity + @dimen/m3_sys_elevation_level3 + 56dp + 72dp + 2dp + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_state_hover_state_layer_opacity + @dimen/m3_sys_state_pressed_state_layer_opacity + 4dp + 32dp + @dimen/m3_sys_elevation_level1 + @dimen/m3_sys_elevation_level1 + 256dp + @dimen/m3_sys_elevation_level1 + @dimen/m3_sys_elevation_level0 + 44dp + 6dp + 4dp + 0.38 + 0.38 + 0.12 + 16dp + 4dp + @dimen/m3_sys_elevation_level3 + 32dp + @dimen/m3_sys_elevation_level1 + @dimen/m3_sys_elevation_level0 + 1dp + 18dp + 1 + 0.38 + 0.12 + 0.38 + 0.38 + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_state_hover_state_layer_opacity + @dimen/m3_sys_state_pressed_state_layer_opacity + 32dp + 52dp + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_state_hover_state_layer_opacity + @dimen/m3_sys_state_pressed_state_layer_opacity + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_state_hover_state_layer_opacity + @dimen/m3_sys_state_pressed_state_layer_opacity + 2dp + @dimen/m3_sys_elevation_level3 + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_state_hover_state_layer_opacity + 1dp + @dimen/m3_sys_state_pressed_state_layer_opacity + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_state_hover_state_layer_opacity + @dimen/m3_sys_state_pressed_state_layer_opacity + 152dp + 112dp + @dimen/m3_sys_elevation_level0 + 64dp + @dimen/m3_sys_elevation_level2 + @dimen/m3_sys_elevation_level3 + 8dp + 8dp + 20dp + 12dp + 56dp + 16dp + 8dp + 0dp + 30% + 2dp + 6dp + 36dp + 96dp + 4dp + @dimen/m3_comp_menu_container_elevation + 14dp + 16dp + 4dp + 28dp + 12dp + 0dp + 12dp + 12dp + 0dp + 4dp + 28dp + 28dp + @dimen/m3_comp_navigation_rail_container_width + @dimen/m3_comp_navigation_rail_container_elevation + @dimen/m3_comp_navigation_rail_icon_size + @dimen/m3_comp_navigation_rail_active_indicator_height + 4dp + @dimen/m3_comp_navigation_rail_active_indicator_width + 60dp + 12dp + 20dp + 4dp + 12dp + 2dp + @dimen/m3_sys_state_dragged_state_layer_opacity + @dimen/m3_sys_state_focus_state_layer_opacity + @dimen/m3_sys_state_hover_state_layer_opacity + @dimen/m3_sys_state_pressed_state_layer_opacity + @dimen/m3_sys_state_pressed_state_layer_opacity + @dimen/m3_comp_search_bar_container_elevation + @dimen/m3_comp_search_bar_container_height + 16dp + 16dp + 1dp + 4dp + 16dp + 16sp + 1dp + @dimen/m3_comp_search_view_container_elevation + @dimen/m3_comp_search_view_full_screen_header_container_height + 16dp + @dimen/m3_comp_sheet_side_docked_modal_container_elevation + @dimen/m3_comp_sheet_side_docked_standard_container_elevation + @dimen/m3_comp_sheet_side_docked_container_width + 0.08 + 0.12 + 2dp + 24dp + 40dp + 1.0 + 8dp + 0dp + 1dp + 3dp + 6dp + 8dp + 12dp + 0.3 + 0.8 + 0 + 0.2 + 0.1 + 0.1 + 0.7 + 1 + 0.4 + 1 + 0 + 1 + 0.4 + 0.2 + 0 + 1 + 0 + 0.2 + 0 + 1 + 0 + 1 + 0 + 1 + 0.3 + 1 + 0 + 1 + 0.2 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 0.16 + 0.1 + 0.08 + 0.1 + 2dp + @dimen/m3_comp_time_picker_container_elevation + 20dp + 640dp + 80dp + 24dp + 96dp + 24dp + 44dp + 4dp + 4dp + 2dp + 15sp + 96dp + 12dp + 12dp + 52dp + 256dp + -4dp + 2dp + 1dp + 0.38 + 0.12 + 0.87 + 0.6 + 12dp + 23dp + 8dp + 32dp + 4dp + 8dp + 4dp + 12dp + 8dp + 2dp + 245dp + 488dp + 56dp + 560dp + 340dp + 80dp + 24dp + 24dp + 80dp + 24dp + 4dp + 4dp + 8dp + 6dp + 10sp + 12dp + 12dp + 16dp + 60dp + 16dp + 5dp + 8dp + 0dp + 56dp + 4dp + 64dp + 0dp + 0dp + 2dp + 2dp + 2dp + 12dp + 8dp + 6dp + 0.07 + 320dp + 4dp + 16dp + 16dp + 4dp + 6dp + 8dp + 1dp + 4dp + 8dp + 8dp + 14sp + 0dp + 64dp + 52dp + 8dp + 0dp + 12dp + 15dp + 32dp + 3dp + 1dp + 1dp + 36dp + 24dp + 16dp + 12dp + 4dp + 1dp + 120dp + 128dp + 32dp + 12dp + 8dp + 24dp + 0dp + 480dp + 2dp + 0dp + 4dp + 48dp + 4dp + 8dp + 104dp + 20dp + 24dp + 100dp + 16dp + 28dp + 68dp + 18dp + 52dp + 8dp + 8dp + 88dp + 8dp + 24dp + 4dp + 5dp + 1dp + 8dp + 3dp + 14sp + 8dp + -8dp + 8dp + 12dp + 0dp + 0dp + 6dp + 20dp + 20dp + 24dp + 12dp + 48dp + 120dp + 20dp + 12dp + 12dp + 0dp + 2dp + 6dp + 6dp + 48dp + 2dp + 6dp + 0.00 + 0.24 + 0.08 + 0.24 + 0.00 + 0.12 + 0.04 + 0.12 + 48dp + 24dp + 8dp + 0dp + 22dp + 14dp + 24dp + 8dp + 4dp + 14dp + 56dp + 72dp + 8dp + 14dp + 24dp + 8dp + 16dp + 12dp + 4dp + 2dp + 4dp + 4dp + 18dp + 40dp + 20dp + 40dp + 28dp + 2.5dp + 4dp + 3dp + 2dp + 4dp + 0dp + 4dp + 4dp + 24dp + 4dp + 13dp + 26dp + 1dp + 10dp + 8dp + 1dp + 4dp + 16dp + 48dp + 0.5 + 4dp + 0.8 + 8dp + 8dp + 8dp + 16dp + 4dp + 16dp + 32dp + @dimen/m3_comp_switch_track_height + @dimen/m3_comp_switch_track_width + 4dp + 0dp + 4dp + @dimen/m3_comp_outlined_text_field_outline_width + @dimen/m3_comp_outlined_text_field_focus_outline_width + 16dp + 4dp + 16dp + 4dp + 56dp + 14dp + 4dp + 32dp + 32dp + 12dp + 30dp + 32dp + 13sp + 12dp + 8dp + 64dp + 64dp + 10dp + @dimen/notification_content_margin_start + 16dp + 4dp + 3dp + 24dp + 13sp + 10dp + 5dp + 2dp + 16dp + 8dp + 8dp + 96dp + 6.5dp + 0dp + 16dp + @drawable/material_ic_keyboard_arrow_right_black_24dp + @drawable/material_ic_keyboard_arrow_left_black_24dp + #3333B5E5 + #0cffffff + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 220 + 150 + 150 + 150 + 127 + 150 + 2 + 300 + 12451000 + 320 + 999 + 100 + 100 + 75 + 120 + 100 + 700 + 800 + 900 + 1000 + 450 + 500 + 550 + 600 + 250 + 300 + 350 + 400 + 50 + 100 + 150 + 200 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 300 + 350 + 200 + 250 + 75 + 150 + 0 + 4 + 100 + 100 + 1 + 1 + 3 + 75 + 120 + 100 + @integer/m3_sys_motion_duration_medium1 + @integer/m3_sys_motion_duration_short3 + @integer/m3_sys_motion_duration_short2 + @integer/m3_sys_motion_duration_short2 + 16 + 32 + 32 + 52 + 250 + 2 + 1 + 0 + 200 + 999 + + %d new notification + %d new notifications + + com.google.android.gms.net.PlayServicesCronetProvider + Navigate home + Navigate up + More options + Done + See all + Choose an app + OFF + ON + Alt+ + Ctrl+ + delete + enter + Function+ + Meta+ + Shift+ + space + Sym+ + Menu+ + Search… + Clear query + Search query + Search + Submit query + Voice search + Share with + Share with %s + Collapse + Advanced connect (dev) + Advanced options hidden + Advanced options unlocked + androidx.startup + Android Cast + com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior + The sender is streaming audio. Play it on this device? + Video only + Play cast audio? + Play audio + Allow microphone for audio cast fallback when nothing is playing on the sender. + Playing video and audio + Video only (audio skipped) + This device runs Android 9 or lower. Playback audio capture needs Android 10 or newer. You can continue with video only. + Video only + Authenticating… + Estimated + com.google.android.material.bottomsheet.BottomSheetBehavior + Collapse the bottom sheet + Expand the bottom sheet + Expand halfway + Drag handle double-tapped + Drag handle + ACCEPT + Licenses + Reset to defaults + Answer + Video + Decline + Hang Up + Incoming call + Ongoing call + Screening an incoming call + Calibration test pattern + Camera (rear Camera2) + Camera (front) + Could not open the camera. Try another capture mode. + Camera permission denied. Allow camera access or choose another capture mode. + Camera (rear) + Camera capture requires Android 10 or newer. Use screen or calibration test. + Camera source (requires Android 10+) + Screen capture permission denied + Entire screen + Choose app or screen (Android 14+) + App picker needs Android 14 (this device: API %1$d) + PIN cannot be changed while casting + Android Cast settings + Casting via %1$s · %2$dx%3$d + Calibration cast %1$dx%2$d + Camera cast %1$dx%2$d + Casting from %1$s + Casting from %1$s · %2$s + Rotated — now %1$dx%2$d + Casting started + Characters entered %1$d of %2$d + Character limit exceeded %1$d of %2$d + %1$d/%2$d + Clear text + AAC + AUTO + Passthrough (debug) + H.264 (AVC) + H.265 (HEVC) + Priority hint — codec is negotiated during handshake. + libvpx (VP8) + libvpx (VP9) + Opus + Passthrough (debug) + Passthrough video is not implemented yet + · %1$d + Speex + [Ads placeholder — enable AdMob in manifest for production] + Enable + %1$s won\'t work unless you enable Google Play services. + Enable Google Play services + Install + %1$s won\'t run without Google Play services, which are missing from your device. + Get Google Play services + Google Play services availability + Google Play services error + %1$s is having trouble with Google Play services. Please try again. + %1$s won\'t run without Google Play services, which are not supported by your device. + Update + %1$s won\'t run unless you update Google Play services. + Update Google Play services + %1$s won\'t run without Google Play services, which are currently updating. + New version of Google Play services needed. It will update itself shortly. + Open on phone + Sign in + Sign in with Google + Connecting… + Connecting to %1$s… + Continue (video only) + Copied adb connect line + Copy adb connect line + One-time (USB): ./scripts/grant-dev-adb-perms.sh — enables auto re-enable after Wi‑Fi drops and TLS port discovery. Pair wireless debugging once in system settings (Android 11+ uses a random TLS port, not 5555). rebuild.sh uses curl :5039/adb.json and avahi-browse _adb-tls-connect._tcp. + Keep wireless adb alive after Wi‑Fi drops + ADB Wi‑Fi keeper + Shows adb connect line while debugging on flaky Wi‑Fi. + adb connect %1$s + ADB Wi‑Fi ready + Waiting for Wi‑Fi IP… + Refresh adb connect info now + ADB over Wi‑Fi (debug) + HTTP :5039/adb.json · secure=%1$s · wifi adb=%2$s · %3$s + adb connect %1$s + Waiting for Wi‑Fi and adb endpoints… + Bass boost + Default (passthrough) + Dolby 5.1 (stereo headset) + Dolby 7.1 (stereo headset) + Immersive + Audio preset + Filter intensity + Intensity: %1$d (0 = off, 10 = max) + Audio: PCM chain after AAC decode. Video experimental: GLES shader after decode (immersive denoise/sharpen, HDR tone map). Intensity 0–10. Restart cast session after preset changes. + Receiver A/V presets (experimental) + Default (passthrough) + HDR (experimental) + Immersive (experimental) + Video preset + Enable backend NTP sync + Disabled by default. Network self-test compares device time to BE (shown in BE timezone). If skew exceeds ±3 minutes, stores a correction offset for app diagnostics — does not change the system clock. + Default display only (active) + External display experimental (planned) + Prefer external when present (planned) + Enable in-app ads (placeholder) + Enable in-app purchases above first + Enable Play Store integration above first + Ads, billing, and review stay disabled for daily use. Configure Play Console SKUs and AdMob before any public release. + Enable in-app purchases (Play Billing) + Enable Play Store integration + Commercial (off until enabled here) + Full advertisement info + Audio codecs (compression) + Sound capture + Camera capture + Other casting / display + Hardware acceleration (video) + Supported features — quick read-only probes. Tests run in the background when you open this tab. + Network + Waiting… + Requires both peers on a build that supports MSG_DIAG_PING. Old peers ignore unknown packets. + Diagnostic cast ping-pong (~1/s) + Mirror as-is (dummy pong) + Ping response mode (this device) + Reply-with (seq + timestamps) + Mirror smart (local timestamp) + Running… + Stop tests + Stopped + External display capture policy (future) + Grab anonymous session stats + IAP query finished — see logcat + Force re-check + Hidden diagnostics tab. Long-press the tabs row to unlock. Runs quick network checks: connectivity, captive portal, CIDR/DNS/MTU, cast LAN peers (UDP discovery), backend RTT/throughput (apps.f0xx.org), NAT and NTP correction. + Waiting for self-test run… + Run self-test + Running self-test… + Network self-test tab unlocked + Open Play Store listing + Query IAP products (log) + Adaptive receiver display (experimental) + Reload codecs.json + Loads assets/codecs.json overrides without restarting the app. Reopen the settings drawer to refresh spinners. + Remote access: %1$s + Disabled + When enabled, device polls BE every 1–7 min (type:ra). WireGuard needs Android VPN permission once. RSSH uses outbound SSH — no VPN prompt. + Remote access (on-demand debug) + Remote access + WireGuard tunnel connected + Polling BE (%1$s) + Connected · session %1$s + Remote debug active + RSSH (reverse SSH) + Reverse SSH (RSSH) is not implemented yet. + RSSH (reverse SSH — alpha; not available yet) + All apps (matching routes) + App-only uses Android IncludedApplications so other apps keep their normal path. Ignored for RSSH. Changes reconnect an active WireGuard session. + VPN app scope (WireGuard) + This app only + VPN permission required for WireGuard remote access. + All traffic (0.0.0.0/0) + Hub-only is the production default (split tunnel). Full tunnel routes all device IP traffic through WireGuard when the session is up. + Hub only (172.200.2.1/32) + VPN route scope (WireGuard) + VPN routing updated — reconnecting if tunnel was up + WireGuard + Request in-app review flow + Combined (480p + 720p + original + adaptive) + Changes the sender resolution spinner in cast settings. Default: Separated. Re-open cast settings to refresh labels. + Legacy (full preset list) + Resolution preset mode + Sender resolution UI (test) + Separated (Original / 720p / 480p / Auto) + Show codec priority scores in settings + Show debug overlay on receiver + Record stream dump while casting (FR 0.1) + Writes zip under files/stream_dumps/ (max 5 min or 100 MB). Pull via adb. + Diagnostics + Network self-test + Settings + Show USB-tether transport in cast settings (stub, roadmap E) + Wired HDMI uses the OS display stack, not the cast protocol. If no second screen appears in system Display settings, adapters cannot be fixed in-app. See docs/USB_HDMI_CAST.md. + Show sender status when external display is plugged in + USB-C / HDMI (roadmap D) + Developer settings + Selected: %1$s (%2$s, %3$s) + Selected %1$d receivers + Recent + Enter PIN + + Error: invalid + + Could not connect to %1$s:%2$d + Error + Missing host, PIN, or settings + No cast intent + Screen capture data missing (retry cast) + Receiver not listening at %1$s:%2$d — on the tablet tap Start listening, then Refresh on this phone. + Show dropdown menu + com.google.android.material.transformation.FabTransformationScrimBehavior + com.google.android.material.transformation.FabTransformationSheetBehavior + Found %1$d receiver(s) + Relay gateway URL (not implemented) + com.google.android.material.behavior.HideBottomViewOnScrollBehavior + Dialog Icon + Tab + Cast adjustment preset + Author: + Built: + Commit: + Protocol: + Version: + Include audio (playback capture, Android 10+) + Audio codec + Audio unavailable (requires Android 10+) + Bitrate + Screen capture (sender phone) + Screen capture (sender phone only) + Language + Mute + Network adoption + Quality (bitrate / FPS) + Play incoming cast audio on this device + Resolution + Enable picture-in-picture (receiver) + Capture resolution + Send anonymous crash logs + Always show icon in system bar + Stream protection (UDP) + Theme + Transport + Username + Video codec + Language updated + English + Russian + Default (system) + Could not load license text. + Licenses + %1$s%2$s + sans-serif-medium + sans-serif + sans-serif-medium + sans-serif + path(M 0,0 C 0.05, 0, 0.133333, 0.06, 0.166666, 0.4 C 0.208333, 0.82, 0.25, 1, 1, 1) + cubic-bezier(0.3, 0, 0.8, 0.2) + cubic-bezier(0.1, 0.7, 0.1, 1) + M 0,0 C 0.05, 0, 0.133333, 0.06, 0.166666, 0.4 C 0.208333, 0.82, 0.25, 1, 1, 1 + cubic-bezier(0.4, 0, 0.2, 1) + cubic-bezier(0.4, 0, 1, 1) + cubic-bezier(0, 0, 0.2, 1) + cubic-bezier(0, 0, 1, 1) + cubic-bezier(0.2, 0, 0, 1) + cubic-bezier(0.3, 0, 1, 1) + cubic-bezier(0, 0, 0, 1) + Same Wi‑Fi required. Default PIN: 1234. UDP is default; pick TCP in settings if needed. Match transport on both devices. + Connect to IP + Enter host and port + Receiver IP address + Port (default 41235) + : + Select AM or PM + %1$s hours + Select hour + %1$s o\'clock + Select minutes + %1$s minutes + cubic-bezier(0.4, 0.0, 1.0, 1.0) + cubic-bezier(0.0, 0.0, 0.2, 1.0) + path(M 0,0 C 0.05, 0, 0.133333, 0.06, 0.166666, 0.4 C 0.208333, 0.82, 0.25, 1, 1, 1) + cubic-bezier(0.0, 0.0, 1.0, 1.0) + cubic-bezier(0.4, 0.0, 0.2, 1.0) + Range end + Range start + Value + AM + Switch to clock mode for the time input. + Hour + Minute + PM + Select time + Switch to text input mode for the time input. + New notification + M14,18.2 11.4,15.6 10,17 14,21 22,13 20.6,11.6z + icon + M13.4,15 11,15 11,17 13.4,17 21,17 21,15z + icon path + M23,7H9C7.9,7,7,7.9,7,9v14c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V9C25,7.9,24.1,7,23,7z + button + button path + M23,7H9C7.9,7,7,7.9,7,9v14c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V9C25,7.9,24.1,7,23,7z M23,23H9V9h14V23z + + Checked + + + Partially checked + + + Not checked + + Remove %1$s + More than %1$d new notifications + %1$d%2$s + Change to next month + Change to previous month + Start date selection: %1$s – End date selection: %2$s + Current selection: %1$s + none + Cancel + OK + %1$s + Select Date + Selected date + %1$s + End date %1$s + Invalid format. + Example: %1$s + Use: %1$s + Invalid range. + Navigate to current year %1$d + Navigate to year %1$d + Out of range: %1$s + Start date – %1$s + %1$s – End date + %1$s – %2$s + Select Range + Start date – End date + Save + Start date %1$s + Date + End date + Start date + d + m + y + Today %1$s + Switch to calendar input mode + Tap to switch to Calendar view + Switch to text input mode + Tap to switch to year view + circle_group + M4,16 A12,12 0 0,1 16,4 H16 A12,12 0 0,1 16,28 H16 A12,12 0 0,1 4,16 + M0,16 A11,11 0 0,1 11,5 H21 A11,11 0 0,1 21,27 H11 A11,11 0 0,1 0,16 + circle + M2,16 A14,14 0 0,1 16,2 H16 A14,14 0 0,1 16,30 H16 A14,14 0 0,1 2,16 + M8,16 A8,8 0 0,1 16,8 H16 A8,8 0 0,1 16,24 H16 A8,8 0 0,1 8,16 + M1,16 A15,15 0 0,1 16,1 H36 A15,15 0 0,1 36,31 H16 A15,15 0 0,1 1,16 + M0,16 A16,16 0 0,1 16,0 H36 A16,16 0 0,1 36,32 H16 A16,16 0 0,1 0,16 + Cancel + OK + Estimated (auto) + No compatible receivers (protocol/transport/codec) + Settings + AUTO (default) + Balanced + Estimated + None + OFF + ON + Performance (balanced) + Quality + RobustLess (UDP only) + Speed + Update check failed: %1$s + Check for updates now + Enable OTA periodic checks (default every 1 minute) + You dismissed this version — tap Check again to see it. + Download failed: %1$s + Download & install + Downloading update + Downloading APK… + Installed: %1$s (%2$d) + Not now + OTA channel URL (v0 stable.json) + No release notes. + No OTA channel URL — set one in developer settings or local.properties (ota.channel.url). + App updates + v0 layout: https://host/v0/ota/channel/stable.json → manifest → APK. Service checks every 1 minute by default (overridable in private settings.json). + App updates (OTA) + Up to date (%1$s, %2$d). + New OTA version found (%1$s, current version is: %2$s / %3$s MB). Would you like to perform the update?\n\n%4$s + Update available + Show password + M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z + M2,4.27 L19.73,22 L22.27,19.46 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 Z + M2,4.27 L2,4.27 L4.54,1.73 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 Z + M3.27,4.27 L19.74,20.74 + Notifications (cast status) + App settings + Grant + Permissions needed + Leave empty for anonymous cast + PIN + The receiver expects a different PIN. Enter the PIN for this cast session. + PIN mismatch + Session PIN + Allow picture-in-picture for Android Cast in system settings, then try again. + Picture-in-picture disabled + Picture-in-picture + Notifications keep the receiver visible while casting in the background. + Picture-in-picture is not available on this device + Awaiting for stream to come… + Connected — waiting for video… + Listening for cast — awaiting sender… + Fullscreen playback %1$dx%2$d + Video playing + Cast ended — waiting for sender… + Stream lost — awaiting for stream to come… + Playing %1$dx%2$d + Press Back again to stop casting + Calibration test pattern + Camera preview + Casting — preview paused + Source preview\n(screen capture starts after START) + Screen preview + Screen preview — grant capture when prompted + FEC 3/4 + FEC + NACK + FEC (Reed-Solomon) + NACK + Stream protection: %1$s (%2$s) + Using FEC 3/4 without NACK (receiver %1$s, sender %2$s). NACK disabled for this session. + Using Reed–Solomon FEC (receiver %1$s, sender %2$s). For a direct match, set %3$s to FEC (Reed–Solomon). + Protection mismatch (receiver %1$s, sender %2$s). Casting without protection; align %3$s settings. + NACK off + NACK on + Using FEC with NACK (receiver %1$s, sender %2$s). + receiver + sender + No protection this session (receiver %1$s, sender %2$s). Set %3$s stream protection to None or match the peer. + None (default) + High (~10 Mbps, 30 fps) + Low (~1.5 Mbps, 24 fps) + Medium (~5 Mbps, 30 fps) — recommended + Receive on TV / projector + Adaptive (experimental) + AUTO (fits screen) + Listening for cast + When on, the receiver can shrink to a floating window during cast (after notifications are allowed). Off by default if PiP is unavailable. + Ready — PIN %1$s · %2$s + Starting receiver service… + Waiting for cast + Stream options are in Android Cast settings. + REFRESH + REFRESH (%1$d) + Rescanning for receivers… + Restore all app settings to default? + App settings restored to default + 720p height cap (keeps aspect) + 75% scale + Adaptive (BW estimator, preview) + Adaptive (BW estimator) + Original (native) + Fixed 1080p (fit in 1920×1080) + Fixed 720p (fit in 1280×720) + Full display + 50% scale + 480p + 720p + Auto + Original + Search + + com.google.android.material.search.SearchBar$ScrollingViewBehavior + + Searching for receivers… + Clear text + Back + Select a receiver first + Send screen (tablet / phone) + Cast starting — see notification for status + Cast to receiver + Tap sessions to toggle overlay. Pinch or scroll wheel to zoom. Drag finger for values. + UDP & protection counters + Session grab is off — enable it here to record new sessions. + No session files yet. Cast with “Grab session stats” enabled. + Bitrate + Encode FPS + Loss % + Open statistics analyzer + Refresh + Share JSON + Could not share session file + Charts from session_send_* / session_recv_* JSON (enable grab in developer settings, then cast). + Session statistics + Open settings + Settings saved + App info + Global app settings + Receiver settings + Sender settings + Stream options + Side Sheet + com.google.android.material.sidesheet.SideSheetBehavior + Start cast + Start listening (keeps running in background) + 999+ + Stop + Sender preference — receiver FEC/NACK is auto-detected at connect. UDP only. + Video surface ready + Swipe from the left edge for settings + Theme updated + Dark + Inverted + Light + System (default) + Select at most %1$d receivers + Transport must match the receiver (TCP/UDP) + QUIC experimental (Cronet) + TCP (reliable fallback) + UDP (default, best effort) + USB tether (experimental) + WebRTC (stub, future) + Cast active — tap to open app + Android Cast — tap to open app + Persistent cast status icon in the notification bar + Cast tray + Waiting for receiver at %1$s:%2$d… + Waiting for sender… + Connected — open video surface… + External display detected — use system mirror or Wi‑Fi cast to receiver + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ?attr/shapeAppearanceCornerSmall + ?attr/textAppearanceLabelLarge + ?attr/colorError + ?attr/colorOnError + ?attr/textAppearanceLabelSmall + ?attr/colorSurfaceContainer + ?attr/colorPrimary + ?attr/colorOnSurface + ?attr/colorSurface + ?attr/colorError + ?attr/colorOnError + ?attr/colorOnPrimary + ?attr/colorOnSurfaceVariant + ?attr/colorSurfaceContainerHigh + ?attr/shapeAppearanceCornerExtraLarge + ?attr/textAppearanceBodyLarge + ?attr/colorPrimary + ?attr/colorOnPrimary + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/colorOnSurface + ?attr/colorOnSurfaceVariant + ?attr/textAppearanceHeadlineLarge + ?attr/colorOnSurfaceVariant + ?attr/textAppearanceLabelLarge + ?attr/colorSecondaryContainer + ?attr/textAppearanceTitleLarge + ?attr/colorOnSurfaceVariant + ?attr/textAppearanceTitleSmall + ?attr/colorOnSurface + ?attr/textAppearanceBodyLarge + ?attr/colorPrimary + ?attr/colorOnPrimary + ?attr/colorOnSurfaceVariant + ?attr/colorSurfaceContainerHigh + ?attr/shapeAppearanceCornerExtraLarge + ?attr/colorOnSurface + ?attr/textAppearanceHeadlineSmall + ?attr/colorOnSurfaceVariant + ?attr/textAppearanceBodyMedium + ?attr/colorOutlineVariant + ?attr/colorSurfaceContainerLow + ?attr/colorSurfaceContainerLow + ?attr/shapeAppearanceCornerMedium + ?attr/colorPrimaryContainer + ?attr/shapeAppearanceCornerLarge + ?attr/colorOnPrimaryContainer + ?attr/textAppearanceLabelLarge + ?attr/colorSecondaryContainer + ?attr/colorOnSecondaryContainer + ?attr/colorSurfaceContainerHigh + ?attr/colorPrimary + ?attr/colorTertiaryContainer + ?attr/colorOnTertiaryContainer + ?attr/colorPrimaryContainer + ?attr/shapeAppearanceCornerLarge + ?attr/colorOnPrimaryContainer + ?attr/shapeAppearanceCornerExtraLarge + ?attr/shapeAppearanceCornerMedium + ?attr/colorSecondaryContainer + ?attr/colorOnSecondaryContainer + ?attr/colorSurfaceContainerHigh + ?attr/colorPrimary + ?attr/colorTertiaryContainer + ?attr/colorOnTertiaryContainer + ?attr/colorSurfaceContainer + ?attr/textAppearanceBodyLarge + ?attr/colorPrimary + ?attr/colorOnPrimary + ?attr/textAppearanceLabelLarge + ?attr/colorSurfaceContainerHighest + ?attr/shapeAppearanceCornerMedium + ?attr/colorPrimary + ?attr/colorOnPrimary + ?attr/colorPrimary + ?attr/colorSurfaceContainerHighest + ?attr/shapeAppearanceCornerExtraSmall + ?attr/colorError + ?attr/colorError + ?attr/colorError + ?attr/textAppearanceBodyLarge + ?attr/textAppearanceBodySmall + ?attr/colorSecondaryContainer + ?attr/colorOnSecondaryContainer + ?attr/colorSecondaryContainer + ?attr/colorOnSecondaryContainer + ?attr/colorOnSurfaceVariant + ?attr/shapeAppearanceCornerSmall + ?attr/textAppearanceLabelLarge + ?attr/colorPrimary + ?attr/colorOnSurfaceVariant + ?attr/shapeAppearanceCornerSmall + ?attr/textAppearanceLabelLarge + ?attr/colorSurfaceContainer + ?attr/colorSecondaryContainer + ?attr/colorOnSecondaryContainer + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSecondaryContainer + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSecondaryContainer + ?attr/colorSecondaryContainer + ?attr/colorOnSurface + ?attr/colorOnSecondaryContainer + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorSurfaceContainer + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurfaceVariant + ?attr/colorOnSurfaceVariant + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/textAppearanceLabelMedium + ?attr/colorOnSecondaryContainer + ?attr/colorOnSecondaryContainer + ?attr/colorOnSecondaryContainer + ?attr/colorOnSecondaryContainer + ?attr/colorOnSecondaryContainer + ?attr/colorOnSecondaryContainer + ?attr/colorOnSecondaryContainer + ?attr/colorSecondaryContainer + ?attr/colorOnSecondaryContainer + ?attr/colorOnSecondaryContainer + ?attr/colorOnSecondaryContainer + ?attr/colorOnSecondaryContainer + ?attr/colorOnSurfaceVariant + ?attr/textAppearanceTitleSmall + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurfaceVariant + ?attr/colorOnSurfaceVariant + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSecondaryContainer + ?attr/textAppearanceLabelLarge + ?attr/colorSurfaceContainerLow + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSecondaryContainer + ?attr/colorSecondaryContainer + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurfaceVariant + ?attr/colorOnSurfaceVariant + ?attr/colorOnSurface + ?attr/textAppearanceLabelMedium + ?attr/colorSurfaceContainer + ?attr/colorPrimary + ?attr/textAppearanceBodyLarge + ?attr/colorOnSurface + ?attr/colorPrimary + ?attr/colorOutline + ?attr/colorOutline + ?attr/colorOutline + ?attr/colorSurface + ?attr/shapeAppearanceCornerMedium + ?attr/colorOutline + ?attr/colorOutlineVariant + ?attr/colorOnSurface + ?attr/colorOutlineVariant + ?attr/colorOutlineVariant + ?attr/colorOutlineVariant + ?attr/colorPrimary + ?attr/shapeAppearanceCornerExtraSmall + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorError + ?attr/colorError + ?attr/colorError + ?attr/colorOnSurface + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/colorOnSurfaceVariant + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurfaceVariant + ?attr/colorOnSurface + ?attr/textAppearanceBodyLarge + ?attr/colorOnSurfaceVariant + ?attr/colorOutline + ?attr/colorOnSurfaceVariant + ?attr/textAppearanceBodySmall + ?attr/textAppearanceBodySmall + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/colorSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/colorOnSurfaceVariant + ?attr/colorPrimary + ?attr/colorOnSurfaceVariant + ?attr/textAppearanceTitleSmall + ?attr/colorPrimary + ?attr/colorSecondaryContainer + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurfaceVariant + ?attr/colorOnSurface + ?attr/colorPrimary + ?attr/colorSurfaceContainerHigh + ?attr/colorOnSurface + ?attr/colorOnSurfaceVariant + ?attr/colorOnSurface + ?attr/textAppearanceBodyLarge + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurfaceVariant + ?attr/colorOnSurfaceVariant + ?attr/textAppearanceBodyLarge + ?attr/colorOnSurfaceVariant + ?attr/colorSurfaceContainerHigh + ?attr/colorOutline + ?attr/shapeAppearanceCornerExtraLarge + ?attr/colorOnSurface + ?attr/textAppearanceBodyLarge + ?attr/colorOnSurface + ?attr/colorOnSurfaceVariant + ?attr/textAppearanceBodyLarge + ?attr/colorOnSurfaceVariant + ?attr/colorPrimary + ?attr/colorOnSurface + ?attr/colorSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurfaceVariant + ?attr/textAppearanceTitleSmall + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurfaceVariant + ?attr/colorSurfaceContainerLow + ?attr/shapeAppearanceCornerExtraLarge + ?attr/colorOnSurfaceVariant + ?attr/shapeAppearanceCornerLarge + ?attr/colorSurfaceContainerLow + ?attr/shapeAppearanceCornerLarge + ?attr/colorSurface + ?attr/colorPrimary + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorPrimary + ?attr/colorSecondaryContainer + ?attr/colorSurfaceInverse + ?attr/colorOnSurfaceInverse + ?attr/colorSurfaceInverse + ?attr/shapeAppearanceCornerExtraSmall + ?attr/colorOnSurfaceInverse + ?attr/textAppearanceBodyMedium + ?attr/shapeAppearanceCornerSmall + ?attr/textAppearanceLabelLarge + ?attr/colorSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorSurfaceContainerHighest + ?attr/colorSurfaceContainerHighest + ?attr/colorOnSurface + ?attr/colorPrimaryContainer + ?attr/colorOnPrimaryContainer + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/colorOnPrimary + ?attr/colorPrimaryContainer + ?attr/colorOnPrimaryContainer + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/colorOnPrimaryContainer + ?attr/colorPrimaryContainer + ?attr/colorOnPrimaryContainer + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/colorOnSurfaceVariant + ?attr/colorSurfaceContainerHighest + ?attr/colorOnSurface + ?attr/colorSurfaceContainerHighest + ?attr/colorOutline + ?attr/colorOutline + ?attr/colorOnSurfaceVariant + ?attr/colorSurfaceContainerHighest + ?attr/colorOnSurface + ?attr/colorSurfaceContainerHighest + ?attr/colorOutline + ?attr/colorSurfaceContainerHighest + ?attr/colorOnSurfaceVariant + ?attr/colorSurfaceContainerHighest + ?attr/colorOnSurface + ?attr/colorSurfaceContainerHighest + ?attr/colorOutline + ?attr/colorSurfaceContainerHighest + ?attr/colorOutline + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/colorPrimary + ?attr/textAppearanceLabelLarge + ?attr/colorPrimary + ?attr/shapeAppearanceCornerSmall + ?attr/colorPrimary + ?attr/colorOnSurface + ?attr/colorOnSurfaceVariant + ?attr/textAppearanceBodySmall + ?attr/colorSurfaceContainerHighest + ?attr/colorPrimary + ?attr/colorSurfaceContainerHigh + ?attr/shapeAppearanceCornerExtraLarge + ?attr/colorOnSurfaceVariant + ?attr/textAppearanceLabelMedium + ?attr/shapeAppearanceCornerSmall + ?attr/textAppearanceTitleMedium + ?attr/colorOutline + ?attr/colorTertiaryContainer + ?attr/colorOnTertiaryContainer + ?attr/colorOnTertiaryContainer + ?attr/colorOnTertiaryContainer + ?attr/colorOnTertiaryContainer + ?attr/colorOnSurfaceVariant + ?attr/colorOnSurfaceVariant + ?attr/colorOnSurfaceVariant + ?attr/colorOnSurfaceVariant + ?attr/shapeAppearanceCornerSmall + ?attr/textAppearanceDisplayLarge + ?attr/colorPrimaryContainer + ?attr/colorOnPrimaryContainer + ?attr/colorOnPrimaryContainer + ?attr/colorOnPrimaryContainer + ?attr/colorOnPrimaryContainer + ?attr/colorOnSurface + ?attr/textAppearanceDisplayLarge + ?attr/colorSurfaceContainerHighest + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/colorOnSurface + ?attr/textAppearanceHeadlineMedium + ?attr/colorOnSurface + ?attr/textAppearanceHeadlineSmall + ?attr/colorSurface + ?attr/colorOnSurface + ?attr/textAppearanceTitleLarge + ?attr/colorOnSurface + ?attr/colorSurfaceContainer + ?attr/colorOnSurfaceVariant + ?attr/colorPrimary + ?attr/colorPrimary + \ No newline at end of file diff --git a/app/build/intermediates/incremental/debug/mergeDebugResources/merger.xml b/app/build/intermediates/incremental/debug/mergeDebugResources/merger.xml new file mode 100644 index 0000000..85df0d3 --- /dev/null +++ b/app/build/intermediates/incremental/debug/mergeDebugResources/merger.xml @@ -0,0 +1,15732 @@ + +androidx.startup#FF424242#FFFFFFFF#03000000#37000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + 1dp2dp2dp"Cavab verin""Video""İmtina edin""Dəstəyi asın""Gələn zəng""Davam edən zəng""Gələn zəng göstərilir""999+""接聽""視訊""拒接""掛斷""來電""通話中""正在過濾來電""999+""Rispondi""Video""Rifiuta""Riaggancia""Chiamata in arrivo""Chiamata in corso""Applicazione filtro a chiamata in arrivo""999+""Yanıtla""Video""Reddet""Kapat""Gelen arama""Devam eden arama""Gelen arama süzülüyor""999+""Répondre""Vidéo""Refuser""Raccrocher""Appel entrant""Appel en cours""Filtrage d\'un appel entrant""999+""Svara""Myndsímtal""Hafna""Leggja á""Símtal berst""Símtal í gangi""Síar símtal sem berst""999+""ਜਵਾਬ ਦਿਓ""ਵੀਡੀਓ""ਅਸਵੀਕਾਰ ਕਰੋ""ਸਮਾਪਤ ਕਰੋ""ਇਨਕਮਿੰਗ ਕਾਲ""ਜਾਰੀ ਕਾਲ""ਇਨਕਮਿੰਗ ਕਾਲ ਦੀ ਸਕ੍ਰੀਨਿੰਗ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ""999+""Jawab""Video""Tolak""Tutup""Panggilan masuk""Panggilan sedang berlangsung""Menyaring panggilan masuk""999+"#1f000000#8a000000#1d873b#d93025#ffffffff#ff9e9e9e4dp6dp8dp4dp2dp320dp320dp32dp13sp12dp8dp64dp64dp10dp@dimen/notification_content_margin_start16dp4dp3dp24dp13sp10dp5dp#3333B5E5#0cffffff999AnswerVideoDeclineHang UpIncoming callOngoing callScreening an incoming call999+"ಉತ್ತರಿಸಿ""ವೀಡಿಯೊ""ನಿರಾಕರಿಸಿ""ಕರೆ ಕೊನೆಗೊಳಿಸಿ""ಒಳಬರುವ ಕರೆ""ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಕರೆ""ಒಳಬರುವ ಕರೆಯನ್ನು ಸ್ಕ್ರೀನ್ ಮಾಡಲಾಗುತ್ತಿದೆ""999+""Sprejmi""Video""Zavrni""Prekini klic""Dohodni klic""Aktivni klic""Preverjanje dohodnega klica""999+""Odgovori""Video""Odbaci""Prekini vezu""Dolazni poziv""Poziv u toku""Filtriranje dolaznog poziva""999+""Vastaa""Video""Hylkää""Lopeta puhelu""Saapuva puhelu""Käynnissä oleva puhelu""Seulotaan saapuvaa puhelua""999+""Answer""Video""Decline""Hang up""Incoming call""On-going call""Screening an incoming call""999+""Fogadás""Videó""Elutasítás""Befejezés""Bejövő hívás""Hívás folyamatban""Bejövő hívás szűrése""999+""ຮັບສາຍ""ວິດີໂອ""ປະຕິເສດ""ວາງສາຍ""ສາຍໂທເຂົ້າ""ສາຍໂທອອກ""ກຳລັງກວດສອບສາຍໂທເຂົ້າ""999+""รับสาย""วิดีโอ""ปฏิเสธ""วางสาย""สายเรียกเข้า""สายที่สนทนาอยู่""กำลังสกรีนสายเรียกเข้า""999+""Răspunde""Video""Respinge""Închide""Apel primit""Apel în desfășurare""Se filtrează un apel primit""999+""통화""동영상""거절""전화 끊기""수신 전화""진행 중인 통화""수신 전화 검사 중""999+""Отговор""Видеообаждане""Отхвърляне""Затваряне""Входящо обаждане""Текущо обаждане""Преглежда се входящо обаждане""999+""接听""视频通话""拒接""挂断""来电""正在通话""正在过滤来电""999+""Адказаць""Відэа""Адхіліць""Завяршыць""Уваходны выклік""Бягучы выклік""Фільтраванне ўваходнага выкліку""999+""Ответить""Видео""Отклонить""Завершить""Входящий вызов""Текущий вызов""Фильтрация входящего вызова"">999""Одговори""Видео""Одбиј""Спушти""Дојдовен повик""Тековен повик""Проверка на дојдовен повик""999+""Annehmen""Video""Ablehnen""Auflegen""Eingehender Anruf""Aktueller Anruf""Filter für eingehenden Anruf""999+""ردّ""فيديو""رفض""قطع الاتصال""مكالمة واردة""مكالمة جارية""يتم فحص المكالمة الواردة""999+""Responder""Video""Rechazar""Colgar""Llamada entrante""Llamada en curso""Filtrando una llamada entrante""999+""Respon""Vídeo""Rebutja""Penja""Trucada entrant""Trucada en curs""S\'està filtrant una trucada entrant""999+""Відповісти""Відео""Відхилити""Завершити""Вхідний виклик""Активний виклик""Вхідний виклик (Фільтр)""999+""పికప్ చేయండి""వీడియో కాల్""కట్ చేయండి""ముగించండి""ఇన్‌కమింగ్ కాల్""కాల్ కొనసాగుతోంది""ఇన్‌కమింగ్ కాల్‌ను స్క్రీన్ చేయండి""999+""Sagutin""Video""Tanggihan""Ibaba""Papasok na tawag""Kasalukuyang tawag""Nagsi-screen ng papasok na tawag""999+""ଉତ୍ତର ଦିଅନ୍ତୁ""ଭିଡିଓ""ଅଗ୍ରାହ୍ୟ କର""ସମାପ୍ତ କରନ୍ତୁ""ଇନକମିଂ କଲ୍""ଚାଲିଥିବା କଲ୍""ଏକ ଇନକମିଂ କଲକୁ ସ୍କ୍ରିନ୍ କରୁଛି""999+""接聽""視像""拒接""掛斷""來電""通話中""正在過濾來電""999+""Хариулах""Видео""Татгалзах""Таслах""Ирсэн дуудлага""Дуудлага хийгдэж байна""Ирсэн дуудлагыг харуулж байна""999+""‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‎‎‏‏‏‎‏‏‎‏‏‎‎‏‎‏‏‎‎‎‎‎‏‎‏‎‏‎‏‏‎‎‏‎‎‏‏‏‏‎‎‏‎‏‎‏‎‎‎‎‎‏‎‏‎‎‎Answer‎‏‎‎‏‎""‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‎‎‏‏‏‎‎‎‏‎‎‎‏‎‏‎‏‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‏‎‏‎‏‎‎‏‏‎‏‎‎‏‎‎‎‎‎‎Video‎‏‎‎‏‎""‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‏‏‎‏‎‎‎‏‏‎‎‎‎‏‎‎‏‏‏‎‏‎‎‏‏‎‎‎‎‏‎‎‏‏‎‎‏‏‏‏‏‎‎‏‎‎‏‎‎‎‎‏‎‎‏‎‎Decline‎‏‎‎‏‎""‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‏‎‏‎‎‎‎‏‎‎‏‎‏‎‏‏‏‎‏‎‎‏‏‎‎‎‎‎‎‏‏‎‏‏‎‎‏‏‏‏‎‎‎‎‎‎‎‎‎‏‎‏‏‏‎Hang Up‎‏‎‎‏‎""‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‏‏‎‎‎‎‏‎‎‏‎‏‎‎‎‎‏‎‎‎‎‏‎‏‏‎‎‎‏‏‏‎‏‏‎‎‎‏‎‎‎‏‏‎‏‎‎‎‏‎‏‏‎‏‏‏‎Incoming call‎‏‎‎‏‎""‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‎‏‏‏‏‏‏‏‎‏‎‎‎‏‎‏‏‎‎‏‏‏‏‏‎‎‎‎‎‏‎‏‏‏‎‎‎‏‎‏‎‎‏‎‏‏‏‏‏‎‎Ongoing call‎‏‎‎‏‎""‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‎‏‏‎‏‎‎‎‏‏‏‎‎‏‎‎‏‎‏‎‎‎‏‏‎‎‏‎‎‎‏‏‏‎‎‏‎‏‎‏‏‏‏‏‎‏‏‏‏‎‏‎‏‏‏‎‎‎Screening an incoming call‎‏‎‎‏‎""‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‎‏‏‏‏‎‎‏‎‎‏‏‎‏‎‏‏‎‎‏‎‏‏‎‎‎‏‎‎‎‎‎‎‎‏‎‎‎‎‏‎‏‎‏‎‎‎‎‏‎‎‎‎‎‎999+‎‏‎‎‏‎""Atender""Vídeo""Recusar""Desligar""Chamada recebida""Chamada em andamento""Filtrando uma ligação recebida""999+""පිළිතුරු දෙ.""වීඩියෝ""ප්‍රතික්ෂේප ක""විසන්ධි කරන්න""එන ඇමතුම""කරගෙන යන ඇමතුම""එන ඇමතුමක් පරීක්ෂා කරන්න""999+""ឆ្លើយ""វីដេអូ""បដិសេធ""ដាក់​ចុះ""ការ​ហៅ​ចូល""ការ​ហៅដែលកំពុងដំណើរការ""កំពុងពិនិត្យការ​ហៅ​ចូល""999+""Vasta""Video""Keeldu""Lõpeta kõne""Sissetulev kõne""Käimasolev kõne""Sissetuleva kõne filtreerimine""999+""Svar""Video""Avvis""Legg på""Innkommende anrop""Pågående samtale""Filtrerer et innkommende anrop""999+""Přijmout""Video""Odmítnout""Zavěsit""Příchozí hovor""Probíhající hovor""Prověřování příchozího hovoru""999+""መልስ""ቪዲዮ""አትቀበል""ስልኩን ዝጋ""ገቢ ጥሪ""እየተካሄደ ያለ ጥሪ""ገቢ ጥሪ ማጣራት""999+""Απάντηση""Βίντεο""Απόρριψη""Τερματισμός""Εισερχόμενη κλήση""Κλήση σε εξέλιξη""Διαλογή εισερχόμενης κλήσης""999+""जवाब दें""वीडियो""अस्वीकार करें""कॉल काटें""आने वाला (इनकमिंग) कॉल""पहले से जारी कॉल""इनकमिंग कॉल को स्क्रीन किया जा रहा है""999+""Жооп берүү""Видео""Четке кагуу""Чалууну бүтүрүү""Кирүүчү чалуу""Учурдагы чалуу""Кирүүчү чалууну иргөө""999+""Përgjigju""Video""Refuzo""Mbyll""Telefonatë hyrëse""Telefonatë në vazhdim""Po filtron një telefonatë hyrëse""999+""Svara""Video""Avvisa""Lägg på""Inkommande samtal""Pågående samtal""Ett inkommande samtal filtreras""999+""Trả lời""Video""Từ chối""Kết thúc""Cuộc gọi đến""Cuộc gọi đang thực hiện""Đang sàng lọc cuộc gọi đến""999+""Prijať""Video""Odmietnuť""Zložiť""Prichádzajúci hovor""Prebiehajúci hovor""Preveruje sa prichádzajúci hovor""999+""Répondre""Vidéo""Refuser""Raccrocher""Appel entrant""Appel en cours""Filtrer un appel entrant""999+""જવાબ""વીડિયો""નકારો""સમાપ્ત કરો""ઇનકમિંગ કૉલ""ચાલુ કૉલ""ઇનકમિંગ કૉલનું સ્ક્રીનિંગ થાય છે""999+""Jibu""Video""Kataa""Kata simu""Simu uliyopigiwa""Simu inayoendelea""Inachuja simu unayopigiwa""999+""Jawab""Video""Tolak""Tamatkan Panggilan""Panggilan masuk""Panggilan sedang berlangsung""Menyaring panggilan masuk""999+" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10dp + + + + + + + + + + %1$s tətbiqi ilə Google Play xidmətləri arasında problem var. Daha sonra yenidən cəhd edin.「%1$s」無法存取 Google Play 服務,請再試一次。%1$s sta riscontrando problemi con Google Play Services. Riprova.%1$s, Google Play hizmetleriyle ilgili sorun yaşıyor. Lütfen tekrar deneyin.L\'application %1$s rencontre des problèmes avec les services Google Play. Veuillez réessayer.%1$s á í vandræðum með þjónustu Google Play. Reyndu aftur.%1$s ਨੂੰ Google Play ਸੇਵਾਵਾਂ ਨਾਲ ਸਮੱਸਿਆ ਆ ਰਹੀ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।%1$s mengalami masalah dengan layanan Google Play. Coba lagi.12451000%1$s is having trouble with Google Play services. Please try again.%1$s ima poteškoća s uslugama Google Playa. Pokušajte ponovo.%1$s ima problema sa Google Play uslugama. Probajte ponovo.%1$s သည် Google Play ဝန်ဆောင်မှုများနှင့် ပြဿနာအနည်းငယ် ရှိနေပါသည်။ ထပ်လုပ်ကြည့်ပါ။%1$s aplikazioak arazoak ditu Google Play Services-ekin. Saiatu berriro.%1$s ilovasini Google Play xizmatlariga ulab bo‘lmadi. Qaytadan urinib ko‘ring.‏%1$s برای استفاده از خدمات Google Play با مشکل روبرو است. لطفاً دوباره امتحان کنید.O app %1$s está com problemas com o Google Play Services. Tente novamente.%1$s is having trouble with Google Play services. Please try again.%1$s ma problem z dostępem do Usług Google Play. Spróbuj jeszcze raz.「%1$s」で Google Play 開発者サービスに問題が発生しています。もう一度お試しください。%1$s inenkinga ngamasevisi e-Google Play. Sicela uzame futhi.Google Play পরিষেবাগুলির সাথে %1$s এর সমস্যা হচ্ছে৷ অনুগ্রহ করে আবার চেষ্টা করুন৷Google প্লে সেৱাত %1$s ত সমস্যা হৈ আছে। আকৌ চেষ্টা কৰক।%1$s ondervind probleme met Google Play Dienste. Probeer asseblief weer.%1$s está a ter problemas com os Serviços do Google Play. Tente novamente.%1$s հավելվածը Google Play ծառայությունների հետ կապված խնդիր ունի: Փորձեք նորից:%1$s-ს Google Play Services-თან პრობლემა შეექმნა. გთხოვთ, ცადოთ ხელახლა.%1$s लाई Google Play services सँग सहकार्य गर्न समस्या भइरहेको छ। कृपया फेरि प्रयास गर्नुहोस्।‏%1$s נתקלה בבעיה בשירותי Google Play. נסה שוב.Google Play சேவைகளில் சிக்கல் ஏற்பட்டதால், %1$s ஆப்ஸை அணுக முடியவில்லை. மீண்டும் முயலவும்.Lietotnē %1$s ir radusies problēma ar Google Play pakalpojumu darbību. Lūdzu, mēģiniet vēlreiz.%1$s ondervindt problemen met Google Play-services. Probeer het opnieuw.%1$s har problemer med Google Play-tjenester. Prøv igen.La aplicación %1$s tiene problemas con los Servicios de Google Play. Vuelve a intentarlo.Naudojant programą „%1$s“ kilo problemų dėl „Google Play“ paslaugų. Bandykite dar kartą.Google Play സേവനങ്ങളുമായി ബന്ധപ്പെട്ട് %1$s ആപ്പിനെന്തോ പ്രശ്നമുണ്ട്. വീണ്ടും ശ്രമിക്കുക.%1$s ला Google Play सेवांमध्ये समस्या येत आहे. कृपया पुन्हा प्रयत्न करा.%1$s қолданбасында Google Play қызметіне байланысты белгісіз қате шықты. Әрекетті қайталаңыз.%1$s ten problemas cos servizos de Google Play. Téntao de novo.%1$s има проблема са Google Play услугама. Пробајте поново.‏%1$s کو Google Play سروسز کے ساتھ مسئلہ پیش آ رہا ہے۔ براہ کرم دوبارہ کوشش کریں۔Google Play ಸೇವೆಗಳಲ್ಲಿ %1$s ಸಮಸ್ಯೆಯನ್ನು ಹೊಂದಿದೆ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.Aplikacija %1$s ima težave s storitvami Google Play. Poskusite znova.Aplikacija %1$s ima problema s Google Play uslugama. Pokušajte ponovo.Sovelluksella %1$s on ongelmia Google Play Palveluiden kanssa. Yritä uudelleen.A(z) %1$s alkalmazás problémába ütközött a Google Play-szolgáltatások használata során. Próbálkozzon újra.%1$s ກຳລັງມີບັນຫາກັບບໍລິການ Google Play. ກະລຸນາລອງໃໝ່ອີກຄັ້ງ.%1$s มีปัญหาเกี่ยวกับบริการของ Google Play โปรดลองอีกครั้ง%1$s întâmpină probleme privind serviciile Google Play. Încearcă din nou.%1$s에서 Google Play 서비스를 사용하는 데 문제가 있습니다. 다시 시도하세요.%1$s има проблеми с услугите за Google Play. Моля, опитайте отново.%1$s无法访问 Google Play 服务,请重试。У праграмы %1$s узніклі праблемы са службамі Google Play. Паўтарыце спробу.Приложению \"%1$s\" не удается подключиться к сервисам Google Play. Повторите попытку.%1$s има проблеми со услугите на Google Play. Обидете се повторно.%1$s hat Probleme mit Google Play-Diensten. Bitte versuche es noch einmal.‏لدى %1$s مشكلة في خدمات Google Play. يُرجى إعادة المحاولة.%1$s tiene problemas con los servicios de Google Play. Vuelve a intentarlo.%1$s té problemes amb Serveis de Google Play. Torna-ho a provar.У додатку %1$s виникла проблема із сервісами Google Play. Повторіть спробу.%1$s Google Play సేవలతో సమస్య కలిగి ఉంది. దయచేసి మళ్లీ ట్రై చేయండి.Nagkakaproblema ang %1$s sa mga serbisyo ng Google Play. Pakisubukan ulit.%1$sର Google Play ସେବା ସହ ଏକ ସମସ୍ୟା ରହିଛି। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।「%1$s」存取 Google Play 服務時發生問題。請稍後再試一次。%1$s-г Google Play-н үйлчилгээгээр ашиглахад асуудал гарлаа. Дахин оролдоно уу.%1$s හට Google Play සේවා සමගින් ගැටලු ඇත. කරුණාකර නැවත උත්සාහ කරන්න.%1$s កំពុងមានបញ្ហាជាមួយសេវាកម្មរបស់ Google Play ។ សូមព្យាយាមម្តងទៀតនៅពេលក្រោយ។Rakendusel %1$s on probleeme Google Play teenustega. Proovige uuesti.%1$s har problemer med Google Play-tjenester. Prøv på nytt.Aplikace %1$s má potíže se službami Google Play. Zkuste to prosím znovu.%1$s በGoogle Play አገልግሎቶች ላይ ችግሮች እያጋጠሙት ነው። እባክዎ እንደገና ይሞክሩ።Η εφαρμογή %1$s αντιμετωπίζει κάποιο πρόβλημα με τις υπηρεσίες Google Play. Προσπαθήστε ξανά.%1$s को Google Play सेवाओं के साथ समस्या आ रही है. कृपया फिर से कोशिश करें.%1$s колдонмосунун Google Play кызматтары менен иштөөдө көйгөй чыкты. Кайталап көрүңүз.%1$s ka probleme me shërbimet e Google Play. Provo sërish.Det har uppstått ett fel mellan %1$s och Google Play-tjänsterna. Försök igen.%1$s đang gặp sự cố với Dịch vụ Google Play. Hãy thử lại.Aplikácia %1$s má problémy so službami Google Play. Skúste to znova.L\'application %1$s éprouve un problème avec les services Google Play. Veuillez réessayer.%1$s ને Google Play સેવાઓમાં મુશ્કેલી આવી રહી છે. કૃપા કરીને ફરી પ્રયાસ કરો.%1$s inakumbwa na hitilafu ya huduma za Google Play. Tafadhali jaribu tena.%1$s menghadapi masalah berhubung perkhidmatan Google Play. Sila cuba lagi.Aktiv edin%1$s Google Play xidmətlərini aktiv edənə kimi işləməyəcək.Google Play xidmətlərini aktiv edinQuraşdırın%1$s cihazınızda mövcud olmayan Google Play xidmətləri olmadan çalışmayacaq.Google Play xidmətlərini əldə edinGoogle Play xidmətlərinin əlçatanlığıGoogle Play xidmətləri xətasıCihazınız tərəfindən dəstəklənməyən Google Play xidmətləri olmadan %1$s tətbiqi işləməyəcək.Güncəlləyin%1$s Google Play xidmətləri yeniləmə halda çalışmaz.Google Play xidmətlərini güncəlləşdirin%1$s hal-hazırda güncəllənən Google Play xidmətləri olmadan çalışmayacaq.Google Play xidmətlərinin yeni versiyası lazımdır. Qısa müddətə özünü yeniləyəcək.Telefonda açınDaxil olunGoogle ilə daxil olun啟用您必須啟用 Google Play 服務,才能執行「%1$s」。啟用 Google Play 服務安裝您的裝置並未安裝 Google Play 服務,因此無法執行「%1$s」。取得 Google Play 服務Google Play 服務可用性Google Play 服務發生錯誤您的裝置不支援 Google Play 服務,因此無法執行「%1$s」。更新您必須更新 Google Play 服務,才能執行「%1$s」。更新 Google Play 服務執行「%1$s」所需的 Google Play 服務正在更新。必須使用新版 Google Play 服務。該服務稍後就會自動更新。在手機上開啟登入使用 Google 帳戶登入Attiva%1$s non funzionerà se non attivi Google Play Services.Attiva Google Play ServicesInstallaL\'app %1$s non funzionerà senza Google Play Services, non presente sul tuo dispositivo.Installa Google Play ServicesDisponibilità di Google Play ServicesErrore Google Play Services%1$s non funzionerà senza Google Play Services, non supportati dal tuo dispositivo.Aggiorna%1$s non funzionerà se non aggiorni Google Play Services.Aggiorna Google Play Services%1$s non funzionerà senza Google Play Services, attualmente in fase di aggiornamento.È richiesta una nuova versione di Google Play Services. L\'aggiornamento automatico verrà eseguito a breve.Apri sul telefonoAccediAccedi con GoogleEtkinleştirGoogle Play hizmetlerini etkinleştirmezseniz %1$s çalışmaz.Google Play hizmetlerini etkinleştirinYükle%1$s, şu anda cihazınızda bulunmayan Google Play hizmetleri olmadan çalışmaz.Google Play hizmetlerini edininGoogle Play hizmetlerinin kullanılabilirliğiGoogle Play Hizmetleri hatası%1$s, Google Play hizmetleri olmadan çalışmaz ve bu hizmetler cihazınız tarafından desteklenmiyor.GüncelleGoogle Play hizmetlerini güncellemezseniz %1$s çalışmayacak.Google Play hizmetlerini güncelleyin%1$s, şu anda güncellenmekte olan Google Play hizmetleri olmadan çalışmaz.Google Play hizmetlerinin yeni sürümü gerekiyor. Kendisini kısa süre içinde güncelleyecektir.Telefonda açOturum açGoogle\'da oturum açActiver%1$s ne fonctionnera pas tant que vous n\'aurez pas activé les services Google Play.Activer les services Google PlayInstaller%1$s ne fonctionnera pas sans les services Google Play, qui ne sont pas installés sur votre appareil.Installer les services Google PlayDisponibilité des services Google PlayErreur liée aux services Google Play%1$s ne fonctionnera pas sans les services Google Play, qui ne sont pas compatibles avec votre appareil.Mettre à jour%1$s ne fonctionnera pas tant que vous n\'aurez pas mis à jour les services Google Play.Mettre à jour les services Google Play%1$s ne fonctionnera pas sans les services Google Play, qui sont en cours de mise à jour.La nouvelle version des services Google Play est nécessaire. Elle sera bientôt installée automatiquement.Ouvrir sur le téléphoneSe connecterSe connecter avec GoogleKveikja%1$s virkar ekki nema þú gerir þjónustu Google Play virka.Virkja þjónustu Google PlaySetja upp%1$s getur ekki keyrt án þjónustu Google Play, sem vantar í tækið þitt.Sækja þjónustu Google PlayStaða þjónustu Google PlayVilla í þjónustu Google Play%1$s getur ekki keyrt án þjónustu Google Play, sem er ekki studd af tækinu þínu.Uppfæra%1$s getur ekki keyrt nema þú uppfærir þjónustu Google Play.Uppfæra þjónustu Google Play%1$s getur ekki keyrt án þjónustu Google Play, sem verið er að uppfæra.Nýja útgáfu af þjónustu Google Play vantar. Hún uppfærir sig sjálf innan skamms.Opna í símanumSkrá innSkrá inn með Googleਚਾਲੂ ਕਰੋ%1$s ਕੰਮ ਨਹੀਂ ਕਰੇਗਾ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ Google Play ਸੇਵਾਵਾਂ ਨੂੰ ਚਾਲੂ ਨਹੀਂ ਕਰਦੇ ਹੋ।Google Play ਸੇਵਾਵਾਂ ਨੂੰ ਚਾਲੂ ਕਰੋਸਥਾਪਤ ਕਰੋ%1$s Google Play ਸੇਵਾਵਾਂ ਤੋਂ ਬਿਨਾਂ ਨਹੀਂ ਚੱਲੇਗੀ, ਜੋ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਤੋਂ ਗੁੰਮ ਹਨ।Google Play ਸੇਵਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋGoogle Play ਸੇਵਾਵਾਂ ਦੀ ਉਪਲਬਧਤਾGoogle Play ਸੇਵਾਵਾਂ ਅਸ਼ੁੱਧੀ%1$s Google Play ਸੇਵਾਵਾਂ ਤੋਂ ਬਿਨਾਂ ਨਹੀਂ ਚੱਲ ਸਕੇਗੀ, ਜੋ ਤੁਹਾਡੇ ਡੀਵਾਈਸ \'ਤੇ ਸਮਰਥਿਤ ਨਹੀਂ ਹਨ।ਅੱਪਡੇਟ ਕਰੋ%1$s ਨਹੀਂ ਚੱਲੇਗਾ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ Google Play ਸੇਵਾਵਾਂ ਨੂੰ ਅੱਪਡੇਟ ਨਹੀਂ ਕਰਦੇ ਹੋ।Google Play ਸੇਵਾਵਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ%1$s Google Play ਸੇਵਾਵਾਂ ਤੋਂ ਬਿਨਾਂ ਨਹੀਂ ਚੱਲੇਗਾ, ਜੋ ਵਰਤਮਾਨ ਵਿੱਚ ਅੱਪਡੇਟ ਹੋ ਰਹੀਆਂ ਹਨ।Google Play ਸੇਵਾਵਾਂ ਦੇ ਨਵਾਂ ਸੰਸਕਰਨ ਦੀ ਲੋੜ ਹੈ। ਇਹ ਛੇਤੀ ਹੀ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਅੱਪਡੇਟ ਕਰੇਗਾ।ਫ਼ੋਨ \'ਤੇ ਖੋਲ੍ਹੋਸਾਈਨ-ਇਨ ਕਰੋGoogle ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰੋAktifkan%1$s tidak akan berfungsi jika layanan Google Play tidak diaktifkan.Aktifkan layanan Google PlayInstal%1$s tidak akan berjalan tanpa layanan Google Play, yang tidak ada di perangkat Anda.Dapatkan layanan Google PlayKetersediaan layanan Google PlayKesalahan layanan Google Play%1$s tidak akan berjalan tanpa layanan Google Play, yang tidak didukung oleh perangkat Anda.Update%1$s tidak akan berjalan jika layanan Google Play tidak diperbarui.Perbarui layanan Google Play%1$s tidak akan berjalan tanpa layanan Google Play, yang saat ini sedang diperbarui.Perlu versi baru layanan Google Play. Akan segera memperbarui sendiri.Buka di ponselLoginLogin dengan Google@android:color/white#1F000000@android:color/black@android:color/white#90000000#1F000000#90000000#DE000000Enable%1$s won\'t work unless you enable Google Play services.Enable Google Play servicesInstall%1$s won\'t run without Google Play services, which are missing from your device.Get Google Play servicesGoogle Play services availabilityGoogle Play services error%1$s won\'t run without Google Play services, which are not supported by your device.Update%1$s won\'t run unless you update Google Play services.Update Google Play services%1$s won\'t run without Google Play services, which are currently updating.New version of Google Play services needed. It will update itself shortly.Open on phoneSign inSign in with Google + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Omogući%1$s neće funkcionirati ako ne omogućite usluge Google Playa.Omogućivanje usluga Google PlayaInstaliraj%1$s neće funkcionirati bez usluga Google Playa koje nisu instalirane na vašem uređaju.Preuzimanje usluga Google PlayaDostupnost usluga za Google PlayPogreška Usluga za Google Play%1$s neće funkcionirati bez usluga Google Playa koje vaš uređaj ne podržava.Ažuriraj%1$s neće funkcionirati ako ne ažurirate Google Play usluge.Ažuriranje usluga Google Playa%1$s neće se pokrenuti bez usluga Google Playa koje se trenutačno ažuriraju.Potrebna je nova verzija usluga Google Playa. Uskoro će se ažurirati.Otvori na telefonuPrijavaPrijava putem GoogleaOmogući%1$s neće funkcionisati ako ne omogućite Google Play usluge.Omogućite Google Play uslugeInstaliraj%1$s ne može da se pokrene bez Google Play usluga, koje nisu instalirane na uređaju.Preuzmite Google Play uslugeDostupnost Google Play uslugaGreška Google Play usluga%1$s ne može da se pokrene bez Google Play usluga, koje uređaj ne podržava.Ažuriraj%1$s ne može da se pokrene ako ne ažurirate Google Play usluge.Ažurirajte Google Play usluge%1$s ne može da se pokrene bez Google Play usluga, koje se trenutno ažuriraju.Potrebna je nova verzija Google Play usluga. Uskoro će se ažurirati.Otvori na telefonuPrijavi mePrijavi me na Googleဖွင့်ရန်Google Play ဝန်ဆောင်မှုများကို မဖွင့်သ၍ %1$s သည်အလုပ်လုပ်မည်မဟုတ်ပါ။Google Play ဝန်ဆောင်မှုများ ဖွင့်ရန်ထည့်သွင်းပါသင့်တက်ဘလက်တွင် Google Play ဝန်ဆောင်မှုများမရှိသောကြောင့် %1$s ကိုဖွင့်၍မရပါ။Google Play ဝန်ဆောင်မှုများရယူရန်Google Play ဝန်ဆောင်မှုများ ရရှိနိုင်သည်Google Play ဝန်ဆောင်မှုများ အမှားGoogle Play ဝန်ဆောင်မှုများကို သင့်စက်ပစ္စည်းတွင် ပံ့ပိုးမထားသည့်အတွက် ၎င်းမရှိဘဲ %1$s ကို ဖွင့်၍မရပါ။အပ်ဒိတ်Google Play ဝန်ဆောင်မှုများအား အပ်ဒိတ်မလုပ်ပါက %1$s အလုပ်လုပ်မည် မဟုတ်ပါ။Google Play ဝန်ဆောင်မှုများကို အပ်ဒိတ်လုပ်ရန်Google Play ဝန်ဆောင်မှုများကို လက်ရှိအပ်ဒိတ်လုပ်နေသောကြောင့် %1$s ကိုဖွင့်၍ရမည်မဟုတ်ပါ။Google Play ဝန်ဆောင်မှုဗားရှင်းအသစ်များ လိုအပ်နေသည်။ အချိန်အနည်းငယ်အကြာတွင် ၎င်းကိုယ်တိုင်အပ်ဒိတ်လုပ်ပါ လိမ့်မည်။ဖုန်းပေါ်မှာ ဖွင့်ပါလက်မှတ်ထိုး ဝင်ရန်Google ဖြင့် လက်မှတ်ထိုးဝင်ရေGaitu%1$s aplikazioak ez du funtzionatuko Google Play Services gaitzen ez baduzu.Gaitu Google Play ServicesInstalatu%1$s ez da exekutatuko Google Play Services gabe, baina ez dago halakorik gailuan.Lortu Google Play ServicesGoogle Play Services-en erabilgarritasunaGoogle Play Services-en errorea%1$s aplikazioa ezin da erabili Google Play Services gabe, baina zure gailua ez da harekin bateragarria.Eguneratu%1$s ez da exekutatuko Google Play Services eguneratzen ez baduzu.Eguneratu Google Play Services%1$s ez da exekutatuko Google Play Services gabe; zerbitzu hori eguneratzen ari da.Google Play Services-en bertsio berria behar da. Berehala eguneratuko da automatikoki.Ireki telefonoanHasi saioaHasi saioa Google-ko kontuarekinYoqishGoogle Play xizmatlari yoqilmaguncha, %1$s ishlamaydi.Google Play xizmatlarini yoqishO‘rnatish%1$s ishlashi uchun qurilmangizda Google Play xizmatlarini o‘rnatish lozim.Google Play xizmatlarini o‘rnatishGoogle Play xizmatlarining mavjudligiGoogle Play xizmatlari xatosi%1$s ilovasi Google Play xizmatlarisiz ishlamaydi, biroq qurilmangiz ularni qo‘llab-quvvatlamaydi.YangilashGoogle Play xizmatlari yangilanmaguncha, %1$s ishga tushmaydi.Google Play xizmatlarini yangilash%1$s ilovasining ishlashi uchun zarur Google Play xizmatlari hozirda yangilanmoqda.Google Play xizmatlarining yangi versiyasi zarur. U o‘zini qisqa vaqt ichida yangilaydi.Telefonda ochishKirishGoogle orqali kirishفعال کردن‏تا وقتی «خدمات Google Play» را فعال نکنید، %1$s کار نمی‌کند.‏‫فعال کردن «خدمات Google Play»نصب‏%1$s بدون خدمات Google Play که در دستگاه شما وجود ندارد اجرا نمی‌شود.‏دریافت «خدمات Google Play»‏دردسترس بودن خدمات Google Play‏خطا در خدمات Google Play‏%1$s بدون خدمات Google Play که در دستگاه شما پشتیبانی نمی‌شود، اجرا نخواهد شد.به‌روزرسانی‏تاز مانی که «خدمات Google Play» را به‌روزرسانی نکنید، %1$s اجرا نمی‌شود.‏‫به‌روزرسانی «خدمات Google Play»‏%1$s بدون «خدمات Google Play» که درحال حاضر درحال به‌روزرسانی هستند، کار نمی‌کند.‏نسخه جدید «خدمات Google Play» نیاز است. به‌زودی به‌طور خودکار به‌روزرسانی می‌شود.باز کردن در تلفنورود به سیستم‏ورود به سیستم با Google‎Ativar%1$s só funciona com o Google Play Services ativado.Ativar o Google Play ServicesInstalarO app %1$s não funciona sem o Google Play Services, o qual não está instalado no seu dispositivo.Instalar o Google Play ServicesDisponibilidade do Google Play ServicesErro do Google Play ServicesO app %1$s não funciona sem o Google Play Services, o qual não é compatível com seu dispositivo.Atualizar%1$s só funciona com uma versão atualizada do Google Play Services.Atualizar o Google Play Services%1$s não funciona sem o Google Play Services, o qual está sendo atualizado no momento.É necessária uma nova versão do Google Play Services. Ele será atualizado em breve.Abrir no smartphoneFazer loginFazer login com o GoogleEnable%1$s won\'t work unless you enable Google Play services.Enable Google Play servicesInstall%1$s won\'t run without Google Play services, which are missing from your device.Get Google Play servicesGoogle Play services availabilityGoogle Play services error%1$s won\'t run without Google Play services, which are not supported by your device.Update%1$s won\'t run unless you update Google Play services.Update Google Play services%1$s won\'t run without Google Play services, which are currently updating.New version of Google Play services needed. It will update itself shortly.Open on phoneSign InSign in with GoogleWłączAplikacja %1$s nie będzie działać, jeśli nie włączysz Usług Google Play.Włącz Usługi Google PlayZainstaluj%1$s nie będzie działać, jeśli nie zainstalujesz na urządzeniu Usług Google Play.Pobierz Usługi Google PlayDostępność Usług Google PlayBłąd Usług Google Play%1$s nie będzie działać bez Usług Google Play, które nie są obecnie obsługiwane przez urządzenie.AktualizujAplikacja %1$s nie będzie działać, jeśli nie zaktualizujesz Usług Google Play.Zaktualizuj Usługi Google PlayAplikacja %1$s nie będzie działać bez Usług Google Play, które są obecnie aktualizowane.Wymagana jest nowa wersja Usług Google Play. Wkrótce nastąpi automatyczna aktualizacja.Otwórz na telefonieZaloguj sięZaloguj się przez Google有効にする%1$sの実行には、Google Play開発者サービスの有効化が必要です。Google Play開発者サービスの有効化インストール「%1$s」の実行には Google Play 開発者サービスが必要ですが、お使いのデバイスにはインストールされていません。Google Play開発者サービスの入手Google Play 開発者サービスの利用Google Play開発者サービスのエラー「%1$s」の実行には Google Play 開発者サービスが必要ですが、お使いのデバイスではサポートされていません。更新%1$sの実行にはGoogle Play開発者サービスの更新が必要です。Google Play開発者サービスの更新%1$sの実行にはGoogle Play開発者サービスが必要ですが、このサービスは現在更新中です。Google Play開発者サービスの新しいバージョンが必要です。まもなく自動更新されます。スマートフォンで開くログインGoogleにログインNika amandlaI-%1$s ngeke isebenze ngaphandle kokuthi unike amandla amasevisi we-Google Play.Nika amandla amasevisi we-Google PlayFakaI-%1$s ngeke ize iqalise ngaphandle kwamasevisi we-Google Play, angekho kusukela kudivayisi yakho.Thola amasevisi we-Google PlayUkungatholakali kwamasevisi e-Google PlayIphutha lamasevisi we-Google Play%1$s ngeke isebenze ngaphandle kwamasevisi e-Google Play, angasekelwa idivayisi yakho.IsibuyekezoI-%1$s ngeke ize iqalise ngaphandle kokuthi ubuyekeze i-Google Play.Buyekeza amasevisi we-Google PlayI-%1$s ngeke ize iqalise ngaphandle kwamasevisi we-Google Play, okwamanje abuyekezwayo.Kudingeka inguqulo entsha yamasevisi we-Google Play. Izozibuyekeza ngokwayo maduze.Vula kufoniNgena ngemvumeNgena ngemvume nge-Googleসক্ষম করুনআপনি Google Play পরিষেবা সক্ষম না করা পর্যন্ত %1$s কাজ করবে না।Google Play পরিষেবা সক্ষম করুনইনস্টল করুনGoogle Play পরিষেবা ছাড়া %1$s চলবে না, যা আপনার ডিভাইসে অনুপস্থিত।Google Play পরিষেবা পানGoogle Play পরিষেবার উপলভ্যতাGoogle Play পরিষেবার ত্রুটিGoogle Play পরিষেবা ছাড়া %1$s চলবে না, যেটি আপনার ডিভাইসে সমর্থিত নয়৷আপডেট করুনআপনি Google Play পরিষেবা আপডেট না করা পর্যন্ত %1$s চলবে না।Google Play পরিষেবা আপডেট করুনGoogle Play পরিষেবা ছাড়া %1$s চলবে না যা বর্তমানে আপডেট হচ্ছে।Google Play পরিষেবার নতুন ভার্সন প্রয়োজন৷ খুব শীঘ্রই এটা নিজেই আপডেট হবে৷ফোনে খুলুনসাইন-ইন করুনGoogle এর মাধ্যমে সাইন-ইন করুনসক্ষম কৰকআপুনি Google Play সেৱাবোৰ সক্ষম নকৰালৈকে %1$sএ কাম নকৰিব।Google প্লে সেৱাসক্ষম কৰকইনষ্টল কৰক%1$s Google প্লে সেৱাৰ অবিহনে নচলে, যিটো আপোনাৰ ডিভাইচত নাই।Google প্লে সেৱালাভ কৰকGoogle প্লে সেৱাসমূহৰ উপলব্ধতাGoogle Playৰ সেৱা সম্পৰ্কীয় আসোঁৱাহ%1$s Google প্লে সেৱাৰ অবিহনে নচলে, যিবোৰ আপোনাৰ ডিভাইচত চলিব নোৱাৰে।আপডে’ট কৰকআপুনি Google Play সেৱাবোৰ আপডে’ট নকৰালৈকে %1$s নচলিব।Google Play সেৱা আপডে’ট কৰকবৰ্তমান আপডে’ট হৈ থকা Google Play সেৱাসমূহৰ অবিহনে %1$s নচলিব৷Google Play সেৱাসমূহৰ নতুন সংস্কৰণৰ প্ৰয়োজন৷ এইটো শীঘ্ৰেই নিজে-নিজে আপডে’ট হ’ব৷ফ\'নত খোলকছাইন ইন কৰকGoogleৰ জৰিয়তে ছাইন ইন কৰকAktiveer%1$s sal nie werk nie tensy jy Google Play Dienste aktiveer.Aktiveer Google Play DiensteInstalleer%1$s sal nie sonder Google Play Dienste werk nie, wat nie op jou toestel is nie.Kry Google Play DiensteBeskikbaarheid van Google Play DiensteGoogle Play Services-fout%1$s sal nie werk sonder Google Play Dienste nie, wat nie deur jou toestel gesteun word nie.Dateer op%1$s sal nie werk nie tensy jy Google Play Dienste opdateer.Dateer Google Play Dienste op%1$s sal nie sonder Google Play Dienste werk nie, wat tans opdateer.Nuwe weergawe van Google Play Dienste is nodig. Dit sal binnekort self opdateer.Maak oop op foonMeld aanMeld aan met GoogleAtivarO %1$s não funciona enquanto não ativar os serviços do Google Play.Ativar serviços do Google PlayInstalarO %1$s não é executado sem os Serviços do Google Play, os quais estão em falta no seu dispositivo.Obter serviços do Google PlayDisponibilidade Serviços do Google PlayErro dos Serviços do Google PlayNão é possível executar o %1$s sem os Serviços do Google Play, os quais não são compatíveis com o seu dispositivo.AtualizarO %1$s não é executado enquanto não atualizar os serviços do Google Play.Atualizar serviços do Google PlayO %1$s não é executado sem os serviços do Google Play, os quais estão a ser atualizados.É necessária uma nova versão dos serviços do Google Play. Esta será atualizada automaticamente em breve.Abrir no telemóvelIniciar sessãoIniciar sessão com o GoogleՄիացնել%1$s հավելվածը չի աշխատի մինչև չմիացնեք Google Play ծառայությունները:Միացնել Google Play ծառայություններըՏեղադրել%1$s հավելվածը չի աշխատի առանց Google Play ծառայությունների, որոնք չկան ձեր սարքում:Տեղադրել Google Play ծառայություններըGoogle Play ծառայությունների հասանելիությունGoogle Play ծառայությունների սխալ կա%1$s հավելվածը չի աշխատի առանց Google Play ծառայությունների, որոնք ձեր սարքում չեն աջակցվում:Թարմացնել%1$s հավելվածը չի աշխատի մինչև չթարմացնեք Google Play ծառայությունները:Թարմացնել Google Play ծառայությունները%1$s հավելվածը չի աշխատի առանց Google Play ծառայությունների, որոնք այս պահին թարմացվում են:Անհրաժեշտ է Google Play ծառայությունների նոր տարբերակը: Այն շուտով կթարմացվի ավտոմատ կերպով:Բացել հեռախոսովՄուտք գործելՄուտք գործել Google-ովჩართვა%1$s ვერ იმუშავებს Google Play Services-ის ჩართვამდე.Google Play Services-ის ჩართვაინსტალაცია%1$s ვერ გაეშვება Google Play Services-ის გარეშე, რომელიც აკლია თქვენს მოწყობილობას.Google Play Services-ის ჩამოტვირთვაGoogle Play services-ის ხელმისაწვდომობაGoogle Play Services-ის შეცდომა%1$s ვერ გაეშვება Google Play Services-ის გარეშე, რომლებიც მხარდაუჭერელია თქვენი მოწყობილობის მიერ.განახლება%1$s ვერ გაეშვება, თუ Google Play სერვისებს არ განაახლებთ.განაახლეთ Google Play Services%1$s ვერ გაეშვება Google Play Services-ის გარეშე, რომელთა განახლებაც ამჟამად მიმდინარეობს.საჭიროა Google Play Services-ის ახალი ვერსია. ის მალე განახლდება.ტელეფონში გახსნაშესვლაGoogle-ით შესვლაअन गर्नुहोस्%1$s ले तपाईँले Google Play सेवाहरू सक्षम नगरेसम्म काम गर्दैन।Google Play सेवाहरू सक्षम पार्नुहोस्स्थापना गर्नुहोस्%1$s Google Play services बिना सञ्चालन हुने छैन र तपाईँको यन्त्रमा Google Play services उपलब्ध छैनन्।Google Play सेवाहरू प्राप्त गर्नुहोस्Google Play सेवाको उपलब्धताGoogle Play सेवाहरूका त्रुटि%1$s Google Play services बिना सञ्चालन हुने छैन र तपाईँको यन्त्रले Google Play services लाई समर्थन गर्दैन।अपडेट गर्नुहोस्%1$s तपाईंले Google प्ले सेवाहरू अद्यावधिक नगरेसम्म सञ्चालन हुँदैन।Google Play सेवाहरू अपडेट गर्नुहोस्Google Play सेवाहरू %1$s बिना सञ्‍चालन हुँदैन, जुन हाल अद्यावधिक भइरहेका छन्।Google Play सेवाहरूको नयाँ संस्करण आवश्यक छ। यो आफै छिट्टै नै अद्यावधिक हुनेछ।फोनमा खोल्नुहोस्साइन इन गर्नुहोस्Google मार्फत साइन‍ इन गर्नुहोस्הפעל‏האפליקציה %1$s לא תפעל אם לא תפעיל את שירותי Google Play.‏הפעל את שירותי Google Playהתקן‏האפליקציה %1$s לא תפעל ללא שירותי Google Play, שאינם מותקנים במכשיר.‏קבל את שירותי Google Play‏זמינות של שירותי Google Play‏שגיאה בשירותי Google Play‏%1$s לא תפעל ללא שירותי Google Play, שאינם נתמכים במכשיר שלך.עדכון‏%1$s לא יפעל אם לא תעדכן את שירותי Google Play.‏עדכון שירותי Google Play‏האפליקציה %1$s לא תפעל ללא שירותי Google Play, שמתעדכנים כרגע.‏דרושה גרסה חדשה של שירותי Google Play. הגרסה תתעדכן בעצמה תוך זמן קצר.פתח בטלפוןכניסה‏היכנס באמצעות Googleஇயக்குGoogle Play சேவைகளை இயக்கினால் மட்டுமே, %1$s செயல்படும்.Google Play சேவைகளை இயக்கவும்நிறுவுGoogle Play சேவைகள் இருந்தால் மட்டுமே, %1$s இயங்கும். அவை உங்கள் சாதனத்தில் இல்லை.Google Play சேவைகளைப் பெறவும்கிடைக்கும் Google Play சேவைகள்Google Play சேவைகள் பிழைGoogle Play சேவைகள் இருந்தால் மட்டுமே %1$s ஆப்ஸ் இயங்கும். ஆனால், உங்கள் சாதனத்தில் அவை ஆதரிக்கப்படவில்லை.புதுப்பிGoogle Play சேவைகளை இயக்கினால் மட்டுமே, %1$s செயல்படும்.Google Play சேவைகளைப் புதுப்பிக்கவும்தற்போது புதுப்பிக்கப்படும், Google Play சேவைகள் இருந்தால் மட்டுமே, %1$s செயல்படும்.Google Play சேவைகளின் புதிய பதிப்பு தேவை. அது விரைவில் தானாகவே புதுப்பிக்கப்படும்.மொபைலில் திறஉள்நுழைகGoogle மூலம் உள்நுழைகIespējotLai lietotne %1$s darbotos, ir jāiespējo Google Play pakalpojumi.Google Play pakalpojumu iespējošanaInstalētLai lietotne %1$s darbotos, ierīcē ir jāinstalē Google Play pakalpojumi.Google Play pakalpojumu iegūšanaGoogle Play pakalpojumu pieejamībaGoogle Play pakalpojumu kļūdaLai lietotne %1$s darbotos, ir nepieciešami Google Play pakalpojumi, taču jūsu ierīce tos neatbalsta.AtjauninātLai lietotne %1$s darbotos, jums ir jāatjaunina Google Play pakalpojumi.Google Play pakalpojumu atjaunināšanaLai lietotne %1$s darbotos, ir jāinstalē Google Play pakalpojumi. Pašlaik notiek to atjaunināšana.Ir nepieciešama jauna Google Play pakalpojumu versija. Drīzumā tā tiks instalēta.Atvērt tālrunīPierakstītiesPierakstīties ar Google kontuAanzetten%1$s werkt niet, tenzij je Google Play-services aanzet.Google Play-services aanzettenInstalleren%1$s kan niet worden uitgevoerd zonder Google Play-services, die je nog niet op je apparaat hebt.Google Play-services ophalenBeschikbaarheid van Google Play-servicesFout met Google Play-services%1$s kan niet worden uitgevoerd zonder Google Play-services, die niet worden ondersteund op je apparaat.Updaten%1$s kan niet worden uitgevoerd, tenzij je Google Play-services updatet.Google Play-services updaten%1$s kan niet worden uitgevoerd zonder Google Play-services, die momenteel worden geüpdatet.Er is een nieuwe versie van Google Play-services vereist. De update wordt binnenkort automatisch uitgevoerd.Openen op telefoonInloggenInloggen met GoogleAktivérDu skal aktivere Google Play-tjenester, for at %1$s kan fungere.Aktivér Google Play-tjenesterInstallerDu skal installere Google Play-tjenester, før %1$s kan køre på din enhed.Hent Google Play-tjenesterGoogle Play-tjenesters tilgængelighedFejl i Google Play-tjenester%1$s fungerer ikke uden Google Play-tjenester, som ikke understøttes på din enhed.Opdater%1$s kan ikke køre, medmindre du opdaterer Google Play-tjenester.Opdater Google Play-tjenester%1$s kan ikke køre uden Google Play-tjenester, som i øjeblikket opdateres.Du skal bruge en ny version af Google Play-tjenester. Opdateringen gennemføres automatisk om et øjeblik.Åbn på telefonenLog indLog ind med GoogleHabilitar%1$s no funcionará hasta que no habilites Servicios de Google Play.Habilita Servicios de Google PlayInstalar%1$s no se ejecutará si los Servicios de Google Play no están instalados en tu dispositivo.Descargar Servicios de Google PlayDisponibilidad Servicios de Google PlayError de Servicios de Google PlayNo es posible ejecutar la aplicación %1$s sin los Servicios de Google Play, que no son compatibles con tu dispositivo.Actualizar%1$s no funcionará hasta que no actualices Servicios de Google Play.Actualiza Servicios de Google Play%1$s no se ejecutará hasta que finalice la actualización en curso de Servicios de Google Play.Se necesita una nueva versión de Servicios de Google Play. Se actualizará en breve.Abrir en teléfonoIniciar sesiónIniciar sesión con GoogleĮgalinti„%1$s“ neveiks, jei neįgalinsite „Google Play“ paslaugų.Įgalinkite „Google Play“ paslaugasĮdiegtiPrograma „%1$s“ nebus paleidžiama be „Google Play“ paslaugų, kurių nėra įrenginyje.Gaukite „Google Play“ paslaugas„Google Play“ paslaugų pasiekiamumas„Google Play“ paslaugų klaidaPrograma „%1$s“ nebus paleidžiama be „Google Play“ paslaugų, kurių jūsų įrenginys nepalaiko.Atnaujinti„%1$s“ nebus paleidžiama, jei neatnaujinsite „Google Play“ paslaugų.Atnaujinkite „Google Play“ paslaugas„%1$s“ nebus paleidžiama be „Google Play“ paslaugų, kurios šiuo metu atnaujinamos.Reikia naujos versijos „Google Play“ paslaugų. Jos netrukus bus atnaujintos.Atidaryti telefonePrisijungtiPrisijungti naudojant „Google“പ്രവർത്തനക്ഷമമാക്കുകനിങ്ങൾ Google Play സേവനങ്ങൾ പ്രവർത്തനക്ഷമമാക്കുന്നില്ലെങ്കിൽ %1$s പ്രവർത്തിക്കില്ല.Google Play സേവനങ്ങൾ പ്രവർത്തനക്ഷമമാക്കുകഇന്‍സ്റ്റാള്‍ ചെയ്യുകGoogle Play സേവനങ്ങളില്ലാതെ %1$s പ്രവർത്തിക്കില്ല, ഈ സേവനങ്ങളാകട്ടെ നിങ്ങളുടെ ഉപകരണത്തിൽ ഇല്ല.Google Play സേവനങ്ങൾ നേടുകGoogle Play സേവന ലഭ്യതGoogle Play സേവനങ്ങളിലെ പിശക്Google Play സേവനങ്ങളില്ലാതെ %1$s പ്രവർത്തിക്കില്ല, സേവനങ്ങളെയാകട്ടെ നിങ്ങളുടെ ഉപകരണം പിന്തുണയ്ക്കുന്നുമില്ല.അപ്‌ഡേറ്റുചെയ്യുകനിങ്ങൾ Google Play സേവനങ്ങൾ അപ്‌ഡേറ്റുചെയ്‌തില്ലെങ്കിൽ %1$s പ്രവർത്തിക്കില്ല.Google Play സേവനങ്ങൾ അപ്‌ഡേറ്റുചെയ്യുകനിലവിൽ അപ്‌ഡേറ്റുചെയ്യുന്ന Google Play സേവനങ്ങൾ ഇല്ലാതെ %1$s പ്രവർത്തിക്കില്ല.Google Play സേവനങ്ങളുടെ പുതിയ പതിപ്പ് ആവശ്യമാണ്. താമസിയാതെ ഇത് സ്വയം അപ്‌ഡേറ്റുചെയ്യും.ഫോണിൽ തുറക്കുകസൈൻ ഇൻ ചെയ്യുകGoogle ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുകसुरू करातुम्ही Google Play सेवा सक्षम केल्याशिवाय %1$s हा अ‍ॅप कार्य करणार नाही.Google Play सेवा सुरू करास्‍थापित कराGoogle Play सेवा आपल्या डिव्हाइसवर उपलब्ध नाही, त्याशिवाय %1$s चालणार नाही.Google Play सेवा मिळवाGoogle Play सेवा उपलब्धताGoogle Play सेवा एररतुमचे डिव्हाइस सपोर्ट करत नसलेल्या, Google Play सेवांशिवाय %1$s चालणार नाही.अपडेट करातुम्ही Google Play सेवा अपडेट करेपर्यंत %1$s चालणार नाही.Google Play सेवा अपडेट करासध्‍या अपडेट होत असलेल्‍या, Google Play सेवांशिवाय %1$s चालणार नाही.Google Play सेवांच्या नवीन आवृत्तीची आवश्यकता आहे. हे स्वत:ला लवकरच अपडेट करेल.फोनवर उघडासाइन इन कराGoogle सह साइन इन कराҚосуGoogle Play қызметтерін қоспасаңыз, %1$s жұмыс істемейді.Google Play қызметтерін қосуОрнатуGoogle Play қызметтері құрылғыда болмағандықтан, %1$s іске қосылмайды.Google Play қызметтерін алуGoogle Play қызметтерінің қолжетімділігіGoogle Play қызметтерінің қатесі%1$s қолданбасы құрылғыңызда қолдау көрсетілмейтін Google Play қызметінсіз жұмыс істемейді.ЖаңартуGoogle Play қызметтерін жаңартпасаңыз, %1$s іске қосылмайды.Google Play қызметтерін жаңартуҚазіргі уақытта жаңартылып жатқан Google Play қызметтерінсіз %1$s іске қосылмайды.Google Play қызметтерінің жаңа нұсқасы қажет. Ол қысқа уақыттан кейін өзі жаңарады.Телефонда ашуКіруGoogle арқылы кіруActivar%1$s non funcionará a menos que actives os servizos de Google Play.Activar servizos de Google PlayInstalar%1$s non se executará se o teu dispositivo non ten instalados os servizos de Google Play.Descargar servizos de Google PlayDispoñibilidade dos servizos de PlayErro nos servizos de Google Play%1$s non se executará sen os servizos de Google Play, que non son compatibles co teu dispositivo.Actualizar%1$s non se executará a menos que actualices os servizos de Google Play.Actualizar os servizos de Google Play%1$s non se executará sen os servizos de Google Play, que se están actualizando neste momento.Necesítase a nova versión dos servizos de Google Play. Actualizarase en breve.Abrir no teléfonoIniciar sesiónIniciar sesión con GoogleОмогући%1$s неће функционисати ако не омогућите Google Play услуге.Омогућите Google Play услугеИнсталирај%1$s не може да се покрене без Google Play услуга, које нису инсталиране на уређају.Преузмите Google Play услугеДоступност Google Play услугаГрешка Google Play услуга%1$s не може да се покрене без Google Play услуга, које уређај не подржава.Ажурирај%1$s не може да се покрене ако не ажурирате Google Play услуге.Ажурирајте Google Play услуге%1$s не може да се покрене без Google Play услуга, које се тренутно ажурирају.Потребна је нова верзија Google Play услуга. Ускоро ће се ажурирати.Отвори на телефонуПријави меПријави ме на Googleفعال کریں‏جب تک آپ Google Play سروسز فعال نہیں کر لیتے، %1$s کام نہیں کرے گی۔‏Google Play سروسز فعال کریںانسٹال کریں‏%1$s Google Play سروسز کے بغیر نہیں چلے گی، جو آپ کے آلہ سے غائب ہیں۔‏Google Play سروسز حاصل کریں‏Google Play سروسز کی دستیابی‏Google Play سروسز کی خرابی‏%1$s Google Play سروسز کے بغیر نہیں چلے گی، جن کی آپ کا آلہ معاونت نہیں کرتا۔اپ ڈیٹ کریں‏جب تک آپ Google Play سروسز اپ ڈیٹ نہیں کر لیتے ہیں %1$s تب تک نہیں چلے گی۔‏Google Play سروسز اپ ڈیٹ کریں‏%1$s Google Play سروسز کے بغیر نہیں چلے گی، جو فی الحال اپ ڈیٹ ہو رہی ہیں۔‏Google Play سروسز کے نئے ورژن کی ضرورت ہے۔ یہ تھوڑی دیر میں خود ہی اپنے آپ کو اپ ڈیٹ کر لے گا۔فون پر کھولیںسائن ان کریں‏Google کے ساتھ سائن ان کریںಸಕ್ರಿಯಗೊಳಿಸುGoogle Play ಸೇವೆಗಳನ್ನು ನೀವು ಸಕ್ರಿಯಗೊಳಿಸದ ಹೊರತು %1$s ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ.Google Play ಸೇವೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿನಿಮ್ಮ ಸಾಧನದಿಂದ ಕಾಣೆಯಾಗಿರುವ %1$s, Google Play ಸೇವೆಗಳಿಲ್ಲದೆ ರನ್ ಆಗುವುದಿಲ್ಲ.Google Play ಸೇವೆಗಳನ್ನು ಪಡೆಯಿರಿGoogle Play ಸೇವೆಗಳ ಲಭ್ಯತೆGoogle Play ಸೇವೆಗಳ ದೋಷನಿಮ್ಮ ಸಾಧನದ ಮೂಲಕ ಬೆಂಬಲಿಸದಿರುವ Google Play ಸೇವೆಗಳಿಲ್ಲದೆ %1$s ರನ್‌ ಆಗುವುದಿಲ್ಲ.ಅಪ್‌ಡೇಟ್‌ ಮಾಡಿನೀವು Google Play ಸೇವೆಗಳನ್ನು ಅಪ್‍ಡೇಟ್ ಮಾಡದ ಹೊರತು %1$s ರನ್ ಆಗುವುದಿಲ್ಲ.Google ಪ್ಲೇ ಸೇವೆಗಳನ್ನು ಅಪ್‌ಡೇಟ್‌ ಮಾಡಿGoogle Play ಸೇವೆಗಳಿಲ್ಲದೆ ಪ್ರಸ್ತುತ ಅಪ್‌ಡೇಟ್ ಆಗುತ್ತಿರುವ %1$s ರನ್ ಆಗುವುದಿಲ್ಲ.Google Play ಸೇವೆಗಳ ಹೊಸ ಆವೃತ್ತಿ ಅಗತ್ಯವಿದೆ. ಸದ್ಯದಲ್ಲೇ ಅದು ತಾನಾಗಿಯೇ ಅಪ್‌ಡೇಟ್ ಆಗುತ್ತದೆ.ಫೋನ್‌ನಲ್ಲಿ ತೆರೆಯಿರಿಸೈನ್ ಇನ್Google ಮೂಲಕ ಸೈನ್ ಇನ್ ಮಾಡಿOmogočiAplikacija %1$s ne bo delovala, če ne omogočite storitev Google Play.Omogočanje storitev Google PlayNamestiAplikacija %1$s ne deluje brez storitev Google Play, vendar teh ni v napravi.Namestitev storitev Google PlayDostopnost storitev Google PlayNapaka storitev Google PlayAplikacija %1$s ne deluje brez storitev Google Play, ki jih vaša naprava ne podpira.PosodobiAplikacija %1$s ne bo delovala, če ne posodobite storitev Google Play.Posodobitev storitev Google PlayAplikacija %1$s ne deluje brez storitev Google Play, ki se trenutno posodabljajo.Potrebujete novo različico storitev Google Play. V kratkem se bodo posodobile.Odpiranje v telefonuPrijavaPrijava z računom GoogleOmogućiAplikacija %1$s neće raditi ako ne omogućite Google Play usluge.Omogućite Google Play uslugeInstalirajAplikacija %1$s neće raditi bez Google Play usluga, kojih na vašem uređaju nema.Nabavite Google Play uslugeDostupnost Google Play uslugaGreška Google Play uslugeAplikacija %1$s neće raditi bez Google Play usluga, koje vaš uređaj ne podržava.AžurirajAplikacija %1$s neće raditi ako ne ažurirate Google Play usluge.Ažuriranje Google Play uslugaAplikacija %1$s neće raditi bez Google Play usluga, koje se trenutno ažuriraju.Potrebna je nova verzija Google Play usluga. Ubrzo će se samo ažurirati.Otvori na telefonuPrijavaPrijavi se pomoću GoogleaOta käyttöön%1$s ei toimi, ellet ota Google Play Palveluita käyttöön.Ota Google Play Palvelut käyttöönAsenna%1$s ei toimi ilman Google Play Palveluita, jotka puuttuvat laitteeltasi.Asenna Google Play PalvelutGoogle Play Palveluiden saatavuusVirhe Google Play -palveluissa%1$s ei toimi ilman Google Play Palveluita, joita laitteesi ei tue.Päivitä%1$s ei toimi, ellet päivitä Google Play Palveluita.Päivitä Google Play Palvelut%1$s ei toimi ilman Google Play Palveluita, joita päivitetään tällä hetkellä.Uusi Google Play Palveluiden versio tarvitaan. Se päivittyy pian.Avaa puhelimessaKirjaudu sisäänKirjaudu Google-tililleEngedélyezésA(z) %1$s alkalmazás csak akkor működik, ha engedélyezi a Google Play-szolgáltatásokat.Google Play-szolgáltatások engedélyezéseTelepítésA(z) %1$s alkalmazás nem fut a Google Play-szolgáltatások nélkül, amelyek hiányoznak az eszközről.A Google Play-szolgáltatások beszerzéseGoogle Play-szolgáltatások elérhetőségeGoogle Play-szolgáltatások – hibaA(z) %1$s alkalmazás nem fut a Google Play-szolgáltatások nélkül, amelyeket eszköze nem támogat.FrissítésA(z) %1$s alkalmazás csak akkor fog működni, ha frissíti a Google Play-szolgáltatásokat.A Google Play-szolgáltatások frissítéseA(z) %1$s alkalmazás nem fut a Google Play-szolgáltatások nélkül, amelyek frissítése folyamatban van.A Google Play-szolgáltatások új verziójára van szükség. A szolgáltatás hamarosan frissíti önmagát.Megnyitás a telefononBejelentkezésBejelentkezés Google-fiókkalເປີດນຳໃຊ້%1$s ຈະບໍ່ສາມາດໃຊ້ງານໄດ້ຈົນກວ່າທ່ານຈະເປີດໃຊ້ງານ​ການ​ບໍ​ລິ​ການ Google Play.ເປີດໃຊ້ການ​ບໍ​ລິ​ການ Google Playຕິດຕັ້ງ%1$s ຈະບໍ່ສາມາດເປີດໃຊ້ໄດ້ຫາກບໍ່ມີການບໍລິການ Google Play ເຊິ່ງແທັບເລັດຂອງທ່ານບໍ່ມີ.ຕິດຕັ້ງບໍລິການ Google Playສະຖານະບໍລິການ Google PlayGoogle Play Services ​ເກີດ​ຄວາມ​ຜິດ​ພາດ%1$s ຈະບໍ່ສາມາດໃຊ້ໄດ້ຫາກບໍ່ມີບໍລິການ Google Play ເຊິ່ງອຸປະກອນຂອງທ່ານບໍ່ຮອງຮັບ.ອັບເດດ%1$s ຈະບໍ່ສາມາດເຮັດວຽກໄດ້ຈົນກວ່າທ່ານຈະອັບເດດການ​ບໍ​ລິ​ການ Google Playອັບເດດການ​ບໍ​ລິ​ການ Google Play%1$s ຈະບໍ່ສາມາດໃຊ້ງານໄດ້ໂດຍທີ່ບໍ່ມີການ​ບໍ​ລິ​ການ Google Play, ເຊິ່ງ​ກຳ​ລັງ​ອັບ​ເດດ​ຢູ່​ໃນ​ປະ​ຈຸ​ບັນ.ຈຳ​ເປັນ​ຕ້ອງ​ມີ​ກາ​ນ​ບໍ​ລິ​ການ Google Play ເວີ​ຊັນ​ໃໝ່. ມັນ​ຈະ​ອັບ​ເດດ​ຕົວ​ເອງ​ໄວໆ​ນີ້.​ເປີດ​ໃນ​ໂທ​ລະ​ສັບລົງຊື່ເຂົ້າໃຊ້ລົງຊື່ເຂົ້າໃຊ້ດ້ວຍ Googleเปิดใช้%1$s จะไม่ทำงานจนกว่าคุณจะเปิดใช้บริการ Google Playเปิดใช้บริการ Google Playติดตั้ง%1$s จะไม่ทำงานหากไม่มีบริการ Google Play ซี่งไม่มีในอุปกรณ์ของคุณติดตั้งบริการ Google Playความพร้อมใช้งานของบริการ Google Playข้อผิดพลาดของบริการ Google Play%1$s จะไม่ทำงานหากไม่มีบริการ Google Play ซึ่งอุปกรณ์ของคุณไม่สนับสนุนอัปเดต%1$s จะไม่ทำงานจนกว่าคุณจะอัปเดตบริการ Google Playอัปเดตบริการ Google Play%1$s จะไม่ทำงานหากไม่มีบริการ Google Play ซึ่งกำลังอัปเดตอยู่ในขณะนี้จำเป็นต้องใช้บริการ Google Play เวอร์ชันใหม่ ซึ่งจะอัปเดตอัตโนมัติในอีกไม่ช้าเปิดบนโทรศัพท์ลงชื่อเข้าใช้ลงชื่อเข้าใช้ด้วย GoogleActivează%1$s nu va funcționa decât dacă activezi serviciile Google Play.Activează serviciile Google PlayInstalează%1$s nu va rula fără serviciile Google Play, care lipsesc de pe dispozitivul tău.Descarcă serviciile Google PlayDisponibilitatea serviciilor Google PlayEroare a serviciilor Google Play%1$s nu va rula fără serviciile Google Play, care nu sunt acceptate de dispozitivul tău.Actualizează%1$s nu va rula decât dacă actualizezi serviciile Google Play.Actualizează serviciile Google Play%1$s nu va rula fără serviciile Google Play, care momentan se actualizează.Este necesară o nouă versiune a serviciilor Google Play. Se vor actualiza automat în curând.Deschide pe telefonConectează-teConectează-te cu Google사용 설정Google Play 서비스를 사용하도록 설정해야 %1$s이(가) 작동합니다.Google Play 서비스 사용설치기기에 Google Play 서비스가 설치되어 있어야 %1$s이(가) 실행됩니다.Google Play 서비스 설치Google Play 서비스 사용 가능 여부Google Play 서비스 오류%1$s은(는) Google Play 서비스 없이는 실행되지 않으나, 기기에서 Google Play 서비스를 지원하지 않습니다.업데이트Google Play 서비스를 업데이트해야 %1$s이(가) 실행됩니다.Google Play 서비스 업데이트현재 업데이트 중인 Google Play 서비스가 있어야 %1$s이(가) 실행됩니다.새 버전의 Google Play 서비스가 필요합니다. 곧 자동으로 업데이트됩니다.스마트폰에서 열기로그인Google 계정으로 로그인Активиране%1$s няма да работи, освен ако не активирате услугите за Google Play.Активиране на услугите за Google PlayИнсталиране%1$s няма да се изпълнява, тъй като услугите за Google Play не са инсталирани на устройството ви.Изтегляне на услугите за Google PlayНаличност на услугите за Google PlayГрешка в услугите за Google Play%1$s няма да се изпълнява, тъй като услугите за Google Play не се поддържат от устройството ви.Актуализиране%1$s няма да се изпълнява, освен ако не актуализирате услугите за Google Play.Актуализиране на услугите за Google Play%1$s няма да се изпълнява без услугите за Google Play. Понастоящем те се актуализират.Необходима е нова версия на услугите за Google Play. Скоро тя ще се актуализира автоматично.Отваряне на телефонаВходВход с Google启用您必须先启用 Google Play 服务,然后才能运行%1$s。启用 Google Play 服务安装您的设备没有安装 Google Play 服务,因此无法运行%1$s。获取 Google Play 服务Google Play 服务的适用范围Google Play服务出错您的设备不支持 Google Play 服务,因此无法运行%1$s。更新您必须先更新 Google Play 服务,然后才能运行%1$s。更新 Google Play 服务Google Play 服务当前正在更新,因此您无法运行%1$s。必须使用新版 Google Play 服务。该服务很快就会自行更新。在手机上打开登录使用 Google 账号登录Уключыць%1$s не будзе працаваць, пакуль вы не ўключыце службы Google Play.Уключыць службы Google PlayУсталяваць%1$s не будзе працаваць без службаў Google Play, якія адсутнічаюць на вашай прыладзе.Атрымаць службы Google PlayДаступнасць сэрвісаў Google PlayПамылка службаў Google Play%1$s не будзе працаваць без службаў Google Play, якія не падтрымліваюцца вашай прыладай.Абнавіць%1$s не будзе працаваць, пакуль вы не абновіце службы Google Play.Абнаўленне службаў Google Play%1$s не будзе працаваць без службаў Google Play, якія ў цяперашні час абнаўляюцца.Патрабуецца новая версія служб Google Play. Яна абновіцца аўтаматычна ў бліжэйшы час.Адкрыць на тэлефонеУвайсцiУвайсці праз GoogleВключитьДля работы приложения \"%1$s\" требуется включить сервисы Google Play.Включите сервисы Google PlayУстановитьДля работы приложения \"%1$s\" требуется установить сервисы Google Play.Установите сервисы Google PlayДоступность сервисов Google PlayОшибка сервисов Google PlayДля работы с приложением \"%1$s\" требуются сервисы Google Play. Они не поддерживаются на вашем устройстве.ОбновитьЧтобы запустить приложение \"%1$s\", обновите сервисы Google Play.Обновите сервисы Google PlayСервисы Google Play, необходимые для работы приложения \"%1$s\", в настоящий момент обновляются.Версия сервисов Google Play устарела. Они автоматически обновятся в ближайшее время.Открыть на телефонеВойтиВойти через аккаунт GoogleОвозможи%1$s нема да се извршува ако не овозможите услуги на Google Play.Овозможи ги услугите на Google PlayИнсталирај%1$s нема да се извршува без услугите на Google Play што ги нема на уредот.Преземи ги услугите на Google PlayДостапност на услугите на Google PlayГрешка на услугите на Google Play%1$s нема да се извршува без услугите на Google Play, што не се подржани од уредов.Ажурирај%1$s нема да се извршува ако не ги ажурирате услугите на Google Play.Ажурирај ги услугите на Google Play%1$s нема да се извршува без услугите на Google Play што се ажурираат во моментов.Потребна е нова верзија на услугите на Google Play. Таа наскоро самата ќе се ажурира.Отвори на телефонотНајави сеНајави се со GoogleAktivieren%1$s funktioniert erst nach der Aktivierung der Google Play-Dienste.Google Play-Dienste aktivierenInstallierenZur Nutzung von %1$s sind die Google Play-Dienste erforderlich, die auf deinem Gerät nicht installiert sind.Google Play-Dienste installierenVerfügbarkeit von Google Play-DienstenFehler bei Zugriff auf Google Play-DiensteZur Nutzung von %1$s sind Google Play-Dienste erforderlich, die auf deinem Gerät nicht unterstützt werden.Aktualisieren%1$s wird nur ausgeführt, wenn du die Google Play-Dienste aktualisierst.Google Play-Dienste aktualisierenZur Nutzung von %1$s sind Google Play-Dienste erforderlich, die gerade aktualisiert werden.Eine neue Version der Google Play-Dienste wird benötigt. Diese wird in Kürze automatisch aktualisiert.Auf Smartphone öffnenAnmeldenÜber Google anmeldenتفعيل‏لن يعمل %1$s ما لم يتم تفعيل خدمات Google Play.‏تفعيل خدمات Google Playتثبيت‏لن يتم تشغيل %1$s بدون خدمات Google Play، والتي لا تتوفر على جهازك.‏الحصول على خدمات Google Play‏مدى توفّر خدمات Google Play‏خطأ في خدمات Google Play‏لن يتم تشغيل %1$s بدون خدمات Google Play التي لا يوفرها جهازك.تحديث‏لن يتم تشغيل %1$s ما لم يتم تحديث خدمات Google Play.‏تحديث خدمات Google Play‏لن يتم تشغيل %1$s بدون خدمات Google Play، والتي يتم تحديثها حاليًا.‏يجب توفر إصدار جديد من خدمات Google Play. سيتم تحديثها تلقائيًا قريبًا.فتح على الهاتفتسجل الدخول‏تسجيل الدخول عبر GoogleHabilitar%1$s no funcionará a menos que habilites los servicios de Google Play.Habilitar servicios de Google PlayInstalar%1$s no se ejecutará si los Servicios de Google Play no están instalados en tu dispositivo.Obtener servicios de Google PlayDisp. de los Servicios de Google‌‌‌ PlayError de Google Play Services%1$s no se ejecutará sin los servicios de Google Play, que no son compatibles con tu dispositivo.Actualizar%1$s no se ejecutará a menos que actualices los servicios de Google Play.Actualizar servicios de Google Play%1$s no se ejecutará sin los servicios de Google Play. La plataforma se está actualizando en este momento.Se necesita una nueva versión de los servicios de Google Play. Se actualizarán automáticamente en breve.Abrir en el teléfonoAccederAcceder con GoogleActiva%1$s no funcionarà si no actives Serveis de Google Play.Activa Serveis de Google PlayInstal·la%1$s no s\'executarà si Serveis de Google Play no està instal·lat al dispositiu.Obtén Serveis de Google PlayDisponibilitat de serveis de Google PlayError de Serveis de Google Play%1$s no es pot executar sense Serveis de Google Play, que no és compatible amb el teu dispositiu.Actualitza%1$s no s\'executarà si no actualitzes Serveis de Google Play.Actualitza Serveis de Google Play%1$s no s\'executarà sense Serveis de Google Play, que s\'està actualitzant en aquest moment.Cal una nova versió de Serveis de Google Play. S\'actualitzarà automàticament aviat.Obre al telèfonInicia sessióInicia la sessió amb GoogleУвімкнутиДодаток %1$s не працюватиме, якщо не ввімкнути сервіси Google Play.Увімкнути сервіси Google PlayУстановитиДодаток %1$s не працюватиме без сервісів Google Play, яких немає на вашому пристрої.Установити сервіси Google PlayДоступність сервісів Google PlayПомилка сервісів Google PlayДодаток %1$s не працюватиме без сервісів Google Play, які не підтримуються на вашому пристрої.ОновитиДодаток %1$s не працюватиме, якщо не оновити сервіси Google Play.Оновіть сервіси Google PlayДодаток %1$s не працюватиме без сервісів Google Play, які зараз оновлюються.Потрібна нова версія сервісів Google Play. Вони невдовзі оновляться.Відкрити на телефоніУвійтиУвійти в облік. запис Googleప్రారంభించండిమీరు Google Play సేవలను ప్రారంభిస్తే మినహా %1$s పని చేయదు.Google Play సేవలను ప్రారంభించండిఇన్‌స్టాల్ చేయి%1$s Google Play సేవలు లేకుండా అమలు కాదు, ఆ సేవలు మీ పరికరంలో లేవు.Google Play సేవలను పొందండిGoogle Play సేవల లభ్యతGoogle Play సేవల ఎర్రర్%1$s Google Play సేవలు లేకుండా అమలు కాదు, ఈ సేవలకు మీ పరికరంలో మద్దతు లేదు.అప్‌డేట్ చేయిమీరు Google Play సేవలను నవీకరిస్తే మినహా %1$s అమలు కాదు.Google Play సేవలను అప్‌డేట్ చేయండి%1$s Google Play సేవలు లేకుండా అమలు కాదు, ఆ సేవలు ప్రస్తుతం నవీకరించబడుతున్నాయి.కొత్త Google Play సేవల వెర్షన్ అవసరం. అది కొద్ది సేపట్లో దానంతట అదే అప్‌డేట్ చేయబడుతుంది.ఫోన్‌లో తెరువుసైన్ ఇన్ చేయండిGoogleతో సైన్ ఇన్ చేయండిI-enableHindi gagana ang %1$s maliban kung ie-enable mo ang mga serbisyo ng Google Play.I-enable ang mga serbisyo ng Google PlayI-installHindi gagana ang %1$s nang wala ang mga serbisyo ng Google Play na wala sa iyong device.Kunin ang mga serbisyo ng Google PlayAvailability ng serbisyo ng Google PlayError sa Mga Serbisyo ng Google PlayHindi gagana ang %1$s nang wala ang mga serbisyo ng Google Play, na hindi nasusuportahan ng iyong device.I-updateHindi gagana ang %1$s maliban kung i-a-update mo ang mga serbisyo ng Google Play.I-update ang mga serbisyo ng Google PlayHindi gagana ang %1$s nang wala ang mga serbisyo ng Google Play na kasalukuyang ina-update.Kailangan ang bagong bersyon ng mga serbisyo ng Google Play. Mag-a-update itong mag-isa sa ilang sandali.Buksan sa teleponoMag-sign inMag-sign in sa Googleସକ୍ଷମ କରନ୍ତୁଆପଣ Google Play ସେବା ସକ୍ଷମ ନ କରିବା ପର୍ଯ୍ୟନ୍ତ %1$s କାମ କରିବ ନାହିଁ।Google Play ସେବାଗୁଡ଼ିକ ସକ୍ଷମ କରନ୍ତୁଇନ୍‍ଷ୍ଟଲ୍‍ କରନ୍ତୁ%1$s ଏହି Google Play ସେବାଗୁଡ଼ିକ ବିନା ଚାଲେ ନାହିଁ, ଏବଂ ସେଗୁଡ଼ିକ ଆପଣଙ୍କ ଡିଭାଇସ୍‌ରେ ନାହିଁ।Google Play ସେବାଗୁଡ଼ିକ ପ୍ରାପ୍ତ କରନ୍ତୁGoogle Play ସେବାଗୁଡ଼ିକର ଉପଲବ୍ଧତାGoogle Play ସେବା ସମ୍ପର୍କିତ ସମସ୍ୟା%1$s ଏହି Google Play ସେବାଗୁଡ଼ିକ ବିନା ଚାଲେ ନାହିଁ, ଏବଂ ସେଗୁଡ଼ିକ ଆପଣଙ୍କ ଡିଭାଇସ୍‌ରେ କାମ କରେ ନାହିଁ।ଅପଡେଟ୍‍ କରନ୍ତୁଆପଣ Google Play ସେବା ଅପଡେଟ୍‌ ନ କରିବା ପର୍ଯ୍ୟନ୍ତ %1$s ଚାଲିବ ନାହିଁ।Google Play ସେବାଗୁଡ଼ିକ ଅପଡେଟ୍ କରନ୍ତୁGoogle Play ସେବାଗୁଡ଼ିକ ବିନା %1$s ଚାଲିବ ନାହିଁ, ଯେଉଁଗୁଡ଼ିକ ବର୍ତ୍ତମାନ ଅପଡେଟ୍‌ ହେଉଛି।Google Play ସେବାଗୁଡ଼ିକର ନୂତନ ଭର୍ସନ୍‌ ଆବଶ୍ୟକ। ଏହା ନିଜକୁ କିଛି ସମୟ ମଧ୍ୟରେ ଅପଡେଟ୍‌ କରିବ।ଫୋନ୍‌ରେ ଖୋଲନ୍ତୁସାଇନ୍‌-ଇନ୍ କରନ୍ତୁGoogle ସହ ସାଇନ୍‌-ଇନ୍ କରନ୍ତୁ啟用你必須啟用 Google Play 服務,方可執行「%1$s」。啟用 Google Play 服務安裝你的裝置尚未安裝 Google Play 服務,因此無法執行「%1$s」。安裝 Google Play 服務Google Play 服務的適用範圍Google Play 服務錯誤你的裝置不支援 Google Play 服務,因此無法執行「%1$s」。更新你必須更新「Google Play 服務」,才能執行 %1$s。更新 Google Play 服務正在更新 Google Play 服務,更新完成後方可執行「%1$s」。需要使用新版本的 Google Play 服務。更新會即將自動開始。在手機開啟登入透過 Google 登入Идэвхжүүлэх%1$s нь Google Play үйлчилгээг идэвхжүүлэх хүртэл ажиллахгүй.Google Play үйлчилгээг идэвхжүүлэхСуулгахТаны төхөөрөмжид Google Play үйлчилгээ байхгүй тул %1$s ажиллахгүй.Google Play үйлчилгээг авахGoogle Play-н үйлчилгээнүүдийн боломжит байдалGoogle Наадаан үйлчилгээний алдааТаны төхөөрөмж Google Play үйлчилгээг дэмждэггүй учир %1$s ажиллахгүй.Шинэчлэх%1$s нь таныг Google Play үйлчилгээнүүдийг шинэчлэхээс нааш ажиллахгүй.Google Play үйлчилгээг шинэчлэх%1$s нь одоогоор шинэчилж буй Google Play үйлчилгээгүйгээр ажиллахгүй.Google Play үйлчилгээний шинэ хувилбар хэрэгтэй. Энэ нь удахгүй өөрөө өөрийгөө шинэчлэх болно.Утсаар нээхНэвтрэхGoogle-р нэвтрэх:සබල කරන්නඔබ Google Play සේවා සබල කරන්නේ නම් මිස %1$s වැඩ නොකරනු ඇත.Google Play සේවා සබල කරන්නස්ථාපනය කරන්නඔබගේ ටැබ්ලට් පරිගණකයේ නැති Google Play සේවා නොමැතිව %1$s ධාවනය නොවනු ඇත.Google Play සේවා ලබා ගන්නGoogle Play සේවාවල ලබා ගත හැකි බවGoogle Play සේවා දෝෂයඔබගේ උපාංගය මගින් සහාය නොදක්වන, Google Play සේවා නොමැතිව %1$s ධාවනය නොවනු ඇත.යාවත්කාලීන කරන්නGoogle Play සේවා යාවත්කාලීන කරන්නේ නොමැතිව %1$s ධාවනය නොවේ.Google Play සේවා යාවත්කාලීන කරන්නදැනට යාවත්කාලීන කරමින් ඇති, Google Play සේවා නොමැතිව %1$s ධාවනය නොවනු ඇත.Google Play සේවාවල නව අනුවාදයක් අවශ්‍යයි. එය මද වේලාවකින් එය විසින්ම යාවත්කාලීන වනු ඇත.දුරකථනය තුළ විවෘත කරන්නපුරන්නGoogle සමගින් පුරන්නបើក%1$s នឹងមិនដំណើរការទេ លុះត្រាតែអ្នកបើកសេវាកម្ម Google Play។បើកសេវាកម្ម Google Playដំឡើង%1$s នឹងមិនដំណើរការទេ ប្រសិនបើមិនមានសេវាកម្មនានារបស់ Google Play ដែលបានបាត់ពីឧបករណ៍របស់អ្នក។ទាញយកសេវាកម្ម Google Playលទ្ធភាព​ប្រើប្រាស់សេវាកម្ម Google Playកំហុស​​សេវាកម្ម​ Google កម្សាន្ត%1$s នឹងមិនដំណើរការដោយគ្មានសេវាកម្មរបស់ Google Play ដែលឧបករណ៍របស់អ្នកមិនគាំទ្រនោះទេ។ធ្វើបច្ចុប្បន្នភាព%1$s នឹងមិនដំណើរការទេ លុះត្រាតែអ្នកធ្វើបច្ចុប្បន្នភាពសេវាកម្ម Google Play។អាប់ដេតសេវាកម្ម Google Play%1$s នឹងមិនដំណើរការទេ បើមិនមានសេវាកម្ម Google Play ដោយសារតែវាកំពុងអាប់ដេត។តម្រូវឲ្យមានកំណែថ្មីនៃសេវាកម្ម Google Play។ វានឹងអាប់ដេតដោយខ្លួនវានៅពេលបន្តិចទៀតនេះ។បើកតាមទូរស័ព្ទចូលចូលដោយប្រើ GoogleLubaRakendus %1$s töötab ainult siis, kui lubate Google Play teenused.Google Play teenuste lubamineInstalliRakendus %1$s töötab ainult koos Google Play teenustega, mida teie seadmes pole.Google Play teenuste hankimineGoogle Play teenuste saadavalolekViga Google Play teenustesRakendus %1$s töötab ainult koos Google Play teenustega, mida teie seadmes ei toetata.VärskendaRakenduse %1$s töötamiseks peate värskendama Google Play teenuseid.Google Play teenuste värskendamineRakendus %1$s töötab ainult koos Google Play teenustega, mida praegu värskendatakse.Vajalik on Google Play teenuste uus versioon. See värskendab end peagi.Ava telefonisLogi sisseLogi sisse Google\'i kontogaAktivér%1$s fungerer ikke med mindre du slår på Google Play-tjenester.Slå på Google Play-tjenesterInstaller%1$s kan ikke kjøre uten Google Play-tjenester, som ikke er installert på enheten din.Installer Google Play-tjenesterGoogle Play Tjenester-tilgjengelighetGoogle Play Tjenester-feil%1$s kan ikke kjøre uten Google Play-tjenester, som ikke støttes av enheten din.Oppdater%1$s kjører ikke med mindre du oppdaterer Google Play Tjenester.Oppdater Google Play-tjenester%1$s kjører ikke uten Google Play-tjenester, som oppdateres akkurat nå.Du må installere en ny versjon av Google Play-tjenester. Appen oppdateres automatisk om en kort stund.Åpne på telefonenLogg påLogg på med GooglePovolitKe spuštění aplikace %1$s je třeba aktivovat služby Google Play.Aktivace služeb Google PlayInstalovatKe spuštění aplikace %1$s jsou potřeba služby Google Play, které v zařízení nemáte.Instalace služeb Google PlayDostupnost služeb Google PlayChyba služeb Google PlayKe spuštění aplikace %1$s jsou potřeba služby Google Play, které v tomto zařízení nejsou podporovány.AktualizovatKe spuštění aplikace %1$s je třeba aktualizovat služby Google Play.Aktualizace služeb Google PlayKe spuštění aplikace %1$s jsou potřeba služby Google Play, které jsou právě aktualizovány.Je vyžadována nová verze služeb Google Play. Nová verze se brzy sama nainstaluje.Otevřít v telefonuPřihlásit sePřihlásit se k účtu GoogleአንቃGoogle Play አገልግሎቶችን ካላነቁ በስተቀር %1$s አይሰራም።Google Play አገልግሎቶችን ያንቁጫን%1$s ያለ Google Play አገልግሎቶች አይሰራም፣ እነሱ ደግሞ በመሣሪያዎ ላይ የሉም።Google Play አገልግሎቶችን ያግኙGoogle Play አገልግሎቶች ተገኝነትየGoogle Play አገልግሎቶች ስህተት%1$s ያለGoogle Play አገልግሎቶች አይሄድም፣ እነዚህም በመሣሪያዎ አይደገፉም።ያዘምኑGoogle Play አገልግሎቶችን ካላዘመኑ በስተቀር ድረስ %1$s አይሰራም።Google Play አገልግሎቶችን ያዘምኑ%1$s ያለ Google Play አገልግሎቶች አይሰራም፣ እነሱ ደግሞ በአሁኑ ጊዜ በመዘመን ላይ ናቸው።አዲስ የGoogle Play አገልግሎቶች ስሪት ያስፈልጋል። በቅርቡ እራሱን ያዘምናል።ስልክ ላይ ክፈትግባበGoogle ይግቡΕνεργοποίησηΗ εφαρμογή %1$s δεν θα λειτουργήσει εάν δεν έχετε ενεργοποιήσει τις υπηρεσίες Google Play.Ενεργοποίηση υπηρεσιών Google PlayΕγκατάστασηΗ εφαρμογή %1$s δεν μπορεί να εκτελεστεί χωρίς τις υπηρεσίες Google Play, οι οποίες λείπουν από τη συσκευή σας.Λήψη υπηρεσιών Google PlayΔιαθεσιμότητα υπηρεσιών Google PlayΣφάλμα Υπηρεσιών Google PlayΗ εφαρμογή %1$s δεν θα εκτελεστεί χωρίς τις υπηρεσίες Google Play, οι οποίες δεν υποστηρίζονται από τη συσκευή σας.ΕνημέρωσηΗ εφαρμογή %1$s θα εκτελεστεί αφού ενημερώσετε τις Υπηρεσίες Google Play.Ενημέρωση υπηρεσιών Google PlayΗ εφαρμογή %1$s δεν θα εκτελεστεί χωρίς τις υπηρεσίες Google Play, οι οποίες ενημερώνονται αυτήν τη στιγμή.Απαιτείται νέα έκδοση των υπηρεσιών Google Play. Θα ενημερωθεί σύντομα.Άνοιγμα σε τηλέφωνοΣύνδεσηΣυνδεθείτε με το Googleचालू करेंजब तक आप Google Play सेवाएं चालू नहीं करते, %1$s काम नहीं करेगा.Google Play सेवाएं चालू करेंइंस्टॉल करें%1$s उन Google Play सेवाओं के बिना नहीं चलेगा जो आपके डिवाइस में उपलब्ध नहीं हैं.Google Play सेवाएं इंस्टॉल करेंGoogle Play सेवाएं उपलब्ध हैंGoogle Play सेवाओं से जुड़ी गड़बड़ी%1$s उन Google Play सेवाओं के बिना नहीं चलेगा, जो आपके डिवाइस पर काम नहीं करती हैं.अपडेट करें%1$s तब तक नहीं चलेगा जब तक आप Google Play सेवाओं को अपडेट नहीं करते.Google Play सेवाओं को अपडेट करें%1$s उन Google Play सेवाओं के बिना नहीं चलेगा जो अभी अपडेट हो रही हैं.Google Play सेवाओं के नए वर्शन की ज़रूरत है. यह जल्द ही अपने आप अपडेट हो जाएगा.फ़ोन पर खोलेंसाइन इन करेंGoogle के ज़रिए साइन इन करेंИштетүүGoogle Play кызматтарын иштетмейиңизче %1$s иштебейт.Google Play кызматтарын иштетүүОрнотууGoogle Play кызматтарысыз %1$s иштебейт. Алар түзмөгүңүздө жок болуп жатат.Google Play кызматтарын алууGoogle Play кызматтарынын иштешиGoogle Play кызматтарынын катасы%1$s колдонмосу сиздин түзмөгүңүздө колдоого алынбаган Google Play кызматтары болбосо иштебейт.ЖаңыртууGoogle Play кызматтары жаңыртылмайынча %1$s иштебейт.Google Play кызматтарын жаңыртууGoogle Play кызматтарысыз %1$s иштебейт, алар учурда жаңыртылууда.Google Play кызматтарынын жаңы версиясы талап кылынат. Бир аздан кийин ал өзү эле жаңырат.Телефондо ачыкКирүүGoogle менен кирүүAktivizo%1$s nuk do të funksionojë nëse nuk aktivizon shërbimet e \"Luaj me Google\".Aktivizo shërbimet e \"Luaj me Google\"Instalo%1$s nuk do të funksionojë pa shërbimet e Google Play, të cilat mungojnë në pajisjen tënde.Merr shërbimet e \"Luaj me Google\"Disponueshmëria e shërbimeve të Google PlayGabim në shërbimet e \"Luaj me Google\"%1$s nuk do të funksionojë pa shërbimet e Google Play, të cilat nuk mbështeten nga pajisja jote.Përditëso%1$s nuk do të funksionojë nëse nuk përditëson shërbimet e \"Luaj me Google\".Përditëso shërbimet e \"Luaj me Google\"%1$s nuk do të funksionojë pa shërbimet e Google Play, të cilat po përditësohen aktualisht.Nevojitet një version i ri i shërbimeve të \"Luaj me Google\". Ai do të përditësohet automatikisht së shpejti.Hape në telefonIdentifikohuIdentifikohu me GoogleAktivera%1$s fungerar inte om du inte aktiverar Google Play-tjänster.Aktivera Google Play-tjänsterInstallera%1$s kan inte köras utan Google Play-tjänsterna, som saknas på enheten.Hämta Google Play-tjänsterTillgänglighet för Google Plays tjänsterFel på Google Play-tjänster%1$s fungerar inte utan Google Play-tjänsterna, som inte stöds på enheten.Uppdatera%1$s kan inte köras om du inte uppdaterar Google Play-tjänsterna.Uppdatera Google Play-tjänster%1$s kan inte köras utan Google Play-tjänster, och dessa uppdateras för närvarande.En ny version av Google Play-tjänster krävs. Den uppdateras automatiskt inom kort.Öppna på mobilenLogga inLogga in med GoogleBật%1$s sẽ không hoạt động nếu bạn không bật dịch vụ của Google Play.Bật dịch vụ của Google PlayCài đặt%1$s sẽ không chạy nếu không có dịch vụ của Google Play. Thiết bị của bạn bị thiếu dịch vụ này.Cài đặt dịch vụ của Google PlayPhạm vi cung cấp Dịch vụ Google PlayLỗi dịch vụ của Google Play%1$s sẽ không chạy nếu không có Dịch vụ Google Play. Thiết bị của bạn không hỗ trợ các dịch vụ này.Cập nhật%1$s sẽ không chạy trừ khi bạn cập nhật Dịch vụ Google Play.Cập nhật dịch vụ của Google Play%1$s sẽ không chạy nếu không có dịch vụ của Google Play. Dịch vụ này hiện đang cập nhật.Cần phiên bản mới của dịch vụ Google Play. Dịch vụ sẽ sớm tự động cập nhật.Mở trên điện thoạiĐăng nhậpĐăng nhập bằng GooglePovoliťAplikácia %1$s bude fungovať až po povolení služieb Google Play.Povoliť služby Google PlayInštalovaťNa spustenie aplikácie %1$s sa vyžadujú služby Google Play, ktoré na zariadení nemáte.Inštalovať služby Google PlayDostupnosť služieb Google PlayChyba služieb Google PlayAplikáciu %1$s nebude možné spustiť bez služieb Google Play, ktoré vaše zariadenie nepodporuje.AktualizovaťAplikáciu %1$s bude možné spustiť až po aktualizácii služieb Google Play.Aktualizácia služieb Google PlayNa spustenie aplikácie %1$s sa vyžadujú služby Google Play, ktoré sa momentálne aktualizujú.Vyžaduje sa nová verzia služieb Google Play. Aktualizujú sa automaticky v najbližšom čase.Otvoriť v telefónePrihlásiť saPrihlásiť sa do účtu GoogleActiver%1$s ne fonctionnera pas tant que vous n\'aurez pas activé les services Google Play.Activer les services Google PlayInstaller%1$s ne fonctionnera pas sans les services Google Play, qui ne sont pas installés sur votre appareil.Installer les services Google PlayDisponibilité des services Google PlayErreur liée aux services Google PlayL\'application %1$s ne fonctionnera pas sans les services Google Play, qui ne sont pas pris en charge par votre appareil.Mettre à jour%1$s ne fonctionnera pas tant que vous n\'aurez pas mis à jour les services Google Play.Mettre à jour les services Google Play%1$s ne fonctionnera pas sans les services Google Play, qui sont actuellement mis à jour.La nouvelle version des services Google Play est nécessaire. Elle sera bientôt installée automatiquement.Ouvrir sur le téléphoneSe connecterSe connecter avec Googleસક્ષમ કરોતમે Google Play સેવાઓ સક્ષમ કરશો નહીં ત્યાં સુધી %1$s કાર્ય કરશે નહીં.Google Play સેવાઓ સક્ષમ કરોઇન્સ્ટૉલ કરો%1$s, Google Play સેવાઓ વગર ચાલશે નહીં, જે તમારા ઉપકરણમાંથી ખૂટે છે.Google Play સેવાઓ મેળવોGoogle Play સેવાઓની ઉપલબ્ધતાGoogle Play સેવાઓની ભૂલ%1$s, Google Play સેવાઓ વગર ચાલશે નહીં, જે તમારા ઉપકરણ દ્વારા સમર્થિત નથી.અપડેટ કરોતમે Google Play સેવાઓ અપડેટ કરશો નહીં ત્યાં સુધી %1$s શરૂ થશે નહીં.Google Play સેવાઓ અપડેટ કરો%1$s, Google Play સેવાઓ વગર શરૂ થશે નહીં, જે વર્તમાનમાં અપડેટ થઈ રહી છે.Google Play સેવાઓના નવા સંસ્કરણની જરૂર છે. તે ટૂંક સમયમાં પોતાને અપડેટ કરશે.ફોનમાં ખોલોસાઇન ઇન કરોGoogle માં સાઇન ઇન કરોWasha%1$s haitafanya kazi isipokuwa uwashe huduma za Google Play.Washa huduma za Google PlaySakinisha%1$s haitafanya kazi bila huduma za Google Play. Huduma hizi hazipatikani kwenye kifaa chako.Pata huduma za Google PlayUpatikanaji wa huduma za Google PlayHitilafu kwenye huduma za Google Play%1$s haitafanya kazi bila huduma za Google Play. Huduma hizi hazitumiki kwenye kifaa chako.Sasisha%1$s haitafanya kazi hadi usasishe huduma za Google Play.Sasisha huduma za Google Play%1$s haitafanya kazi bila huduma za Google Play. Huduma hizi zinasasishwa sasa.Toleo jipya la huduma za Google Play linahitajika. Litajisasisha baada ya muda mfupi.Fungua kwenye simuIngia katika akauntiIngia katika akaunti ukitumia GoogleDayakan%1$s tidak akan berfungsi melainkan anda mendayakan perkhidmatan Google Play.Dayakan perkhidmatan Google PlayPasang%1$s tidak akan berfungsi tanpa perkhidmatan Google Play dan perkhidmatan ini tiada pada peranti anda.Dapatkan perkhidmatan Google PlayKetersediaan perkhidmatan Google PlayRalat perkhidmatan Google Play%1$s tidak akan berfungsi tanpa perkhidmatan Google Play dan perkhidmatan ini tidak disokong oleh peranti anda.Kemas kini%1$s tidak akan berfungsi kecuali anda mengemas kini perkhidmatan Google Play.Kemaskinikan perkhidmatan Google Play%1$s tidak akan berfungsi tanpa perkhidmatan Google Play dan perkhidmatan ini sedang dikemaskinikan.Versi baharu perkhidmatan Google Play diperlukan. Kemas kini automatik akan dijalankan sebentar lagi.Buka pada telefonLog masukLog masuk dengan Googlecom.google.android.gms.net.PlayServicesCronetProvider8dp0dp50dp20dp800dp120dp + + + + + + + + + + + + + + + + + + + + + + "Əsas səhifəyə keçin""Yuxarı keçin""Digər seçimlər""Hazırdır""Hamısına baxın""Tətbiq seçin""DEAKTİV""AKTİV""Alt+""Ctrl+""silin""daxil olun""Funksiya+""Meta+""Shift+""space""Sym+""Menyu+""Axtarış...""Sorğunu silin""Axtarış sorğusu""Axtarın""Sorğunu göndərin""Səsli axtarış""Paylaşın""%s ilə paylaşın""Yığcamlaşdırın""Axtarın""瀏覽首頁""向上瀏覽""更多選項""完成""查看全部""選擇應用程式""關閉""開啟""Alt +""Ctrl +""Delete 鍵""Enter 鍵""Fn +""Meta +""Shift +""空格鍵""Sym +""Menu +""搜尋…""清除查詢""搜尋查詢""搜尋""提交查詢""語音搜尋""分享對象""與「%s」分享""收合""搜尋""Portami a casa""Torna indietro""Altre opzioni""Fine""Mostra tutto""Scelta di un\'app""OFF""ON""ALT +""CTRL +""CANC""INVIO""FUNZIONE +""META +""MAIUSC +""SPAZIO""SYM +""MENU +""Cerca…""Cancella query""Query di ricerca""Cerca""Invia query""Ricerca vocale""Condividi con""Condividi tramite %s""Comprimi""Cerca""Eve gidiş yolunu göster""Yukarı git""Diğer seçenekler""Bitti""Tümünü göster""Bir uygulama seçin""KAPAT""AÇ""Alt+""Ctrl+""sil""enter""Function+""Meta+""Üst Karakter+""boşluk""Sym+""Menü+""Ara…""Sorguyu temizle""Arama sorgusu""Ara""Sorguyu gönder""Sesli arama""Şununla paylaş:""%s ile paylaş""Daralt""Ara""Revenir à l\'accueil""Revenir en haut de la page""Autres options""OK""Tout afficher""Sélectionner une application""NON""OUI""Alt+""Ctrl+""supprimer""entrée""Fonction+""Méta+""Maj+""espace""Sym+""Menu+""Rechercher…""Effacer la requête""Requête de recherche""Rechercher""Envoyer la requête""Recherche vocale""Partager avec""Partager avec %s""Réduire""Rechercher""Fara heim""Fara upp""Fleiri valkostir""Lokið""Sjá allt""Veldu forrit""SLÖKKT""KVEIKT""Alt+""Ctrl+""eyða""enter""Aðgerðarlykill+""Meta+""Shift+""bilslá""Sym+""Valmynd+""Leita…""Hreinsa fyrirspurn""Leitarfyrirspurn""Leit""Senda fyrirspurn""Raddleit""Deila með""Deila með %s""Minnka""Leit""ਹੋਮ \'ਤੇ ਜਾਓ""ਉੱਪਰ ਜਾਓ""ਹੋਰ ਵਿਕਲਪ""ਹੋ ਗਿਆ""ਸਭ ਦੇਖੋ""ਇੱਕ ਐਪ ਚੁਣੋ""ਬੰਦ""ਚਾਲੂ""Alt+""Ctrl+""ਮਿਟਾਓ""enter""Function+""Meta+""Shift+""space""Sym+""Menu+""ਖੋਜ…""ਪੁੱਛਗਿੱਛ ਕਲੀਅਰ ਕਰੋ""ਖੋਜ ਪੁੱਛਗਿੱਛ""ਖੋਜ""ਪੁੱਛਗਿੱਛ ਸਪੁਰਦ ਕਰੋ""ਅਵਾਜ਼ੀ ਖੋਜ""ਇਸ ਨਾਲ ਸਾਂਝਾ ਕਰੋ""%s ਨਾਲ ਸਾਂਝਾ ਕਰੋ""ਸਮੇਟੋ""ਖੋਜ""Tunjukkan jalan ke rumah""Kembali ke atas""Opsi lainnya""Selesai""Lihat semua""Pilih aplikasi""NONAKTIF""AKTIF""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""spasi""Sym+""Menu+""Telusuri...""Hapus kueri""Telusuri kueri""Telusuri""Kirim kueri""Penelusuran suara""Bagikan dengan""Bagikan dengan %s""Ciutkan""Telusuri"truetrue#ff000000#ffffffff#7fa87f@android:color/black@android:color/black@color/material_deep_teal_200@color/material_deep_teal_500@color/material_grey_800@android:color/white@color/material_grey_850@color/material_grey_50#80ffffff#80000000@color/bright_foreground_material_light@color/bright_foreground_material_dark@android:color/white@android:color/black#ff5a595b#ffd6d7d7#80bebebe#80323232#ffbebebe#ff323232#ff7043#ff5722@android:color/white@android:color/black#6680cbc4#66009688#ff37474f#ff263238#ff21272b#ff80cbc4#ff008577#fff5f5f5#ffe0e0e0#fffafafa#ff757575#ff424242#ff303030#ff212121@android:color/black@color/material_grey_600@color/material_grey_900@color/material_grey_100#ffffffff#de000000#4Dffffff#39000000#33ffffff#1f000000#b3ffffff#8a000000#36ffffff#24000000#ff616161#ffbdbdbd#ffbdbdbd#fff1f1f1#e6616161#e6FFFFFF16dp72dp56dp0dp0dp4dp16dp10dp6dp48dp180dp5dp-3dp48dp48dp36dp48dp48dp@dimen/abc_control_inset_material6dp8dp@dimen/abc_control_padding_material720dp320dp2dp4dp4dp2dp80%100%320dp320dp8dp8dp65%95%24dp18dp8dp0.300.2632dip8dip8dip7dp4dp10dp16dp80dp64dp48dp@dimen/abc_action_bar_content_inset_material296dp4dp48dip320dip2dp2dp20dp48dp36dp16dp3dp14sp14sp14sp12sp34sp45sp56sp112sp24sp22sp18sp14sp16sp14sp16sp16dp20sp20dp0.300.260.260.200.120.500.380.700.542dp16dp8dp8dp96dp6.5dp0dp16dp220150127150Navigate homeNavigate upMore optionsDoneSee allChoose an appOFFONAlt+Ctrl+deleteenterFunction+Meta+Shift+spaceSym+Menu+Search…Clear querySearch querySearchSubmit queryVoice searchShare withShare with %sCollapseSearch440dp60%90%60%90%55%80%"Vai ao inicio""Vai cara arriba""Máis opcións""Feito""Ver todo""Selecciona unha aplicación""DESACTIVADO""ACTIVADO""Alt +""Ctrl +""eliminar""intro""Función +""Meta +""Maiús +""espazo""Sym +""Menú +""Busca…""Borra a consulta""Busca a consulta""Realiza buscas""Envía a consulta""Busca por voz""Comparte contido con""Comparte contido coa aplicación %s""Contrae""Buscar""Идите на почетну""Идите нагоре""Још опција""Готово""Прикажи све""Изаберите апликацију""ИСКЉУЧЕНО""УКЉУЧЕНО""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""тастер за размак""Sym+""Menu+""Претражите…""Обришите упит""Претражите упит""Претражите""Пошаљите упит""Гласовна претрага""Делите помоћу""Делите помоћу апликације %s""Скупи""Претражите""گھر کی طرف نیویگیٹ کریں""اوپر نیویگیٹ کریں""مزید اختیارات""ہو گیا""سبھی دیکھیں""ایک ایپ منتخب کریں""آف""آن""Alt+‎""Ctrl+‎""delete""enter""Function+‎""Meta+‎""Shift+‎""space""Sym+‎""Menu+‎""تلاش کریں…""استفسار صاف کریں""تلاش کا استفسار""تلاش کریں""استفسار جمع کرائیں""صوتی تلاش""اس کے ساتھ اشتراک کریں""%s کے ساتھ اشتراک کریں""سکیڑیں""تلاش کریں""ಹೋಮ್‌ಗೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ""ಮೇಲಕ್ಕೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ""ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು""ಆಯಿತು""ಎಲ್ಲವನ್ನೂ ನೋಡಿ""ಆ್ಯಪ್‌ವೊಂದನ್ನು ಆಯ್ಕೆಮಾಡಿ""ಆಫ್""ಆನ್""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""space""Sym+""Menu+""ಹುಡುಕಿ…""ಪ್ರಶ್ನೆಯನ್ನು ತೆರವುಗೊಳಿಸಿ""ಪ್ರಶ್ನೆಯನ್ನು ಹುಡುಕಿ""ಹುಡುಕಿ""ಪ್ರಶ್ನೆಯನ್ನು ಸಲ್ಲಿಸಿ""ಧ್ವನಿ ಹುಡುಕಾಟ""ಇವರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ""%s ನೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ""ಕುಗ್ಗಿಸಿ""ಹುಡುಕಿ""Krmarjenje na začetek""Pomik navzgor""Več možnosti""Končano""Pokaži vse""Izbira aplikacije""IZKLOP""VKLOP""Alt +""Ctrl +""delete""enter""Fn +""Meta +""Shift +""preslednica""Sym +""Meni +""Iskanje …""Izbris poizvedbe""Iskalna poizvedba""Iskanje""Pošiljanje poizvedbe""Glasovno iskanje""Deljenje z:""Deljenje z drugimi prek aplikacije %s""Strnitev""Iskanje""Navegar para a página inicial""Navegar para cima""Mais opções""Concluído""Ver tudo""Selecionar um app""DESATIVADO""ATIVADO""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""espaço""Sym+""Menu+""Pesquisar…""Limpar consulta""Consulta de pesquisa""Pesquisar""Enviar consulta""Pesquisa por voz""Compartilhar com""Compartilhar com %s""Recolher""Pesquisar""මුල් පිටුවට සංචාලනය කරන්න""ඉහළට සංචාලනය කරන්න""තවත් විකල්ප""කළා""සියල්ල බලන්න""යෙදුමක් තෝරන්න""ක්‍රියාවිරහිතයි""ක්‍රියාත්මකයි""Alt+""Ctrl+""මකන්න""enter""Function+""Meta+""Shift+""space""Sym+""Menu+""සොයන්න...""විමසුම හිස් කරන්න""සෙවුම් විමසුම""සෙවීම""විමසුම යොමු කරන්න""හඬ සෙවීම""සමග බෙදා ගන්න""%s සමඟ බෙදා ගන්න""හකුළන්න""සෙවීම""​ទៅទំព័រដើម""រំកិលឡើងលើ""ជម្រើសច្រើនទៀត""រួចរាល់""មើលទាំងអស់""ជ្រើសរើស​កម្មវិធី​​""បិទ""បើក""Alt+""Ctrl+""លុប""enter""Function+""Meta+""Shift+""space""Sym+""Menu+""ស្វែងរក…""សម្អាត​សំណួរ""ស្វែងរកសំណួរ​""ស្វែងរក""ដាក់បញ្ជូន​សំណួរ""ស្វែងរក​តាម​សំឡេង""ចែករំលែក​ជា​មួយ""ចែក​រំលែក​ជា​មួយ %s""បង្រួម""ស្វែងរក""Liigu avalehele""Liigu üles""Rohkem valikuid""Valmis""Kuva kõik""Valige rakendus""VÄLJAS""SEES""Alt +""Ctrl +""kustuta""sisestusklahv""Funktsiooniklahv +""Meta +""Tõstuklahv +""tühik""Sym +""Menüü +""Otsige …""Päringu tühistamine""Otsingupäring""Otsing""Päringu esitamine""Häälotsing""Jaga:""Jagamine rakendusega %s""Ahendamine""Otsing""Naviger hjem""Gå opp""Flere alternativer""Ferdig""Se alle""Velg en app""AV""PÅ""Alt+""Ctrl+""slett""enter""Funksjon+""Meta+""Shift+""mellomrom""Sym+""Meny+""Søk""Slett søket""Søkeord""Søk""Utfør søket""Talesøk""Del med""Del med %s""Skjul""Søk""Přejít na plochu""Přejít nahoru""Další možnosti""Hotovo""Zobrazit vše""Vybrat aplikaci""VYP""ZAP""Alt+""Ctrl+""delete""enter""Fn+""Meta+""Shift+""mezerník""Sym+""Menu+""Vyhledat…""Smazat dotaz""Dotaz pro vyhledávání""Hledat""Odeslat dotaz""Hlasové vyhledávání""Sdílet s""Sdílet s aplikací %s""Sbalit""Hledat""መነሻ ዳስስ""ወደ ላይ ያስሱ""ተጨማሪ አማራጮች""ተከናውኗል""ሁሉንም ይመልከቱ""አንድ መተግበሪያ ይምረጡ""አጥፋ""አብራ""Alt+""Ctrl+""ሰርዝ""enter""Function+""Meta+""Shift+""ክፍተት""Sym+""Menu+""ይፈልጉ…""መጠይቅ አጽዳ""የፍለጋ መጠይቅ""ፍለጋ""መጠይቅ አስገባ""የድምጽ ፍለጋ""አጋራ በ""ለ%s አጋራ""ሰብስብ""ፍለጋ""Πλοήγηση στην αρχική σελίδα""Πλοήγηση προς τα επάνω""Περισσότερες επιλογές""Τέλος""Εμφάνιση όλων""Επιλέξτε μια εφαρμογή""ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ""ΕΝΕΡΓΟΠΟΙΗΣΗ""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""διάστημα""Sym+""Menu+""Αναζήτηση…""Διαγραφή ερωτήματος""Ερώτημα αναζήτησης""Αναζήτηση""Υποβολή ερωτήματος""Φωνητική αναζήτηση""Κοινοποίηση σε""Κοινοποίηση στην εφαρμογή %s""Σύμπτυξη""Αναζήτηση""होम पेज पर जाएं""वापस जाएं""ज़्यादा विकल्प""हो गया""सभी देखें""कोई ऐप्लिकेशन चुनें""बंद""चालू""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""space""Sym+""Menu+""खोजें…""क्‍वेरी हटाएं""सर्च क्वेरी""खोजें""क्वेरी सबमिट करें""बोलकर खोजें""इससे शेयर करें:""%s से शेयर करें""छोटा करें""खोजें""Башкы бетке чабыттоо""Мурунку экранга өтүү""Дагы параметрлер""Бүттү""Баарын көрүү""Колдонмо тандоо""ӨЧҮК""КҮЙҮК""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""боштук""Sym+""Menu+""Издөө…""Сурамды өчүрүү""Изделген сурам""Издөө""Сурам тапшыруу""Айтып издөө""Төмөнкү менен бөлүшүү""%s аркылуу бөлүшүү""Жыйыштыруу""Издөө""Orientohu për në shtëpi""Ngjitu lart""Opsione të tjera""U krye""Shfaq çdo gjë""Zgjidh një aplikacion""JOAKTIV""AKTIV""Alt+""Ctrl+""delete""enter""Funksioni+""Meta+""Shift+""hapësirë""Sym+""Menyja+""Kërko…""Pastro pyetjen""Kërko pyetjen""Kërko""Dërgo pyetjen""Kërkim me zë""Ndaje me""Ndaje me %s""Palos""Kërko""Navigera hem""Navigera uppåt""Fler alternativ""Klar""Se alla""Välj en app""AV""PÅ""Alt + ""Ctrl + ""delete""retur""Funktion + ""Meta + ""Skift + ""blanksteg""Symbol + ""Meny + ""Sök …""Ta bort frågan""Sökfråga""Sök""Skicka fråga""Röstsökning""Dela med""Dela med %s""Komprimera""Sök""Chỉ đường về nhà""Di chuyển lên""Tùy chọn khác""Xong""Xem tất cả""Chọn một ứng dụng""TẮT""BẬT""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""space""Sym+""Menu+""Tìm kiếm…""Xóa truy vấn""Truy vấn tìm kiếm""Tìm kiếm""Gửi truy vấn""Tìm kiếm bằng giọng nói""Chia sẻ với""Chia sẻ với %s""Thu gọn""Tìm kiếm"48dp12dp14dp"Prejsť na plochu""Prejsť nahor""Ďalšie možnosti""Hotovo""Zobraziť všetky""Vybrať aplikáciu""VYP.""ZAP.""Alt+""Ctrl+""odstrániť""enter""Function+""Meta+""Shift+""medzerník""Sym+""Menu+""Vyhľadať…""Vymazať dopyt""Vyhľadávací dopyt""Hľadať""Odoslať dopyt""Hlasové vyhľadávanie""Zdieľať s""Zdieľať s aplikáciou %s""Zbaliť""Hľadať""Revenir à l\'accueil""Revenir en arrière""Autres options""Terminé""Tout afficher""Sélectionner une application""DÉSACTIVER""ACTIVER""Alt+""Ctrl+""supprimer""entrée""Fonction+""Méta+""Maj+""espace""Sym+""Menu+""Rechercher…""Effacer la requête""Requête de recherche""Rechercher""Envoyer la requête""Recherche vocale""Partager avec""Partager avec %s""Réduire""Rechercher""ઘરનો રસ્તો બતાવો""ઉપર નૅવિગેટ કરો""વધુ વિકલ્પો""થઈ ગયું""બધી જુઓ""ઍપ્લિકેશન પસંદ કરો""બંધ""ચાલુ""Alt+""Ctrl+""delete""Enter""Function+""Meta+""Shift+""space""Sym+""Menu+""શોધો…""ક્વેરી સાફ કરો""શોધ ક્વેરી""શોધો""ક્વેરી સબમિટ કરો""વૉઇસ શોધ""આની સાથે શેર કરો""%sની સાથે શેર કરો""સંકુચિત કરો""શોધો"24dp80dp64dp8dp8dp580dp16dp20dp"Nenda mwanzo""Sogeza juu""Chaguo zaidi""Nimemaliza""Angalia zote""Chagua programu""IMEZIMWA""IMEWASHWA""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""space""Sym+""Menu+""Tafuta…""Futa hoja""Hoja ya utafutaji""Tafuta""Wasilisha hoja""Kutafuta kwa kutamka""Shiriki na""Shiriki ukitumia %s""Kunja""Tafuta""Navigasi laman utama""Navigasi ke atas""Lagi pilihan""Selesai""Lihat semua""Pilih apl""MATI""HIDUP""Alt+""Ctrl+""delete""enter""Fungsi+""Meta+""Shift+""ruang""Sym+""Menu+""Cari…""Kosongkan pertanyaan""Pertanyaan carian""Cari""Serah pertanyaan""Carian suara""Kongsi dengan""Kongsi dengan %s""Runtuhkan""Cari" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %d yeni bildiriş + %d yeni bildiriş + Aşağıdakı vərəqi yığcamlaşdırınAşağıdakı vərəqi genişləndirinTam genişləndirinDəstəyə iki dəfə toxununDəstək%1$d/%2$d simvol daxil edilibSimvol limiti %1$d/%2$d dəyərini keçdiMətni silinXəta: yanlışdırXətaAçılan menyunu göstərinDialoq ikonasıTabGündüz və ya axşam seçin%1$s saatSaatı seçinSaat %1$sDəqiqə seçin%1$s dəqiqəAMZamanı daxil etmək üçün saat rejiminə keçinSaatDəqiqəVaxt seçinZamanı daxil etmək üçün mətnlə daxiletmə rejiminə keçinYeni bildirişİşarələnibQismən işarələnibİşarələnməyib%1$s silinMinimum %1$d yeni bildirişNövbəti aya dəyişinƏvvəlki aya dəyişinBaşlama tarixi seçimi: %1$s – Bitmə tarixi seçimi: %2$sCari seçim: %1$syoxdurLəğv edinOK%1$sTarix seçinSeçilmiş tarix%1$sBitmə tarixi: %1$sYanlış format.Nümunə: %1$s%1$s istifadə edinYanlış diapazon.Cari ilə keçin: %1$d%1$d ilinə keçinƏhatə dairəsindən kənar: %1$sBaşlama tarixi – %1$s%1$s – Bitmə tarixi%1$s: %2$sAralıq seçinBaşlama tarixi - Bitmə tarixiSaxlayınBaşlama tarixi: %1$sTarixBitmə tarixiBaşlama tarixigünayilBugün: %1$sTəqvim daxiletmə rejiminə keçinTəqvim görünüşünə keçirmək üçün toxununMətn daxiletmə rejiminə keçinİl görünüşünə keçirmək üçün toxununLəğv edinOKParolu göstərinMətni təmizləyinGeriYan Vərəq + %d 則新通知 + %d 則新通知 + 收合底部功能表展開底部功能表展開一半已輕觸兩下拖曳控點拖曳控點已輸入 %1$d 個字元 (上限為 %2$d 個字元)超過字元限制 (共 %1$d 字元,上限 %2$d 字元)清除文字錯誤:無效錯誤顯示下拉式選單對話方塊圖示分頁標籤選取上午或下午%1$s 小時請選取時段%1$s 點選取分鐘數%1$s 分AM切換至時鐘模式來輸入時間。小時分鐘PM選取時間切換至文字輸入模式來輸入時間。新通知已勾選已勾選部分選項未勾選移除 %1$s超過 %1$d 則新通知變更至下個月變更至上個月所選開始日期:%1$s - 所選結束日期:%2$s目前選取:%1$s取消確定%1$s選取日期所選日期%1$s結束日期:%1$s格式無效。範例:%1$s使用:%1$s日期範圍無效。前往今年 %1$d前往 %1$d 年超出日期範圍:%1$s開始日期 – %1$s%1$s – 結束日期%1$s – %2$s選取範圍開始日期 - 結束日期儲存開始日期:%1$s日期結束日期開始日期dmy今天 %1$s切換至日曆輸入模式輕觸即可切換至日曆檢視畫面切換至文字輸入模式輕觸即可切換至年份檢視畫面取消確定顯示密碼清除文字返回側邊功能表24dp24dp24dp24dp + %d nuova notifica + %d nuove notifiche + Comprimi riquadro inferioreEspandi riquadro inferioreEspandi a metàDoppio tocco su punto di trascinamentoPunto di trascinamento%1$d caratteri inserirti su %2$dSono presenti %2$d caratteri in più rispetto al limite di %1$dCancella testoErrore: non validoErroreMostra il menu a discesaIcona della finestra di dialogoSchedaSeleziona AM o PM%1$s oreSeleziona l\'ora%1$s in puntoSeleziona i minuti%1$s minutiAMPassa alla modalità orologio per inserire l\'ora.OraMinutoPMSeleziona l\'oraPassa alla modalità di immissione testo per inserire l\'ora.Nuova notificaSelezionataParzialmente selezionataNon selezionataRimuovi %1$sPiù di %1$d nuove notifichePassa al mese successivoPassa al mese precedenteSelezione della data di inizio: %1$s. Selezione della data di fine: %2$sSelezione attuale: %1$sNessuna selezioneAnnullaOK%1$sSeleziona dataData selezionata%1$sData di fine: %1$sFormato non valido.Esempio: %1$sUsa: %1$sIntervallo non valido.Vai all\'anno corrente %1$dVai all\'anno %1$dNon compresa nell\'intervallo: %1$sData di inizio - %1$s%1$s - Data di fine%1$s - %2$sSeleziona intervalloData di inizio - Data di fineSalvaData di inizio: %1$sDataData di fineData di iniziogmaOggi %1$sPassa alla modalità di immissione CalendarioTocca per passare alla visualizzazione CalendarioPassa alla modalità di immissione TestoTocca per passare alla visualizzazione AnnoAnnullaOKMostra passwordCancella testoIndietroScheda secondaria + %d yeni bildirim + %d yeni bildirim + Alt sayfayı daraltAlt sayfayı genişletYarım genişletSürükleme tutamacına iki kez dokunulduSürükleme tutamacıGirilen karakter: %1$d / %2$dKarakter sınırı aşıldı %1$d / %2$dMetni temizleHata: geçersizHataAçılır menüyü gösterİletişim kutusu simgesiSekmeÖÖ veya ÖS\'yi seçin%1$s saatSaat seçinSaat %1$sDakikayı seçin%1$s dakikaAMZaman girişi için saat moduna geçin.SaatDakikaPMZamanı seçinZaman girişi için metin girişi moduna geçin.Yeni bildirimİşaretlendiKısmi olarak işaretlendiİşaretlenmedi%1$s içeriğini kaldır%1$d adetten fazla yeni bildirimSonraki aya değiştirÖnceki aya değiştirBaşlangıç tarihi seçimi: %1$s – Bitiş tarihi seçimi: %2$sGeçerli seçim: %1$syokİptalTamam%1$sTarih SeçinSeçilen tarih%1$sBitiş tarihi: %1$sGeçersiz biçim.Örnek: %1$sTarih biçimi: %1$sGeçersiz aralık.Geçerli yıla (%1$d) git%1$d yılına gitİzin verilen aralığın dışında: %1$sBaşlangıç tarihi – %1$s%1$s – Bitiş tarihi%1$s-%2$sAralık SeçinBaşlangıç tarihi - Bitiş tarihiKaydetBaşlangıç tarihi: %1$sTarihBitiş tarihiBaşlangıç tarihigayBugün, %1$sTakvim giriş moduna geçTakvim görünümüne geçmek için dokununMetin giriş moduna geçYıl görünümüne geçmek için dokununİptalTamamŞifreyi gösterMetni temizleGeriYan Sayfa + %d nouvelle notification + %d nouvelles notifications + Réduire la bottom sheetDévelopper la bottom sheetDévelopper en entierA appuyé deux fois sur la poignée de déplacementPoignée de déplacementCaractères saisis %1$d sur %2$dNombre maximal de caractères dépassé : %1$d sur %2$dEffacer le texteErreur : Non valideErreurAfficher le menu déroulantIcône de la boîte de dialogueTabulationSélectionner le format AM ou PM%1$s heuresSélectionnez une heure%1$s hSélectionner des minutes%1$s minAMPasser en mode horloge pour la saisie de l\'heure.HeureMinutePMSélectionner l\'heurePasser en mode saisie de texte pour la saisie de l\'heure.Nouvelle notificationCochéePartiellement cochéeNon cochéeSupprimer %1$sPlus de %1$d nouvelles notificationsPasser au mois suivantPasser au mois précédentDate de début sélectionnée : %1$s – Date de fin sélectionnée : %2$sSélection actuelle : %1$saucuneAnnulerOK%1$sSélectionnez une dateDate sélectionnée%1$sDate de fin : %1$sFormat incorrect.Exemple : %1$sUtiliser %1$sPlage non valide.Accéder à l\'année en cours : %1$dAccéder à l\'année %1$dHors limite : %1$sDate de début – %1$s%1$s – Date de fin%1$s - %2$sSélectionnez une périodeDate de début – Date de finEnregistrerDate de début : %1$sDateDate de finDate de débutjmaAujourd\'hui : %1$sPasser au mode de saisie AgendaAppuyer pour passer à la vue \"Agenda\"Passer au mode de saisie TexteAppuyer pour passer à la vue \"Année\"AnnulerOKAfficher le mot de passeEffacer le texteRetourFeuille latérale + %d ný tilkynning + %d nýjar tilkynningar + Minnka blað neðstStækka blað neðstStækka til hálfsÝtt tvisvar á dragklóDragklóInnslegnir stafir %1$d af %2$dYfir hámarksstafafjölda, %1$d af %2$dHreinsa textaVilla: ÓgiltVillaSýna fellivalmyndGluggatáknFlipiVelja f.h. eða e.h.%1$s klst.Velja tímaklukkan %1$sVeldu mínútur%1$s mínúturf.h.Skipta yfir í klukkustillingu til að færa inn tíma.KlukkustundMínútae.h.Veldu tímaSkipta yfir í textastillingu til að færa inn tíma.Ný tilkynningMerktMerkt við að hluta tilEkki merktFjarlægja %1$sYfir %1$d nýjar tilkynningarBreyta í næsta mánuðBreyta í fyrri mánuðVal upphafsdags: %1$s – Val lokadags: %2$sNúverandi val: %1$sekkertHætta viðÍ lagi%1$sVeldu dagsetninguValin dagsetning%1$sLokadagur %1$sÓgilt snið.Dæmi: %1$sNota: %1$sÓgilt svið.Fara á núverandi ár %1$dFara í árið %1$dUtan sviðs: %1$sUpphafsdagur – %1$s%1$s – lokadagur%1$s – %2$sVeldu tímabilUpphafsdagur – lokadagurVistaUpphafsdagur %1$sDagsetningLokadagurUpphafsdagurdmáÍ dag %1$sSkipta yfir í innfærsluaðferð fyrir dagatalÝttu til að skipta yfir í dagatalsyfirlitSkipta yfir í innfærsluaðferð fyrir textaÝttu til að skipta yfir í ársyfirlitHætta viðÍ lagiSýna aðgangsorðHreinsa textaTil bakaHliðarblað + %d ਨਵੀਂ ਸੂਚਨਾ + %d ਨਵੀਆਂ ਸੂਚਨਾਵਾਂ + ਹੇਠਲੀ ਸ਼ੀਟ ਨੂੰ ਸਮੇਟੋਹੇਠਲੀ ਸ਼ੀਟ ਦਾ ਵਿਸਤਾਰ ਕਰੋਅੱਧ ਤੱਕ ਵਿਸਤਾਰ ਕਰੋਘਸੀਟਣ ਵਾਲੇ ਹੈਂਡਲ \'ਤੇ ਡਬਲ-ਟੈਪ ਕੀਤਾ ਗਿਆਘਸੀਟਣ ਵਾਲਾ ਹੈਂਡਲ%2$d ਵਿੱਚੋਂ %1$d ਅੱਖਰ-ਚਿੰਨ੍ਹ ਦਾਖਲ ਕੀਤੇ ਗਏਅੱਖਰ-ਚਿੰਨ੍ਹ ਸੀਮਾ %2$d ਤੋਂ %1$d ਵਧੀਲਿਖਤ ਕਲੀਅਰ ਕਰੋਗੜਬੜ: ਅਵੈਧਗੜਬੜਡ੍ਰੌਪ-ਡਾਊਨ ਮੀਨੂ ਦਿਖਾਓਵਿੰਡੋ ਦਾ ਪ੍ਰਤੀਕਟੈਬAM ਜਾਂ PM ਚੁਣੋ%1$s ਘੰਟੇਸਮਾਂ ਚੁਣੋ%1$s ਵਜੇਮਿੰਟ ਚੁਣੋ%1$s ਮਿੰਟAMਸਮਾਂ ਇਨਪੁੱਟ ਕਰਨ ਲਈ ਘੜੀ ਮੋਡ \'ਤੇ ਸਵਿੱਚ ਕਰੋ।ਘੰਟਾਮਿੰਟPMਸਮਾਂ ਚੁਣੋਸਮਾਂ ਇਨਪੁੱਟ ਕਰਨ ਲਈ ਲਿਖਤ ਇਨਪੁੱਟ ਮੋਡ \'ਤੇ ਸਵਿੱਚ ਕਰੋ।ਨਵੀਂ ਸੂਚਨਾਸਹੀ ਦਾ ਨਿਸ਼ਾਨ ਲਾਇਆ ਗਿਆਅੰਸ਼ਕ ਤੌਰ ਤੇ ਜਾਂਚ ਕੀਤੀ ਗਈਸਹੀ ਦਾ ਨਿਸ਼ਾਨ ਨਹੀਂ ਲਾਇਆ ਗਿਆ%1$s ਹਟਾਓ%1$d ਤੋਂ ਵੱਧ ਨਵੀਆਂ ਸੂਚਨਾਵਾਂਅਗਲੇ ਮਹੀਨੇ \'ਤੇ ਜਾਓਪਿਛਲੇ ਮਹੀਨੇ \'ਤੇ ਜਾਓਸ਼ੁਰੂਆਤੀ ਤਾਰੀਖ ਦੀ ਚੋਣ: %1$s – ਸਮਾਪਤੀ ਤਾਰੀਖ ਦੀ ਚੋਣ: %2$sਮੌਜੂਦਾ ਚੋਣ: %1$sਕੋਈ ਨਹੀਂਂਰੱਦ ਕਰੋਠੀਕ ਹੈ%1$sਤਾਰੀਖ ਚੁਣੋਚੁਣੀ ਗਈ ਤਾਰੀਖ%1$sਸਮਾਪਤੀ ਤਾਰੀਖ %1$sਅਵੈਧ ਫਾਰਮੈਟ।ਉਦਾਹਰਨ: %1$sਵਰਤੋ: %1$sਅਵੈਧ ਰੇਂਜ।ਮੌਜੂਦਾ ਸਾਲ \'ਤੇ ਜਾਓ %1$dਸਾਲ %1$d \'ਤੇ ਨੈਵੀਗੇਟ ਕਰੋਰੇਂਜ ਤੋਂ ਬਾਹਰ: %1$sਸ਼ੁੁਰੂਆਤੀ ਤਾਰੀਖ – %1$s%1$s – ਸਮਾਪਤੀ ਤਾਰੀਖ%1$s – %2$sਰੇਂਜ ਚੁਣੋਸ਼ੁਰੂਆਤੀ ਤਾਰੀਖ – ਸਮਾਪਤੀ ਤਾਰੀਖਰੱਖਿਅਤ ਕਰੋਸ਼ੁਰੂਆਤੀ ਤਾਰੀਖ %1$sਤਾਰੀਖਸਮਾਪਤੀ ਤਾਰੀਖਸ਼ੁਰੂਆਤੀ ਤਾਰੀਖdmyਅੱਜ %1$sਕੈਲੰਡਰ ਇਨਪੁੱਟ ਮੋਡ \'ਤੇ ਜਾਓCalendar ਦ੍ਰਿਸ਼ \'ਤੇ ਸਵਿੱਚ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋਲਿਖਤ ਇਨਪੁੱਟ ਮੋਡ \'ਤੇ ਜਾਓਸਾਲ ਦ੍ਰਿਸ਼ \'ਤੇ ਸਵਿੱਚ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋਰੱਦ ਕਰੋਠੀਕ ਹੈਪਾਸਵਰਡ ਦਿਖਾਓਲਿਖਤ ਕਲੀਅਰ ਕਰੋਪਿੱਛੇਸਾਈਡ ਸ਼ੀਟ + %d notifikasi baru + %d notifikasi baru + Menciutkan sheet bawahMeluaskan sheet bawahLuaskan setengahHandel geser diketuk dua kaliHandel geserKarakter yang dimasukkan %1$d dari %2$dMelebihi batas karakter %1$d dari %2$dMenghapus teksError: tidak validErrorTampilkan menu dropdownIkon DialogTabPilih AM atau PM%1$s jamPilih jamPukul %1$sPilih menit%1$s menitAMBeralih ke mode jam untuk masukan waktu.JamMenitPMPilih waktuBeralih ke mode masukan teks untuk masukan waktu.Notifikasi baruDicentangDicentang sebagianTidak dicentangMenghapus %1$sLebih dari %1$d notifikasi baruUbah ke bulan berikutnyaUbah ke bulan sebelumnyaPemilihan tanggal mulai: %1$s – Pemilihan tanggal akhir: %2$sPilihan saat ini: %1$stidak adaBatalOke%1$sPilih TanggalTanggal yang dipilih%1$sTanggal akhir %1$sFormat tidak valid.Contoh: %1$sGunakan: %1$sRentang tidak valid.Pilih tahun ini %1$dBuka tahun %1$dDi luar rentang: %1$sTanggal mulai – %1$s%1$s – Tanggal akhir%1$s – %2$sPilih RentangTanggal mulai – Tanggal akhirSimpanTanggal mulai %1$sTanggalTanggal akhirTanggal mulaihbtHari ini %1$sBeralih ke mode masukan kalenderKetuk untuk beralih ke tampilan KalenderBeralih ke mode masukan teksKetuk untuk beralih ke tampilan tahunBatalOkeTampilkan sandiHapus teksKembaliSheet Samping + + + + + + true#14000000#121212#CF6679#FFFFFF#000000#000000#000000#FFFFFF#BA86FC#000000#3700B3#03DAC6#03DAC6#121212#FFFFFF#B00020#000000#FFFFFF#FFFFFF#000000#000000#6200EE#3700B3#3700B3#03DAC6#018786#FFFFFF@android:color/transparent#14000000#44000000#0A000000#0F000000#1AFFFFFF#2EFFFFFF#323232#ff000000#ff000000#ff410e0b#ffffffff#ff601410#ff8c1d18#ffb3261e#ffdc362e#ffe46962#ffec928e#fff2b8b5#fff9dedc#fffceeee#fffffbf9#ff000000#ff1d1b20#ffffffff#ff211f26#ff2b2930#ff322f35#ff36343b#ff3b383e#ff48464c#ff0f0d13#ff605d64#ff79767d#ff141218#ff938f96#ffaea9b1#ffcac5cd#ffded8e1#ffe6e0e9#ffece6f0#fff3edf7#fff5eff7#fff7f2fa#fffef7ff#fffffbff#ff000000#ff1d1a22#ffffffff#ff322f37#ff49454f#ff605d66#ff79747e#ff938f99#ffaea9b4#ffcac4d0#ffe7e0ec#fff5eefa#fffffbfe#ff000000#ff21005d#ffffffff#ff381e72#ff4f378b#ff6750a4#ff7f67be#ff9a82db#ffb69df8#ffd0bcff#ffeaddff#fff6edff#fffffbfe#ff000000#ff1d192b#ffffffff#ff332d41#ff4a4458#ff625b71#ff7a7289#ff958da5#ffb0a7c0#ffccc2dc#ffe8def8#fff6edff#fffffbfe#ff000000#ff31111d#ffffffff#ff492532#ff633b48#ff7d5260#ff986977#ffb58392#ffd29dac#ffefb8c8#ffffd8e4#ffffecf1#fffffbfa#ffffffff@color/m3_ref_palette_neutral6@color/m3_ref_palette_error80@color/m3_ref_palette_error30@color/m3_ref_palette_neutral20@color/m3_ref_palette_primary40@color/m3_ref_palette_neutral90@color/m3_ref_palette_neutral90@color/m3_ref_palette_error20@color/m3_ref_palette_error90@color/m3_ref_palette_primary20@color/m3_ref_palette_primary90@color/m3_ref_palette_secondary20@color/m3_ref_palette_secondary90@color/m3_ref_palette_neutral90@color/m3_ref_palette_neutral_variant80@color/m3_ref_palette_tertiary20@color/m3_ref_palette_tertiary90@color/m3_ref_palette_neutral_variant60@color/m3_ref_palette_neutral_variant30@color/m3_ref_palette_primary80@color/m3_ref_palette_primary30@color/m3_ref_palette_secondary80@color/m3_ref_palette_secondary30@color/m3_ref_palette_neutral6@color/m3_ref_palette_neutral24@color/m3_ref_palette_neutral12@color/m3_ref_palette_neutral17@color/m3_ref_palette_neutral22@color/m3_ref_palette_neutral10@color/m3_ref_palette_neutral4@color/m3_ref_palette_neutral6@color/m3_ref_palette_neutral_variant30@color/m3_ref_palette_tertiary80@color/m3_ref_palette_tertiary30@color/m3_ref_palette_neutral98@color/m3_ref_palette_error40@color/m3_ref_palette_error90@color/m3_ref_palette_neutral95@color/m3_ref_palette_primary80@color/m3_ref_palette_neutral20@color/m3_ref_palette_neutral10@color/m3_ref_palette_error100@color/m3_ref_palette_error10@color/m3_ref_palette_primary100@color/m3_ref_palette_primary10@color/m3_ref_palette_secondary100@color/m3_ref_palette_secondary10@color/m3_ref_palette_neutral10@color/m3_ref_palette_neutral_variant30@color/m3_ref_palette_tertiary100@color/m3_ref_palette_tertiary10@color/m3_ref_palette_neutral_variant50@color/m3_ref_palette_neutral_variant80@color/m3_ref_palette_primary40@color/m3_ref_palette_primary90@color/m3_ref_palette_secondary40@color/m3_ref_palette_secondary90@color/m3_ref_palette_neutral98@color/m3_ref_palette_neutral98@color/m3_ref_palette_neutral94@color/m3_ref_palette_neutral92@color/m3_ref_palette_neutral90@color/m3_ref_palette_neutral96@color/m3_ref_palette_neutral100@color/m3_ref_palette_neutral87@color/m3_ref_palette_neutral_variant90@color/m3_ref_palette_tertiary40@color/m3_ref_palette_tertiary90@color/m3_ref_palette_primary10@color/m3_ref_palette_primary30@color/m3_ref_palette_secondary10@color/m3_ref_palette_secondary30@color/m3_ref_palette_tertiary10@color/m3_ref_palette_tertiary30@color/m3_ref_palette_primary90@color/m3_ref_palette_primary80@color/m3_ref_palette_secondary90@color/m3_ref_palette_secondary80@color/m3_ref_palette_tertiary90@color/m3_ref_palette_tertiary80#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF#61000000#00ffffff#52000000#6B000000#1F000000#0A000000#00000000#DE00000016dp64dp4dp168dp96dp14sp8dp56dp24dp96dp56dp10dp8dp1dp12sp8dp16dp64dp0.5dp6dp24dp40dp56dp6dp6dp16dp32dp24dp16dp32dp4dp280dp8dp8dp128dp1.00dp6dp0dp-1px-1px12dp14dp16dp14sp264dp72dp14sp12sp5dp14dp14dp28dp@dimen/m3_sys_elevation_level316dp24dp16dp16dp16dp96dp112dp112dp@dimen/m3_comp_top_app_bar_small_container_height@dimen/m3_comp_top_app_bar_large_container_height@dimen/m3_comp_top_app_bar_medium_container_height48dp24dp24dp8dp12dp24dp48dp1.5dp6dp@dimen/m3_comp_badge_size1.5dp3dp12dp@dimen/m3_comp_badge_large_size4dp2dp@dimen/m3_comp_navigation_bar_active_indicator_height4dp@dimen/m3_comp_navigation_bar_active_indicator_width16dp12dp@dimen/m3_comp_navigation_bar_container_height20dp@dimen/m3_sys_elevation_level1@dimen/m3_sys_elevation_level16dp4dp12dp16dp@dimen/m3_comp_bottom_app_bar_container_height4dp64dp8dp0dp0dp@dimen/m3_comp_elevated_button_container_elevation0dp16dp24dp10dp20dp0dp20dp4dp320dp6dp24dp24dp6dp1dp12dp16dp12dp12dp0dp1dp0dp6dp0dp7dp@dimen/m3_comp_elevated_card_container_elevation2dp@dimen/m3_sys_elevation_level01dp1dp2dp10dp1dp28dp56dp40dp1dp8dp-1dp7dp1dp2dp18dp32dp@dimen/m3_sys_elevation_level1@dimen/m3_sys_elevation_level01dp18dp16dp6dp@dimen/m3_sys_elevation_level280dp0.381dp120dp128dp1dp@dimen/m3_sys_elevation_level1@dimen/m3_sys_elevation_level0@dimen/m3_sys_elevation_level124dp@dimen/m3_sys_elevation_level356dp@dimen/m3_sys_elevation_level3@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_elevation_level4@dimen/m3_sys_state_hover_state_layer_opacity24dp@dimen/m3_sys_elevation_level3@dimen/m3_sys_state_pressed_state_layer_opacity@dimen/m3_sys_elevation_level356dp@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_elevation_level4@dimen/m3_sys_state_hover_state_layer_opacity24dp96dp36dp@dimen/m3_sys_elevation_level3@dimen/m3_sys_state_pressed_state_layer_opacity40dp24dp@dimen/m3_sys_elevation_level2@dimen/m3_sys_elevation_level018dp@dimen/m3_sys_elevation_level0@dimen/m3_sys_state_dragged_state_layer_opacity@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_state_hover_state_layer_opacity24dp@dimen/m3_sys_state_pressed_state_layer_opacity0.3832dp@dimen/m3_sys_elevation_level1@dimen/m3_sys_elevation_level01dp18dp@dimen/m3_sys_elevation_level032dp1dp24dp18dp@dimen/m3_sys_elevation_level232dp64dp@dimen/m3_sys_elevation_level280dp@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_state_hover_state_layer_opacity24dp@dimen/m3_sys_state_pressed_state_layer_opacity360dp@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_state_hover_state_layer_opacity24dp@dimen/m3_sys_elevation_level1@dimen/m3_sys_state_pressed_state_layer_opacity@dimen/m3_sys_elevation_level032dp56dp@dimen/m3_sys_elevation_level080dp@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_state_hover_state_layer_opacity24dp@dimen/m3_sys_state_pressed_state_layer_opacity@dimen/m3_sys_elevation_level20.121dp@dimen/m3_sys_elevation_level00.1224dp1dp1dp0.380.380.382dp1dp@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_state_hover_state_layer_opacity3dp@dimen/m3_sys_state_pressed_state_layer_opacity@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_state_hover_state_layer_opacity@dimen/m3_sys_state_pressed_state_layer_opacity24dp4dp4dp4dp0.380.38@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_state_hover_state_layer_opacity@dimen/m3_sys_state_pressed_state_layer_opacity@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_state_hover_state_layer_opacity@dimen/m3_sys_state_pressed_state_layer_opacity0.3230dp@dimen/m3_sys_elevation_level356dp@dimen/m3_sys_state_hover_state_layer_opacity@dimen/m3_sys_state_pressed_state_layer_opacity@dimen/m3_sys_elevation_level356dp72dp2dp@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_state_hover_state_layer_opacity@dimen/m3_sys_state_pressed_state_layer_opacity4dp32dp@dimen/m3_sys_elevation_level1@dimen/m3_sys_elevation_level1256dp@dimen/m3_sys_elevation_level1@dimen/m3_sys_elevation_level044dp6dp4dp0.380.380.1216dp4dp@dimen/m3_sys_elevation_level332dp@dimen/m3_sys_elevation_level1@dimen/m3_sys_elevation_level01dp18dp10.380.120.380.38@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_state_hover_state_layer_opacity@dimen/m3_sys_state_pressed_state_layer_opacity32dp52dp@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_state_hover_state_layer_opacity@dimen/m3_sys_state_pressed_state_layer_opacity@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_state_hover_state_layer_opacity@dimen/m3_sys_state_pressed_state_layer_opacity2dp@dimen/m3_sys_elevation_level3@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_state_hover_state_layer_opacity1dp@dimen/m3_sys_state_pressed_state_layer_opacity@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_state_hover_state_layer_opacity@dimen/m3_sys_state_pressed_state_layer_opacity152dp112dp@dimen/m3_sys_elevation_level064dp@dimen/m3_sys_elevation_level2@dimen/m3_sys_elevation_level38dp8dp20dp12dp56dp16dp8dp0dp30%2dp6dp36dp96dp4dp@dimen/m3_comp_menu_container_elevation14dp16dp4dp28dp12dp0dp12dp12dp0dp4dp28dp28dp@dimen/m3_comp_navigation_rail_container_width@dimen/m3_comp_navigation_rail_container_elevation@dimen/m3_comp_navigation_rail_icon_size@dimen/m3_comp_navigation_rail_active_indicator_height4dp@dimen/m3_comp_navigation_rail_active_indicator_width60dp12dp20dp4dp12dp2dp@dimen/m3_sys_state_dragged_state_layer_opacity@dimen/m3_sys_state_focus_state_layer_opacity@dimen/m3_sys_state_hover_state_layer_opacity@dimen/m3_sys_state_pressed_state_layer_opacity@dimen/m3_sys_state_pressed_state_layer_opacity@dimen/m3_comp_search_bar_container_elevation@dimen/m3_comp_search_bar_container_height16dp16dp1dp4dp16dp16sp1dp@dimen/m3_comp_search_view_container_elevation@dimen/m3_comp_search_view_full_screen_header_container_height16dp@dimen/m3_comp_sheet_side_docked_modal_container_elevation@dimen/m3_comp_sheet_side_docked_standard_container_elevation@dimen/m3_comp_sheet_side_docked_container_width0.080.122dp24dp40dp1.08dp0dp1dp3dp6dp8dp12dp0.30.800.20.10.10.710.41010.40.20100.20101010.31010.200100010.160.10.080.12dp@dimen/m3_comp_time_picker_container_elevation20dp640dp80dp24dp96dp24dp44dp4dp4dp2dp15sp96dp12dp12dp52dp256dp-4dp2dp1dp0.380.120.870.612dp23dp8dp32dp4dp8dp4dp12dp8dp2dp245dp488dp56dp560dp340dp80dp24dp24dp80dp24dp4dp4dp8dp6dp10sp12dp12dp16dp60dp16dp5dp8dp0dp56dp4dp64dp0dp0dp2dp2dp2dp12dp8dp6dp0.07320dp4dp16dp16dp4dp6dp8dp1dp4dp8dp8dp14sp0dp64dp52dp8dp0dp12dp15dp32dp3dp1dp1dp36dp24dp16dp12dp4dp1dp120dp128dp32dp12dp8dp24dp0dp480dp2dp0dp4dp48dp4dp8dp104dp20dp24dp100dp16dp28dp68dp18dp52dp8dp8dp88dp8dp24dp4dp5dp1dp8dp3dp14sp8dp-8dp8dp12dp0dp0dp6dp20dp20dp24dp12dp48dp120dp20dp12dp12dp0dp2dp6dp6dp48dp2dp6dp0.000.240.080.240.000.120.040.1248dp24dp8dp0dp22dp14dp24dp8dp4dp14dp56dp72dp8dp14dp24dp8dp16dp12dp4dp2dp4dp4dp18dp40dp20dp40dp28dp2.5dp4dp3dp2dp4dp0dp4dp4dp24dp4dp13dp26dp1dp10dp8dp1dp4dp16dp48dp0.54dp0.88dp8dp8dp16dp4dp16dp32dp@dimen/m3_comp_switch_track_height@dimen/m3_comp_switch_track_width4dp0dp4dp@dimen/m3_comp_outlined_text_field_outline_width@dimen/m3_comp_outlined_text_field_focus_outline_width16dp4dp16dp4dp56dp14dp4dp32dp32dp12dp30dp@drawable/material_ic_keyboard_arrow_right_black_24dp@drawable/material_ic_keyboard_arrow_left_black_24dp1501502300320999100100751201007008009001000450500550600250300350400501001502000000000300350200250751500410010011375120100@integer/m3_sys_motion_duration_medium1@integer/m3_sys_motion_duration_short3@integer/m3_sys_motion_duration_short2@integer/m3_sys_motion_duration_short216323252250210200 + %d new notification + %d new notifications + com.google.android.material.appbar.AppBarLayout$ScrollingViewBehaviorcom.google.android.material.bottomsheet.BottomSheetBehaviorCollapse the bottom sheetExpand the bottom sheetExpand halfwayDrag handle double-tappedDrag handleCharacters entered %1$d of %2$dCharacter limit exceeded %1$d of %2$d%1$d/%2$dClear text + Error: invalid + ErrorShow dropdown menucom.google.android.material.transformation.FabTransformationScrimBehaviorcom.google.android.material.transformation.FabTransformationSheetBehaviorcom.google.android.material.behavior.HideBottomViewOnScrollBehaviorDialog IconTab%1$s%2$ssans-serif-mediumsans-serifsans-serif-mediumsans-serifpath(M 0,0 C 0.05, 0, 0.133333, 0.06, 0.166666, 0.4 C 0.208333, 0.82, 0.25, 1, 1, 1)cubic-bezier(0.3, 0, 0.8, 0.2)cubic-bezier(0.1, 0.7, 0.1, 1)M 0,0 C 0.05, 0, 0.133333, 0.06, 0.166666, 0.4 C 0.208333, 0.82, 0.25, 1, 1, 1cubic-bezier(0.4, 0, 0.2, 1)cubic-bezier(0.4, 0, 1, 1)cubic-bezier(0, 0, 0.2, 1)cubic-bezier(0, 0, 1, 1)cubic-bezier(0.2, 0, 0, 1)cubic-bezier(0.3, 0, 1, 1)cubic-bezier(0, 0, 0, 1):Select AM or PM%1$s hoursSelect hour%1$s o\'clockSelect minutes%1$s minutescubic-bezier(0.4, 0.0, 1.0, 1.0)cubic-bezier(0.0, 0.0, 0.2, 1.0)path(M 0,0 C 0.05, 0, 0.133333, 0.06, 0.166666, 0.4 C 0.208333, 0.82, 0.25, 1, 1, 1)cubic-bezier(0.0, 0.0, 1.0, 1.0)cubic-bezier(0.4, 0.0, 0.2, 1.0)Range endRange startValueAMSwitch to clock mode for the time input.HourMinutePMSelect timeSwitch to text input mode for the time input.New notificationM14,18.2 11.4,15.6 10,17 14,21 22,13 20.6,11.6ziconM13.4,15 11,15 11,17 13.4,17 21,17 21,15zicon pathM23,7H9C7.9,7,7,7.9,7,9v14c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V9C25,7.9,24.1,7,23,7zbuttonbutton pathM23,7H9C7.9,7,7,7.9,7,9v14c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V9C25,7.9,24.1,7,23,7z M23,23H9V9h14V23z + Checked + + Partially checked + + Not checked + Remove %1$sMore than %1$d new notifications%1$d%2$sChange to next monthChange to previous monthStart date selection: %1$s – End date selection: %2$sCurrent selection: %1$snoneCancelOK%1$sSelect DateSelected date%1$sEnd date %1$sInvalid format.Example: %1$sUse: %1$sInvalid range.Navigate to current year %1$dNavigate to year %1$dOut of range: %1$sStart date – %1$s%1$s – End date%1$s – %2$sSelect RangeStart date – End dateSaveStart date %1$sDateEnd dateStart datedmyToday %1$sSwitch to calendar input modeTap to switch to Calendar viewSwitch to text input modeTap to switch to year viewcircle_groupM4,16 A12,12 0 0,1 16,4 H16 A12,12 0 0,1 16,28 H16 A12,12 0 0,1 4,16M0,16 A11,11 0 0,1 11,5 H21 A11,11 0 0,1 21,27 H11 A11,11 0 0,1 0,16circleM2,16 A14,14 0 0,1 16,2 H16 A14,14 0 0,1 16,30 H16 A14,14 0 0,1 2,16M8,16 A8,8 0 0,1 16,8 H16 A8,8 0 0,1 16,24 H16 A8,8 0 0,1 8,16M1,16 A15,15 0 0,1 16,1 H36 A15,15 0 0,1 36,31 H16 A15,15 0 0,1 1,16M0,16 A16,16 0 0,1 16,0 H36 A16,16 0 0,1 36,32 H16 A16,16 0 0,1 0,16CancelOKShow passwordM12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3zM2,4.27 L19.73,22 L22.27,19.46 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 ZM2,4.27 L2,4.27 L4.54,1.73 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 ZM3.27,4.27 L19.74,20.74 + com.google.android.material.search.SearchBar$ScrollingViewBehavior + Clear textBackSide Sheetcom.google.android.material.sidesheet.SideSheetBehavior + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ?attr/shapeAppearanceCornerSmall?attr/textAppearanceLabelLarge?attr/colorError?attr/colorOnError?attr/textAppearanceLabelSmall?attr/colorSurfaceContainer?attr/colorPrimary?attr/colorOnSurface?attr/colorSurface?attr/colorError?attr/colorOnError?attr/colorOnPrimary?attr/colorOnSurfaceVariant?attr/colorSurfaceContainerHigh?attr/shapeAppearanceCornerExtraLarge?attr/textAppearanceBodyLarge?attr/colorPrimary?attr/colorOnPrimary?attr/colorPrimary?attr/colorPrimary?attr/colorOnSurface?attr/colorOnSurfaceVariant?attr/textAppearanceHeadlineLarge?attr/colorOnSurfaceVariant?attr/textAppearanceLabelLarge?attr/colorSecondaryContainer?attr/textAppearanceTitleLarge?attr/colorOnSurfaceVariant?attr/textAppearanceTitleSmall?attr/colorOnSurface?attr/textAppearanceBodyLarge?attr/colorPrimary?attr/colorOnPrimary?attr/colorOnSurfaceVariant?attr/colorSurfaceContainerHigh?attr/shapeAppearanceCornerExtraLarge?attr/colorOnSurface?attr/textAppearanceHeadlineSmall?attr/colorOnSurfaceVariant?attr/textAppearanceBodyMedium?attr/colorOutlineVariant?attr/colorSurfaceContainerLow?attr/colorSurfaceContainerLow?attr/shapeAppearanceCornerMedium?attr/colorPrimaryContainer?attr/shapeAppearanceCornerLarge?attr/colorOnPrimaryContainer?attr/textAppearanceLabelLarge?attr/colorSecondaryContainer?attr/colorOnSecondaryContainer?attr/colorSurfaceContainerHigh?attr/colorPrimary?attr/colorTertiaryContainer?attr/colorOnTertiaryContainer?attr/colorPrimaryContainer?attr/shapeAppearanceCornerLarge?attr/colorOnPrimaryContainer?attr/shapeAppearanceCornerExtraLarge?attr/shapeAppearanceCornerMedium?attr/colorSecondaryContainer?attr/colorOnSecondaryContainer?attr/colorSurfaceContainerHigh?attr/colorPrimary?attr/colorTertiaryContainer?attr/colorOnTertiaryContainer?attr/colorSurfaceContainer?attr/textAppearanceBodyLarge?attr/colorPrimary?attr/colorOnPrimary?attr/textAppearanceLabelLarge?attr/colorSurfaceContainerHighest?attr/shapeAppearanceCornerMedium?attr/colorPrimary?attr/colorOnPrimary?attr/colorPrimary?attr/colorSurfaceContainerHighest?attr/shapeAppearanceCornerExtraSmall?attr/colorError?attr/colorError?attr/colorError?attr/textAppearanceBodyLarge?attr/textAppearanceBodySmall?attr/colorSecondaryContainer?attr/colorOnSecondaryContainer?attr/colorSecondaryContainer?attr/colorOnSecondaryContainer?attr/colorOnSurfaceVariant?attr/shapeAppearanceCornerSmall?attr/textAppearanceLabelLarge?attr/colorPrimary?attr/colorOnSurfaceVariant?attr/shapeAppearanceCornerSmall?attr/textAppearanceLabelLarge?attr/colorSurfaceContainer?attr/colorSecondaryContainer?attr/colorOnSecondaryContainer?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSecondaryContainer?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSecondaryContainer?attr/colorSecondaryContainer?attr/colorOnSurface?attr/colorOnSecondaryContainer?attr/colorOnSurface?attr/colorOnSurface?attr/colorSurfaceContainer?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurfaceVariant?attr/colorOnSurfaceVariant?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/textAppearanceLabelMedium?attr/colorOnSecondaryContainer?attr/colorOnSecondaryContainer?attr/colorOnSecondaryContainer?attr/colorOnSecondaryContainer?attr/colorOnSecondaryContainer?attr/colorOnSecondaryContainer?attr/colorOnSecondaryContainer?attr/colorSecondaryContainer?attr/colorOnSecondaryContainer?attr/colorOnSecondaryContainer?attr/colorOnSecondaryContainer?attr/colorOnSecondaryContainer?attr/colorOnSurfaceVariant?attr/textAppearanceTitleSmall?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurfaceVariant?attr/colorOnSurfaceVariant?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSecondaryContainer?attr/textAppearanceLabelLarge?attr/colorSurfaceContainerLow?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSecondaryContainer?attr/colorSecondaryContainer?attr/colorOnSurface?attr/colorOnSurface?attr/colorSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurfaceVariant?attr/colorOnSurfaceVariant?attr/colorOnSurface?attr/textAppearanceLabelMedium?attr/colorSurfaceContainer?attr/colorPrimary?attr/textAppearanceBodyLarge?attr/colorOnSurface?attr/colorPrimary?attr/colorOutline?attr/colorOutline?attr/colorOutline?attr/colorSurface?attr/shapeAppearanceCornerMedium?attr/colorOutline?attr/colorOutlineVariant?attr/colorOnSurface?attr/colorOutlineVariant?attr/colorOutlineVariant?attr/colorOutlineVariant?attr/colorPrimary?attr/shapeAppearanceCornerExtraSmall?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorError?attr/colorError?attr/colorError?attr/colorOnSurface?attr/colorPrimary?attr/colorPrimary?attr/colorOnSurfaceVariant?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurfaceVariant?attr/colorOnSurface?attr/textAppearanceBodyLarge?attr/colorOnSurfaceVariant?attr/colorOutline?attr/colorOnSurfaceVariant?attr/textAppearanceBodySmall?attr/textAppearanceBodySmall?attr/colorPrimary?attr/colorPrimary?attr/colorPrimary?attr/colorPrimary?attr/colorSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorPrimary?attr/colorPrimary?attr/colorOnSurfaceVariant?attr/colorPrimary?attr/colorOnSurfaceVariant?attr/textAppearanceTitleSmall?attr/colorPrimary?attr/colorSecondaryContainer?attr/colorOnSurface?attr/colorOnSurface?attr/colorPrimary?attr/colorPrimary?attr/colorPrimary?attr/colorPrimary?attr/colorPrimary?attr/colorPrimary?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurfaceVariant?attr/colorOnSurface?attr/colorPrimary?attr/colorSurfaceContainerHigh?attr/colorOnSurface?attr/colorOnSurfaceVariant?attr/colorOnSurface?attr/textAppearanceBodyLarge?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurfaceVariant?attr/colorOnSurfaceVariant?attr/textAppearanceBodyLarge?attr/colorOnSurfaceVariant?attr/colorSurfaceContainerHigh?attr/colorOutline?attr/shapeAppearanceCornerExtraLarge?attr/colorOnSurface?attr/textAppearanceBodyLarge?attr/colorOnSurface?attr/colorOnSurfaceVariant?attr/textAppearanceBodyLarge?attr/colorOnSurfaceVariant?attr/colorPrimary?attr/colorOnSurface?attr/colorSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurfaceVariant?attr/textAppearanceTitleSmall?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurfaceVariant?attr/colorSurfaceContainerLow?attr/shapeAppearanceCornerExtraLarge?attr/colorOnSurfaceVariant?attr/shapeAppearanceCornerLarge?attr/colorSurfaceContainerLow?attr/shapeAppearanceCornerLarge?attr/colorSurface?attr/colorPrimary?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorPrimary?attr/colorSecondaryContainer?attr/colorSurfaceInverse?attr/colorOnSurfaceInverse?attr/colorSurfaceInverse?attr/shapeAppearanceCornerExtraSmall?attr/colorOnSurfaceInverse?attr/textAppearanceBodyMedium?attr/shapeAppearanceCornerSmall?attr/textAppearanceLabelLarge?attr/colorSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorSurfaceContainerHighest?attr/colorSurfaceContainerHighest?attr/colorOnSurface?attr/colorPrimaryContainer?attr/colorOnPrimaryContainer?attr/colorPrimary?attr/colorPrimary?attr/colorOnPrimary?attr/colorPrimaryContainer?attr/colorOnPrimaryContainer?attr/colorPrimary?attr/colorPrimary?attr/colorOnPrimaryContainer?attr/colorPrimaryContainer?attr/colorOnPrimaryContainer?attr/colorPrimary?attr/colorPrimary?attr/colorPrimary?attr/colorOnSurfaceVariant?attr/colorSurfaceContainerHighest?attr/colorOnSurface?attr/colorSurfaceContainerHighest?attr/colorOutline?attr/colorOutline?attr/colorOnSurfaceVariant?attr/colorSurfaceContainerHighest?attr/colorOnSurface?attr/colorSurfaceContainerHighest?attr/colorOutline?attr/colorSurfaceContainerHighest?attr/colorOnSurfaceVariant?attr/colorSurfaceContainerHighest?attr/colorOnSurface?attr/colorSurfaceContainerHighest?attr/colorOutline?attr/colorSurfaceContainerHighest?attr/colorOutline?attr/colorPrimary?attr/colorPrimary?attr/colorPrimary?attr/textAppearanceLabelLarge?attr/colorPrimary?attr/shapeAppearanceCornerSmall?attr/colorPrimary?attr/colorOnSurface?attr/colorOnSurfaceVariant?attr/textAppearanceBodySmall?attr/colorSurfaceContainerHighest?attr/colorPrimary?attr/colorSurfaceContainerHigh?attr/shapeAppearanceCornerExtraLarge?attr/colorOnSurfaceVariant?attr/textAppearanceLabelMedium?attr/shapeAppearanceCornerSmall?attr/textAppearanceTitleMedium?attr/colorOutline?attr/colorTertiaryContainer?attr/colorOnTertiaryContainer?attr/colorOnTertiaryContainer?attr/colorOnTertiaryContainer?attr/colorOnTertiaryContainer?attr/colorOnSurfaceVariant?attr/colorOnSurfaceVariant?attr/colorOnSurfaceVariant?attr/colorOnSurfaceVariant?attr/shapeAppearanceCornerSmall?attr/textAppearanceDisplayLarge?attr/colorPrimaryContainer?attr/colorOnPrimaryContainer?attr/colorOnPrimaryContainer?attr/colorOnPrimaryContainer?attr/colorOnPrimaryContainer?attr/colorOnSurface?attr/textAppearanceDisplayLarge?attr/colorSurfaceContainerHighest?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/colorOnSurface?attr/textAppearanceHeadlineMedium?attr/colorOnSurface?attr/textAppearanceHeadlineSmall?attr/colorSurface?attr/colorOnSurface?attr/textAppearanceTitleLarge?attr/colorOnSurface?attr/colorSurfaceContainer?attr/colorOnSurfaceVariant?attr/colorPrimary?attr/colorPrimary + %d nova obavijest + %d nove obavijesti + %d novih obavijesti + Sažmite donju tablicuProširite donju tablicuProširi donju polovicuDvaput dodirnut marker za povlačenjeMarker za povlačenjeUneseno znakova: %1$d od %2$dPremašeno je ograničenje broja znakova: %1$d od %2$dBrisanje tekstaPogreška: nije važećePogreškaPrikaži padajući izbornikIkona dijalogaKarticaOdaberite prijepodne ili poslijepodne%1$s hOdaberite sat%1$s hOdaberite minute%1$s minAMPrijeđite na način rada sata da biste unijeli vrijeme.SatMinutaPMOdabir vremenaPrijeđite na način unosa teksta da biste unijeli vrijeme.Nova obavijestPotvrđenoDjelomično potvrđenoNije potvrđenoUkloni %1$sViše od %1$d novih obavijestiPrijelaz na sljedeći mjesecPomicanje na prethodni mjesecOdabir datuma početka: %1$s – odabir datuma završetka: %2$sTrenutačan odabir: %1$sništaOdustaniU redu%1$sOdaberite datumOdabrani datum%1$sDatum završetka %1$sNevažeći format.Primjer: %1$sKoristi format: %1$sRaspon nije važeći.Idi na trenutačnu godinu %1$dPrijelaz na godinu %1$dIzvan raspona: %1$sDatum početka – %1$s%1$s – datum završetka%1$s – %2$sOdaberite rasponDatum početka – datum završetkaSpremiDatum početka %1$sDatumDatum završetkaDatum početkadmgDanas: %1$sPrijelaz na način unosa u KalendaruDodirnite da biste se prebacili na prikaz kalendaraPrijelaz na način unosa tekstaDodirnite da biste se prebacili na prikaz godineOdustaniU reduPrikaži zaporkuUkloni tekstNatragBočni list + %d novo obaveštenje + %d nova obaveštenja + %d novih obaveštenja + Skupite donju tabeluProširite donju tabeluProširite do polaIdentifikator za prevlačenje je dvaput dodirnutRučica za prevlačenjeUneti znakovi: %1$d od %2$dPrekoračeno je ograničenje broja znakova: %1$d od %2$dObriši tekstGreška: nevažećeGreškaPrikaži padajući meniIkona dijalogaKarticaIzaberite pre podne ili po podne%1$s sIzaberite sat%1$s sIzaberite minute%1$s minAMPređite u režim sata radi unosa vremena.SatMinutPMIzaberite vremePređite u režim unosa teksta radi unosa vremena.Novo obaveštenjeOznačenoDelimično označenoNije označenoUklonite %1$sNovih obaveštenja: više od %1$dPređite na sledeći mesecPređite na prethodni mesecIzbor datuma početka: %1$s – Izbor datuma završetka: %2$sAktuelni izbor: %1$sništaOtkažiPotvrdi%1$sIzaberite datumIzabrani datum%1$sDatum završetka %1$sFormat je nevažeći.Primer: %1$sKoristite: %1$sNevažeći period.Idite na aktuelnu godinu %1$dIdite na godinu %1$dIzvan perioda: %1$sDatum početka – %1$s%1$s – Datum završetka%1$s–%2$sIzaberite periodDatum početka – Datum završetkaSačuvajDatum početka %1$sDatumDatum završetkaDatum početkadmgDanas %1$sPređite na režim unosa u KalendaruDodirnite da biste prešli na prikaz kalendaraPređite na režim unosa tekstaDodirnite da biste prešli na prikaz godineOtkažiPotvrdiPrikaži lozinkuObriši tekstNazadBočna tabela + %d notificación nova + %d notificacións novas + Contrae o panel inferiorDesprega o panel inferiorDespregar ata a metadeControlador de arrastre tocado dúas vecesControlador de arrastreIntroducíronse %1$d caracteres de %2$dIntroducíronse %1$d caracteres, pero o límite é de %2$dBorra textoErro: Non válidaProduciuse un erroMostra o menú despregableIcona de cadro de diálogoPestanaSeleccionar a.m. ou p.m.%1$s horasSeleccionar hora%1$s en puntoSeleccionar minutos%1$s minutosa.m.Cambiar ao modo de reloxo para introducir a hora.HoraMinutop.m.Seleccionar horaCambia ao modo de introdución de texto para introducir a hora.Notificación novaMarcouseMarcouse parcialmenteNon se marcouQuita %1$sMáis de %1$d notificacións novasCambiar ao mes seguinteCambiar ao mes anteriorSelección de data de inicio: %1$s - Selección de data de finalización: %2$sSelección actual: %1$sningunhaCancelarAceptar%1$sSelecciona unha dataData seleccionada%1$sData de finalización: %1$sO formato non é válido.Exemplo: %1$sUsa este formato: %1$sO intervalo de datas non é válido.Ir ao ano actual (%1$d)Ir ao ano %1$dSó se admiten datas do intervalo: %1$sData de inicio - %1$s%1$s - data de finalización%1$s - %2$sSelecciona un intervalo de datasData de inicio - data de finalizaciónGardarData de inicio: %1$sDataData de finalizaciónData de iniciodmaHoxe (%1$s)Cambiar ao modo de entrada de calendarioTocar para cambiar á vista de calendarioCambiar ao modo de introdución de textoTocar para cambiar á vista de anoCancelarAceptarMostra o contrasinalBorrar textoAnteriorFolla lateral + %d ново обавештење + %d нова обавештења + %d нових обавештења + Скупите доњу табелуПроширите доњу табелуПроширите до полаИдентификатор за превлачење је двапут додирнутРучица за превлачењеУнети знакови: %1$d од %2$dПрекорачено је ограничење броја знакова: %1$d од %2$dОбриши текстГрешка: неважећеГрешкаПрикажи падајући мениИкона дијалогаКартицаИзаберите пре подне или по подне%1$s сИзаберите сат%1$s сИзаберите минуте%1$s минAMПређите у режим сата ради уноса времена.СатМинутPMИзаберите времеПређите у режим уноса текста ради уноса времена.Ново обавештењеОзначеноДелимично означеноНије означеноУклоните %1$sНових обавештења: више од %1$dПређите на следећи месецПређите на претходни месецИзбор датума почетка: %1$s – Избор датума завршетка: %2$sАктуелни избор: %1$sништаОткажиПотврди%1$sИзаберите датумИзабрани датум%1$sДатум завршетка %1$sФормат је неважећи.Пример: %1$sКористите: %1$sНеважећи период.Идите на актуелну годину %1$dИдите на годину %1$dИзван периода: %1$sДатум почетка – %1$s%1$s – Датум завршетка%1$s–%2$sИзаберите периодДатум почетка – Датум завршеткаСачувајДатум почетка %1$sДатумДатум завршеткаДатум почеткадмгДанас %1$sПређите на режим уноса у КалендаруДодирните да бисте прешли на приказ календараПређите на режим уноса текстаДодирните да бисте прешли на приказ годинеОткажиПотврдиПрикажи лозинкуОбриши текстНазадБочна табела@android:color/system_neutral1_1000@android:color/system_neutral1_900@android:color/system_neutral1_0@android:color/system_neutral1_800@android:color/system_neutral1_700@android:color/system_neutral1_600@android:color/system_neutral1_500@android:color/system_neutral1_400@android:color/system_neutral1_300@android:color/system_neutral1_200@android:color/system_neutral1_100@android:color/system_neutral1_50@android:color/system_neutral1_10@android:color/system_neutral2_1000@android:color/system_neutral2_900@android:color/system_neutral2_0@android:color/system_neutral2_800@android:color/system_neutral2_700@android:color/system_neutral2_600@android:color/system_neutral2_500@android:color/system_neutral2_400@android:color/system_neutral2_300@android:color/system_neutral2_200@android:color/system_neutral2_100@android:color/system_neutral2_50@android:color/system_neutral2_10@android:color/system_accent1_1000@android:color/system_accent1_900@android:color/system_accent1_0@android:color/system_accent1_800@android:color/system_accent1_700@android:color/system_accent1_600@android:color/system_accent1_500@android:color/system_accent1_400@android:color/system_accent1_300@android:color/system_accent1_200@android:color/system_accent1_100@android:color/system_accent1_50@android:color/system_accent1_10@android:color/system_accent2_1000@android:color/system_accent2_900@android:color/system_accent2_0@android:color/system_accent2_800@android:color/system_accent2_700@android:color/system_accent2_600@android:color/system_accent2_500@android:color/system_accent2_400@android:color/system_accent2_300@android:color/system_accent2_200@android:color/system_accent2_100@android:color/system_accent2_50@android:color/system_accent2_10@android:color/system_accent3_1000@android:color/system_accent3_900@android:color/system_accent3_0@android:color/system_accent3_800@android:color/system_accent3_700@android:color/system_accent3_600@android:color/system_accent3_500@android:color/system_accent3_400@android:color/system_accent3_300@android:color/system_accent3_200@android:color/system_accent3_100@android:color/system_accent3_50@android:color/system_accent3_10@color/m3_ref_palette_dynamic_neutral_variant6@color/m3_ref_palette_dynamic_neutral20@color/m3_ref_palette_dynamic_primary40@color/m3_ref_palette_dynamic_neutral90@color/m3_ref_palette_dynamic_neutral90@color/m3_ref_palette_dynamic_primary20@color/m3_ref_palette_dynamic_primary90@color/m3_ref_palette_dynamic_secondary20@color/m3_ref_palette_dynamic_secondary90@color/m3_ref_palette_dynamic_neutral90@color/m3_ref_palette_dynamic_neutral_variant80@color/m3_ref_palette_dynamic_tertiary20@color/m3_ref_palette_dynamic_tertiary90@color/m3_ref_palette_dynamic_neutral_variant60@color/m3_ref_palette_dynamic_neutral_variant30@color/m3_ref_palette_dynamic_primary80@color/m3_ref_palette_dynamic_primary30@color/m3_ref_palette_dynamic_secondary80@color/m3_ref_palette_dynamic_secondary30@color/m3_ref_palette_dynamic_neutral_variant6@color/m3_ref_palette_dynamic_neutral_variant24@color/m3_ref_palette_dynamic_neutral_variant12@color/m3_ref_palette_dynamic_neutral_variant17@color/m3_ref_palette_dynamic_neutral_variant22@color/m3_ref_palette_dynamic_neutral_variant10@color/m3_ref_palette_dynamic_neutral_variant4@color/m3_ref_palette_dynamic_neutral_variant6@color/m3_ref_palette_dynamic_neutral_variant30@color/m3_ref_palette_dynamic_tertiary80@color/m3_ref_palette_dynamic_tertiary30@color/m3_ref_palette_dynamic_neutral_variant98@color/m3_ref_palette_dynamic_neutral95@color/m3_ref_palette_dynamic_primary80@color/m3_ref_palette_dynamic_neutral20@color/m3_ref_palette_dynamic_neutral10@color/m3_ref_palette_dynamic_primary100@color/m3_ref_palette_dynamic_primary10@color/m3_ref_palette_dynamic_secondary100@color/m3_ref_palette_dynamic_secondary10@color/m3_ref_palette_dynamic_neutral10@color/m3_ref_palette_dynamic_neutral_variant30@color/m3_ref_palette_dynamic_tertiary100@color/m3_ref_palette_dynamic_tertiary10@color/m3_ref_palette_dynamic_neutral_variant50@color/m3_ref_palette_dynamic_neutral_variant80@color/m3_ref_palette_dynamic_primary40@color/m3_ref_palette_dynamic_primary90@color/m3_ref_palette_dynamic_secondary40@color/m3_ref_palette_dynamic_secondary90@color/m3_ref_palette_dynamic_neutral_variant98@color/m3_ref_palette_dynamic_neutral_variant98@color/m3_ref_palette_dynamic_neutral_variant94@color/m3_ref_palette_dynamic_neutral_variant92@color/m3_ref_palette_dynamic_neutral_variant90@color/m3_ref_palette_dynamic_neutral_variant96@color/m3_ref_palette_dynamic_neutral_variant100@color/m3_ref_palette_dynamic_neutral_variant87@color/m3_ref_palette_dynamic_neutral_variant90@color/m3_ref_palette_dynamic_tertiary40@color/m3_ref_palette_dynamic_tertiary90@color/m3_ref_palette_dynamic_primary10@color/m3_ref_palette_dynamic_primary30@color/m3_ref_palette_dynamic_secondary10@color/m3_ref_palette_dynamic_secondary30@color/m3_ref_palette_dynamic_tertiary10@color/m3_ref_palette_dynamic_tertiary30@color/m3_ref_palette_dynamic_primary90@color/m3_ref_palette_dynamic_primary80@color/m3_ref_palette_dynamic_secondary90@color/m3_ref_palette_dynamic_secondary80@color/m3_ref_palette_dynamic_tertiary90@color/m3_ref_palette_dynamic_tertiary80@color/m3_sys_color_dark_error@color/m3_sys_color_dark_error_container@color/m3_sys_color_dark_on_error@color/m3_sys_color_dark_on_error_container@color/m3_sys_color_light_error@color/m3_sys_color_light_error_container@color/m3_sys_color_light_on_error@color/m3_sys_color_light_on_error_container@color/m3_ref_palette_dynamic_neutral0@color/m3_ref_palette_dynamic_neutral10@color/m3_ref_palette_dynamic_neutral100@color/m3_ref_palette_dynamic_neutral20@color/m3_ref_palette_dynamic_neutral30@color/m3_ref_palette_dynamic_neutral40@color/m3_ref_palette_dynamic_neutral50@color/m3_ref_palette_dynamic_neutral60@color/m3_ref_palette_dynamic_neutral70@color/m3_ref_palette_dynamic_neutral80@color/m3_ref_palette_dynamic_neutral90@color/m3_ref_palette_dynamic_neutral95@color/m3_ref_palette_dynamic_neutral99@color/m3_ref_palette_dynamic_neutral_variant0@color/m3_ref_palette_dynamic_neutral_variant10@color/m3_ref_palette_dynamic_neutral_variant100@color/m3_ref_palette_dynamic_neutral_variant20@color/m3_ref_palette_dynamic_neutral_variant30@color/m3_ref_palette_dynamic_neutral_variant40@color/m3_ref_palette_dynamic_neutral_variant50@color/m3_ref_palette_dynamic_neutral_variant60@color/m3_ref_palette_dynamic_neutral_variant70@color/m3_ref_palette_dynamic_neutral_variant80@color/m3_ref_palette_dynamic_neutral_variant90@color/m3_ref_palette_dynamic_neutral_variant95@color/m3_ref_palette_dynamic_neutral_variant99@color/m3_ref_palette_dynamic_primary0@color/m3_ref_palette_dynamic_primary10@color/m3_ref_palette_dynamic_primary100@color/m3_ref_palette_dynamic_primary20@color/m3_ref_palette_dynamic_primary30@color/m3_ref_palette_dynamic_primary40@color/m3_ref_palette_dynamic_primary50@color/m3_ref_palette_dynamic_primary60@color/m3_ref_palette_dynamic_primary70@color/m3_ref_palette_dynamic_primary80@color/m3_ref_palette_dynamic_primary90@color/m3_ref_palette_dynamic_primary95@color/m3_ref_palette_dynamic_primary99@color/m3_ref_palette_dynamic_secondary0@color/m3_ref_palette_dynamic_secondary10@color/m3_ref_palette_dynamic_secondary100@color/m3_ref_palette_dynamic_secondary20@color/m3_ref_palette_dynamic_secondary30@color/m3_ref_palette_dynamic_secondary40@color/m3_ref_palette_dynamic_secondary50@color/m3_ref_palette_dynamic_secondary60@color/m3_ref_palette_dynamic_secondary70@color/m3_ref_palette_dynamic_secondary80@color/m3_ref_palette_dynamic_secondary90@color/m3_ref_palette_dynamic_secondary95@color/m3_ref_palette_dynamic_secondary99@color/m3_ref_palette_dynamic_tertiary0@color/m3_ref_palette_dynamic_tertiary10@color/m3_ref_palette_dynamic_tertiary100@color/m3_ref_palette_dynamic_tertiary20@color/m3_ref_palette_dynamic_tertiary30@color/m3_ref_palette_dynamic_tertiary40@color/m3_ref_palette_dynamic_tertiary50@color/m3_ref_palette_dynamic_tertiary60@color/m3_ref_palette_dynamic_tertiary70@color/m3_ref_palette_dynamic_tertiary80@color/m3_ref_palette_dynamic_tertiary90@color/m3_ref_palette_dynamic_tertiary95@color/m3_ref_palette_dynamic_tertiary990dp22dp48dp2dp2dp48dp20dp168dp0dp24dp36dp + %d نئی اطلاع + %d نئی اطلاعات + نیچے کی شیٹ کو سکیڑیںنیچے کی شیٹ کو پھیلائیںنصف تک پھیلائیںگھسیٹنے کے ہینڈل کو دو بار تھپتھپائیںگھسیٹنے کا ہینڈل%2$d میں سے %1$d حروف درج کیے گئےحروف کی تعداد کی حد %2$d سے %1$d پہنچ گئیٹیکسٹ صاف کریںخرابی: غلطخرابیڈراپ ڈاؤن مینیو دکھائیںڈائیلاگ کا آئیکنٹیبAM یا PM منتخب کریں%1$s گھنٹےگھنٹہ منتخب کریں%1$s بجےمنٹ منتخب کریں%1$s منٹقبل از دوپہروقت ان پٹ کے لیے گھڑی و‏ضع پر سوئچ کریں۔گھنٹہمنٹراتوقت منتخب کریںوقت ان پٹ کے لیے ٹیکسٹ ان پٹ وضع پر سوئچ کریں۔نئی اطلاعنشان زد ہو گیاجزوی طور پر نشان زدنشان زد نہیں ہوا%1$s کو ہٹائیں%1$d سے زیادہ نئی اطلاعاتاگلے مہینہ میں منتقل کریںگزشتہ ماہ میں منتقل کریںتاریخ آغاز کا انتخاب: %1$s – تاریخ اختتام کا انتخاب: %2$sموجودہ انتخاب: %1$sکوئی نہیںمنسوخ کریںٹھیک ہے%1$sتاریخ منتخب کریںمنتخب کردہ تاریخ%1$sتاریخ اختتام %1$sغلط فارمیٹ۔مثال: %1$s۔%1$s استعمال کریںغلط رینج۔سال رواں %1$d پر نیویگیٹ کریں%1$d سال پر نیویگیٹ کریںحد سے باہر: %1$sتاریخ آغاز – %1$s%1$s – تاریخ اختتام%1$s – %2$sرینج منتخب کریںتاریخ آغاز - تاریخ اختتاممحفوظ کریںتاریخ آغاز %1$sتاریختاریخ اختتامتاریخ آغازdmyآج %1$sکیلنڈر ان پٹ وضع پر سوئچ کریںکیلنڈر منظر پر سوئچ کرنے کے لیے تھپتھپائیںمتنی ان پٹ وضع پر سوئچ کریںسال کے منظر پر سوئچ کرنے کے لیے تھپتھپائیںمنسوخ کریںٹھیک ہےپاس ورڈ دکھائیںٹیکسٹ صاف کریںواپس جائیںسائیڈ شیٹ0.320.20.160.20dp1dp0.480.480.160.480.240.240.080.24sans-serif-mediumsans-serifsans-serif-mediumsans-serif + %d ಹೊಸ ನೋಟಿಫಿಕೇಶನ್‍ಗಳು + %d ಹೊಸ ನೋಟಿಫಿಕೇಶನ್‍ಗಳು + ಕೆಳಭಾಗದ ಶೀಟ್ ಅನ್ನು ಕುಗ್ಗಿಸಿಕೆಳಭಾಗದ ಶೀಟ್ ಅನ್ನು ವಿಸ್ತರಿಸಿಅರ್ಧದಷ್ಟು ವಿಸ್ತರಿಸಿಹ್ಯಾಂಡಲ್ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ ಎಂಬುದನ್ನು ಡಬಲ್-ಟ್ಯಾಪ್ ಮಾಡಲಾಗಿದೆಹ್ಯಾಂಡಲ್ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ%2$d ರಲ್ಲಿ %1$d ಅಕ್ಷರಗಳನ್ನು ನಮೂದಿಸಲಾಗಿದೆಅಕ್ಷರ ಮಿತಿಯು %2$d ರಲ್ಲಿ %1$d ಮೀರಿದೆಪಠ್ಯ ತೆರವುಗೊಳಿಸಿದೋಷ: ಅಮಾನ್ಯದೋಷಡ್ರಾಪ್‌ಡೌನ್ ಮೆನು ತೋರಿಸಿಡೈಲಾಗ್ ಐಕಾನ್ಟ್ಯಾಬ್ಬೆಳಿಗ್ಗೆ ಅಥವಾ ಮಧ್ಯಾಹ್ನ ಆಯ್ಕೆಮಾಡಿ%1$s ಗಂಟೆಗಳುಸಮಯವನ್ನು ಆಯ್ಕೆಮಾಡಿ%1$s ಗಂಟೆನಿಮಿಷಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ%1$s ನಿಮಿಷಗಳುAMಸಮಯವನ್ನು ನಮೂದಿಸಲು ಗಡಿಯಾರದ ನಮೂನೆಗೆ ಬದಲಿಸಿ.ಗಂಟೆನಿಮಿಷPMಸಮಯವನ್ನು ಆಯ್ಕೆಮಾಡಿಸಮಯವನ್ನು ನಮೂದಿಸಲು ಪಠ್ಯದ ನಮೂನೆಗೆ ಬದಲಿಸಿ.ಹೊಸ ನೋಟಿಫಿಕೇಶನ್ಪರೀಕ್ಷಿಸಲಾಗಿದೆಭಾಗಶಃ ಪರೀಕ್ಷಿಸಲಾಗಿದೆಪರೀಕ್ಷಿಸಲಾಗಿಲ್ಲ%1$s ಅನ್ನು ತೆಗೆದುಹಾಕಿ%1$d ಕ್ಕಿಂತ ಹೆಚ್ಚು ಹೊಸ ಅಧಿಸೂಚನೆಗಳುಮುಂದಿನ ತಿಂಗಳಿಗೆ ಬದಲಿಸಿಹಿಂದಿನ ತಿಂಗಳಿಗೆ ಬದಲಿಸಿಪ್ರಾರಂಭ ದಿನಾಂಕದ ಆಯ್ಕೆ: %1$s – ಅಂತಿಮ ದಿನಾಂಕದ ಆಯ್ಕೆ: %2$sಪ್ರಸ್ತುತ ಆಯ್ಕೆ: %1$sಯಾವುದೂ ಇಲ್ಲರದ್ದುಮಾಡಿಸರಿ%1$sದಿನಾಂಕವನ್ನು ಆಯ್ಕೆಮಾಡಿದಿನಾಂಕವನ್ನು ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ%1$sಕೊನೆಯ ದಿನಾಂಕ %1$sಅಮಾನ್ಯವಾದ ಫಾರ್ಮ್ಯಾಟ್.ಉದಾಹರಣೆ: %1$sಇದನ್ನು ಬಳಸಿ: %1$sಅಮಾನ್ಯ ಶ್ರೇಣಿ.ಪ್ರಸ್ತುತ ವರ್ಷ %1$d ಕ್ಕೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ%1$d ವರ್ಷಕ್ಕೆ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿವ್ಯಾಪ್ತಿಯ ಹೊರಗಿದೆ: %1$sಪ್ರಾರಂಭ ದಿನಾಂಕ – %1$s%1$s – ಮುಕ್ತಾಯ ದಿನಾಂಕ%1$s – %2$sಶ್ರೇಣಿಯನ್ನು ಆಯ್ಕೆಮಾಡಿಪ್ರಾರಂಭ ದಿನಾಂಕ – ಮುಕ್ತಾಯ ದಿನಾಂಕಉಳಿಸಿಪ್ರಾರಂಭದ ದಿನಾಂಕ %1$sದಿನಾಂಕಮುಕ್ತಾಯ ದಿನಾಂಕಪ್ರಾರಂಭ ದಿನಾಂಕದಿತಿಇಂದು %1$sಕ್ಯಾಲೆಂಡರ್ ಇನ್‌ಪುಟ್ ಮೋಡ್‌ಗೆ ಬದಲಿಸಿCalendar ವೀಕ್ಷಣೆಗೆ ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿಪಠ್ಯ ಇನ್‌ಪುಟ್ ಮೋಡ್‌ಗೆ ಬದಲಿಸಿವರ್ಷದ ವೀಕ್ಷಣೆಗೆ ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿರದ್ದುಮಾಡಿಸರಿಪಾಸ್‌ವರ್ಡ್ ತೋರಿಸಿಪಠ್ಯವನ್ನು ತೆರವುಗೊಳಿಸಿಹಿಂದಕ್ಕೆಸೈಡ್ ಶೀಟ್ + %d novo obvestilo + %d novi obvestili + %d nova obvestila + %d novih obvestil + Strnitev razdelka na dnu zaslonaRazširitev razdelka na dnu zaslonaRazširjanje na pol višineDvakrat dotaknjena ročica za vlečenjeRočica za vlečenjeŠtevilo vnesenih znakov je %1$d od %2$dOmejitev števila znakov je presegla %1$d od %2$dIzbris besedilaNapaka: NeveljavnoNapakaPrikaz spustnega menijaIkona pogovornega oknaZavihekIzberite dopoldanski ali popoldanski čas.%1$s hIzberite uro%1$sIzberite minute%1$s mindop.Preklopite na način ure, da vnesete čas.UraMinutapop.Izberite uroPreklopite na način za vnašanje besedila, da vnesete čas.Novo obvestiloPotrjenoDelno potrjenoNepotrjenoOdstranite %1$sVeč kot toliko novih obvestil: %1$dSpremeni na naslednji mesecSpremeni na prejšnji mesecIzbira začetnega datuma: %1$s – Izbira končnega datuma: %2$sTrenutna izbira: %1$sbrezPrekličiV redu%1$sIzberite datumIzbrani datum%1$sKončni datum %1$sNeveljavna oblika.Primer: %1$sUporabite: %1$sNeveljaven razpon.Pomik na trenutno leto %1$dPomik na leto %1$dZunaj razpona: %1$sZačetni datum–%1$s%1$s–končni datum%1$s–%2$sIzberite obsegZačetni datum–končni datumShraniZačetni datum %1$sDatumKončni datumZačetni datumdmlDanes %1$sPreklop na način vnosa v koledarDotaknite se za preklop na pogled koledarjaPreklop na način vnosa besedilaDotaknite se za preklop na pogled letaPrekličiV reduPrikaz geslaPočisti besediloNazajStranski list + %d novo obavještenje + %d nova obavještenja + %d novih obavještenja + Sužavanje donje tabeleProširivanje donje tabeleProširivanje dopolaRučica za prevlačenje je dvaput dodirnutaRučica za prevlačenjeUneseno znakova: %1$d od %2$dOgraničenje broja znakova premašuje %1$d od %2$dObriši tekstGreška: nevežaćeGreškaPrikaži padajući meniikona dijaloškog okviraKarticaOdaberite prijepodne ili poslijepodne%1$s hOdaberite sat%1$s hOdaberite minute%1$s minAMPrebacite u način rada kao sat za unos vremena.SatMinutaPMOdabir vremenaPrebacite u način unosa teksta za unos vremena.Novo obavještenjeOznačenoDjelimično označenoNije označenoUklonite %1$sBroj novih obavještenja: više od %1$dPromijeni na sljedeći mjesecPromijeni na prethodni mjesecOdabir datuma početka: %1$s – Odabir datuma završetka: %2$sTrenutni izbor: %1$sništaOtkažiUredu%1$sOdaberite datumOdabrani datum%1$sDatum završetka %1$sNevažeći format.Primjer: %1$sKoristi: %1$sNevažeći opseg.Odlazak na trenutnu godinu %1$dOdlazak na %1$d. godinuIzvan opsega: %1$sDatum početka – %1$s%1$s – Datum završetka%1$s – %2$sOdaberite rasponDatum početka – Datum završetkaSačuvajDatum početka %1$sDatumDatum završetkaDatum početkadmgDanas %1$sPrebacivanje na način unosa kalendaraPrebacivanje dodirom na prikaz KalendaraPrebacivanje na način unosa tekstaPrebacivanje dodirom na prikaz godineOtkažiUreduPrikaži lozinkuBrisanje tekstaNazadBočna tabela + %d uusi ilmoitus + %d uutta ilmoitusta + Tiivistä alapaneeliLaajenna alapaneeliLaajenna puoliväliinVetokahvaa kaksoisnapautettuVetokahva%1$d/%2$d merkkiä kirjoitettuMerkkiraja ylitetty: %1$d/%2$dTyhjennä tekstiVirhe: ei kelpaaVirheNäytä avattava valikkoValintaikkunan kuvakeVälilehtiValitse AP tai IP%1$s tuntiaValitse tuntiklo %1$sValitse minuutit%1$s minuuttiaapVaihda ajan syöttämiseen kellotilassa.TunnitMinuuttiipValitse aikaVaihda ajan syöttämiseen tekstitilassa.Uusi ilmoitusValittuOsittain valittuEi valittuPoista %1$sYli %1$d uutta ilmoitustaVaihda seuraavaan kuukauteenVaihda edelliseen kuukauteenAlkamispäivän valinta: %1$s – päättymispäivän valinta: %2$sNykyinen valinta: %1$sPeruOK%1$sValitse päivämääräValittu päivämäärä%1$sPäättyy %1$sVirheellinen muotoEsimerkki: %1$sKäytä muotoa %1$sVirheellinen alueSiirry kuluvaan vuoteen: %1$dSiirry vuoteen %1$dAikavälin ulkop.: %1$sAlkamispäivä – %1$s%1$s – päättymispäivä%1$s – %2$sValitse jaksoAlkamispäivä – päättymispäiväTallennaAlkaa %1$sPäivämääräPäättymispäiväAlkamispäiväpkvTänään: %1$sVaihda syöttötavaksi kalenteriSiirry kalenterinäkymään napauttamallaValitse syöttötavaksi tekstiSiirry vuosinäkymään napauttamallaPeruOKNäytä salasanaTyhjennä tekstiTakaisinSivupalkki + %d új értesítés + %d új értesítés + Az alsó lap összecsukásaAz alsó lap kibontásaKibontás féligDuplán koppintott a csúszkáraCsúszkaBegépelt karakterszám: %2$d/%1$dMaximális karakterszám túllépve: %2$d/%1$dSzöveg törléseHiba: érvénytelenHibaLegördülő menü megjelenítésePárbeszédpanel ikonjaLapVálassza ki, hogy délelőtt vagy délután%1$s óraÓra kiválasztása%1$s óraPerc kiválasztása%1$s percde.Időbevitelhez váltson óramódba.ÓraPercdu.Időpont kiválasztásaIdőbevitelhez váltson szövegbeviteli módba.Új értesítésBejelölveRészlegesen bejelölveNincs bejelölveEltávolítás (%1$s)Több mint %1$d új értesítésVáltás a következő hónapraVáltás az előző hónapraKiválasztott kezdő dátum: %1$s – Kiválasztott befejező dátum: %2$sJelenleg kiválasztva: %1$segyik semMégseOK%1$sVálasszon dátumotKiválasztott dátum%1$sBefejezés dátuma: %1$sÉrvénytelen formátum.Példa: %1$sHasználja ezt: %1$sÉrvénytelen tartomány.Ugrás az aktuális évre %1$dUgrás ehhez az évhez: %1$dTartományon kívül: %1$sKezdés dátuma – %1$s%1$s – Befejezés dátuma%1$s – %2$sVálasszon dátumtartománytKezdés dátuma – Befejezés dátumaMentésKezdés dátuma: %1$sDátumBefejezés dátumaKezdés dátumaNHÉMa %1$sVáltás naptárbeviteli módraKoppintson a naptárnézetre való váltáshozVáltás szövegbeviteli módraKoppintson az éves nézetre való váltáshozMégseOKJelszó megjelenítéseSzöveg törléseVisszaOldalsáv + %d ການແຈ້ງເຕືອນໃໝ່ + %d ການແຈ້ງເຕືອນໃໝ່ + ຫຍໍ້ຊີດລຸ່ມສຸດລົງຂະຫຍາຍຊີດລຸ່ມສຸດຂະຫຍາຍອອກເຄິ່ງໜຶ່ງແຕະບ່ອນຈັບລາກສອງເທື່ອແລ້ວບ່ອນຈັບລາກຕົວອັກສອນທີ່ປ້ອນເຂົ້າ %1$d ຕົວຈາກທັງໝົດ %2$d ຕົວຂີດຈຳກັດຕົວອັກສອນເກີນ %1$d ຈາກທັງໝົດ %2$dລຶບລ້າງຂໍ້ຄວາມຂໍ້ຜິດພາດ: ບໍ່ຖືກຕ້ອງຜິດພາດສະແດງເມນູເລື່ອນລົງໄອຄອນກ່ອງໂຕ້ຕອບແຖບເລືອກຕອນເຊົ້າ ຫຼື ຕອນແລງ%1$s ຊົ່ວໂມງເລືອກຊົ່ວໂມງ%1$s ໂມງເລືອກນາ​ທີ%1$s ນາທີໂມງເຊົ້າສະຫຼັບໄປໃຊ້ໂໝດໂມງສຳລັບການປ້ອນເວລາ.ຊົ່ວໂມງນາທີໂມງແລງເລືອກເວ​ລາສະຫຼັບໄປໃຊ້ໂໝດປ້ອນຂໍ້ຄວາມສຳລັບການປ້ອນເວລາ.ການແຈ້ງເຕືອນໃໝ່ເລືອກໄວ້ເລືອກໄວ້ບາງສ່ວນບໍ່ໄດ້ເລືອກໄວ້ລຶບ %1$s ອອກການແຈ້ງເຕືອນໃໝ່ຫຼາຍກວ່າ %1$d ລາຍການປ່ຽນເປັນເດືອນຕໍ່ໄປປ່ຽນເປັນເດືອນຜ່ານມາການເລືອກວັນທີເລີ່ມຕົ້ນ: %1$s – ການເລືອກວັນທີສິ້ນສຸດ: %2$sການເລືອກປັດຈຸບັນ: %1$sບໍ່ມີຍົກເລີກຕົກລົງ%1$sເລືອກວັນທີເລືອກວັນທີ%1$sວັນທີສິ້ນສຸດ %1$sຮູບແບບບໍ່ຖືກຕ້ອງ.ຕົວຢ່າງ: %1$sໃຊ້: %1$sໄລຍະບໍ່ຖືກຕ້ອງ.ໄປຫາປີປັດຈຸບັນ %1$dເລື່ອນໄປປີ %1$dຢູ່ນອກຊ່ວງວັນທີ: %1$sວັນທີເລີ່ມຕົ້ນ – %1$s%1$s – ວັນທີສິ້ນສຸດ%1$s – %2$sເລືອກຊ່ວງວັນທີເລີ່ມຕົ້ນ – ວັນທີສິ້ນສຸດບັນທຶກວັນທີເລີ່ມຕົ້ນ %1$sວັນທີວັນທີສິ້ນສຸດວັນທີເລີ່ມມື້ນີ້ %1$sປ່ຽນເປັນໂໝດປ້ອນຂໍ້ມູນປະຕິທິນແຕະເພື່ອສະຫຼັບໄປເປັນມຸມມອງປະຕິທິນປ່ຽນເປັນໂໝດປ້ອນຂໍ້ມູນຂໍ້ຄວາມແຕະເພື່ອສະຫຼັບໄປເປັນມຸມມອງປີຍົກເລີກຕົກລົງສະແດງລະຫັດຜ່ານລຶບລ້າງຂໍ້ຄວາມກັບຄືນຊີດດ້ານຂ້າງ + การแจ้งเตือนใหม่ %d รายการ + การแจ้งเตือนใหม่ %d รายการ + ยุบ Bottom Sheetขยาย Bottom Sheetขยายรายการครึ่งหนึ่งแตะแฮนเดิลการลากสองครั้งแฮนเดิลการลากป้อนอักขระแล้ว %1$d จาก %2$d ตัวเกินจำนวนอักขระสูงสุด %1$d จาก %2$dล้างข้อความข้อผิดพลาด: ไม่ถูกต้องข้อผิดพลาดแสดงเมนูแบบเลื่อนลงไอคอนกล่องโต้ตอบแท็บเลือก AM หรือ PM%1$s ชั่วโมงเลือกชั่วโมง%1$s นาฬิกาเลือกนาที%1$s นาทีAMสลับไปโหมดนาฬิกาเพื่อป้อนเวลาชั่วโมงนาทีPMเลือกเวลาสลับไปโหมดป้อนข้อความเพื่อป้อนเวลาการแจ้งเตือนใหม่เลือกไว้เลือกบางส่วนไม่ได้เลือกนำ %1$s ออกการแจ้งเตือนใหม่มากกว่า %1$d รายการเปลี่ยนไปที่เดือนถัดไปเปลี่ยนไปที่เดือนก่อนหน้าการเลือกวันที่เริ่มต้น: %1$s – การเลือกวันที่สิ้นสุด: %2$sการเลือกในปัจจุบัน: %1$sไม่มียกเลิกตกลง%1$sเลือกวันที่วันที่ที่เลือก%1$sวันที่สิ้นสุด %1$sรูปแบบไม่ถูกต้องตัวอย่าง: %1$sใช้: %1$sช่วงไม่ถูกต้องไปยังปีปัจจุบัน %1$dไปที่ปี %1$dวันที่ไม่อยู่ในช่วงที่อนุญาต: %1$sวันที่เริ่มต้น – %1$s%1$s – วันที่สิ้นสุด%1$s – %2$sเลือกช่วงวันที่เริ่มต้น – วันที่สิ้นสุดบันทึกวันที่เริ่มต้น %1$sวันที่วันที่สิ้นสุดวันที่เริ่มต้นวันนี้ %1$sสลับไปใช้โหมดป้อนข้อมูลปฏิทินแตะเพื่อเปลี่ยนเป็นมุมมองปฏิทินสลับไปใช้โหมดป้อนข้อมูลข้อความแตะเพื่อเปลี่ยนเป็นมุมมองปียกเลิกตกลงแสดงรหัสผ่านล้างข้อความกลับชีตด้านข้าง + %d notificare nouă + %d notificări noi + %d de notificări noi + Restrângeți foaia din partea de josExtindeți foaia din partea de josExtinde pe ecran completGhidaj de tragere atins de două oriGhidaj de tragereCaractere introduse: %1$d din %2$dLimita de caractere a depășit %1$d din %2$dȘtergeți textulEroare: nevalidăEroareAfișați meniul drop-downPictogramă de dialogFilăSelectați ora%1$s oreSelectați oraOra %1$sSelectați minutele%1$s minutea.m.Pentru a introduce ora, comutați la modul ceas.OraMinutp.m.Selectați oraPentru a introduce ora, comutați la modul de introducere a textului.Notificare nouăBifatăBifată parțialNebifatăEliminați %1$sPeste %1$d notificări noiTreceți la luna următoareTreceți la luna anterioarăSelectarea datei de începere: %1$s – selectarea datei de încheiere: %2$sSelecția actuală: %1$sniciunaAnulațiOK%1$sSelectați dataData selectată%1$sData de încheiere: %1$sFormat nevalid.Exemplu: %1$sFolosiți: %1$sInterval nevalid.Navigați la anul actual %1$dNavigați la anul %1$dFără acoperire: %1$sData de începere – %1$s%1$s – data de încheiere%1$s – %2$sSelectați intervalulData de începere – data de încheiereSalvațiData de începere: %1$sDatăData de încheiereData de începerezlaAstăzi, la %1$sComutați la modul introducere în calendarAtingeți pentru a comuta la afișarea CalendarComutați la modul de introducere a textuluiAtingeți pentru a comuta la afișarea AnAnulațiOKAfișați parolaȘtergeți textulÎnapoiFoaie laterală + 새 알림 %d개 + 새 알림 %d개 + 하단 시트 접기하단 시트 펼치기반만 펼치기두 번 탭한 드래그 핸들드래그 핸들입력된 글자 %1$d/%2$d글자 수 제한이 초과되었습니다(%1$d/%2$d).텍스트 삭제오류: 잘못됨오류드롭다운 메뉴 표시대화상자 아이콘오전 또는 오후를 선택하세요.%1$s시간시간 선택%1$s시 정각분 선택%1$s분오전시간 입력을 위해 시계 모드로 전환합니다.시간오후시간 선택시간 입력을 위해 텍스트 입력 모드로 전환합니다.새 알림선택됨일부 선택됨선택되지 않음%1$s 삭제새 알림 %1$d개 초과다음 달로 변경이전 달로 변경시작일 선택: %1$s, 종료일 선택: %2$s현재 %1$s 선택됨없음취소확인%1$s날짜 선택선택한 날짜%1$s종료일: %1$s형식이 잘못되었습니다.예: %1$s올바른 형식: %1$s날짜 범위가 잘못되었습니다.현재 연도(%1$d)로 이동%1$d년으로 이동%1$s은 범위를 벗어난 날짜입니다.시작일~%1$s%1$s~종료일%1$s~%2$s기간 선택시작일~종료일저장시작일: %1$s날짜종료일시작일오늘(%1$s)캘린더 입력 모드로 전환탭하여 캘린더 뷰로 전환텍스트 입력 모드로 전환탭하여 연도 뷰로 전환취소확인비밀번호 표시텍스트 삭제뒤로사이드 시트 + %d ново известие + %d нови известия + Свиване на долния листРазгъване на долния листРазгъване наполовинаДвукратно докосване на манипулатора за преместване с плъзганеМанипулатор за преместване с плъзганеВъведени знаци: %1$d от %2$dМаксималният брой знаци е надхвърлен с(ъс) %1$d от %2$dИзчистване на текстаГрешка: невалидноГрешкаПоказване на падащото менюИкона за диалогов прозорецРазделИзберете AM или PM%1$s часаИзберете час%1$s часаИзбиране на минути%1$s минутиAMПревключете към режима за часовник, за да въведете часа.ЧасМинутаPMИзбор на часПревключете към режима за въвеждане на текст, за да въведете часа.Ново известиеС отметкаЧастично отметнатоБез отметкаПремахване на %1$sПовече от %1$d нови известияПреминаване към следващия месецПреминаване към предишния месецИзбиране на начална дата: %1$s – Избиране на крайна дата: %2$sТекущ избор: %1$sнямаОтказOK%1$sИзбиране на датаИзбрана дата%1$sКрайна дата: %1$sФорматът е невалиден.Пример: %1$sИзползвайте: %1$sНевалиден диапазон.Навигиране до текущата година %1$dНавигиране до %1$d г.Извън диапазона: %1$sНачална дата – %1$s%1$s – крайна дата%1$s – %2$sИзбиране на период от времеНачална дата – крайна датаЗапазванеНачална дата: %1$sДатаКрайна датаНачална датадмгДнес – %1$sПревключване към режим на въвеждане в календарДокоснете за превключване към календарен изгледПревключване към режим за въвеждане на текстДокоснете за превключване към годишен изгледОтказOKПоказване на паролатаИзчистване на текстаНазадСтраничен лист@drawable/material_ic_keyboard_arrow_left_black_24dp@drawable/material_ic_keyboard_arrow_right_black_24dp + %d 条新通知 + %d 条新通知 + 收起底部动作条展开底部动作条展开到一半高度拖动手柄被点按两次拖动手柄输入了 %1$d 个字符(上限为 %2$d 个)超出字符数限制(共 %1$d 个,上限为 %2$d 个)清除文字错误:无效错误显示下拉菜单对话框图标标签页选择上午或下午%1$s 小时选择小时%1$s 点选择分钟%1$s 分上午切换到时钟模式来输入时间。小时分钟下午选择时间切换到文字输入模式来输入时间。新通知已选中部分选中未选中移除%1$s有 %1$d 条以上的新通知转到下个月转到上个月开始日期选择:%1$s – 结束日期选择:%2$s当前的选择是:%1$s取消确定%1$s请选择日期选定的日期%1$s结束日期 %1$s格式无效。示例:%1$s使用:%1$s范围无效。转到今年%1$d转到 %1$d 年不在允许的范围内:%1$s开始日期 – %1$s%1$s – 结束日期%1$s - %2$s请选择范围开始日期 - 结束日期保存开始日期 %1$s日期结束日期开始日期dmy今天%1$s切换到日历输入模式点按即可切换到日历视图切换到文本字段输入模式点按即可切换到年视图取消确定显示密码清除文字返回侧边动作条 + %d новае апавяшчэнне + %d новыя апавяшчэнні + %d новых апавяшчэнняў + %d новага апавяшчэння + Згарнуць ніжні аркушРазгарнуць ніжні аркушРазгарнуць напаловуМаркер перацягвання націснуты двойчыМаркер перацягванняУведзена сімвалаў: %1$d з %2$dАбмежаванне колькасці сімвалаў перавышана: %1$d з %2$dАчысціць тэкстПамылка: недапушчальнае значэннеПамылкаПаказаць выпадное менюЗначок дыялогавага акнаУкладкаВыберыце AM (да паўдня) або PM (пасля паўдня)%1$s гадзВыберыце гадзіну%1$s гадзВыберыце хвіліны%1$s хвAMПераключыцца на рэжым гадзінніка пры ўводзе часу.ГадзінаХвілінаPMВыберыце часПераключыцца на рэжым тэксту пры ўводзе часу.Новае апавяшчэннеВыбранаВыбрана частковаНе выбранаВыдаліць %1$sКолькасць новых апавяшчэнняў перавысіла %1$dПерайсці да наступнага месяцаПерайсці да папярэдняга месяцаВыбраная дата пачатку: %1$s, выбраная дата заканчэння: %2$sБягучае вылучэнне: %1$sне выбранаСкасавацьОК%1$sВыберыце датуВыбраная дата%1$sДата заканчэння: %1$sНяправільны фармат.Прыклад: %1$sНеабходны фармат: %1$sНяправільны дыяпазон.Перайсці да бягучага года %1$dПерайсці ў %1$d годПа-за межамі дыяпазону: %1$sДата пачатку – %1$s%1$s – дата заканчэння%1$s – %2$sВыберыце дыяпазон датДата пачатку – дата заканчэнняЗахавацьДата пачатку: %1$sДатаДата заканчэнняДата пачаткудмгСёння %1$sПераключыцца ў рэжым уводу \"Каляндар\"Націсніце, каб пераключыцца на прагляд календараПераключыцца ў рэжым уводу \"Тэкст\"Націсніце, каб пераключыцца на агляд годаСкасавацьОКПаказаць парольАчысціць тэкстНазадБакавая панэль + %d новое уведомление + %d новых уведомления + %d новых уведомлений + %d нового уведомления + Свернуть нижний экранРазвернуть нижний экранРазвернуть наполовинуДвойное нажатие на маркер перемещенияМаркер перемещенияВведено символов: %1$d из %2$dПревышено ограничение на количество символов (%1$d из %2$d)Очистить текстовое полеОшибка: недопустимое значениеОшибкаПоказать раскрывающееся менюЗначок диалогового окнаВкладкаВыберите AM (до полудня) или PM (после полудня)%1$s ч.Выберите час%1$s ч.Выберите минуты%1$s мин.AMЧтобы ввести время, перейдите в режим часов.ЧасМинутыPMВыбор времениЧтобы ввести время, перейдите в режим ввода текста.Новое уведомлениеФлажок установлен.Флажки установлены частично.Флажок не установлен.Удалить \"%1$s\"Новых уведомлений больше %1$dПерейти к следующему месяцуПерейти к предыдущему месяцуВыбранная дата начала: %1$s. Выбранная дата окончания: %2$s.Выбранный элемент: %1$sнетОтменаОК%1$sВыберите датуВыбранная дата%1$sДата окончания: %1$sНедействительный формат.Пример: %1$sИспользуйте: %1$sНедопустимый диапазон.Перейти к текущему году: %1$dПерейти к %1$d годуВне диапазона: %1$sДата начала – %1$s%1$s – дата окончания%1$s – %2$sВыберите диапазон датДата начала – дата окончанияСохранитьДата начала: %1$sДатаДата окончанияДата началадмгСегодня: %1$sПерейти в режим выбора днейНажмите, чтобы перейти к КалендарюПерейти в режим ввода текстаНажмите, чтобы выбрать годОтменаОКПоказать парольОчистить текстовое полеНазадБоковая панель + %d ново известување + %d нови известувања + Соберете го долниот листПроширете го долниот листПрошири до половинаРачката за влечење е допрена двапатиРачка за влечењеВнесени се %1$d од %2$d знациОграничувањето на знаците надмина %1$d од %2$dИзбриши го текстотГрешка: неважечкоГрешкаПрикажи паѓачко мениИкона за дијалогКартичкаИзберете претпладне или попладне%1$s часаИзберете час%1$s часотИзбери минути%1$s минутипр.Префрлете се на режимот за часовник за да внесете време.ЧасМинутапо.Изберете времеПрефрлете се на режимот за внесување текст за да внесете време.Ново известувањеШтиклираноДелумно штиклираноНе е штиклираноОтстрани %1$sНад %1$d нови известувањаПромени на следниот месецПромени на претходниот месецИзбор на датум на започнување: %1$s – Избор на датум на завршување: %2$sТековен избор: %1$sнемаОткажиВо ред%1$sИзберете датумИзбран датум%1$sКраен датум %1$sНеважечки формат.Пример: %1$sКористете: %1$sПогрешен опсег.Одете на тековната година: %1$dОди на %1$d годинаНадвор од опсег: %1$sПочетен датум - %1$s%1$s - краен датум%1$s - %2$sИзберете опсегПочетен датум - краен датумЗачувајПочетен датум %1$sДатумКраен датумПочетен датумдмгДенес: %1$sПрефрли на режим за внесување во календаротДопрете за да се префрлите на приказ на „Календар“Префрли на режим за внесување текстДопрете за да се префрлите на приказ на годинаОткажиВо редПрикажи ја лозинкатаБришење на текстотВраќање назадСтраничен лист + %d neue Benachrichtigung + %d neue Benachrichtigungen + Ansicht am unteren Rand minimierenAnsicht am unteren Rand maximierenZur Hälfte maximierenAuf Ziehpunkt doppelt getipptZiehpunktEingegebene Zeichen: %1$d von %2$dZeichenbeschränkung überschritten: %1$d/%2$dText löschenFehler: ungültigFehlerDrop-down-Menü anzeigenDialogfeldsymbolTabVormittags oder Nachmittags auswählen%1$s StundenStunde auswählen%1$s UhrMinuten auswählen%1$s MinutenAMIn den Uhrzeitmodus wechseln, um die Uhrzeit einzugeben.StundeMinutePMUhrzeit auswählenIn den Texteingabemodus wechseln, um die Uhrzeit einzugeben.Neue BenachrichtigungAktiviertTeilweise aktiviertNicht aktiviert%1$s entfernenMehr als %1$d neue BenachrichtigungenZum nächsten Monat wechselnZum vorherigen Monat wechselnAusgewähltes Startdatum: %1$s – Ausgewähltes Enddatum: %2$sAktuelle Auswahl: %1$sKeinesAbbrechenOK%1$sDatum auswählenAusgewähltes Datum%1$sEnddatum %1$sUngültiges Format.Beispiel: %1$sFormat: %1$sUngültiger Bereich.Zum aktuellen Jahr %1$d wechselnZum Jahr %1$d wechselnAußerhalb des Bereichs: %1$sStartdatum – %1$s%1$s – Enddatum%1$s – %2$sZeitraum auswählenStartdatum – EnddatumSpeichernStartdatum %1$sDatumEnddatumStartdatumTMJHeute %1$sIn den Kalendereingabemodus wechselnTippen, um zur Kalenderansicht zu wechselnIn den Texteingabemodus wechselnTippen, um zur Jahresansicht zu wechselnAbbrechenOKPasswort anzeigenText löschenZurückSeitenblatt + %d إشعار جديد + إشعار جديد واحد (%d) + إشعاران جديدان (%d) + %d إشعارات جديدة + %d إشعارًا جديدًا + %d إشعار جديد + تصغير البطاقة السفليةتوسيع البطاقة السفليةتوسيع البطاقة السفليةتم النقر مرّتين على مقبض السحب.مقبض السحبتمّ إدخال %1$d حرف من إجمالي %2$d.تجاوز عدد الأحرف المسموح به %1$d من %2$d.محو النصخطأ: غير صالحخطأعرض القائمة المنسدلةرمز مربع الحوارعلامة تبويبيُرجى اختيار صباحًا أو مساءً.%1$s ساعةتحديد الساعةالساعة %1$sتحديد الدقائق%1$s دقيقةصباحًايُرجى التبديل إلى وضع الساعة لإدخال الوقت.الساعةدقيقةمساءًاختيار الوقتيُرجى التبديل إلى وضع إدخال النص لإدخال الوقت.إشعار جديدتم وضع علامة في المربّعيجوز أنه تم وضع علامة في المربّعلم يتم وضع علامة في المربّعإزالة %1$sيبلغ عدد الإشعارات الجديدة أكثر من %1$d.التغيير إلى الشهر التاليالتغيير إلى الشهر السابقاختيار تاريخ البدء: %1$s – اختيار تاريخ الانتهاء: %2$sالاختيار الحالي: %1$sبلاإلغاءحسنًا%1$sيُرجى اختيار تاريخ.التاريخ المحدَّد%1$sتاريخ الانتهاء: %1$sالتنسيق غير صالحمثال: %1$sاستخدام: %1$sالنطاق غير صالحالانتقال إلى السنة الحالية %1$dالتنقل إلى العام %1$dخارج النطاق: %1$sتاريخ البدء – %1$s%1$s – تاريخ الانتهاء%1$s – %2$sيُرجى اختيار نطاق زمني.تاريخ البدء - تاريخ الانتهاءحفظتاريخ البدء: %1$sالتاريختاريخ الانتهاءتاريخ البدءيشساليوم %1$sالتبديل إلى وضع \"الإدخال في التقويم\"يمكنك النقر للتبديل إلى عرض \"تقويم Google\".التبديل إلى وضع \"إدخال النص\"يمكنك النقر للتبديل إلى عرض السنة.إلغاءحسنًاعرض كلمة المرورمحو النصرجوعورقة جانبية + %d notificación nueva + %d notificaciones nuevas + Contraer la hoja inferiorExpandir la hoja inferiorExpandir hasta la mitadEl control de arrastre se presionó dos vecesControlador de arrastreCaracteres ingresados: %1$d de %2$dSe excedió en %1$d el límite de caracteres de %2$dBorrar textoError: No válidoErrorMostrar menú desplegableÍcono de diálogoPestañaSelecciona a.m. o p.m.%1$s horasSeleccione la hora.%1$s en puntoSeleccionar minutos%1$s minutosa.m.Cambia al modo de reloj para ingresar la hora.HoraMinutop.m.Selecciona una horaCambia al modo de entrada de texto para ingresar la hora.Notificación nuevaMarcadaVerificado parcialmenteSin marcarQuitar %1$sMás de %1$d notificaciones nuevasCambiar al mes siguienteCambiar al mes anteriorSelección de fecha de inicio: %1$s – Selección de fecha de finalización: %2$sSelección actual: %1$snadaCancelarAceptar%1$sSelecciona una fechaFecha seleccionada%1$sFecha de finalización: %1$sFormato no válidoEjemplo: %1$sUsar: %1$sEl rango no es válido.Navegar al año actual (%1$d)Navegar al año %1$dFuera de rango: %1$sFecha de inicio - %1$s%1$s - fecha de finalización%1$s-%2$sSelecciona un períodoFecha de inicio - fecha de finalizaciónGuardarFecha de inicio: %1$sFechaFecha de finalizaciónFecha de iniciodmaHoy, %1$sCambiar al modo de entrada de calendarioPresiona para cambiar a la vista de CalendarioCambiar al modo de entrada de textoPresiona para cambiar a la vista de añoCancelarAceptarMostrar contraseñaBorrar textoAtrásHoja lateral + %d notificació nova + %d notificacions noves + Replega el full inferiorDesplega el full inferiorDesplega fins a la meitatHas fet doble toc a l\'ansa per arrossegarAnsa per arrossegarCaràcters introduïts: %1$d de %2$dS\'ha superat el límit de caràcters (%1$d de %2$d)Esborra el textError: no vàlidErrorMostra el menú desplegableIcona del quadre de diàlegTabuladorSelecciona a. m. o p. m.%1$s horesSeleccioneu l\'hora%1$s en puntSelecciona els minuts%1$s minutsa. m.Canvia al mode de rellotge per introduir l\'hora.HoraMinutp. m.Selecció de l\'horaCanvia al mode d\'introducció de text per introduir l\'hora.Notificació novaMarcatMarcat parcialmentDesmarcatSuprimeix %1$sMés de %1$d notificacions novesCanvia al mes següentCanvia al mes anteriorSelecció de la data d\'inici: %1$s – Selecció de la data de finalització: %2$sSelecció actual: %1$scapCancel·laD’acord%1$sSelecciona una dataData seleccionada%1$sData de finalització: %1$sEl format no és vàlid.Exemple: %1$sUtilitza: %1$sL\'interval no és vàlid.Navega fins a l\'any actual %1$dCanvia a l\'any %1$dLa data està fora de l\'interval: %1$sData d\'inici - %1$s%1$s - data de finalització%1$s - %2$sSelecciona un intervalData d\'inici - data de finalitzacióDesaData d\'inici: %1$sDataData de finalitzacióData d\'inicidmaAvui, dia %1$sCanvia al mode d\'introducció de dades del calendariToca per canviar a la visualització de calendariCanvia al mode d\'introducció de textToca per canviar a la visualització d\'anyCancel·laD’acordMostra la contrasenyaEsborra el textEnrerePanell lateral + %d нове сповіщення + %d нові сповіщення + %d нових сповіщень + %d нового сповіщення + Згорнути нижній екранРозгорнути нижній екранРозгорнути нижню половинуМаркер переміщення активовано подвійним дотикомМаркер переміщенняВведено символів: %1$d з %2$dПеревищено ліміт символів: %1$d з %2$dВидалити текстПомилка: недійсне значенняПомилкаПоказати спадне менюЗначок вікнаВкладкаВиберіть ДП чи ПП%1$s годВибрати годину%1$s годВиберіть хвилини%1$s хвдпПерейти в режим годинника, щоб ввести час.ГодинаХвилинаппВиберіть часПерейти в текстовий режим, щоб ввести час.Нове сповіщенняВибраноЧастково вибраноНе вибраноВидалити %1$sНових сповіщень більше ніж %1$dПерейти до наступного місяцяПерейти до попереднього місяцяВибрана дата початку – %1$s; вибрана дата завершення – %2$sПоточний вибір: %1$sнемаєСкасуватиOK%1$sВиберіть датуВибрана дата%1$sДата завершення: %1$sНедійсний формат.Приклад: %1$sПотрібний формат: %1$sНедійсний діапазон.Перейти до поточного року: %1$dПерейти до %1$d рокуЗа межами діапазону: %1$sДата початку – %1$s%1$s – дата завершення%1$s – %2$sВиберіть діапазон датДата початку – дата завершенняЗберегтиДата початку: %1$sДатаДата завершенняДата початкудмрСьогодні: %1$sПерейти в режим введення в календаріНатисніть, щоб перейти до перегляду календаряПерейти в режим введення текстуНатисніть, щоб перейти до перегляду рокуСкасуватиOKПоказувати парольВидалити текстНазадБічна панель8dp + %d కొత్త నోటిఫికేషన్ + %d కొత్త నోటిఫికేషన్‌లు + దిగువున ఉన్న షీట్‌ను కుదిస్తుందిదిగువున ఉన్న షీట్‌ను విస్తరిస్తుందిసగాన్ని విస్తరింపజేయండిలాగే హ్యాండిల్ డబుల్-ట్యాప్ చేయబడిందిలాగే హ్యాండిల్%2$dలో %1$d అక్షరాలు నమోదు చేయబడ్డాయిఅక్షర పరిధి %2$dలో %1$dను అధిగమించిందిరాసినదాన్ని తీసివేయండిఎర్రర్: చెల్లదుఎర్రర్డ్రాప్‌డౌన్ మెనూను చూపుడైలాగ్ చిహ్నంట్యాబ్AM లేదా PMను ఎంచుకోండి%1$s గంటలుగంటను ఎంచుకోండి%1$s అవుతుందినిమిషాలను ఎంచుకోండి%1$s నిమిషాలుAMసమయాన్ని నమోదు చేయడం కోసం గడియారం మోడ్‌కు మారండి.గంటనిమిషంPMసమయాన్ని ఎంచుకోండిసమయాన్ని నమోదు చేయడం కోసం వచన నమోదు మోడ్‌కి మారండి.కొత్త నోటిఫికేషన్ఎంచుకోబడిందిపాక్షికంగా ఎంచుకోబడిందిఎంచుకోబడలేదు(%1$s)ని తీసివేస్తుంది%1$d కంటే ఎక్కువ కొత్త నోటిఫికేషన్‌లువచ్చే నెలకు మార్చుతుందిమునుపటి నెలకు మార్చుతుందిప్రారంభ తేదీ ఎంపిక: %1$s – ముగింపు తేదీ ఎంపిక: %2$sప్రస్తుత ఎంపిక: %1$sఏదీ వద్దురద్దు చేయండిసరే%1$sతేదీని ఎంచుకోండిఎంచుకున్న తేది%1$sముగింపు తేదీ %1$sఫార్మాట్ చెల్లదు.ఉదాహరణ: %1$sఇలా ఉపయోగించండి: %1$sచెల్లని పరిధి.ప్రస్తుత సంవత్సరానికి %1$d నావిగేట్ చేయండి%1$dసంవత్సరానికి నావిగేట్ చేస్తుందిపరిధి వెలుపల ఉంది: %1$sప్రారంభ తేదీ – %1$s%1$s – ముగింపు తేది%1$s – %2$sపరిధిని ఎంచుకోండిప్రారంభ తేది - ముగింపు తేదిసేవ్ చేయండిప్రారంభ తేదీ %1$sతేదీముగింపు తేదీప్రారంభ తేదీరోనెసంఈరోజు %1$sక్యాలెండర్ ఇన్‌పుట్ మోడ్‌కు మారుస్తుందిక్యాలెండర్ వీక్షణకు మారడానికి ట్యాప్ చేయండివచన ఇన్‌పుట్ మోడ్‌కు మారుస్తుందిసంవత్సర వీక్షణకు మారడానికి ట్యాప్ చేయండిరద్దు చేయండిసరేపాస్‌వర్డ్‌ను చూపుటెక్స్ట్‌ను క్లియర్ చేయండివెనుకకుసైడ్ షీట్ + %d bagong notification + %d na bagong notification + I-collapse ang bottom sheetI-expand ang bottom sheetI-expand hanggang gitnaNa-double tap ang handle sa pag-dragI-drag ang handleMga character na nailagay %1$d sa %2$dLumampas sa limitasyon sa bilang ng character %1$d sa %2$dI-clear ang textError: invalidErrorIpakita ang dropdown na menuIcon ng DialogTabPiliin ang AM o PM%1$s (na) orasPumili ng oras%1$s o\'clockPumili ng mga minuto%1$s (na) minutoAMLumipat sa mode ng orasan para sa input na oras.OrasMinutoPMPumili ng orasLumipat sa pamamaraan ng pag-input ng text para sa input na oras.Bagong notificationMay checkBahagyang may checkWalang checkAlisin ang %1$sMahigit %1$d (na) bagong notificationLumipat sa susunod na buwanLumipat sa nakaraang buwanNapiling petsa ng pagsisimula: %1$s – Napiling petsa ng pagtatapos: %2$sKasalukuyang seleksyon: %1$swalaKanselahinOK%1$sPumili ng PetsaPiniling petsa%1$sPetsa ng pagtatapos %1$sInvalid na format.Halimbawa: %1$sGamitin: %1$sInvalid na hanay.Mag-navigate sa kasalukuyang taon %1$dMag-navigate patungo sa taong %1$dWala sa sakop: %1$sPetsa ng pagsisimula – %1$s%1$s – Petsa ng pagtatapos%1$s – %2$sPumili ng RangePetsa ng pagsisimula – Petsa ng pagtataposI-savePetsa ng pagsisimula %1$sPetsaPetsa ng pagtataposPetsa ng pagsisimuladmyNgayon %1$sLumipat sa pamamaraan ng pag-input ng kalendaryoI-tap para lumipat sa view ng KalendaryoLumipat sa pamamaraan ng pag-input ng textI-tap para lumipat sa view ng taonKanselahinOKIpakita ang passwordI-clear ang textBumalikSide Sheet + %d new notification + %d new notifications + Collapse the bottom sheetExpand the bottom sheetExpand halfwayDrag handle double-tappedDrag handle%2$d ର %1$d ଅକ୍ଷର ଲେଖିଛନ୍ତି%2$d ର %1$d ଅକ୍ଷର ଲେଖିଛନ୍ତିClear textError: invalidErrorShow dropdown menuDialog IconTabSelect AM or PM%1$s hoursSelect hour%1$s o\'clockମିନିଟ୍‍ ଚୟନ କରନ୍ତୁ%1$s minutesAMସମୟ ଇନପୁଟ୍‍ ପାଇଁ ଘଣ୍ଟା ମୋଡ୍‌କୁ ବଦଳାନ୍ତୁ।HourMinutePMSelect timeସମୟ ଇନପୁଟ୍‍ ପାଇଁ ଟେକ୍ସଟ୍‍ ଇନପୁଟ୍‌କୁ ବଦଳାନ୍ତୁ।New notificationCheckedPartially checkedNot checked%1$s କାଢ଼ିଦିଅନ୍ତୁMore than %1$d new notificationsChange to next monthChange to previous monthStart date selection: %1$s – End date selection: %2$sCurrent selection: %1$snoneCancelOK%1$sSelect DateSelected date%1$sEnd date %1$sInvalid format.Example: %1$sUse: %1$sInvalid range.Navigate to current year %1$dNavigate to year %1$dOut of range: %1$sStart date – %1$s%1$s – End date%1$s – %2$sSelect RangeStart date – End dateSaveStart date %1$sDateEnd dateStart datedmyToday %1$sSwitch to calendar input modeTap to switch to Calendar viewSwitch to text input modeTap to switch to year viewCancelOKପାସ୍‍ୱାର୍ଡ ଦେଖାନ୍ତୁClear textBackSide Sheet + %d 個新通知 + %d 個新通知 + 收合頁底面板展開頁底面板展開一半㩒咗兩下拖曳控點拖曳控點已輸入 %1$d 個字元 (共 %2$d 個)超出字元限制 %1$d 個字元 (上限 %2$d 個字元)清除文字錯誤:冇效錯誤顯示下拉式選單對話框圖示分頁選擇上午或下午%1$s 個鐘選取時段%1$s 點選取分鐘%1$s 分AM切換至時鐘模式即可輸入時間。小時分鐘PM選取時間切換至文字輸入模式即可輸入時間。新通知已勾選已勾選部分未勾選移除「%1$s」超過 %1$d 則新通知變更為下個月變更為上個月開始日期選項:%1$s – 結束日期選項:%2$s目前選取:%1$s取消確定%1$s請選擇日期所選日期%1$s結束日期係 %1$s格式無效。例如:%1$s使用:%1$s範圍無效。去今個年度 %1$d瀏覽至 %1$d 年超出範圍:%1$s開始日期 – %1$s%1$s – 結束日期%1$s – %2$s請選擇範圍開始日期 – 結束日期儲存開始日期係 %1$s日期結束日期開始日期今日 %1$s切換至日曆輸入模式㩒一下就可以切換去日曆檢視模式切換至文字輸入模式㩒一下就可以切換去按年檢視模式取消確定顯示密碼清除文字返回側邊工作表 + %d шинэ мэдэгдэл + %d шинэ мэдэгдэл + Доод хүснэгтийг хураахДоод хүснэгтийг дэлгэхХагас дэлгэнэ үүЧирэх бариулыг хоёр товшихЧирэх бариул%2$d-н %1$d тэмдэгтийг оруулсанТэмдэгтийн хязгаар %2$d-н %1$d-с хэтэрсэнТекстийг арилгахАлдаа: хүчингүйАлдааДоош унадаг цэсийг харуулахХарилцах цонхны дүрс тэмдэгТабҮӨ эсвэл ҮХ сонгоно уу%1$s цагЦаг сонгох%1$s цагМинут сонгоно уу%1$s минутAMЦагийг оруулахын тулд цагийн горимд шилжүүлнэ үү.ЦагМинутPMЦаг сонгохЦагийг оруулахын тулд текст оруулах горимд шилжүүлнэ үү.Шинэ мэдэгдэлТэмдэглэсэнХэсэгчлэн тэмдэглэсэнТэмдэглээгүй%1$s-г устгах%1$d-с олон шинэ мэдэгдэлДараагийн сар луу өөрчлөхӨмнөх сар луу өөрчлөхЭхлэх огнооны сонголт: %1$s – Дуусах огнооны сонголт: %2$sОдоогийн сонголт: %1$sбайхгүйЦуцлахOK%1$sОгноо сонгохСонгосон огноо%1$sДуусах огноо %1$sБуруу формат байна.Жишээ нь: %1$sАшиглах формат: %1$sОгнооны хязгаар буруу байна.Одоогийн %1$d он руу шилжих%1$d он руу шилжихХязгаараас хэтэрсэн: %1$sЭхлэх огноо – %1$s%1$s – Дуусах огноо%1$s – %2$sМуж сонгохЭхлэх огноо – Дуусах огнооХадгалахЭхлэх огноо %1$sОгнооДуусах огнооЭхлэх огнооөсжӨнөөдөр %1$sКалендарийн орох горим руу сэлгэхКалендариар харуулах руу сэлгэхийн тулд товшино ууТекстийн орох горим руу сэлгэхЖилээр нь харуулах руу сэлгэхийн тулд товшино ууЦуцлахOKНууц үгийг харуулахТекстийг арилгахБуцахХажуугийн хүснэгт + නව දැනුම්දීම් %dක් + නව දැනුම්දීම් %dක් + පහළම පත්‍රය හකුළන්නපහළම පත්‍රය දිග හරින්නඅඩක් දිග හරින්නඇදීම් හැඬලය දෙවරක් තට්ටු කර ඇතහැඬලය අදින්නඅනුලකුණු %2$dන් %1$dක් ඇතුළු කෙරිණිඅනුලකුණු සීමාව %2$dකින් %1$d ඉක්ම වියපෙළ හිස් කරන්නදෝෂය: වලංගු නැතදෝෂයපතන මෙනුව පෙන්වන්නසංවාද නිරූපකයටැබයපෙරවරු හෝ පස්වරු තෝරන්නපැය %1$sක්පැය තෝරන්න%1$sයිමිනිත්තු තෝරන්නමිනිත්තු %1$sයිපෙවවේලා ආදානය සඳහා ඔරලෝසු ප්‍රකාරය වෙත මාරු වෙන්න.පැයමිනිත්තුපවවේලාව තෝරන්නවේලා ආදානය සඳහා ආදාන ප්‍රකාරය වෙත මාරු වෙන්න.නව දැනුම්දීමසලකුණු කරන ලදිඅඩ වශයෙන් ලකුණු කළහරි ලකුණ නොයෙදූ%1$s ඉවත් කරන්නනව දැනුම්දීම් %1$dකට වඩාලබන මාසයට වෙනස් කරන්නකලින් මාසයට වෙනස් කරන්නආරම්භක දිනය තේරීම: %1$s – අවසාන දිනය තේරීම: %2$sවත්මන් තේරීම: %1$sකිසිවක් නැතඅවලංගු කරන්නහරි%1$sදිනය තෝරන්නතේරූ දිනය%1$sඅවසාන දිනය %1$sඅවලංගු ආකෘතියකි.උදාහරණය: %1$sභාවිතය: %1$sඅවලංගු පරාසයකි.වත්මන් වර්ෂය %1$d වෙත සංචාලනය කරන්න%1$d වසරට සංචාලනය කරන්නපරාසයෙන් පිටත: %1$sආරම්භක දිනය – %1$s%1$s – නිමා වන දිනය%1$s – %2$sපරාසය තෝරන්නආරම්භක දිනය – නිමා වන දිනයසුරකින්නආරම්භක දිනය %1$sදිනයනිමා වන දිනයආරම්භක දිනයඅද %1$sදින දර්ශන ආදාන ප්‍රකාරයට මාරු වන්නදින දර්ශන දසුන වෙත මාරු වීමට තට්ටු කරන්නපෙළ ආදාන ප්‍රකාරයට මාරු වන්නවසරේ දසුන වෙත මාරු වීමට තට්ටු කරන්නඅවලංගු කරන්නහරිමුරපදය පෙන්වන්නපෙළ හිස් කරන්නආපසුපැති පත්‍රය + ការជូនដំណឹងថ្មី %d + ការជូនដំណឹងថ្មី %d + បង្រួមសន្លឹក​ខាងក្រោមពង្រីកសន្លឹក​ខាងក្រោមពង្រីក​ពាក់កណ្ដាលបានប៉ះដង​អូស​ពីរដងដង​អូសតួ​អក្សរ​បាន​បញ្ចូល​ %1$d នៃ %2$dដែនកំណត់តួអក្សរបានលើស %1$d នៃ %2$dសម្អាតអក្សរបញ្ហា៖ មិនត្រឹមត្រូវបញ្ហាបង្ហាញ​ម៉ឺនុយ​ធ្លាក់ចុះរូប​ប្រអប់បញ្ចូលផ្ទាំងជ្រើសរើស AM ឬ PM%1$s ម៉ោងជ្រើសរើសម៉ោងម៉ោង %1$sជ្រើស​នាទី%1$s នាទីព្រឹកប្តូរ​ទៅ​មុខងារ​នាឡិកា​សម្រាប់​ការ​បញ្ចូល​ម៉ោង។ម៉ោងនាទី​ល្ងាចជ្រើស​ម៉ោងប្តូរ​ទៅ​មុខងារ​បញ្ចូល​អក្សរ​សម្រាប់​ការ​បញ្ចូល​ម៉ោង។ការជូនដំណឹងថ្មីបាន​ធីកបានធីកខ្លះមិន​បាន​ធីកលុប %1$sការជូនដំណឹង​ថ្មីៗ​លើស %1$d ហើយប្ដូរ​ទៅ​ខែបន្ទាប់ប្ដូរ​ទៅ​ខែមុនការជ្រើសរើស​កាលបរិច្ឆេទចាប់ផ្ដើម៖ %1$s – ការជ្រើសរើស​កាលបរិច្ឆេទបញ្ចប់៖ %2$sការជ្រើសរើស​បច្ចុប្បន្ន៖ %1$sគ្មានបោះ​បង់យល់ព្រម%1$sជ្រើសរើស​កាល​បរិច្ឆេទកាលបរិច្ឆេទដែលបាន​ជ្រើសរើស%1$sកាលបរិច្ឆេទ​បញ្ចប់ %1$sទម្រង់មិន​ត្រឹមត្រូវទេ។ឧទាហរណ៍៖ %1$sប្រើ៖ %1$sជួរ​មិនត្រឹមត្រូវទេ។រុករក​ទៅកាន់​ឆ្នាំបច្ចុប្បន្ន %1$dប្ដូរទៅ​ឆ្នាំ %1$dនៅក្រៅ​ចន្លោះ៖ %1$sកាលបរិច្ឆេទ​ចាប់ផ្ដើម – %1$s%1$s – កាលបរិច្ឆេទ​បញ្ចប់%1$s – %2$sជ្រើស​រើស​ចន្លោះកាលបរិច្ឆេទ​ចាប់ផ្ដើម – កាលបរិច្ឆេទ​បញ្ចប់រក្សាទុកកាលបរិច្ឆេទ​ចាប់ផ្ដើម %1$sកាលបរិច្ឆេទកាល​បរិច្ឆេទ​បញ្ចប់កាល​បរិច្ឆេទ​ចាប់ផ្ដើមថ្ងៃនេះ %1$sប្ដូរទៅ​របៀប​បញ្ចូល​ប្រតិទិនចុច ដើម្បីប្ដូរទៅទិដ្ឋភាពប្រតិទិនប្ដូរទៅ​របៀប​បញ្ចូល​អក្សរចុច ដើម្បីប្ដូរទៅទិដ្ឋភាពឆ្នាំបោះបង់យល់ព្រមបង្ហាញពាក្យសម្ងាត់សម្អាតអក្សរថយក្រោយសន្លឹកចំហៀង4dp18dp40dp2dp2dp40dp40dp4dp + %d notificación nueva + %d notificaciones nuevas + Contraer la hoja inferiorExpandir la hoja inferiorExpandir hasta la mitadEl control de arrastre se presionó dos vecesControlador de arrastreCaracteres ingresados: %1$d de %2$dSe excedió en %1$d el límite de caracteres de %2$dBorrar textoError: No válidoErrorMostrar menú desplegableÍcono de diálogoPestañaSelecciona a.m. o p.m.%1$s horasSeleccione la hora.%1$s en puntoSeleccionar minutos%1$s minutosa.m.Cambia al modo de reloj para ingresar la hora.HoraMinutop.m.Selecciona una horaCambia al modo de entrada de texto para ingresar la hora.Notificación nuevaMarcadaVerificado parcialmenteSin marcarQuitar %1$sMás de %1$d notificaciones nuevasCambiar al mes siguienteCambiar al mes anteriorSelección de fecha de inicio: %1$s – Selección de fecha de finalización: %2$sSelección actual: %1$snadaCancelarAceptar%1$sSelecciona una fechaFecha seleccionada%1$sFecha de finalización: %1$sFormato no válidoEjemplo: %1$sUsar: %1$sEl rango no es válido.Navegar al año actual (%1$d)Navegar al año %1$dFuera de rango: %1$sFecha de inicio - %1$s%1$s - fecha de finalización%1$s-%2$sSelecciona un períodoFecha de inicio - fecha de finalizaciónGuardarFecha de inicio: %1$sFechaFecha de finalizaciónFecha de iniciodmaHoy, %1$sCambiar al modo de entrada de calendarioPresiona para cambiar a la vista de CalendarioCambiar al modo de entrada de textoPresiona para cambiar a la vista de añoCancelarAceptarMostrar contraseñaBorrar textoAtrásHoja lateral@android:color/system_background_dark@android:color/system_error_dark@android:color/system_error_container_dark@android:color/system_on_surface_light@android:color/system_primary_light@android:color/system_surface_light@android:color/system_on_background_dark@android:color/system_on_error_dark@android:color/system_on_error_container_dark@android:color/system_on_primary_dark@android:color/system_on_primary_container_dark@android:color/system_on_secondary_dark@android:color/system_on_secondary_container_dark@android:color/system_on_surface_dark@android:color/system_on_surface_variant_dark@android:color/system_on_tertiary_dark@android:color/system_on_tertiary_container_dark@android:color/system_outline_dark@android:color/system_outline_variant_dark@android:color/system_primary_dark@android:color/system_primary_container_dark@android:color/system_secondary_dark@android:color/system_secondary_container_dark@android:color/system_surface_dark@android:color/system_surface_bright_dark@android:color/system_surface_container_dark@android:color/system_surface_container_high_dark@android:color/system_surface_container_highest_dark@android:color/system_surface_container_low_dark@android:color/system_surface_container_lowest_dark@android:color/system_surface_dim_dark@android:color/system_surface_variant_dark@android:color/system_tertiary_dark@android:color/system_tertiary_container_dark@android:color/system_background_light@android:color/system_error_light@android:color/system_error_container_light@android:color/system_on_surface_dark@android:color/system_primary_dark@android:color/system_surface_dark@android:color/system_on_background_light@android:color/system_on_error_light@android:color/system_on_error_container_light@android:color/system_on_primary_light@android:color/system_on_primary_container_light@android:color/system_on_secondary_light@android:color/system_on_secondary_container_light@android:color/system_on_surface_light@android:color/system_on_surface_variant_light@android:color/system_on_tertiary_light@android:color/system_on_tertiary_container_light@android:color/system_outline_light@android:color/system_outline_variant_light@android:color/system_primary_light@android:color/system_primary_container_light@android:color/system_secondary_light@android:color/system_secondary_container_light@android:color/system_surface_light@android:color/system_surface_bright_light@android:color/system_surface_container_light@android:color/system_surface_container_high_light@android:color/system_surface_container_highest_light@android:color/system_surface_container_low_light@android:color/system_surface_container_lowest_light@android:color/system_surface_dim_light@android:color/system_surface_variant_light@android:color/system_tertiary_light@android:color/system_tertiary_container_light@android:color/system_on_primary_fixed@android:color/system_on_primary_fixed_variant@android:color/system_on_secondary_fixed@android:color/system_on_secondary_fixed_variant@android:color/system_on_tertiary_fixed@android:color/system_on_tertiary_fixed_variant@android:color/system_primary_fixed@android:color/system_primary_fixed_dim@android:color/system_secondary_fixed@android:color/system_secondary_fixed_dim@android:color/system_tertiary_fixed@android:color/system_tertiary_fixed_dim@color/m3_sys_color_dynamic_dark_error@color/m3_sys_color_dynamic_dark_error_container@color/m3_sys_color_dynamic_dark_on_error@color/m3_sys_color_dynamic_dark_on_error_container@color/m3_sys_color_dynamic_light_error@color/m3_sys_color_dynamic_light_error_container@color/m3_sys_color_dynamic_light_on_error@color/m3_sys_color_dynamic_light_on_error_container + %d uus märguanne + %d uut märguannet + Alumise lehe ahendamineAlumise lehe laiendamineLaiendamine poolenistiLohistamispidet topeltpuudutatiLohistamispideSisestatud tähemärgid: %1$d/%2$dTähemärgipiirang on ületatud: %1$d/%2$dKustuta tekstViga: sobimatuVigaKuva rippmenüüDialoogi ikoonVahelehtValige AM või PM%1$s tundiValige tundKell %1$sMinutite valimine%1$s minutitAMAktiveerige kellaaja sisestamiseks kellarežiim.TunnidMinutPMAja valimineAktiveerige kellaaja sisestamiseks tekstisisestusrežiim.Uus märguanneMärgitudOsaliselt märgitudMärkimataÜksuse %1$s eemaldamineRohkem kui %1$d uut märguannetVaheta järgmisele kuuleVaheta eelmisele kuuleAlguskuupäeva valik: %1$s. Lõppkuupäeva valik: %2$s.Praegune valik: %1$spuudubTühistaOK%1$sValige kuupäevValitud kuupäev%1$sLõppkuupäev: %1$sSobimatu vorming.Näide: %1$sKasutage: %1$sSobimatu vahemik.Navigeerige praegusele aastale %1$dMine aastasse %1$dVahemikust väljas: %1$sAlguskuupäev – %1$s%1$s – lõppkuupäev%1$s – %2$sValige vahemikAlguskuupäev – lõppkuupäevSalvestaAlguskuupäev: %1$sKuupäevLõppkuupäevAlguskuupäevpkaTäna %1$sLülitu kalendrisisestusrežiimilePuudutage kalendrivaatele lülitumiseksLülitu tekstisisestusrežiimilePuudutage aastavaatele lülitumiseksTühistaOKParooli kuvamineTeksti kustutamineTagasiKülgmine leht + %d nytt varsel + %d nye varsler + Skjul feltet nederstVis feltet nederstVis halve feltet nederstDobbelttrykket på håndtaketHåndtak%1$d av %2$d tegn er skrevet innTegngrensen er overskredet – %1$d av %2$dFjern tekstenFeil: ugyldigFeilVis rullegardinmenyenDialogboksikonFaneVelg AM eller PM%1$s timerVelg time%1$s null-nullAngi minutter%1$s minutterAMBytt til klokkemodus for tidsinndata.TimeMinuttPMVelg tidspunktBytt til tekstinndatamodus for tidsinndata.Nytt varselAvmerketDelvis avmerketIkke avmerketFjern %1$sFlere enn %1$d nye varslerEndre til neste månedEndre til forrige månedValg av startdato: %1$s – valg av sluttdato: %2$sGjeldende valg: %1$singenAvbrytOK%1$sVelg datoValgt dato%1$sSluttdato %1$sUgyldig format.Eksempel: %1$sBruk: %1$sUgyldig område.Gå til dette året %1$dNaviger til år %1$dUtenfor rekkevidde: %1$sStartdato – %1$s%1$s – sluttdato%1$s–%2$sVelg periodeStartdato–sluttdatoLagreStartdato %1$sDatoSluttdatoStartdatodmåI dag %1$sBytt til kalenderinndatamodusTrykk for å bytte til kalendervisningenBytt til tekstinndatamodusTrykk for å bytte til årsvisningenAvbrytOKVis passordetFjern tekstenTilbakeSideark + %d nové oznámení + %d nová oznámení + %d nového oznámení + %d nových oznámení + Sbalit spodní tabulkuRozbalit spodní tabulkuRozbalit napůlDvakrát jste klepli na úchyt pro přetaženíÚchyt pro přetaženíZadané znaky: %1$d z %2$dByl překročen povolený počet znaků (%1$d z %2$d)Vymazat textChyba: neplatnéChybaZobrazit rozbalovací nabídkuIkona dialogového oknaKartaVyberte AM nebo PM%1$s hodinVyberte hodinu%1$sZvolte minuty%1$s minAMChcete-li zadat čas, přepněte na režim hodin.HodinaMinutaPMVyberte časChcete-li zadat čas, přepněte na režim textu.Nové oznámeníZaškrtnutoČástečně zaškrtnutoNezaškrtnutoOdstranit položku %1$sVíce než %1$d nových oznámeníPřejít na další měsícPřejít na předchozí měsícVýběr data zahájení: %1$s – Výběr data ukončení: %2$sAktuální výběr: %1$sprázdnéZrušitOK%1$sVyberte datumVybrané datum%1$sDatum ukončení %1$sNeplatný formát.Příklad: %1$sPoužijte: %1$sNeplatný rozsah.Přejít na aktuální rok %1$dPřejít na rok %1$dMimo rozsah: %1$sDatum zahájení – %1$s%1$s – datum ukončení%1$s – %2$sVyberte rozsahDatum zahájení – datum ukončeníUložitDatum zahájení %1$sDatumDatum ukončeníDatum zahájenídmrDnes %1$sPřepnout na režim zadávání do kalendářeKlepnutím přepnete na zobrazení kalendářePřepnout na režim zadávání textuKlepnutím přepnete na zobrazení jednotlivých letZrušitOKZobrazit hesloVymazat textZpětPostranní list + %d አዲስ ማሳወቂያዎች + %d አዲስ ማሳወቂያዎች + የግርጌ ሉሁን ይሰብስቡየግርጌ ሉሁን ይዘርጉግማሽ መንገድ ዘርጋመያዣ ይጎትቱ ሁለቴ መታ ተደርጓልመያዣ ይጎትቱቁምፊዎች %1$d ከ%2$d ገብተዋልየቁምፊ ገደብ %1$d ከ%2$d አልፏልጽሑፍን አጽዳስህተት፦ ልክ ያልሆነስህተትተቆልቋይ ምናሌን አሳይየንግግር አዶትርAM ወይም PM ይምረጡ%1$s ሰዓታትሰዓትን ይምረጡ%1$s ሰዓትደቂቃዎችን ይምረጡ%1$s ደቂቃዎችጥዋትለጊዜ ግቤቱ ወደ የሰዓት ሁነታ ቀይር።ሰዓትደቂቃከሰዓትጊዜ ምረጥለጊዜ ግቤቱ ወደ የጽሑፍ ግቤት ሁነታ ቀይር።አዲስ ማሳወቂያምልክት ተደርጎበታልበከፊል ምልክት ተደርጎበታልምልክት አልተደረገበትም%1$sን አስወግድከ%1$d በላይ አዲስ ማሳወቂያዎችወደ የሚቀጥለው ወር ቀይርወደ ቀዳሚው ወር ቀይርየመጀመሪያ ቀን ምርጫ፦ %1$s – የማብቂያ ቀን ምርጫ፦ %2$sየአሁኑ ምርጫ፦ %1$sምንምይቅርእሺ%1$sቀን ይምረጡየተመረጠው ቀን%1$sየማብቂያ ቀን %1$sልክ ያልሆነ ቅርጸትምሳሌ፦ %1$s%1$s ን ይጠቀሙልክ ያልኾነ ክልል።ወደ የአሁኑ ዓመት %1$d አስስወደ ዓመት %1$d አሰስከክልል ውጭ፦ %1$sመጀመሪያ ቀን – %1$s%1$s – መጨረሻ ቀን%1$s – %2$sክልል ይምረጡየመጀመሪያ ቀን – የመጨረሻ ቀንአስቀምጥየመጀመሪያ ቀን %1$sቀንየማብቂያ ቀንመጀመሪያ ቀንዛሬ %1$sወደ የቀን መቁጠሪያ ግቤት ሁነታ ቀይርወደ የቀን መቁጠሪያ ዕይታ ለመቀየር መታ ያድርጉወደ ጽሁፍ ግቤት ሁነታ ቀይርወደ የዓመት ዕይታ ለመቀየር መታ ያድርጉይቅርእሺየይለፍ ቃል አሳይጽሁፍን አጽዳተመለስየጎን ሉህ + %d νέα ειδοποίηση + %d νέες ειδοποιήσεις + Σύμπτυξη του φύλλου κάτω μέρουςΑνάπτυξη του φύλλου κάτω μέρουςΑνάπτυξη μέχρι τη μέσηΗ λαβή μεταφοράς πατήθηκε δύο φορέςΛαβή μεταφοράςΕισήχθησαν %1$d από %2$d χαρακτήρεςΥπέρβαση ορίου χαρακτήρων %1$d από %2$dΔιαγραφή κειμένουΣφάλμα: μη έγκυροΣφάλμαΕμφάνιση αναπτυσσόμενου μενούΕικονίδιο παραθύρου διαλόγουΚαρτέλαΕπιλέξτε π.μ. ή μ.μ.%1$s ώρεςΕπιλογή ώρας%1$s ακριβώςΕπιλογή λεπτών%1$s λεπτάΠΜΚάντε εναλλαγή στη λειτουργία ρολογιού, για την εισαγωγή της ώρας.ΏραΛεπτόΜΜΕπιλέξτε ώραΚάντε εναλλαγή στη λειτουργία εισαγωγής κειμένου, για την εισαγωγή της ώρας.Νέα ειδοποίησηΕπιλεγμένοΈγινε μερικός έλεγχοςΜη επιλεγμένοΚατάργηση %1$sΠάνω από %1$d νέες ειδοποιήσειςΑλλαγή στον επόμενο μήναΑλλαγή στον προηγούμενο μήναΕπιλογή ημερομηνίας έναρξης: %1$s – Επιλογή ημερομηνίας λήξης: %2$sΤρέχουσα επιλογή: %1$sχωρίς επιλογήΑκύρωσηΟΚ%1$sΕπιλογή ημερομηνίαςΕπιλεγμένη ημερομηνία%1$sΗμερομηνία λήξης %1$sΜη έγκυρη μορφή.Παράδειγμα: %1$sΧρησιμοποιήστε: %1$sΜη έγκυρο εύρος.Πλοήγηση στο τρέχον έτος %1$dΠλοήγηση στο έτος %1$dΕκτός εύρους: %1$sΗμερομηνία έναρξης – %1$s%1$s – Ημερομηνία λήξης%1$s – %2$sΕπιλογή εύρουςΗμερομηνία έναρξης – Ημερομηνία λήξηςΑποθήκευσηΗμερομηνία έναρξης %1$sΗμερομηνίαΗμερομηνία λήξηςΗμερομηνία έναρξηςημεΣήμερα %1$sΕναλλαγή στη λειτουργία εισαγωγής ημερολογίουΠατήστε για εναλλαγή στην προβολή ΗμερολόγιοΕναλλαγή στη λειτουργία εισαγωγής κειμένουΠατήστε για εναλλαγή στην προβολή έτουςΑκύρωσηΟΚΕμφάνιση κωδικού πρόσβασηςΔιαγραφή κειμένουΠίσωΔευτερεύον φύλλο + %d नई सूचनाएं + %d नई सूचनाएं + बॉटम शीट को छोटा करेंबॉटम शीट को बड़ा करेंपूरी तरह बड़ा करेंखींचकर छोड़ने वाले हैंडल पर दो बार टैप किया गयाखींचकर छोड़ने वाला हैंडल%2$d वर्णों में से %1$d वर्ण दर्ज किए गएअभी %1$d वर्ण हैं जबकि %2$d से ज़्यादा नहीं होने चाहिएटेक्स्ट मिटाएंगड़बड़ी: यह अमान्य हैगड़बड़ीड्रॉपडाउन मेन्यू दिखाएंडायलॉग का आइकॉनटैबAM या PM चुनें%1$s घंटेघंटा चुनें%1$s बजेमिनट चुनें%1$s मिनटपूर्वाह्नसमय इनपुट के लिए घड़ी मोड पर जाएं.घंटामिनटअपराह्नसमय चुनेंसमय इनपुट के लिए लेख इनपुट मोड पर जाएं.नई सूचनासही का निशान लगाया गयाकुछ विकल्प चुने गएसही का निशान नहीं लगाया गया%1$s हटाएं%1$d से ज़्यादा नई सूचनाएंअगले महीने पर जाएंपिछले महीने पर जाएंशुरू होने की तारीख चुनें: %1$s – खत्म होने की तारीख चुनें: %2$sफ़िलहाल, यह चुना गया है: %1$sकोई भी तारीख नहीं चुनी गईरद्द करेंठीक है%1$sतारीख चुनेंचुनी गई तारीख%1$sखत्म होने की तारीख %1$sगलत फ़ॉर्मैट.उदाहरण: %1$s%1$s का इस्तेमाल करेंतारीखों की अमान्य सीमा.मौजूदा साल %1$d पर जाएंसाल %1$d पर जाएंचुनी गई तारीख मान्य नहीं है: %1$sशुरू होने की तारीख – %1$s%1$s – खत्म होने की तारीख%1$s – %2$sरेंज चुनेंशुरू होने की तारीख – खत्म होने की तारीखसेव करेंशुरू होने की तारीख %1$sतारीखखत्म होने की तारीखशुरू होने की तारीखdmyआज %1$sकैलेंडर के इनपुट मोड पर स्विच करेंकैलेंडर के व्यू पर स्विच करने के लिए टैप करेंटेक्स्ट के इनपुट मोड पर स्विच करेंसाल के व्यू पर स्विच करने के लिए टैप करेंरद्द करेंठीक हैपासवर्ड दिखाएंटेक्स्ट मिटाएंवापस जाएंसाइड शीट + %d жаңы билдирме + %d жаңы билдирме + Ылдыйкы экранды жыйыштырууЫлдыйкы экранды жайып көрсөтүүЖарымын жайып көрсөтүүЭки жолу таптап, тизменин керектүү жерине сүйрөп барууТизменин керектүү жерине сүйрөп баруу%2$d ичинен %1$d символ киргизилдиСимволдордун саны коюлган %2$d чегинен %1$d символго ашып кеттиТекстти тазалооКата: жараксызКатаТүрүлмө менюну көрсөтүүДиалог сүрөтчөсүӨтмөкТандоо: AM же PM%1$s саатСаат тандооСаат %1$sМүнөттөрдү тандаңыз%1$s мүнөтAMУбакытты дубал саатынын режиминде киргизиңиз.СаатМүнөтPMУбакыт тандооУбакытты текст киргизүү режиминде киргизиңиз.Жаңы билдирмеБелгилендиЖарым-жартылай белгилендиБелгиленген жокМазмунду алып салуу (%1$s)%1$d ашуун жаңы билдирмеКийинки айга өзгөртүүМурунку айга өзгөртүүБашталуу күнүн тандоо: %1$s – Аяктоо күнүн тандоо: %2$sУчурдагы тандоо: %1$sэч бириЖокко чыгарууЖарайт%1$sКүн тандооТандалган күн%1$sКачан аяктайт: %1$sТуура эмес формат.Мисалы: %1$s%1$s деген форматты колдонуңузЖараксыз диапазон.Учурдагы жылга өтүү %1$d%1$d-жылга өтүүДиапазондон тышкары: %1$sБаштоо күнү – %1$s%1$s – Аяктоо күнү%1$s – %2$sДаталар диапазонун тандооБаштоо күнү – Аяктоо күнүСактооКачан башталат: %1$sКүнКачан аяктайтБаштоо күнүкажБүгүн %1$sЖылнаамага иш-чара киргизүү режимине которулууЖылнаама көрүнүшүнө өтүү үчүн таптап коюңузТекст киргизүү режимине которулууЖыл көрүнүшүнө өтүү үчүн таптап коюңузЖокко чыгарууЖарайтСырсөздү көрсөтүүТекстти тазалооАрткаКапталдагы таблица + %d njoftim i ri + %d njoftime të reja + Palos fletën e poshtmeZgjero fletën e poshtmeZgjeroje deri në gjysmëTe doreza e zvarritjes u trokit dy herëDoreza e zvarritjesKarakteret e futura: %1$d nga %2$dKufiri i karaktereve është kaluar: %1$d nga %2$dPastro tekstinGabim: E pavlefshmeGabimShfaq menynë me lëshim poshtëIkona e dialogutTabZgjidh paradite ose pasdite%1$s orëZgjidh orën%1$s fiksPërzgjidh minutat%1$s minutaPDKalo te modaliteti i orës për hyrjen e kohës.OraMinutaPDZgjidh orënKalo te modaliteti i hyrjes së tekstit për hyrjen e kohës.Njoftim i riE zgjedhurPjesërisht e zgjedhurE pazgjedhurHiq %1$sMë shumë se %1$d njoftime të rejaNdrysho te muaji i ardhshëmNdrysho te muaji i kaluarZgjedhja e datës së fillimit: %1$s - Zgjedhja e datës së përfundimit: %2$sZgjedhja aktuale: %1$sasnjëAnuloNë rregull%1$sZgjidh datënData e zgjedhur%1$sData e mbarimit: %1$sFormat i pavlefshëm.Shembull: %1$sPërdor: %1$sGamë e pavlefshme.Navigo te viti aktual %1$dNavigo te viti %1$dJashtë gamës: %1$sData e fillimit – %1$s%1$s – data e përfundimit%1$s - %2$sZgjidh gamënData e fillimit - data e përfundimitRuajData e fillimit: %1$sDataData e përfundimitData e fillimitdmvSot %1$sKalo te modaliteti i \"Hyrjes së kalendarit\"Trokit për t\'u kthyer te pamja e \"Kalendarit\"Kalo te modaliteti i \"Hyrjes së tekstit\"Trokit për t\'u kthyer te pamja vjetoreAnuloNë rregullShfaq fjalëkaliminPastro tekstinPasFleta anësore + %d ny avisering + %d nya aviseringar + Komprimera arket på nedre delen av skärmenUtöka arket på nedre delen av skärmenUtöka till hälftenDu tryckte snabbt två gånger på handtagetHandtag%1$d av %2$d tecken har angettsTeckengränsen har överskridits: %1$d av %2$dRensa textFel: ogiltigtFelVisa rullgardinsmenynDialogikonFlikVälj mellan FM och EM%1$s timmarAnge timmeKlockan %1$sVälj minuter%1$s minuterFMByt till klockläget och ange tid.TimmeMinutEMVälj tidByt till textinmatningsläget och ange tid.Ny aviseringMarkeradDelvis markeradInte markeradTa bort (%1$s)Fler än %1$d nya aviseringarÄndra till nästa månadÄndra till föregående månadVal av startdatum: %1$s – val av slutdatum: %2$sAktuellt val: %1$singetAvbrytOK%1$sVälj datumValt datum%1$sSlutdatum %1$sOgiltigt format.Exempel: %1$sAnvänd %1$sOgiltigt intervall.Navigera till innevarande år %1$dNavigera till år %1$dUtanför intervallet: %1$sStartdatum–%1$s%1$s–slutdatum%1$s–%2$sVälj intervallStartdatum–slutdatumSparaStartdatum %1$sDatumSlutdatumStartdatumdmåIdag %1$sByt till kalender som inmatningslägeTryck för att byta till kalendervyByt till text som inmatningslägeTryck för att byta till årsvyAvbrytOKVisa lösenordRensa textTillbakaArk på sidan av skärmen + %d thông báo mới + %d thông báo mới + Thu gọn bảng dưới cùngMở rộng bảng dưới cùngMở rộng một nửaĐã nhấn đúp nút kéoNút kéoĐã nhập %1$d trong số %2$d ký tựĐã vượt quá giới hạn ký tự %1$d/%2$dXóa văn bảnLỗi: không hợp lệLỗiHiển thị menu thả xuốngBiểu tượng hộp thoạiThẻChọn SA hoặc CH%1$s giờChọn giờ%1$s giờChọn phút%1$s phútSAChuyển sang chế độ đồng hồ để nhập thời gian.GiờPhútCHChọn thời gianChuyển sang chế độ nhập văn bản để nhập thời gian.Thông báo mớiĐã đánh dấuĐã đánh dấu một phầnChưa đánh dấuXóa %1$sHơn %1$d thông báo mớiChuyển sang tháng tiếp theoChuyển về tháng trướcNgày bắt đầu được chọn: %1$s – Ngày kết thúc được chọn: %2$sLựa chọn hiện tại: %1$skhông cóHủyOK%1$sChọn ngàyNgày đã chọn%1$sNgày kết thúc %1$sĐịnh dạng không hợp lệ.Ví dụ: %1$sSử dụng: %1$sPhạm vi không hợp lệ.Chuyển đến năm hiện tại %1$dChuyển tới năm %1$dNằm ngoài phạm vi: %1$sNgày bắt đầu – %1$s%1$s – Ngày kết thúc%1$s – %2$sChọn dải ôNgày bắt đầu – Ngày kết thúcLưuNgày bắt đầu %1$sNgàyNgày kết thúcNgày bắt đầudmyHôm nay %1$sChuyển sang chế độ nhập lịchNhấn để chuyển sang chế độ xem theo lịchChuyển sang chế độ nhập văn bảnNhấn để chuyển sang chế độ xem theo nămHuỷOKHiện mật khẩuXoá văn bảnQuay lạiTrang bên4dp18dp40dp2dp2dp40dp20dp128dp4dp450dp600dp24dp24dp24dp24dp20dp4dp96dp0dp0dp104dp68dp28dp64dp32dp24dp32dp06 + %d nové upozornenie + %d nové upozornenia + %d new notifications + %d nových upozornení + Zbaliť dolný hárokRozbaliť dolný hárokRozbaliť napolyDvojité klepnutie na presúvadloPresúvadloZadané znaky: %1$d z %2$dBol prekročený povolený počet znakov (%1$d z %2$d)Vymazať textChyba: neplatnéChybaZobraziť rozbaľovaciu ponukuIkona dialógového oknaTabulátorVyberte AM alebo PM%1$s hodínVybrať hodinu%1$sVyberte minúty%1$s minAMAk chcete zadať čas, prepnite na režim hodín.HodinaMinútaPMVyberte časAk chcete zadať čas, prepnite na textový režim vstupuNové upozornenieZačiarknutéČiastočne začiarknutéNezačiarknutéOdstrániť položku %1$sViac než %1$d nových upozorneníĎalší mesiacPredchádzajúci mesiacVýber dátumu začatia: %1$s – Výber dátumu ukončenia: %2$sAktuálny výber: %1$sprázdneZrušiťOK%1$sVyberte dátumVybraný dátum%1$sDátum ukončenia %1$sNeplatný formát.Príklad: %1$sPoužite: %1$sNeplatný rozsah.Prejsť na aktuálny rok %1$dPrejsť na rok %1$dMimo rozsahu: %1$sDátum začatia – %1$s%1$s – dátum ukončenia%1$s – %2$sVyberte rozsahDátum začatia – dátum ukončeniaUložiťDátum začatia %1$sDátumDátum ukončeniaDátum začatiadmrDnes %1$sPrepnúť na kalendárový režim vstupuKlepnutím prepnete na zobrazenie kalendáraPrepnúť na textový režim vstupuKlepnutím prepnete na zobrazenie jednotlivých rokovZrušiťOKZobraziť hesloVymazať textSpäťBočný hárok + %d nouvelle notification + %d nouvelles notifications + Réduire la zone de contenu dans le bas de l\'écranDévelopper la zone de contenu dans le bas de l\'écranDévelopper à moitiéPoignée de déplacement touchée deux foisFaire glisser la poignéeCaractères entrés : %1$d sur %2$dLimite de caractère dépassée : %1$d sur %2$dEffacer le texteErreur : incorrecteErreurAfficher le menu déroulantIcône de boîte de dialogueOngletSélectionner AM ou PM%1$s heure(s)Sélectionner l\'heure%1$s heuresSélectionnez les minutes%1$s minutesAMPasser au mode Horloge pour entrer l\'heure.HeureMinutePMSélectionner l\'heurePasser au mode Entrée de texte pour entrer l\'heure.Nouvelle notificationCochéePartiellement cochéeNon cochéeSupprimer %1$sPlus de %1$d nouvelles notificationsPasser au mois suivantPasser au mois précédentSélection de la date de début : %1$s – Sélection de la date de fin : %2$sSélection actuelle : %1$saucuneAnnulerOK%1$sSélectionnez la dateDate sélectionnée%1$sDate de fin : %1$sFormat incorrectExemple : %1$sUtiliser : %1$sPlage incorrecte.Naviguer à l\'année en cours %1$dNaviguer vers l\'année %1$dHors de la plage : %1$sDu (date de début) au %1$sDu %1$s au (date de fin)Du %1$s au %2$sSélectionnez la plageDu (date de début) au (date de fin)EnregistrerDate de début : %1$sDateDate de finDate de débutjma%1$s Aujourd\'huiPasser au mode d\'entrée AgendaToucher pour passer à la vue du calendrierPasser au mode d\'entrée TexteToucher pour passer à la vue de l\'annéeAnnulerOKAfficher le mot de passeEffacez le texteRetourFeuille latérale + %d નવું નોટિફિકેશન + %d નવા નોટિફિકેશન + બોટમ શીટ નાની કરોબોટમ શીટ મોટી કરોઅડધે સુધી મોટું કરોઑબ્જેક્ટ ખેંચવાના હૅન્ડલ પર બે વાર ટૅપ કર્યુંઑબ્જેક્ટ ખેંચવાનું હૅન્ડલ%2$dમાંથી %1$d અક્ષરો દાખલ કર્યા%2$dમાંથી %1$dની વર્ણ મર્યાદા ઓળંગાઈ ગઈ છેટેક્સ્ટ સાફ કરોભૂલ: અમાન્યભૂલડ્રૉપડાઉન મેનૂ બતાવોસંવાદનું આઇકનટૅબAM અથવા PM પસંદ કરો%1$s કલાકસમય પસંદ કરો%1$s વાગ્યા છેમિનિટ પસંદ કરો%1$s મિનિટAMસમય દાખલ કરવા માટે ઘડિયાળ મોડમાં સ્વિચ કરો.કલાકમિનિટPMસમય પસંદ કરોસમય દાખલ કરવા માટે ટેક્સ્ટ ઇનપુટ મોડમાં સ્વિચ કરો.નવું નોટિફિકેશનચેક કરેલું છેઆંશિક રીતે ચેક કરેલું છેચેક કરેલું નથી%1$s કાઢી નાખો%1$dથી વધુ નવા નોટિફિકેશનઆગલા મહિના પર બદલોપાછલા મહિના પર બદલોપ્રારંભ તારીખની પસંદગી: %1$s – સમાપ્તિ તારીખની પસંદગી: %2$sહાલની પસંદગી: %1$sકોઈ નહીંરદ કરોઓકે%1$sતારીખ પસંદ કરોપસંદ કરેલી તારીખ%1$sસમાપ્તિ તારીખ %1$sઅમાન્ય ફોર્મેટ.ઉદાહરણ: %1$sઆનો ઉપયોગ કરો: %1$sઅમાન્ય શ્રેણી.ચાલુ વર્ષ %1$d પર નૅવિગેટ કરો%1$dના વર્ષ પર નૅવિગેટ કરોઆ શ્રેણીની બહાર છે: %1$sશરૂ કરવાની તારીખ – %1$s%1$s – સમાપ્તિની તારીખ%1$s – %2$sશ્રેણી પસંદ કરોશરૂ કરવાની તારીખ – સમાપ્તિની તારીખસાચવોપ્રારંભ તારીખ %1$sતારીખસમાપ્તિની તારીખશરૂ કરવાની તારીખdmyઆજે %1$sકૅલેન્ડર ઇનપુટ મોડ પર સ્વિચ કરોCalendar વ્યૂ પર સ્વિચ કરવા માટે ટૅપ કરોટેક્સ્ટ ઇનપુટ મોડ પર સ્વિચ કરોવર્ષ વ્યૂ પર સ્વિચ કરવા માટે ટૅપ કરોરદ કરોઓકેપાસવર્ડ બતાવોટેક્સ્ટ સાફ કરોપાછળસાઇડ શીટ320dp0dp2dp24dp576dp320dp@dimen/design_snackbar_padding_vertical + 160dp64dp64dp1 + Arifa %d mpya + Arifa %d mpya + Kunja safu ya chiniPanua safu ya chiniPanua nusuAikoni ya buruta imeguswa mara mbiliAikoni ya burutaUmeweka herufi %1$d kati ya %2$dUmepitisha idadi ya juu ya herufi %1$d kati ya %2$dFuta maandishiHitilafu: si sahihiHitilafuOnyesha menyu kunjuziAikoni ya KidirishaKichupoChagua AM au PMSaa %1$sChagua saaSaa %1$s kamiliChagua dakikaDakika %1$sAMBadilisha umbo liwe la saa ya mishale wakati wa kuweka muda.SaaDakikaPMChagua wakatiBadilisha iwe katika hali ya maandishi wakati wa kuweka muda.Arifa mpyaKimeteuliwaKimeteuliwa kwa kiasi fulaniHakijateuliwaOndoa %1$sZaidi ya arifa %1$d mpyaNenda kwenye mwezi unaofuataRudi kwenye mwezi uliotanguliaUteuzi wa tarehe ya kuanza: %1$s - Uteuzi wa tarehe ya mwisho: %2$sUteuzi wa sasa: %1$shakunaGhairiSawa%1$sChagua TareheTarehe uliyochagua%1$sTarehe ya kumaliza %1$sMuundo si sahihiMfano: %1$sTumia: %1$sKipindi si sahihi.Sogeza kwenye mwaka huu %1$dSogeza kwenye mwaka wa %1$dNje ya kipindi: %1$sTarehe ya kuanza – %1$s%1$s – Tarehe ya mwisho%1$s – %2$sChagua Kipindi cha TareheTarehe ya kuanza – Tarehe ya mwishoHifadhiTarehe ya kuanza %1$sTareheTarehe ya mwishoTarehe ya kuanzadmyLeo %1$sTumia programu ya kuingiza data kwenye kalendaGusa ili ubadilishe kwenda mwonekano wa KalendaTumia programu ya kuingiza data ya maandishiGusa ili ubadilishe kwenda mwonekano wa mwakaGhairiSawaOnyesha nenosiriFuta maandishiRudi nyumaLaha ya Pembeni + %d pemberitahuan baharu + %d pemberitahuan baharu + Kuncupkan helaian bawahKembangkan helaian bawahKembangkan helaian bawahPemegang seret diketik dua kaliPemegang seretAksara dimasukkan %1$d daripada %2$dMelebihi had aksara %1$d daripada %2$dKosongkan teksRalat: tidak sahRalatTunjukkan menu lungsurIkon DialogTabPilih AM atau PM%1$s jamPilih jamPukul %1$sPilih minit%1$s minitPGBeralih ke mod jam untuk input masa.JamMinitP/MPilih masaBeralih ke mod input teks untuk input masa.Pemberitahuan baharuDitandaiSebahagiannya ditandaiTidak ditandaiAlih keluar %1$sLebih daripada %1$d pemberitahuan baharuTukar kepada bulan seterusnyaTukar kepada bulan sebelumnyaPilihan tarikh mula: %1$s – Pilihan tarikh tamat: %2$sPilihan semasa: %1$stiadaBatalOK%1$sPilih TarikhTarikh dipilih%1$sTarikh tamat %1$sFormat tidak sah.Contoh: %1$sGunakan: %1$sJulat tidak sah.Navigasi ke tahun semasa %1$dNavigasi ke tahun %1$dDi luar julat: %1$sTarikh mula – %1$s%1$s – Tarikh tamat%1$s – %2$sPilih JulatTarikh mula – Tarikh tamatSimpanTarikh mula %1$sTarikhTarikh tamatTarikh mulahbtHari ini %1$sBeralih kepada mod input kalendarKetik untuk menukar kepada paparan KalendarBeralih kepada mod input teksKetik untuk menukar kepada paparan tahunBatalOKTunjukkan kata laluanKosongkan teksKembaliHelaian SisiAndroid CastSend screen (tablet / phone)Receive on TV / projectorSame Wi‑Fi required. Default PIN: 1234. UDP is default; pick TCP in settings if needed. Match transport on both devices.Cast to receiverWaiting for castPINREFRESHREFRESH (%1$d)Start castSearching for receivers…Waiting for sender…Stream optionsTransportQuality (bitrate / FPS)Capture resolutionScreen capture (sender phone)Screen capture (sender phone only)Entire screenChoose app or screen (Android 14+)App picker needs Android 14 (this device: API %1$d)Include audio (playback capture, Android 10+)Audio unavailable (requires Android 10+)Video onlyThis device runs Android 9 or lower. Playback audio capture needs Android 10 or newer. You can continue with video only.Continue (video only)UDP (default, best effort)TCP (reliable fallback)QUIC experimental (Cronet)WebRTC (stub, future)Calibration test patternCamera (rear Camera2)Camera source (requires Android 10+)Camera capture requires Android 10 or newer. Use screen or calibration test.Camera permission denied. Allow camera access or choose another capture mode.Could not open the camera. Try another capture mode.Calibration cast %1$dx%2$dCamera cast %1$dx%2$dLow (~1.5 Mbps, 24 fps)Medium (~5 Mbps, 30 fps) — recommendedHigh (~10 Mbps, 30 fps)Full display75% scale50% scale720p height cap (keeps aspect)Fixed 1080p (fit in 1920×1080)Fixed 720p (fit in 1280×720)Adaptive (BW estimator, preview)Original720p480pAutoOriginal (native)Adaptive (BW estimator)Video codecCast adjustment presetBitrateNetwork adoptionAUTO (default)NoneQualitySpeedPerformance (balanced)BalancedRobustLess (UDP only)EstimatedH.264 (AVC)H.265 (HEVC)Passthrough (debug)Passthrough video is not implemented yetTransport must match the receiver (TCP/UDP)Select a receiver firstEnter PINScreen capture permission deniedAllow microphone for audio cast fallback when nothing is playing on the sender.Casting startedFound %1$d receiver(s)Ready — PIN %1$s · %2$sCasting from %1$sCasting from %1$s · %2$sRescanning for receivers…Advanced options unlockedAdvanced options hiddenAdvanced connect (dev)Receiver IP addressPort (default 41235)Relay gateway URL (not implemented)Connect to IPEnter host and portPlaying %1$dx%2$dStopPlay incoming cast audio on this deviceStart listening (keeps running in background)Connected — waiting for video…Listening for cast — awaiting sender…Awaiting for stream to come…Stream lost — awaiting for stream to come…Cast ended — waiting for sender…Press Back again to stop castingPermissions neededGrantApp settingsStarting receiver service…Listening for castConnected — open video surface…Video surface readyConnecting…Connecting to %1$s…Authenticating…Casting via %1$s · %2$dx%3$dScreen capture data missing (retry cast)Missing host, PIN, or settingsNo cast intentReceiver not listening at %1$s:%2$d — on the tablet tap Start listening, then Refresh on this phone.Could not connect to %1$s:%2$dCast starting — see notification for statusFullscreen playback %1$dx%2$dVideo playingSelected: %1$s (%2$s, %3$s)Selected %1$d receiversSelect at most %1$d receiversPlay cast audio?The sender is streaming audio. Play it on this device?Play audioVideo onlyPlaying video and audioVideo only (audio skipped)Rotated — now %1$dx%2$dWaiting for receiver at %1$s:%2$d…SettingsAndroid Cast settingsGlobal app settingsSender settingsReceiver settingsUsernameAlways show icon in system barSend anonymous crash logsLeave empty for anonymous castResolutionAUTO (fits screen)Adaptive (experimental)Stream protection (UDP)Sender preference — receiver FEC/NACK is auto-detected at connect. UDP only.senderreceiverNACK onNACK offStream protection: %1$s (%2$s)No protection this session (receiver %1$s, sender %2$s). Set %3$s stream protection to None or match the peer.Protection mismatch (receiver %1$s, sender %2$s). Casting without protection; align %3$s settings.Using Reed–Solomon FEC (receiver %1$s, sender %2$s). For a direct match, set %3$s to FEC (Reed–Solomon).Using FEC 3/4 without NACK (receiver %1$s, sender %2$s). NACK disabled for this session.Using FEC with NACK (receiver %1$s, sender %2$s).FEC 3/4FEC (Reed-Solomon)NACKFEC + NACKNone (default)No compatible receivers (protocol/transport/codec)Estimated (auto)EstimatedONOFFPriority hint — codec is negotiated during handshake.Camera (rear)Camera (front)MuteSource preview\n(screen capture starts after START)Screen previewCasting — preview pausedCamera previewCalibration test patternStream options are in Android Cast settings.PIN mismatchThe receiver expects a different PIN. Enter the PIN for this cast session.Session PINSettings savedPIN cannot be changed while castingCast active — tap to open appAndroid Cast — tap to open appCast trayPersistent cast status icon in the notification barSwipe from the left edge for settingsThemeLanguageDefault (system)EnglishRussianLanguage updatedSystem (default)DarkLightInvertedTheme updatedScreen preview — grant capture when promptedOpen settingsApp infoVersion:Protocol:Commit:Built:Author:LicensesReset to defaultsRestore all app settings to default?App settings restored to defaultACCEPTLicensesCould not load license text.Developer settingsSettingsDiagnosticsSupported features — quick read-only probes. Tests run in the background when you open this tab.Stop testsWaiting…Running…StoppedHardware acceleration (video)Camera captureSound captureAudio codecs (compression)NetworkOther casting / displayFull advertisement infoSender resolution UI (test)Resolution preset modeSeparated (Original / 720p / 480p / Auto)Legacy (full preset list)Combined (480p + 720p + original + adaptive)Changes the sender resolution spinner in cast settings. Default: Separated. Re-open cast settings to refresh labels.USB-C / HDMI (roadmap D)Show sender status when external display is plugged inWired HDMI uses the OS display stack, not the cast protocol. If no second screen appears in system Display settings, adapters cannot be fixed in-app. See docs/USB_HDMI_CAST.md.External display capture policy (future)Show USB-tether transport in cast settings (stub, roadmap E)External display detected — use system mirror or Wi‑Fi cast to receiverUSB tether (experimental)ADB over Wi‑Fi (debug)Keep wireless adb alive after Wi‑Fi dropsRefresh adb connect info nowCopy adb connect lineWaiting for Wi‑Fi and adb endpoints…adb connect %1$sHTTP :5039/adb.json · secure=%1$s · wifi adb=%2$s · %3$sCopied adb connect lineOne-time (USB): ./scripts/grant-dev-adb-perms.sh — enables auto re-enable after Wi‑Fi drops and TLS port discovery. Pair wireless debugging once in system settings (Android 11+ uses a random TLS port, not 5555). rebuild.sh uses curl :5039/adb.json and avahi-browse _adb-tls-connect._tcp.ADB Wi‑Fi keeperShows adb connect line while debugging on flaky Wi‑Fi.ADB Wi‑Fi readyWaiting for Wi‑Fi IP…adb connect %1$sCommercial (off until enabled here)Enable in-app ads (placeholder)Enable in-app purchases (Play Billing)Enable Play Store integrationOpen Play Store listingRequest in-app review flowQuery IAP products (log)Ads, billing, and review stay disabled for daily use. Configure Play Console SKUs and AdMob before any public release.[Ads placeholder — enable AdMob in manifest for production]Enable Play Store integration above firstEnable in-app purchases above firstIAP query finished — see logcatDefault display only (active)Prefer external when present (planned)External display experimental (planned)Show debug overlay on receiverShow codec priority scores in settingsGrab anonymous session statsRecord stream dump while casting (FR 0.1)Writes zip under files/stream_dumps/ (max 5 min or 100 MB). Pull via adb.Diagnostic cast ping-pong (~1/s)Ping response mode (this device)Mirror as-is (dummy pong)Mirror smart (local timestamp)Reply-with (seq + timestamps)Requires both peers on a build that supports MSG_DIAG_PING. Old peers ignore unknown packets.Enable backend NTP syncDisabled by default. Network self-test compares device time to BE (shown in BE timezone). If skew exceeds ±3 minutes, stores a correction offset for app diagnostics — does not change the system clock.Remote access (on-demand debug)DisabledWireGuardRSSH (reverse SSH)RSSH (reverse SSH — alpha; not available yet)When enabled, device polls BE every 1–7 min (type:ra). WireGuard needs Android VPN permission once. RSSH uses outbound SSH — no VPN prompt.VPN route scope (WireGuard)Hub only (172.200.2.1/32)All traffic (0.0.0.0/0)Hub-only is the production default (split tunnel). Full tunnel routes all device IP traffic through WireGuard when the session is up.VPN app scope (WireGuard)All apps (matching routes)This app onlyApp-only uses Android IncludedApplications so other apps keep their normal path. Ignored for RSSH. Changes reconnect an active WireGuard session.VPN routing updated — reconnecting if tunnel was upReverse SSH (RSSH) is not implemented yet.Remote access: %1$sVPN permission required for WireGuard remote access.Remote accessRemote debug activePolling BE (%1$s)WireGuard tunnel connectedConnected · session %1$sNetwork self-testNetwork self-test tab unlockedHidden diagnostics tab. Long-press the tabs row to unlock. Runs quick network checks: connectivity, captive portal, CIDR/DNS/MTU, cast LAN peers (UDP discovery), backend RTT/throughput (apps.f0xx.org), NAT and NTP correction.Run self-testForce re-checkWaiting for self-test run…Running self-test…Session statisticsCharts from session_send_* / session_recv_* JSON (enable grab in developer settings, then cast).Open statistics analyzerRefreshShare JSONNo session files yet. Cast with “Grab session stats” enabled.Session grab is off — enable it here to record new sessions.UDP & protection countersCould not share session fileBitrateLoss %Encode FPSTap sessions to toggle overlay. Pinch or scroll wheel to zoom. Drag finger for values.Reload codecs.jsonLoads assets/codecs.json overrides without restarting the app. Reopen the settings drawer to refresh spinners.Adaptive receiver display (experimental)Receiver A/V presets (experimental)Video presetAudio presetFilter intensityIntensity: %1$d (0 = off, 10 = max)Audio: PCM chain after AAC decode. Video experimental: GLES shader after decode (immersive denoise/sharpen, HDR tone map). Intensity 0–10. Restart cast session after preset changes.Default (passthrough)Immersive (experimental)HDR (experimental)Default (passthrough)Bass boostImmersiveDolby 5.1 (stereo headset)Dolby 7.1 (stereo headset)App updates (OTA)v0 layout: https://host/v0/ota/channel/stable.json → manifest → APK. Service checks every 1 minute by default (overridable in private settings.json).OTA channel URL (v0 stable.json)Enable OTA periodic checks (default every 1 minute)Check for updates nowInstalled: %1$s (%2$d)No OTA channel URL — set one in developer settings or local.properties (ota.channel.url).Update check failed: %1$sUp to date (%1$s, %2$d).You dismissed this version — tap Check again to see it.Update availableNew OTA version found (%1$s, current version is: %2$s / %3$s MB). Would you like to perform the update?\n\n%4$sNo release notes.Download & installNot nowDownloading updateDownloading APK…Download failed: %1$sApp updates · %1$dAudio codeclibvpx (VP8)libvpx (VP9)AACSpeexOpusPassthrough (debug)AUTOPicture-in-picturePicture-in-picture is not available on this devicePicture-in-picture disabledAllow picture-in-picture for Android Cast in system settings, then try again.Notifications keep the receiver visible while casting in the background.Notifications (cast status)Enable picture-in-picture (receiver)When on, the receiver can shrink to a floating window during cast (after notifications are allowed). Off by default if PiP is unavailable.Recent#1565C0#331565C0#FF1565C0#FF212121#FFFFFFFF#66000000#FFF5F5F5#FF212121#AA000000#FFFFFFFF#66000000#FF34D399Android CastТрансляцияУстройства должны быть в одной сети. PIN по умолчанию: 1234; Транспорт должен совпадать с передающим устройством.ТрансляцияОжидаем поток...PINОБНОВИТЬОБНОВИТЬ (%1$d)Начать трансляциюПоиск трансляций…Ожидание потока…Настройки стримаТранспортКачество (bitrate / FPS)РазрешениеРазрешение (отправитель)Разрешение (только отправитель)Весь экранВыбрать приложение для захвата (Android 14+)App picker нужен Android 14 (текущий: API %1$d)Включить аудио (захват воспроизведения, Android 10+)Аудио недоступно (requires Android 10+)Только видеоУстройство под управлением Android 9 или ниже. Захват аудио недоступен, нужен Android 10 или более новый. Можно продолжить только с видеоПродолжить (только видео)UDP (по умолчанию, быстрый)TCP (медленный, но надежный)QUIC экспериент (Cronet)WebRTC (эксперимент, недоступно)Тест сигналаКамера (лицевая)Источник для камеры (Android 10+)Захват с камеры доступен с Android 10. Выберите экран или калибровку.Нет доступа к камере. Разрешите камеру или выберите другой режим.Не удалось открыть камеру. Выберите другой режим захвата.Передача калибрации %1$dx%2$dТрансляция с камеры %1$dx%2$dНизкий (~1.5 Mbps, 24 fps)Средний (~5 Mbps, 30 fps) — recommendedВысокий (~10 Mbps, 30 fps)Весь экран75% экрана50% экрана720p фикс. (с аспектом)1080p (1920×1080)720p (1280×720)Адаптивный (предсказание, в разработке)Оригинал720p480pАвтоОригинал (нативное)Адаптивный (оценка канала)Видео кодекТонкие быстрые настройкиBitrateАдаптация сетиAUTO (по умолчанию)НетКачествоСкоростьПроизводительность (компромисс)СбалансированоБез щащиты потока (только для UDP)ПредсказаниеH.264 (AVC)H.265 (HEVC)Passthrough (для разраб.)Passthrough недоступно, в разработкеВыбранный транспорт не соответствует принимающей сторонеВыберите приемник потокаВвод PINЗахват недоступен, ограничения системыРазрешить захват микрофона если отправитель ничего не проигрывает.Трансляция началасьНайдено %1$d получателейГотово — PIN %1$s · %2$sТрансляция от %1$sТрансляция с помощью %1$s · %2$sСканирую…Расширенные опции доступныРасшинерные опции выключеныРасширенные возможности (разработчикам)IP адрес получателяПорт (по умолчанию 41235)Relay gateway URL (не готово)Соединяюсь с IPВведите имя узла и портИграет %1$dx%2$dСтопПроигрывать входящее аудио на этом устройствеНачать (продолжит работу в фоновом режиме)Соединяюсь — ожидание потока…Ожидание потока…Ожидание входящих данных…Потеря трансляции — ожидаю поток…Трансляция завершена — ожидание данных отправителя…Нажмите "Назад" еще раз для выходаВключите разрешения системыРазрешитьНастройки приложенияСтартуем сервис получателя…Слушаем эфирСоежинились — открываем видео…Видео виджет готовСоединяемся…Соединяемся с %1$s…Проверка…Трансляция через %1$s · %2$dx%3$dДанные трансляции утеряны (пробуем перезапуск)Не указаны получатель, PIN, или кривые настройкиНету запроса на трансляциюПолучатель отсутствует на %1$s:%2$d — нажмите "Start listening" на получателе и пересканируйте сеть на этом устройстсвеНе могу соединиться с %1$s:%2$dНачинаем — следите за состоянием статусаПолноэкранное воспроизведение %1$dx%2$dВоспроизведениеВыбрано: %1$s (%2$s, %3$s)Выбрано %1$d получателейВыберите хотя бы %1$d получательВоспроизводить аудио?Отправитель включил передачу аудио. Воспроизвести?Проигрываем аудиоТолько видеоПроигрываем и аудио и видеоТолько видео (пропускаем аудио)Переворот — теперь %1$dx%2$dОжидаем получателя %1$s:%2$d…НастройкиНастройки Android CastОбщие настройкиНастройки отправкиНастройки приемаИмяВсегда показывать иконку состоянияПусто для анонимных трансляцийРазрешениеAUTOАдаптивно (эксперимент)Защита потока (только для UDP)Подсказка для получателя, не факт что заработает. Только для UDP транспортаFEC 3/4FEC (Reed-Solomon)NACKFEC + NACKНичего (по умолчанию)Нет совместимых получателей (протокол/транспорт/кодек)Предсказание (авто)ПредсказаниеВклВыклПодсказка — кодек выберется при согласовании, это только подсказка.Камера (тыл)Камера (фронт)ТихоПредпросмотр\n(трансляция начнется после нажатия кнопки)Предпросмотр экранаТрансляция — предпросмотр приостановленПредпросмотр с камерыКалибрационная таблицаStream options are in Android Cast settings.PIN не совпадаетПолучатель ожидает другой PIN. Можете поменять PIN в настройках.PIN сессииНастройки сохраненыPIN не может быть изменен посреди трансляцииТрансляция активна — нажмите чтобы открытьAndroid Cast — нажмите чтобы открытьCast trayВсегда показывать иконку статуса в строке состоянияПроведите по левому краю чтобы перейти к настройкамОформлениеЯзыкПо умолчанию (система)EnglishРусскийЯзык обновлёнСистема (по умолчанию)НочьДеньИнвертированнаяОформление обновленоПредпросмотр — разрешите захват, если не видноОткрыть настройкиИнформацияВерсия:Протокол:Commit:Сборка:Автор:ЛицензииСбросить по умолчаниюВосстановить все настройки приложения по умолчанию?Настройки приложения сброшены по умолчаниюПРИНЯТЬЛицензииНе могу найти факл лицензийДля разработчиковНастройкиДиагностикаПоддерживаемые возможности — быстрые проверки без ввода. Запускаются в фоне при открытии вкладки.Остановить тестыОжидание…Выполняется…ОстановленоАппаратное ускорение (видео)Захват с камерыЗахват звукаАудиокодеки (сжатие)СетьДругой вывод / трансляцияПолная реклама возможностейРазрешение отправителя (тест)Режим списка разрешенийРаздельный (Оригинал / 720p / 480p / Авто)Старый (полный список)Комбинированный (480p + 720p + оригинал + адаптив)Меняет список разрешений в настройках трансляции. По умолчанию: Раздельный. Откройте настройки cast заново.USB-C / HDMI (план D)Монетизация (выкл. по умолчанию)USB-тетер (эксперимент)Показывать отладочный оверлей на приёмникеПоказывать приоритет кодеков в настройкахСохранять анонимную статистику сессийПерезагрузить codecs.jsonПодгружает overrides из assets/codecs.json без перезапуска. Откройте настройки снова, чтобы обновить списки. · %1$dАудио кодекlibvpx (VP8)libvpx (VP9)AACSpeexOpusPassthrough (отладка)AUTOКартинка в картинке (PiP)Режим «картинка в картинке» (PiP) недоступен на этом устройствеPiP отключеноРазрешите PiP для Android Cast в настройках системы.Уведомления нужны, чтобы приёмник оставался активным при трансляции в фоне.Уведомления (статус трансляции)PiP (приёмник)При включении приёмник может свернуться в плавающее окно во время трансляции (нужны уведомления). Выключено, если PiP недоступен.Недавние#FF1565C0#FF000000#FFFFFFFF#99000000#66FFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/app/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties new file mode 100644 index 0000000..7c3d2ca --- /dev/null +++ b/app/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties @@ -0,0 +1,49 @@ +#Sat Jun 20 18:32:12 CEST 2026 +com.foxx.androidcast.app-main-5\:/anim/robot_dance.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/anim/robot_dance.xml +com.foxx.androidcast.app-main-5\:/color/device_item_text.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/color/device_item_text.xml +com.foxx.androidcast.app-main-5\:/color/settings_spinner_text.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/color/settings_spinner_text.xml +com.foxx.androidcast.app-main-5\:/drawable-nodpi/calibration_chart_reference.png=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable-nodpi-v4/calibration_chart_reference.png +com.foxx.androidcast.app-main-5\:/drawable/bg_settings_drawer_handle.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_drawer_handle.xml +com.foxx.androidcast.app-main-5\:/drawable/bg_settings_section_header.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_section_header.xml +com.foxx.androidcast.app-main-5\:/drawable/bg_settings_spinner.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_spinner.xml +com.foxx.androidcast.app-main-5\:/drawable/bg_settings_spinner_item.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_spinner_item.xml +com.foxx.androidcast.app-main-5\:/drawable/bg_settings_spinner_item_selected.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_spinner_item_selected.xml +com.foxx.androidcast.app-main-5\:/drawable/bg_settings_spinner_popup.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_spinner_popup.xml +com.foxx.androidcast.app-main-5\:/drawable/bg_spinner_item_underline_dark.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_spinner_item_underline_dark.xml +com.foxx.androidcast.app-main-5\:/drawable/bg_spinner_item_underline_light.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_spinner_item_underline_light.xml +com.foxx.androidcast.app-main-5\:/drawable/device_item_background.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/device_item_background.xml +com.foxx.androidcast.app-main-5\:/drawable/device_item_live_border.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/device_item_live_border.xml +com.foxx.androidcast.app-main-5\:/drawable/ic_android_robot.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_android_robot.xml +com.foxx.androidcast.app-main-5\:/drawable/ic_launcher_foreground.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_launcher_foreground.xml +com.foxx.androidcast.app-main-5\:/drawable/ic_notification.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_notification.xml +com.foxx.androidcast.app-main-5\:/drawable/ic_picture_in_picture.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_picture_in_picture.xml +com.foxx.androidcast.app-main-5\:/drawable/settings_app_info_divider.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/settings_app_info_divider.xml +com.foxx.androidcast.app-main-5\:/layout-land/activity_sender.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout-land/activity_sender.xml +com.foxx.androidcast.app-main-5\:/layout/activity_cast_settings.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/activity_cast_settings.xml +com.foxx.androidcast.app-main-5\:/layout/activity_dev_diagnostics_panel.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/activity_dev_diagnostics_panel.xml +com.foxx.androidcast.app-main-5\:/layout/activity_dev_network_selftest_panel.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/activity_dev_network_selftest_panel.xml +com.foxx.androidcast.app-main-5\:/layout/activity_dev_settings_panel.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/activity_dev_settings_panel.xml +com.foxx.androidcast.app-main-5\:/layout/activity_developer_settings.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/activity_developer_settings.xml +com.foxx.androidcast.app-main-5\:/layout/activity_drawer_host.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/activity_drawer_host.xml +com.foxx.androidcast.app-main-5\:/layout/activity_licenses.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/activity_licenses.xml +com.foxx.androidcast.app-main-5\:/layout/activity_main.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/activity_main.xml +com.foxx.androidcast.app-main-5\:/layout/activity_playback.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/activity_playback.xml +com.foxx.androidcast.app-main-5\:/layout/activity_sender.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/activity_sender.xml +com.foxx.androidcast.app-main-5\:/layout/activity_session_stats_analyzer.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/activity_session_stats_analyzer.xml +com.foxx.androidcast.app-main-5\:/layout/activity_settings_panel.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/activity_settings_panel.xml +com.foxx.androidcast.app-main-5\:/layout/dialog_ota_download.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/dialog_ota_download.xml +com.foxx.androidcast.app-main-5\:/layout/fragment_cast_settings.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/fragment_cast_settings.xml +com.foxx.androidcast.app-main-5\:/layout/include_app_info_section.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/include_app_info_section.xml +com.foxx.androidcast.app-main-5\:/layout/include_settings_section_header.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/include_settings_section_header.xml +com.foxx.androidcast.app-main-5\:/layout/item_device.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/item_device.xml +com.foxx.androidcast.app-main-5\:/layout/item_session_stats.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/item_session_stats.xml +com.foxx.androidcast.app-main-5\:/layout/overlay_cast_diagnostics.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/overlay_cast_diagnostics.xml +com.foxx.androidcast.app-main-5\:/layout/overlay_stream_awaiting.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/overlay_stream_awaiting.xml +com.foxx.androidcast.app-main-5\:/layout/spinner_dropdown_item_scored.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/spinner_dropdown_item_scored.xml +com.foxx.androidcast.app-main-5\:/layout/spinner_dropdown_item_settings.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/spinner_dropdown_item_settings.xml +com.foxx.androidcast.app-main-5\:/layout/spinner_item_scored.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/spinner_item_scored.xml +com.foxx.androidcast.app-main-5\:/layout/spinner_item_settings.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/spinner_item_settings.xml +com.foxx.androidcast.app-main-5\:/layout/view_dev_diag_card.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/view_dev_diag_card.xml +com.foxx.androidcast.app-main-5\:/layout/view_settings_drawer_handle.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/layout/view_settings_drawer_handle.xml +com.foxx.androidcast.app-main-5\:/mipmap-anydpi-v26/ic_launcher.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/mipmap-anydpi-v26/ic_launcher.xml +com.foxx.androidcast.app-main-5\:/xml/file_paths.xml=/home/foxx/repos/My Projects/android cast/app/build/intermediates/packaged_res/debug/packageDebugResources/xml/file_paths.xml diff --git a/app/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml b/app/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml new file mode 100644 index 0000000..df2a7ec --- /dev/null +++ b/app/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml @@ -0,0 +1,436 @@ + + + #331565C0 + #FF34D399 + #1565C0 + #FF212121 + #FFF5F5F5 + #66000000 + #FF212121 + #FF1565C0 + #66000000 + #FFFFFFFF + #FFFFFFFF + #AA000000 + + + + Advanced connect (dev) + Advanced options hidden + Advanced options unlocked + Android Cast + The sender is streaming audio. Play it on this device? + Video only + Play cast audio? + Play audio + Allow microphone for audio cast fallback when nothing is playing on the sender. + Playing video and audio + Video only (audio skipped) + This device runs Android 9 or lower. Playback audio capture needs Android 10 or newer. You can continue with video only. + Video only + Authenticating… + Estimated + ACCEPT + Licenses + Reset to defaults + Calibration test pattern + Camera (rear Camera2) + Camera (front) + Could not open the camera. Try another capture mode. + Camera permission denied. Allow camera access or choose another capture mode. + Camera (rear) + Camera capture requires Android 10 or newer. Use screen or calibration test. + Camera source (requires Android 10+) + Screen capture permission denied + Entire screen + Choose app or screen (Android 14+) + App picker needs Android 14 (this device: API %1$d) + PIN cannot be changed while casting + Android Cast settings + Casting via %1$s · %2$dx%3$d + Calibration cast %1$dx%2$d + Camera cast %1$dx%2$d + Casting from %1$s + Casting from %1$s · %2$s + Rotated — now %1$dx%2$d + Casting started + AAC + AUTO + Passthrough (debug) + H.264 (AVC) + H.265 (HEVC) + Priority hint — codec is negotiated during handshake. + libvpx (VP8) + libvpx (VP9) + Opus + Passthrough (debug) + Passthrough video is not implemented yet + · %1$d + Speex + [Ads placeholder — enable AdMob in manifest for production] + Connecting… + Connecting to %1$s… + Continue (video only) + Copied adb connect line + Copy adb connect line + One-time (USB): ./scripts/grant-dev-adb-perms.sh — enables auto re-enable after Wi‑Fi drops and TLS port discovery. Pair wireless debugging once in system settings (Android 11+ uses a random TLS port, not 5555). rebuild.sh uses curl :5039/adb.json and avahi-browse _adb-tls-connect._tcp. + Keep wireless adb alive after Wi‑Fi drops + ADB Wi‑Fi keeper + Shows adb connect line while debugging on flaky Wi‑Fi. + adb connect %1$s + ADB Wi‑Fi ready + Waiting for Wi‑Fi IP… + Refresh adb connect info now + ADB over Wi‑Fi (debug) + HTTP :5039/adb.json · secure=%1$s · wifi adb=%2$s · %3$s + adb connect %1$s + Waiting for Wi‑Fi and adb endpoints… + Bass boost + Default (passthrough) + Dolby 5.1 (stereo headset) + Dolby 7.1 (stereo headset) + Immersive + Audio preset + Filter intensity + Intensity: %1$d (0 = off, 10 = max) + Audio: PCM chain after AAC decode. Video experimental: GLES shader after decode (immersive denoise/sharpen, HDR tone map). Intensity 0–10. Restart cast session after preset changes. + Receiver A/V presets (experimental) + Default (passthrough) + HDR (experimental) + Immersive (experimental) + Video preset + Enable backend NTP sync + Disabled by default. Network self-test compares device time to BE (shown in BE timezone). If skew exceeds ±3 minutes, stores a correction offset for app diagnostics — does not change the system clock. + Default display only (active) + External display experimental (planned) + Prefer external when present (planned) + Enable in-app ads (placeholder) + Enable in-app purchases above first + Enable Play Store integration above first + Ads, billing, and review stay disabled for daily use. Configure Play Console SKUs and AdMob before any public release. + Enable in-app purchases (Play Billing) + Enable Play Store integration + Commercial (off until enabled here) + Full advertisement info + Audio codecs (compression) + Sound capture + Camera capture + Other casting / display + Hardware acceleration (video) + Supported features — quick read-only probes. Tests run in the background when you open this tab. + Network + Waiting… + Requires both peers on a build that supports MSG_DIAG_PING. Old peers ignore unknown packets. + Diagnostic cast ping-pong (~1/s) + Mirror as-is (dummy pong) + Ping response mode (this device) + Reply-with (seq + timestamps) + Mirror smart (local timestamp) + Running… + Stop tests + Stopped + External display capture policy (future) + Grab anonymous session stats + IAP query finished — see logcat + Force re-check + Hidden diagnostics tab. Long-press the tabs row to unlock. Runs quick network checks: connectivity, captive portal, CIDR/DNS/MTU, cast LAN peers (UDP discovery), backend RTT/throughput (apps.f0xx.org), NAT and NTP correction. + Waiting for self-test run… + Run self-test + Running self-test… + Network self-test tab unlocked + Open Play Store listing + Query IAP products (log) + Adaptive receiver display (experimental) + Reload codecs.json + Loads assets/codecs.json overrides without restarting the app. Reopen the settings drawer to refresh spinners. + Remote access: %1$s + Disabled + When enabled, device polls BE every 1–7 min (type:ra). WireGuard needs Android VPN permission once. RSSH uses outbound SSH — no VPN prompt. + Remote access (on-demand debug) + Remote access + WireGuard tunnel connected + Polling BE (%1$s) + Connected · session %1$s + Remote debug active + RSSH (reverse SSH) + Reverse SSH (RSSH) is not implemented yet. + RSSH (reverse SSH — alpha; not available yet) + All apps (matching routes) + App-only uses Android IncludedApplications so other apps keep their normal path. Ignored for RSSH. Changes reconnect an active WireGuard session. + VPN app scope (WireGuard) + This app only + VPN permission required for WireGuard remote access. + All traffic (0.0.0.0/0) + Hub-only is the production default (split tunnel). Full tunnel routes all device IP traffic through WireGuard when the session is up. + Hub only (172.200.2.1/32) + VPN route scope (WireGuard) + VPN routing updated — reconnecting if tunnel was up + WireGuard + Request in-app review flow + Combined (480p + 720p + original + adaptive) + Changes the sender resolution spinner in cast settings. Default: Separated. Re-open cast settings to refresh labels. + Legacy (full preset list) + Resolution preset mode + Sender resolution UI (test) + Separated (Original / 720p / 480p / Auto) + Show codec priority scores in settings + Show debug overlay on receiver + Record stream dump while casting (FR 0.1) + Writes zip under files/stream_dumps/ (max 5 min or 100 MB). Pull via adb. + Diagnostics + Network self-test + Settings + Show USB-tether transport in cast settings (stub, roadmap E) + Wired HDMI uses the OS display stack, not the cast protocol. If no second screen appears in system Display settings, adapters cannot be fixed in-app. See docs/USB_HDMI_CAST.md. + Show sender status when external display is plugged in + USB-C / HDMI (roadmap D) + Developer settings + Selected: %1$s (%2$s, %3$s) + Selected %1$d receivers + Recent + Enter PIN + Could not connect to %1$s:%2$d + Missing host, PIN, or settings + No cast intent + Screen capture data missing (retry cast) + Receiver not listening at %1$s:%2$d — on the tablet tap Start listening, then Refresh on this phone. + Found %1$d receiver(s) + Relay gateway URL (not implemented) + Cast adjustment preset + Author: + Built: + Commit: + Protocol: + Version: + Include audio (playback capture, Android 10+) + Audio codec + Audio unavailable (requires Android 10+) + Bitrate + Screen capture (sender phone) + Screen capture (sender phone only) + Language + Mute + Network adoption + Quality (bitrate / FPS) + Play incoming cast audio on this device + Resolution + Enable picture-in-picture (receiver) + Capture resolution + Send anonymous crash logs + Always show icon in system bar + Stream protection (UDP) + Theme + Transport + Username + Video codec + Language updated + English + Russian + Default (system) + Could not load license text. + Licenses + Same Wi‑Fi required. Default PIN: 1234. UDP is default; pick TCP in settings if needed. Match transport on both devices. + Connect to IP + Enter host and port + Receiver IP address + Port (default 41235) + Estimated (auto) + No compatible receivers (protocol/transport/codec) + Settings + AUTO (default) + Balanced + Estimated + None + OFF + ON + Performance (balanced) + Quality + RobustLess (UDP only) + Speed + Update check failed: %1$s + Check for updates now + Enable OTA periodic checks (default every 1 minute) + You dismissed this version — tap Check again to see it. + Download failed: %1$s + Download & install + Downloading update + Downloading APK… + Installed: %1$s (%2$d) + Not now + OTA channel URL (v0 stable.json) + No release notes. + No OTA channel URL — set one in developer settings or local.properties (ota.channel.url). + App updates + v0 layout: https://host/v0/ota/channel/stable.json → manifest → APK. Service checks every 1 minute by default (overridable in private settings.json). + App updates (OTA) + Up to date (%1$s, %2$d). + New OTA version found (%1$s, current version is: %2$s / %3$s MB). Would you like to perform the update?\n\n%4$s + Update available + Notifications (cast status) + App settings + Grant + Permissions needed + Leave empty for anonymous cast + PIN + The receiver expects a different PIN. Enter the PIN for this cast session. + PIN mismatch + Session PIN + Allow picture-in-picture for Android Cast in system settings, then try again. + Picture-in-picture disabled + Picture-in-picture + Notifications keep the receiver visible while casting in the background. + Picture-in-picture is not available on this device + Awaiting for stream to come… + Connected — waiting for video… + Listening for cast — awaiting sender… + Fullscreen playback %1$dx%2$d + Video playing + Cast ended — waiting for sender… + Stream lost — awaiting for stream to come… + Playing %1$dx%2$d + Press Back again to stop casting + Calibration test pattern + Camera preview + Casting — preview paused + Source preview\n(screen capture starts after START) + Screen preview + Screen preview — grant capture when prompted + FEC 3/4 + FEC + NACK + FEC (Reed-Solomon) + NACK + Stream protection: %1$s (%2$s) + Using FEC 3/4 without NACK (receiver %1$s, sender %2$s). NACK disabled for this session. + Using Reed–Solomon FEC (receiver %1$s, sender %2$s). For a direct match, set %3$s to FEC (Reed–Solomon). + Protection mismatch (receiver %1$s, sender %2$s). Casting without protection; align %3$s settings. + NACK off + NACK on + Using FEC with NACK (receiver %1$s, sender %2$s). + receiver + sender + No protection this session (receiver %1$s, sender %2$s). Set %3$s stream protection to None or match the peer. + None (default) + High (~10 Mbps, 30 fps) + Low (~1.5 Mbps, 24 fps) + Medium (~5 Mbps, 30 fps) — recommended + Receive on TV / projector + Adaptive (experimental) + AUTO (fits screen) + Listening for cast + When on, the receiver can shrink to a floating window during cast (after notifications are allowed). Off by default if PiP is unavailable. + Ready — PIN %1$s · %2$s + Starting receiver service… + Waiting for cast + Stream options are in Android Cast settings. + REFRESH + REFRESH (%1$d) + Rescanning for receivers… + Restore all app settings to default? + App settings restored to default + 720p height cap (keeps aspect) + 75% scale + Adaptive (BW estimator, preview) + Adaptive (BW estimator) + Original (native) + Fixed 1080p (fit in 1920×1080) + Fixed 720p (fit in 1280×720) + Full display + 50% scale + 480p + 720p + Auto + Original + Searching for receivers… + Select a receiver first + Send screen (tablet / phone) + Cast starting — see notification for status + Cast to receiver + Tap sessions to toggle overlay. Pinch or scroll wheel to zoom. Drag finger for values. + UDP & protection counters + Session grab is off — enable it here to record new sessions. + No session files yet. Cast with “Grab session stats” enabled. + Bitrate + Encode FPS + Loss % + Open statistics analyzer + Refresh + Share JSON + Could not share session file + Charts from session_send_* / session_recv_* JSON (enable grab in developer settings, then cast). + Session statistics + Open settings + Settings saved + App info + Global app settings + Receiver settings + Sender settings + Stream options + Start cast + Start listening (keeps running in background) + Stop + Sender preference — receiver FEC/NACK is auto-detected at connect. UDP only. + Video surface ready + Swipe from the left edge for settings + Theme updated + Dark + Inverted + Light + System (default) + Select at most %1$d receivers + Transport must match the receiver (TCP/UDP) + QUIC experimental (Cronet) + TCP (reliable fallback) + UDP (default, best effort) + USB tether (experimental) + WebRTC (stub, future) + Cast active — tap to open app + Android Cast — tap to open app + Persistent cast status icon in the notification bar + Cast tray + Waiting for receiver at %1$s:%2$d… + Waiting for sender… + Connected — open video surface… + External display detected — use system mirror or Wi‑Fi cast to receiver + + + + + + + + + \ No newline at end of file diff --git a/app/build/intermediates/incremental/debug/packageDebugResources/merger.xml b/app/build/intermediates/incremental/debug/packageDebugResources/merger.xml new file mode 100644 index 0000000..41f01d0 --- /dev/null +++ b/app/build/intermediates/incremental/debug/packageDebugResources/merger.xml @@ -0,0 +1,36 @@ + +Android CastSend screen (tablet / phone)Receive on TV / projectorSame Wi‑Fi required. Default PIN: 1234. UDP is default; pick TCP in settings if needed. Match transport on both devices.Cast to receiverWaiting for castPINREFRESHREFRESH (%1$d)Start castSearching for receivers…Waiting for sender…Stream optionsTransportQuality (bitrate / FPS)Capture resolutionScreen capture (sender phone)Screen capture (sender phone only)Entire screenChoose app or screen (Android 14+)App picker needs Android 14 (this device: API %1$d)Include audio (playback capture, Android 10+)Audio unavailable (requires Android 10+)Video onlyThis device runs Android 9 or lower. Playback audio capture needs Android 10 or newer. You can continue with video only.Continue (video only)UDP (default, best effort)TCP (reliable fallback)QUIC experimental (Cronet)WebRTC (stub, future)Calibration test patternCamera (rear Camera2)Camera source (requires Android 10+)Camera capture requires Android 10 or newer. Use screen or calibration test.Camera permission denied. Allow camera access or choose another capture mode.Could not open the camera. Try another capture mode.Calibration cast %1$dx%2$dCamera cast %1$dx%2$dLow (~1.5 Mbps, 24 fps)Medium (~5 Mbps, 30 fps) — recommendedHigh (~10 Mbps, 30 fps)Full display75% scale50% scale720p height cap (keeps aspect)Fixed 1080p (fit in 1920×1080)Fixed 720p (fit in 1280×720)Adaptive (BW estimator, preview)Original720p480pAutoOriginal (native)Adaptive (BW estimator)Video codecCast adjustment presetBitrateNetwork adoptionAUTO (default)NoneQualitySpeedPerformance (balanced)BalancedRobustLess (UDP only)EstimatedH.264 (AVC)H.265 (HEVC)Passthrough (debug)Passthrough video is not implemented yetTransport must match the receiver (TCP/UDP)Select a receiver firstEnter PINScreen capture permission deniedAllow microphone for audio cast fallback when nothing is playing on the sender.Casting startedFound %1$d receiver(s)Ready — PIN %1$s · %2$sCasting from %1$sCasting from %1$s · %2$sRescanning for receivers…Advanced options unlockedAdvanced options hiddenAdvanced connect (dev)Receiver IP addressPort (default 41235)Relay gateway URL (not implemented)Connect to IPEnter host and portPlaying %1$dx%2$dStopPlay incoming cast audio on this deviceStart listening (keeps running in background)Connected — waiting for video…Listening for cast — awaiting sender…Awaiting for stream to come…Stream lost — awaiting for stream to come…Cast ended — waiting for sender…Press Back again to stop castingPermissions neededGrantApp settingsStarting receiver service…Listening for castConnected — open video surface…Video surface readyConnecting…Connecting to %1$s…Authenticating…Casting via %1$s · %2$dx%3$dScreen capture data missing (retry cast)Missing host, PIN, or settingsNo cast intentReceiver not listening at %1$s:%2$d — on the tablet tap Start listening, then Refresh on this phone.Could not connect to %1$s:%2$dCast starting — see notification for statusFullscreen playback %1$dx%2$dVideo playingSelected: %1$s (%2$s, %3$s)Selected %1$d receiversSelect at most %1$d receiversPlay cast audio?The sender is streaming audio. Play it on this device?Play audioVideo onlyPlaying video and audioVideo only (audio skipped)Rotated — now %1$dx%2$dWaiting for receiver at %1$s:%2$d…SettingsAndroid Cast settingsGlobal app settingsSender settingsReceiver settingsUsernameAlways show icon in system barSend anonymous crash logsLeave empty for anonymous castResolutionAUTO (fits screen)Adaptive (experimental)Stream protection (UDP)Sender preference — receiver FEC/NACK is auto-detected at connect. UDP only.senderreceiverNACK onNACK offStream protection: %1$s (%2$s)No protection this session (receiver %1$s, sender %2$s). Set %3$s stream protection to None or match the peer.Protection mismatch (receiver %1$s, sender %2$s). Casting without protection; align %3$s settings.Using Reed–Solomon FEC (receiver %1$s, sender %2$s). For a direct match, set %3$s to FEC (Reed–Solomon).Using FEC 3/4 without NACK (receiver %1$s, sender %2$s). NACK disabled for this session.Using FEC with NACK (receiver %1$s, sender %2$s).FEC 3/4FEC (Reed-Solomon)NACKFEC + NACKNone (default)No compatible receivers (protocol/transport/codec)Estimated (auto)EstimatedONOFFPriority hint — codec is negotiated during handshake.Camera (rear)Camera (front)MuteSource preview\n(screen capture starts after START)Screen previewCasting — preview pausedCamera previewCalibration test patternStream options are in Android Cast settings.PIN mismatchThe receiver expects a different PIN. Enter the PIN for this cast session.Session PINSettings savedPIN cannot be changed while castingCast active — tap to open appAndroid Cast — tap to open appCast trayPersistent cast status icon in the notification barSwipe from the left edge for settingsThemeLanguageDefault (system)EnglishRussianLanguage updatedSystem (default)DarkLightInvertedTheme updatedScreen preview — grant capture when promptedOpen settingsApp infoVersion:Protocol:Commit:Built:Author:LicensesReset to defaultsRestore all app settings to default?App settings restored to defaultACCEPTLicensesCould not load license text.Developer settingsSettingsDiagnosticsSupported features — quick read-only probes. Tests run in the background when you open this tab.Stop testsWaiting…Running…StoppedHardware acceleration (video)Camera captureSound captureAudio codecs (compression)NetworkOther casting / displayFull advertisement infoSender resolution UI (test)Resolution preset modeSeparated (Original / 720p / 480p / Auto)Legacy (full preset list)Combined (480p + 720p + original + adaptive)Changes the sender resolution spinner in cast settings. Default: Separated. Re-open cast settings to refresh labels.USB-C / HDMI (roadmap D)Show sender status when external display is plugged inWired HDMI uses the OS display stack, not the cast protocol. If no second screen appears in system Display settings, adapters cannot be fixed in-app. See docs/USB_HDMI_CAST.md.External display capture policy (future)Show USB-tether transport in cast settings (stub, roadmap E)External display detected — use system mirror or Wi‑Fi cast to receiverUSB tether (experimental)ADB over Wi‑Fi (debug)Keep wireless adb alive after Wi‑Fi dropsRefresh adb connect info nowCopy adb connect lineWaiting for Wi‑Fi and adb endpoints…adb connect %1$sHTTP :5039/adb.json · secure=%1$s · wifi adb=%2$s · %3$sCopied adb connect lineOne-time (USB): ./scripts/grant-dev-adb-perms.sh — enables auto re-enable after Wi‑Fi drops and TLS port discovery. Pair wireless debugging once in system settings (Android 11+ uses a random TLS port, not 5555). rebuild.sh uses curl :5039/adb.json and avahi-browse _adb-tls-connect._tcp.ADB Wi‑Fi keeperShows adb connect line while debugging on flaky Wi‑Fi.ADB Wi‑Fi readyWaiting for Wi‑Fi IP…adb connect %1$sCommercial (off until enabled here)Enable in-app ads (placeholder)Enable in-app purchases (Play Billing)Enable Play Store integrationOpen Play Store listingRequest in-app review flowQuery IAP products (log)Ads, billing, and review stay disabled for daily use. Configure Play Console SKUs and AdMob before any public release.[Ads placeholder — enable AdMob in manifest for production]Enable Play Store integration above firstEnable in-app purchases above firstIAP query finished — see logcatDefault display only (active)Prefer external when present (planned)External display experimental (planned)Show debug overlay on receiverShow codec priority scores in settingsGrab anonymous session statsRecord stream dump while casting (FR 0.1)Writes zip under files/stream_dumps/ (max 5 min or 100 MB). Pull via adb.Diagnostic cast ping-pong (~1/s)Ping response mode (this device)Mirror as-is (dummy pong)Mirror smart (local timestamp)Reply-with (seq + timestamps)Requires both peers on a build that supports MSG_DIAG_PING. Old peers ignore unknown packets.Enable backend NTP syncDisabled by default. Network self-test compares device time to BE (shown in BE timezone). If skew exceeds ±3 minutes, stores a correction offset for app diagnostics — does not change the system clock.Remote access (on-demand debug)DisabledWireGuardRSSH (reverse SSH)RSSH (reverse SSH — alpha; not available yet)When enabled, device polls BE every 1–7 min (type:ra). WireGuard needs Android VPN permission once. RSSH uses outbound SSH — no VPN prompt.VPN route scope (WireGuard)Hub only (172.200.2.1/32)All traffic (0.0.0.0/0)Hub-only is the production default (split tunnel). Full tunnel routes all device IP traffic through WireGuard when the session is up.VPN app scope (WireGuard)All apps (matching routes)This app onlyApp-only uses Android IncludedApplications so other apps keep their normal path. Ignored for RSSH. Changes reconnect an active WireGuard session.VPN routing updated — reconnecting if tunnel was upReverse SSH (RSSH) is not implemented yet.Remote access: %1$sVPN permission required for WireGuard remote access.Remote accessRemote debug activePolling BE (%1$s)WireGuard tunnel connectedConnected · session %1$sNetwork self-testNetwork self-test tab unlockedHidden diagnostics tab. Long-press the tabs row to unlock. Runs quick network checks: connectivity, captive portal, CIDR/DNS/MTU, cast LAN peers (UDP discovery), backend RTT/throughput (apps.f0xx.org), NAT and NTP correction.Run self-testForce re-checkWaiting for self-test run…Running self-test…Session statisticsCharts from session_send_* / session_recv_* JSON (enable grab in developer settings, then cast).Open statistics analyzerRefreshShare JSONNo session files yet. Cast with “Grab session stats” enabled.Session grab is off — enable it here to record new sessions.UDP & protection countersCould not share session fileBitrateLoss %Encode FPSTap sessions to toggle overlay. Pinch or scroll wheel to zoom. Drag finger for values.Reload codecs.jsonLoads assets/codecs.json overrides without restarting the app. Reopen the settings drawer to refresh spinners.Adaptive receiver display (experimental)Receiver A/V presets (experimental)Video presetAudio presetFilter intensityIntensity: %1$d (0 = off, 10 = max)Audio: PCM chain after AAC decode. Video experimental: GLES shader after decode (immersive denoise/sharpen, HDR tone map). Intensity 0–10. Restart cast session after preset changes.Default (passthrough)Immersive (experimental)HDR (experimental)Default (passthrough)Bass boostImmersiveDolby 5.1 (stereo headset)Dolby 7.1 (stereo headset)App updates (OTA)v0 layout: https://host/v0/ota/channel/stable.json → manifest → APK. Service checks every 1 minute by default (overridable in private settings.json).OTA channel URL (v0 stable.json)Enable OTA periodic checks (default every 1 minute)Check for updates nowInstalled: %1$s (%2$d)No OTA channel URL — set one in developer settings or local.properties (ota.channel.url).Update check failed: %1$sUp to date (%1$s, %2$d).You dismissed this version — tap Check again to see it.Update availableNew OTA version found (%1$s, current version is: %2$s / %3$s MB). Would you like to perform the update?\n\n%4$sNo release notes.Download & installNot nowDownloading updateDownloading APK…Download failed: %1$sApp updates · %1$dAudio codeclibvpx (VP8)libvpx (VP9)AACSpeexOpusPassthrough (debug)AUTOPicture-in-picturePicture-in-picture is not available on this devicePicture-in-picture disabledAllow picture-in-picture for Android Cast in system settings, then try again.Notifications keep the receiver visible while casting in the background.Notifications (cast status)Enable picture-in-picture (receiver)When on, the receiver can shrink to a floating window during cast (after notifications are allowed). Off by default if PiP is unavailable.Recent#1565C0#331565C0#FF1565C0#FF212121#FFFFFFFF#66000000#FFF5F5F5#FF212121#AA000000#FFFFFFFF#66000000#FF34D399Android CastТрансляцияУстройства должны быть в одной сети. PIN по умолчанию: 1234; Транспорт должен совпадать с передающим устройством.ТрансляцияОжидаем поток...PINОБНОВИТЬОБНОВИТЬ (%1$d)Начать трансляциюПоиск трансляций…Ожидание потока…Настройки стримаТранспортКачество (bitrate / FPS)РазрешениеРазрешение (отправитель)Разрешение (только отправитель)Весь экранВыбрать приложение для захвата (Android 14+)App picker нужен Android 14 (текущий: API %1$d)Включить аудио (захват воспроизведения, Android 10+)Аудио недоступно (requires Android 10+)Только видеоУстройство под управлением Android 9 или ниже. Захват аудио недоступен, нужен Android 10 или более новый. Можно продолжить только с видеоПродолжить (только видео)UDP (по умолчанию, быстрый)TCP (медленный, но надежный)QUIC экспериент (Cronet)WebRTC (эксперимент, недоступно)Тест сигналаКамера (лицевая)Источник для камеры (Android 10+)Захват с камеры доступен с Android 10. Выберите экран или калибровку.Нет доступа к камере. Разрешите камеру или выберите другой режим.Не удалось открыть камеру. Выберите другой режим захвата.Передача калибрации %1$dx%2$dТрансляция с камеры %1$dx%2$dНизкий (~1.5 Mbps, 24 fps)Средний (~5 Mbps, 30 fps) — recommendedВысокий (~10 Mbps, 30 fps)Весь экран75% экрана50% экрана720p фикс. (с аспектом)1080p (1920×1080)720p (1280×720)Адаптивный (предсказание, в разработке)Оригинал720p480pАвтоОригинал (нативное)Адаптивный (оценка канала)Видео кодекТонкие быстрые настройкиBitrateАдаптация сетиAUTO (по умолчанию)НетКачествоСкоростьПроизводительность (компромисс)СбалансированоБез щащиты потока (только для UDP)ПредсказаниеH.264 (AVC)H.265 (HEVC)Passthrough (для разраб.)Passthrough недоступно, в разработкеВыбранный транспорт не соответствует принимающей сторонеВыберите приемник потокаВвод PINЗахват недоступен, ограничения системыРазрешить захват микрофона если отправитель ничего не проигрывает.Трансляция началасьНайдено %1$d получателейГотово — PIN %1$s · %2$sТрансляция от %1$sТрансляция с помощью %1$s · %2$sСканирую…Расширенные опции доступныРасшинерные опции выключеныРасширенные возможности (разработчикам)IP адрес получателяПорт (по умолчанию 41235)Relay gateway URL (не готово)Соединяюсь с IPВведите имя узла и портИграет %1$dx%2$dСтопПроигрывать входящее аудио на этом устройствеНачать (продолжит работу в фоновом режиме)Соединяюсь — ожидание потока…Ожидание потока…Ожидание входящих данных…Потеря трансляции — ожидаю поток…Трансляция завершена — ожидание данных отправителя…Нажмите "Назад" еще раз для выходаВключите разрешения системыРазрешитьНастройки приложенияСтартуем сервис получателя…Слушаем эфирСоежинились — открываем видео…Видео виджет готовСоединяемся…Соединяемся с %1$s…Проверка…Трансляция через %1$s · %2$dx%3$dДанные трансляции утеряны (пробуем перезапуск)Не указаны получатель, PIN, или кривые настройкиНету запроса на трансляциюПолучатель отсутствует на %1$s:%2$d — нажмите "Start listening" на получателе и пересканируйте сеть на этом устройстсвеНе могу соединиться с %1$s:%2$dНачинаем — следите за состоянием статусаПолноэкранное воспроизведение %1$dx%2$dВоспроизведениеВыбрано: %1$s (%2$s, %3$s)Выбрано %1$d получателейВыберите хотя бы %1$d получательВоспроизводить аудио?Отправитель включил передачу аудио. Воспроизвести?Проигрываем аудиоТолько видеоПроигрываем и аудио и видеоТолько видео (пропускаем аудио)Переворот — теперь %1$dx%2$dОжидаем получателя %1$s:%2$d…НастройкиНастройки Android CastОбщие настройкиНастройки отправкиНастройки приемаИмяВсегда показывать иконку состоянияПусто для анонимных трансляцийРазрешениеAUTOАдаптивно (эксперимент)Защита потока (только для UDP)Подсказка для получателя, не факт что заработает. Только для UDP транспортаFEC 3/4FEC (Reed-Solomon)NACKFEC + NACKНичего (по умолчанию)Нет совместимых получателей (протокол/транспорт/кодек)Предсказание (авто)ПредсказаниеВклВыклПодсказка — кодек выберется при согласовании, это только подсказка.Камера (тыл)Камера (фронт)ТихоПредпросмотр\n(трансляция начнется после нажатия кнопки)Предпросмотр экранаТрансляция — предпросмотр приостановленПредпросмотр с камерыКалибрационная таблицаStream options are in Android Cast settings.PIN не совпадаетПолучатель ожидает другой PIN. Можете поменять PIN в настройках.PIN сессииНастройки сохраненыPIN не может быть изменен посреди трансляцииТрансляция активна — нажмите чтобы открытьAndroid Cast — нажмите чтобы открытьCast trayВсегда показывать иконку статуса в строке состоянияПроведите по левому краю чтобы перейти к настройкамОформлениеЯзыкПо умолчанию (система)EnglishРусскийЯзык обновлёнСистема (по умолчанию)НочьДеньИнвертированнаяОформление обновленоПредпросмотр — разрешите захват, если не видноОткрыть настройкиИнформацияВерсия:Протокол:Commit:Сборка:Автор:ЛицензииСбросить по умолчаниюВосстановить все настройки приложения по умолчанию?Настройки приложения сброшены по умолчаниюПРИНЯТЬЛицензииНе могу найти факл лицензийДля разработчиковНастройкиДиагностикаПоддерживаемые возможности — быстрые проверки без ввода. Запускаются в фоне при открытии вкладки.Остановить тестыОжидание…Выполняется…ОстановленоАппаратное ускорение (видео)Захват с камерыЗахват звукаАудиокодеки (сжатие)СетьДругой вывод / трансляцияПолная реклама возможностейРазрешение отправителя (тест)Режим списка разрешенийРаздельный (Оригинал / 720p / 480p / Авто)Старый (полный список)Комбинированный (480p + 720p + оригинал + адаптив)Меняет список разрешений в настройках трансляции. По умолчанию: Раздельный. Откройте настройки cast заново.USB-C / HDMI (план D)Монетизация (выкл. по умолчанию)USB-тетер (эксперимент)Показывать отладочный оверлей на приёмникеПоказывать приоритет кодеков в настройкахСохранять анонимную статистику сессийПерезагрузить codecs.jsonПодгружает overrides из assets/codecs.json без перезапуска. Откройте настройки снова, чтобы обновить списки. · %1$dАудио кодекlibvpx (VP8)libvpx (VP9)AACSpeexOpusPassthrough (отладка)AUTOКартинка в картинке (PiP)Режим «картинка в картинке» (PiP) недоступен на этом устройствеPiP отключеноРазрешите PiP для Android Cast в настройках системы.Уведомления нужны, чтобы приёмник оставался активным при трансляции в фоне.Уведомления (статус трансляции)PiP (приёмник)При включении приёмник может свернуться в плавающее окно во время трансляции (нужны уведомления). Выключено, если PiP недоступен.Недавние#FF1565C0#FF000000#FFFFFFFF#99000000#66FFFFFF \ No newline at end of file diff --git a/app/build/intermediates/incremental/mergeDebugAssets/merger.xml b/app/build/intermediates/incremental/mergeDebugAssets/merger.xml new file mode 100644 index 0000000..1a09c80 --- /dev/null +++ b/app/build/intermediates/incremental/mergeDebugAssets/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/app/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml new file mode 100644 index 0000000..9ced164 --- /dev/null +++ b/app/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/build/intermediates/incremental/mergeDebugShaders/merger.xml b/app/build/intermediates/incremental/mergeDebugShaders/merger.xml new file mode 100644 index 0000000..3b70679 --- /dev/null +++ b/app/build/intermediates/incremental/mergeDebugShaders/merger.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt b/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt new file mode 100644 index 0000000..f00279e --- /dev/null +++ b/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt @@ -0,0 +1,67 @@ +#Fri Jun 19 17:07:18 CEST 2026 +base.0=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeExtDexDebug/classes.dex +base.1=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeLibDexDebug/14/classes.dex +base.10=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeProjectDexDebug/13/classes.dex +base.11=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeProjectDexDebug/14/classes.dex +base.12=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeProjectDexDebug/15/classes.dex +base.13=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeProjectDexDebug/2/classes.dex +base.14=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeProjectDexDebug/3/classes.dex +base.15=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeProjectDexDebug/4/classes.dex +base.16=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeProjectDexDebug/5/classes.dex +base.17=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeProjectDexDebug/7/classes.dex +base.18=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeProjectDexDebug/8/classes.dex +base.19=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeProjectDexDebug/9/classes.dex +base.2=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeLibDexDebug/6/classes.dex +base.20=/home/foxx/repos/My Projects/android cast/app/build/intermediates/global_synthetics_dex/debug/mergeDebugGlobalSynthetics/classes.dex +base.21=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeExtDexDebug/classes2.dex +base.3=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeLibDexDebug/8/classes.dex +base.4=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeLibDexDebug/9/classes.dex +base.5=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeProjectDexDebug/0/classes.dex +base.6=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeProjectDexDebug/1/classes.dex +base.7=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeProjectDexDebug/10/classes.dex +base.8=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeProjectDexDebug/11/classes.dex +base.9=/home/foxx/repos/My Projects/android cast/app/build/intermediates/dex/debug/mergeProjectDexDebug/12/classes.dex +path.0=classes.dex +path.1=14/classes.dex +path.10=13/classes.dex +path.11=14/classes.dex +path.12=15/classes.dex +path.13=2/classes.dex +path.14=3/classes.dex +path.15=4/classes.dex +path.16=5/classes.dex +path.17=7/classes.dex +path.18=8/classes.dex +path.19=9/classes.dex +path.2=6/classes.dex +path.20=classes.dex +path.21=classes2.dex +path.3=8/classes.dex +path.4=9/classes.dex +path.5=0/classes.dex +path.6=1/classes.dex +path.7=10/classes.dex +path.8=11/classes.dex +path.9=12/classes.dex +renamed.0=classes.dex +renamed.1=classes2.dex +renamed.10=classes11.dex +renamed.11=classes12.dex +renamed.12=classes13.dex +renamed.13=classes14.dex +renamed.14=classes15.dex +renamed.15=classes16.dex +renamed.16=classes17.dex +renamed.17=classes18.dex +renamed.18=classes19.dex +renamed.19=classes20.dex +renamed.2=classes3.dex +renamed.20=classes21.dex +renamed.21=classes22.dex +renamed.3=classes4.dex +renamed.4=classes5.dex +renamed.5=classes6.dex +renamed.6=classes7.dex +renamed.7=classes8.dex +renamed.8=classes9.dex +renamed.9=classes10.dex diff --git a/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources b/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources new file mode 100644 index 0000000..4970529 Binary files /dev/null and b/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources differ diff --git a/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/javaResources0 b/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/javaResources0 new file mode 100644 index 0000000..e53ad48 Binary files /dev/null and b/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/javaResources0 differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/AndroidCastApplication.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/AndroidCastApplication.class new file mode 100644 index 0000000..959eee7 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/AndroidCastApplication.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/AppPreferences.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/AppPreferences.class new file mode 100644 index 0000000..4bd6ff4 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/AppPreferences.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/BuildConfig.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/BuildConfig.class new file mode 100644 index 0000000..d65750f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/BuildConfig.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastActiveState.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastActiveState.class new file mode 100644 index 0000000..3a0688c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastActiveState.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastActivityTracker.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastActivityTracker.class new file mode 100644 index 0000000..cc6b5ee Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastActivityTracker.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastConfig.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastConfig.class new file mode 100644 index 0000000..5549969 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastConfig.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastLocaleHelper$AppLocaleMode.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastLocaleHelper$AppLocaleMode.class new file mode 100644 index 0000000..e35674d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastLocaleHelper$AppLocaleMode.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastLocaleHelper.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastLocaleHelper.class new file mode 100644 index 0000000..dadc2bc Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastLocaleHelper.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastNotifications.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastNotifications.class new file mode 100644 index 0000000..d8172bb Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastNotifications.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastResolution$Size.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastResolution$Size.class new file mode 100644 index 0000000..c4c24be Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastResolution$Size.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastResolution.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastResolution.class new file mode 100644 index 0000000..5c519ab Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastResolution.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$AdjustmentPreset.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$AdjustmentPreset.class new file mode 100644 index 0000000..a7a5b9c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$AdjustmentPreset.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$AudioCodec.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$AudioCodec.class new file mode 100644 index 0000000..ecf7cf6 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$AudioCodec.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$BitrateMode.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$BitrateMode.class new file mode 100644 index 0000000..165b0f9 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$BitrateMode.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$CaptureMode.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$CaptureMode.class new file mode 100644 index 0000000..30aef13 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$CaptureMode.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$NetworkAdoption.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$NetworkAdoption.class new file mode 100644 index 0000000..1ab09cf Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$NetworkAdoption.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$Quality.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$Quality.class new file mode 100644 index 0000000..1bb80b0 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$Quality.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$ReceiverDisplayResolution.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$ReceiverDisplayResolution.class new file mode 100644 index 0000000..f555f96 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$ReceiverDisplayResolution.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$Resolution.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$Resolution.class new file mode 100644 index 0000000..7ac2a80 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$Resolution.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$StreamProtection.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$StreamProtection.class new file mode 100644 index 0000000..e91fdbe Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$StreamProtection.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$VideoCodec.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$VideoCodec.class new file mode 100644 index 0000000..c4147ab Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings$VideoCodec.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings.class new file mode 100644 index 0000000..ae50d6e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettings.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsActivity.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsActivity.class new file mode 100644 index 0000000..359b76e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsActivity.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder$1.class new file mode 100644 index 0000000..72ffe6e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder$2.class new file mode 100644 index 0000000..097f6c4 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder$3.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder$3.class new file mode 100644 index 0000000..e124451 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder$3.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder$4.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder$4.class new file mode 100644 index 0000000..2afdcd9 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder$4.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder$5.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder$5.class new file mode 100644 index 0000000..d0c3072 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder$5.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder.class new file mode 100644 index 0000000..6439861 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsBinder.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsFragment$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsFragment$1.class new file mode 100644 index 0000000..75ee1c8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsFragment$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsFragment$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsFragment$2.class new file mode 100644 index 0000000..7fd1dcf Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsFragment$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsFragment.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsFragment.class new file mode 100644 index 0000000..1a20d76 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastSettingsFragment.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastThemeHelper$AppThemeMode.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastThemeHelper$AppThemeMode.class new file mode 100644 index 0000000..3d7b2a5 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastThemeHelper$AppThemeMode.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastThemeHelper.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastThemeHelper.class new file mode 100644 index 0000000..1d71f8b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastThemeHelper.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTrayContent$Body.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTrayContent$Body.class new file mode 100644 index 0000000..18d36d2 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTrayContent$Body.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTrayContent.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTrayContent.class new file mode 100644 index 0000000..5022cd7 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTrayContent.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTrayNotifier.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTrayNotifier.class new file mode 100644 index 0000000..90a0341 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTrayNotifier.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTuningEngine$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTuningEngine$1.class new file mode 100644 index 0000000..6e0ab5c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTuningEngine$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTuningEngine$CaptureLimits.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTuningEngine$CaptureLimits.class new file mode 100644 index 0000000..fc947dd Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTuningEngine$CaptureLimits.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTuningEngine$EffectiveParams.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTuningEngine$EffectiveParams.class new file mode 100644 index 0000000..668f054 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTuningEngine$EffectiveParams.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTuningEngine.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTuningEngine.class new file mode 100644 index 0000000..0f0b9f8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/CastTuningEngine.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity$1.class new file mode 100644 index 0000000..6320d7b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity$2.class new file mode 100644 index 0000000..3609112 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity$3.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity$3.class new file mode 100644 index 0000000..7527401 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity$3.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity$4.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity$4.class new file mode 100644 index 0000000..97ccb6d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity$4.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity$BoolPrefWriter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity$BoolPrefWriter.class new file mode 100644 index 0000000..62ce448 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity$BoolPrefWriter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity.class new file mode 100644 index 0000000..153c6b8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeveloperSettingsActivity.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeviceInfo.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeviceInfo.class new file mode 100644 index 0000000..22d5bfd Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DeviceInfo.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DrawerHostActivity$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DrawerHostActivity$1.class new file mode 100644 index 0000000..1124efb Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DrawerHostActivity$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DrawerHostActivity.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DrawerHostActivity.class new file mode 100644 index 0000000..5ec3cd0 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/DrawerHostActivity.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastReceiverService$Default.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastReceiverService$Default.class new file mode 100644 index 0000000..bc1567e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastReceiverService$Default.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastReceiverService$Stub$Proxy.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastReceiverService$Stub$Proxy.class new file mode 100644 index 0000000..5a74e65 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastReceiverService$Stub$Proxy.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastReceiverService$Stub.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastReceiverService$Stub.class new file mode 100644 index 0000000..d77d6bc Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastReceiverService$Stub.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastReceiverService$_Parcel.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastReceiverService$_Parcel.class new file mode 100644 index 0000000..dfc98ed Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastReceiverService$_Parcel.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastReceiverService.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastReceiverService.class new file mode 100644 index 0000000..405ee9f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastReceiverService.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastSenderService$Default.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastSenderService$Default.class new file mode 100644 index 0000000..6501142 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastSenderService$Default.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastSenderService$Stub$Proxy.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastSenderService$Stub$Proxy.class new file mode 100644 index 0000000..82872c3 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastSenderService$Stub$Proxy.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastSenderService$Stub.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastSenderService$Stub.class new file mode 100644 index 0000000..918a091 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastSenderService$Stub.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastSenderService.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastSenderService.class new file mode 100644 index 0000000..c0f8075 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastSenderService.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastStatusCallback$Default.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastStatusCallback$Default.class new file mode 100644 index 0000000..1374bd7 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastStatusCallback$Default.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastStatusCallback$Stub$Proxy.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastStatusCallback$Stub$Proxy.class new file mode 100644 index 0000000..f599523 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastStatusCallback$Stub$Proxy.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastStatusCallback$Stub.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastStatusCallback$Stub.class new file mode 100644 index 0000000..dbcefd4 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastStatusCallback$Stub.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastStatusCallback.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastStatusCallback.class new file mode 100644 index 0000000..f0abf68 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ICastStatusCallback.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkChangeListener$Default.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkChangeListener$Default.class new file mode 100644 index 0000000..005fe26 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkChangeListener$Default.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkChangeListener$Stub$Proxy.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkChangeListener$Stub$Proxy.class new file mode 100644 index 0000000..16fd17e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkChangeListener$Stub$Proxy.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkChangeListener$Stub.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkChangeListener$Stub.class new file mode 100644 index 0000000..cac752a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkChangeListener$Stub.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkChangeListener$_Parcel.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkChangeListener$_Parcel.class new file mode 100644 index 0000000..52dab4b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkChangeListener$_Parcel.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkChangeListener.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkChangeListener.class new file mode 100644 index 0000000..d5ad27a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkChangeListener.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkSelfTestService$Default.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkSelfTestService$Default.class new file mode 100644 index 0000000..6b6e651 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkSelfTestService$Default.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkSelfTestService$Stub$Proxy.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkSelfTestService$Stub$Proxy.class new file mode 100644 index 0000000..9a03bb2 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkSelfTestService$Stub$Proxy.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkSelfTestService$Stub.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkSelfTestService$Stub.class new file mode 100644 index 0000000..68d0226 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkSelfTestService$Stub.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkSelfTestService$_Parcel.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkSelfTestService$_Parcel.class new file mode 100644 index 0000000..7d9a5e7 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkSelfTestService$_Parcel.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkSelfTestService.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkSelfTestService.class new file mode 100644 index 0000000..8e10912 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/INetworkSelfTestService.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlHost$Default.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlHost$Default.class new file mode 100644 index 0000000..944def3 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlHost$Default.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlHost$Stub$Proxy.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlHost$Stub$Proxy.class new file mode 100644 index 0000000..d544e57 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlHost$Stub$Proxy.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlHost$Stub.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlHost$Stub.class new file mode 100644 index 0000000..42953c3 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlHost$Stub.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlHost.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlHost.class new file mode 100644 index 0000000..15752ba Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlHost.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlService$Default.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlService$Default.class new file mode 100644 index 0000000..98c90d6 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlService$Default.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlService$Stub$Proxy.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlService$Stub$Proxy.class new file mode 100644 index 0000000..d05bf91 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlService$Stub$Proxy.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlService$Stub.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlService$Stub.class new file mode 100644 index 0000000..faa0f42 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlService$Stub.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlService.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlService.class new file mode 100644 index 0000000..a6e6f0d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IRemoteAccessControlService.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnOperationCallback$Default.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnOperationCallback$Default.class new file mode 100644 index 0000000..8bd5e6c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnOperationCallback$Default.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnOperationCallback$Stub$Proxy.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnOperationCallback$Stub$Proxy.class new file mode 100644 index 0000000..c43c1d9 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnOperationCallback$Stub$Proxy.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnOperationCallback$Stub.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnOperationCallback$Stub.class new file mode 100644 index 0000000..de9730c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnOperationCallback$Stub.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnOperationCallback.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnOperationCallback.class new file mode 100644 index 0000000..6f6865b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnOperationCallback.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnService$Default.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnService$Default.class new file mode 100644 index 0000000..3bffc54 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnService$Default.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnService$Stub$Proxy.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnService$Stub$Proxy.class new file mode 100644 index 0000000..07dd5ff Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnService$Stub$Proxy.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnService$Stub.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnService$Stub.class new file mode 100644 index 0000000..6f5ee7b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnService$Stub.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnService.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnService.class new file mode 100644 index 0000000..6600300 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnService.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnStateCallback$Default.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnStateCallback$Default.class new file mode 100644 index 0000000..a193ad3 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnStateCallback$Default.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnStateCallback$Stub$Proxy.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnStateCallback$Stub$Proxy.class new file mode 100644 index 0000000..0dbe9fd Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnStateCallback$Stub$Proxy.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnStateCallback$Stub.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnStateCallback$Stub.class new file mode 100644 index 0000000..a72ce1f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnStateCallback$Stub.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnStateCallback.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnStateCallback.class new file mode 100644 index 0000000..c5368c2 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IVpnStateCallback.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IntentExtras.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IntentExtras.class new file mode 100644 index 0000000..e78da4f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/IntentExtras.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/LicensesActivity.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/LicensesActivity.class new file mode 100644 index 0000000..88b2890 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/LicensesActivity.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/MainActivity$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/MainActivity$1.class new file mode 100644 index 0000000..3d053fb Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/MainActivity$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/MainActivity.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/MainActivity.class new file mode 100644 index 0000000..5566424 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/MainActivity.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/NetworkConditions$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/NetworkConditions$1.class new file mode 100644 index 0000000..cc0f2ac Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/NetworkConditions$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/NetworkConditions.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/NetworkConditions.class new file mode 100644 index 0000000..171a1ab Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/NetworkConditions.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/PermissionHelper$PermissionItem.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/PermissionHelper$PermissionItem.class new file mode 100644 index 0000000..61e2732 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/PermissionHelper$PermissionItem.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/PermissionHelper.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/PermissionHelper.class new file mode 100644 index 0000000..5ad2f50 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/PermissionHelper.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/PictureInPictureHelper.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/PictureInPictureHelper.class new file mode 100644 index 0000000..99c69b4 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/PictureInPictureHelper.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/PinAuth.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/PinAuth.class new file mode 100644 index 0000000..96d2011 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/PinAuth.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/PlatformCastSupport.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/PlatformCastSupport.class new file mode 100644 index 0000000..16659f8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/PlatformCastSupport.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/SettingsUi$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/SettingsUi$1.class new file mode 100644 index 0000000..70d2d84 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/SettingsUi$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/SettingsUi$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/SettingsUi$2.class new file mode 100644 index 0000000..328b03d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/SettingsUi$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/SettingsUi$IntConsumer.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/SettingsUi$IntConsumer.class new file mode 100644 index 0000000..3f6b1d0 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/SettingsUi$IntConsumer.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/SettingsUi$LabelProvider.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/SettingsUi$LabelProvider.class new file mode 100644 index 0000000..92395d4 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/SettingsUi$LabelProvider.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/SettingsUi.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/SettingsUi.class new file mode 100644 index 0000000..128fca5 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/SettingsUi.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/TrayForegroundService$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/TrayForegroundService$1.class new file mode 100644 index 0000000..71a5ab0 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/TrayForegroundService$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/TrayForegroundService.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/TrayForegroundService.class new file mode 100644 index 0000000..3e00c0c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/TrayForegroundService.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/TrayNotificationReceiver.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/TrayNotificationReceiver.class new file mode 100644 index 0000000..66f1027 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/TrayNotificationReceiver.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/VersionInfo.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/VersionInfo.class new file mode 100644 index 0000000..4fc9fde Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/VersionInfo.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/VersionUtils.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/VersionUtils.class new file mode 100644 index 0000000..352eeb6 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/VersionUtils.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/commercial/CommercialFeatures.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/commercial/CommercialFeatures.class new file mode 100644 index 0000000..fe7a453 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/commercial/CommercialFeatures.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/commercial/InAppAdCoordinator.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/commercial/InAppAdCoordinator.class new file mode 100644 index 0000000..4e8ae1a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/commercial/InAppAdCoordinator.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/commercial/InAppPurchaseCoordinator$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/commercial/InAppPurchaseCoordinator$1.class new file mode 100644 index 0000000..5568f52 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/commercial/InAppPurchaseCoordinator$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/commercial/InAppPurchaseCoordinator.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/commercial/InAppPurchaseCoordinator.class new file mode 100644 index 0000000..89b1c12 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/commercial/InAppPurchaseCoordinator.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/commercial/PlayStoreIntegration.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/commercial/PlayStoreIntegration.class new file mode 100644 index 0000000..bdf9714 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/commercial/PlayStoreIntegration.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashNativeBridge.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashNativeBridge.class new file mode 100644 index 0000000..db905fd Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashNativeBridge.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashReportBuilder.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashReportBuilder.class new file mode 100644 index 0000000..979e34c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashReportBuilder.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashReportStore.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashReportStore.class new file mode 100644 index 0000000..5697eb5 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashReportStore.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashReporter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashReporter.class new file mode 100644 index 0000000..906ecdb Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashReporter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashRuntimeContext$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashRuntimeContext$1.class new file mode 100644 index 0000000..d7ca3a2 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashRuntimeContext$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashRuntimeContext.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashRuntimeContext.class new file mode 100644 index 0000000..13462fb Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashRuntimeContext.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashSettings.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashSettings.class new file mode 100644 index 0000000..d8af5a2 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashSettings.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashSettingsStore.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashSettingsStore.class new file mode 100644 index 0000000..10854e2 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashSettingsStore.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashUploadClient.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashUploadClient.class new file mode 100644 index 0000000..d435414 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashUploadClient.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashWatcherService.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashWatcherService.class new file mode 100644 index 0000000..215f00b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/crash/CrashWatcherService.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DebugDeployWakeReceiver.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DebugDeployWakeReceiver.class new file mode 100644 index 0000000..e8be293 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DebugDeployWakeReceiver.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbConnectHttpServer.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbConnectHttpServer.class new file mode 100644 index 0000000..fec977b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbConnectHttpServer.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbConnectInfo$RaControlEndpoint.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbConnectInfo$RaControlEndpoint.class new file mode 100644 index 0000000..90291fa Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbConnectInfo$RaControlEndpoint.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbConnectInfo.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbConnectInfo.class new file mode 100644 index 0000000..16faccd Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbConnectInfo.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbMdnsProbe$1$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbMdnsProbe$1$1.class new file mode 100644 index 0000000..3d2486a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbMdnsProbe$1$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbMdnsProbe$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbMdnsProbe$1.class new file mode 100644 index 0000000..96a3749 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbMdnsProbe$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbMdnsProbe.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbMdnsProbe.class new file mode 100644 index 0000000..bc55f78 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbMdnsProbe.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbWifiHelper.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbWifiHelper.class new file mode 100644 index 0000000..238f992 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbWifiHelper.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbWifiKeeper$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbWifiKeeper$1.class new file mode 100644 index 0000000..5b94c7b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbWifiKeeper$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbWifiKeeper.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbWifiKeeper.class new file mode 100644 index 0000000..9b4fa78 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbWifiKeeper.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbWifiReceiver.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbWifiReceiver.class new file mode 100644 index 0000000..9495916 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbWifiReceiver.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsController$CardViews.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsController$CardViews.class new file mode 100644 index 0000000..ca1da00 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsController$CardViews.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsController$Probe.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsController$Probe.class new file mode 100644 index 0000000..5fb11ad Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsController$Probe.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsController$Section.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsController$Section.class new file mode 100644 index 0000000..11a28c8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsController$Section.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsController.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsController.class new file mode 100644 index 0000000..a6efa3d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsController.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsProbe.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsProbe.class new file mode 100644 index 0000000..1ac67ae Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsProbe.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsReport.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsReport.class new file mode 100644 index 0000000..5606d0c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevDiagnosticsReport.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevInstallWakeHelper.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevInstallWakeHelper.class new file mode 100644 index 0000000..e6599a5 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevInstallWakeHelper.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestController$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestController$1.class new file mode 100644 index 0000000..6a3faa4 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestController$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestController$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestController$2.class new file mode 100644 index 0000000..e32051c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestController$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestController$3.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestController$3.class new file mode 100644 index 0000000..0963d7f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestController$3.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestController.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestController.class new file mode 100644 index 0000000..fcf42a8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestController.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestProbe$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestProbe$1.class new file mode 100644 index 0000000..dafd625 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestProbe$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestProbe$HttpReadResult.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestProbe$HttpReadResult.class new file mode 100644 index 0000000..5b196b5 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestProbe$HttpReadResult.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestProbe$HttpResult.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestProbe$HttpResult.class new file mode 100644 index 0000000..bd81780 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestProbe$HttpResult.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestProbe$HttpTextResult.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestProbe$HttpTextResult.class new file mode 100644 index 0000000..b54d605 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestProbe$HttpTextResult.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestProbe.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestProbe.class new file mode 100644 index 0000000..9c5335d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestProbe.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestReport$Level.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestReport$Level.class new file mode 100644 index 0000000..930c2e0 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestReport$Level.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestReport.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestReport.class new file mode 100644 index 0000000..04775e0 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevNetworkSelfTestReport.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevVpnStatusProbe.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevVpnStatusProbe.class new file mode 100644 index 0000000..9177ea6 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/DevVpnStatusProbe.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/StreamDumpWriter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/StreamDumpWriter.class new file mode 100644 index 0000000..a6d4fb5 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/dev/StreamDumpWriter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastDiagnosticsFormatter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastDiagnosticsFormatter.class new file mode 100644 index 0000000..9493e67 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastDiagnosticsFormatter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastDiagnosticsLabels$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastDiagnosticsLabels$1.class new file mode 100644 index 0000000..d9ac263 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastDiagnosticsLabels$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastDiagnosticsLabels.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastDiagnosticsLabels.class new file mode 100644 index 0000000..6389ff5 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastDiagnosticsLabels.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastDiagnosticsScorer.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastDiagnosticsScorer.class new file mode 100644 index 0000000..63bb7ed Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastDiagnosticsScorer.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastMtuSampler$Info.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastMtuSampler$Info.class new file mode 100644 index 0000000..62d9a50 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastMtuSampler$Info.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastMtuSampler.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastMtuSampler.class new file mode 100644 index 0000000..0f8cc90 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastMtuSampler.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CpuLoadSampler$ProcStat.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CpuLoadSampler$ProcStat.class new file mode 100644 index 0000000..84ec82a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CpuLoadSampler$ProcStat.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CpuLoadSampler$Sample.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CpuLoadSampler$Sample.class new file mode 100644 index 0000000..524ae8d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CpuLoadSampler$Sample.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CpuLoadSampler.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CpuLoadSampler.class new file mode 100644 index 0000000..3fafaee Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CpuLoadSampler.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/CastLanPeerProbe$Result.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/CastLanPeerProbe$Result.class new file mode 100644 index 0000000..0e1852b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/CastLanPeerProbe$Result.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/CastLanPeerProbe.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/CastLanPeerProbe.class new file mode 100644 index 0000000..f13abdc Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/CastLanPeerProbe.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/DiscoveryManager$DiscoveredDevice.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/DiscoveryManager$DiscoveredDevice.class new file mode 100644 index 0000000..09e15d1 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/DiscoveryManager$DiscoveredDevice.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/DiscoveryManager$Listener.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/DiscoveryManager$Listener.class new file mode 100644 index 0000000..30b355a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/DiscoveryManager$Listener.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/DiscoveryManager.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/DiscoveryManager.class new file mode 100644 index 0000000..922b51b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/DiscoveryManager.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/DiscoverySelfFilter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/DiscoverySelfFilter.class new file mode 100644 index 0000000..8aabdce Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/DiscoverySelfFilter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/NsdCastDiscovery$1$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/NsdCastDiscovery$1$1.class new file mode 100644 index 0000000..bb453bb Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/NsdCastDiscovery$1$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/NsdCastDiscovery$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/NsdCastDiscovery$1.class new file mode 100644 index 0000000..e61589a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/NsdCastDiscovery$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/NsdCastDiscovery$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/NsdCastDiscovery$2.class new file mode 100644 index 0000000..3c553a8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/NsdCastDiscovery$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/NsdCastDiscovery$Host.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/NsdCastDiscovery$Host.class new file mode 100644 index 0000000..198e935 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/NsdCastDiscovery$Host.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/NsdCastDiscovery.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/NsdCastDiscovery.class new file mode 100644 index 0000000..3cf52a4 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/NsdCastDiscovery.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/PinnedReceiversStore.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/PinnedReceiversStore.class new file mode 100644 index 0000000..249ec7b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/PinnedReceiversStore.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/ReceiverCompatibility$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/ReceiverCompatibility$1.class new file mode 100644 index 0000000..ac13edf Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/ReceiverCompatibility$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/ReceiverCompatibility.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/ReceiverCompatibility.class new file mode 100644 index 0000000..c6b6646 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/discovery/ReceiverCompatibility.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/display/ExternalDisplayCapturePolicy.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/display/ExternalDisplayCapturePolicy.class new file mode 100644 index 0000000..0d954df Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/display/ExternalDisplayCapturePolicy.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/display/WiredDisplayMonitor$ExternalDisplayInfo.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/display/WiredDisplayMonitor$ExternalDisplayInfo.class new file mode 100644 index 0000000..df67da8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/display/WiredDisplayMonitor$ExternalDisplayInfo.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/display/WiredDisplayMonitor$Listener.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/display/WiredDisplayMonitor$Listener.class new file mode 100644 index 0000000..5c8e74e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/display/WiredDisplayMonitor$Listener.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/display/WiredDisplayMonitor.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/display/WiredDisplayMonitor.class new file mode 100644 index 0000000..a7d00c1 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/display/WiredDisplayMonitor.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementCoordinator.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementCoordinator.class new file mode 100644 index 0000000..610099d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementCoordinator.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementFlags.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementFlags.class new file mode 100644 index 0000000..ceb28d9 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementFlags.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementNativeBridge.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementNativeBridge.class new file mode 100644 index 0000000..97f89fc Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementNativeBridge.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementPolicy.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementPolicy.class new file mode 100644 index 0000000..1a5d97c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementPolicy.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementStore.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementStore.class new file mode 100644 index 0000000..9b4853e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementStore.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementSyncClient$SyncPayload.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementSyncClient$SyncPayload.class new file mode 100644 index 0000000..b7b1003 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementSyncClient$SyncPayload.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementSyncClient.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementSyncClient.class new file mode 100644 index 0000000..0d4010a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementSyncClient.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/PaidEntitlements.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/PaidEntitlements.class new file mode 100644 index 0000000..472272e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/entitlements/PaidEntitlements.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/live/LiveCastControlPlane.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/live/LiveCastControlPlane.class new file mode 100644 index 0000000..358d228 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/live/LiveCastControlPlane.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/live/LiveCastPeerTracker$Listener.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/live/LiveCastPeerTracker$Listener.class new file mode 100644 index 0000000..800bbcb Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/live/LiveCastPeerTracker$Listener.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/live/LiveCastPeerTracker.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/live/LiveCastPeerTracker.class new file mode 100644 index 0000000..78954ce Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/live/LiveCastPeerTracker.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/AacAdtsHelper.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/AacAdtsHelper.class new file mode 100644 index 0000000..40827e1 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/AacAdtsHelper.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/AudioNegotiator.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/AudioNegotiator.class new file mode 100644 index 0000000..91bb708 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/AudioNegotiator.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecNegotiator.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecNegotiator.class new file mode 100644 index 0000000..ae90592 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecNegotiator.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$1.class new file mode 100644 index 0000000..104be87 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$AudioNegotiationCandidate.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$AudioNegotiationCandidate.class new file mode 100644 index 0000000..feb18bc Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$AudioNegotiationCandidate.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$AudioNegotiationDecision.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$AudioNegotiationDecision.class new file mode 100644 index 0000000..09e6ade Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$AudioNegotiationDecision.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$NegotiationCandidate.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$NegotiationCandidate.class new file mode 100644 index 0000000..3a151df Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$NegotiationCandidate.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$NegotiationDecision.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$NegotiationDecision.class new file mode 100644 index 0000000..c209313 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$NegotiationDecision.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$ScoreBreakdown.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$ScoreBreakdown.class new file mode 100644 index 0000000..647683e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$ScoreBreakdown.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$ScoredItem.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$ScoredItem.class new file mode 100644 index 0000000..24f006c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog$ScoredItem.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog.class new file mode 100644 index 0000000..3181325 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityCatalog.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityId$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityId$1.class new file mode 100644 index 0000000..1979bfe Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityId$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityId.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityId.class new file mode 100644 index 0000000..98af698 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecPriorityId.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecTier.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecTier.class new file mode 100644 index 0000000..feb97ed Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/CodecTier.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/EncodedStreamProbe.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/EncodedStreamProbe.class new file mode 100644 index 0000000..d850d14 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/EncodedStreamProbe.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/H264Bitstream.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/H264Bitstream.class new file mode 100644 index 0000000..6ee5843 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/H264Bitstream.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/H264SpsParser$BitReader.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/H264SpsParser$BitReader.class new file mode 100644 index 0000000..e51c051 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/H264SpsParser$BitReader.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/H264SpsParser$Dimensions.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/H264SpsParser$Dimensions.class new file mode 100644 index 0000000..11a7150 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/H264SpsParser$Dimensions.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/H264SpsParser.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/H264SpsParser.class new file mode 100644 index 0000000..42801e3 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/H264SpsParser.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/PcmLevelAnalyzer$Levels.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/PcmLevelAnalyzer$Levels.class new file mode 100644 index 0000000..db39b14 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/PcmLevelAnalyzer$Levels.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/PcmLevelAnalyzer.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/PcmLevelAnalyzer.class new file mode 100644 index 0000000..b71d3a8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/PcmLevelAnalyzer.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/RgbToNv21.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/RgbToNv21.class new file mode 100644 index 0000000..f372aa5 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/RgbToNv21.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/RgbToYuv420$Layout.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/RgbToYuv420$Layout.class new file mode 100644 index 0000000..be53843 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/RgbToYuv420$Layout.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/RgbToYuv420.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/RgbToYuv420.class new file mode 100644 index 0000000..54a2a6d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/RgbToYuv420.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/StreamDimensionResolver$Size.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/StreamDimensionResolver$Size.class new file mode 100644 index 0000000..a8d809b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/StreamDimensionResolver$Size.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/StreamDimensionResolver.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/StreamDimensionResolver.class new file mode 100644 index 0000000..e78180f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/StreamDimensionResolver.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/AudioCodecBackend.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/AudioCodecBackend.class new file mode 100644 index 0000000..f716e38 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/AudioCodecBackend.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/AudioCodecFactory.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/AudioCodecFactory.class new file mode 100644 index 0000000..affd956 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/AudioCodecFactory.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/AudioEncoderSink$Callback.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/AudioEncoderSink$Callback.class new file mode 100644 index 0000000..a6bfa42 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/AudioEncoderSink$Callback.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/AudioEncoderSink.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/AudioEncoderSink.class new file mode 100644 index 0000000..379d84f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/AudioEncoderSink.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/CodecSessionRegistry.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/CodecSessionRegistry.class new file mode 100644 index 0000000..3d48d83 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/CodecSessionRegistry.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/LibvpxCapableVideoDecoder.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/LibvpxCapableVideoDecoder.class new file mode 100644 index 0000000..c6a1cd3 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/LibvpxCapableVideoDecoder.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/LibvpxVideoEncoderSink$CapturePipeline.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/LibvpxVideoEncoderSink$CapturePipeline.class new file mode 100644 index 0000000..8157eb3 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/LibvpxVideoEncoderSink$CapturePipeline.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/LibvpxVideoEncoderSink.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/LibvpxVideoEncoderSink.class new file mode 100644 index 0000000..d053f63 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/LibvpxVideoEncoderSink.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/PassthroughAudioEncoderSink.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/PassthroughAudioEncoderSink.class new file mode 100644 index 0000000..195f758 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/PassthroughAudioEncoderSink.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/PassthroughCodecPolicy$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/PassthroughCodecPolicy$1.class new file mode 100644 index 0000000..0381de0 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/PassthroughCodecPolicy$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/PassthroughCodecPolicy.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/PassthroughCodecPolicy.class new file mode 100644 index 0000000..58d7d7c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/PassthroughCodecPolicy.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/PassthroughVideoEncoderSink.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/PassthroughVideoEncoderSink.class new file mode 100644 index 0000000..2120765 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/PassthroughVideoEncoderSink.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoCodecBackend.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoCodecBackend.class new file mode 100644 index 0000000..14904a1 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoCodecBackend.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoCodecFactory.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoCodecFactory.class new file mode 100644 index 0000000..8199b34 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoCodecFactory.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoDecoderFactory.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoDecoderFactory.class new file mode 100644 index 0000000..f8f6c31 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoDecoderFactory.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoDecoderSink$Listener.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoDecoderSink$Listener.class new file mode 100644 index 0000000..d0145a2 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoDecoderSink$Listener.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoDecoderSink.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoDecoderSink.class new file mode 100644 index 0000000..6a19582 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoDecoderSink.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoEncoderSink$Callback.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoEncoderSink$Callback.class new file mode 100644 index 0000000..58c24a9 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoEncoderSink$Callback.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoEncoderSink.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoEncoderSink.class new file mode 100644 index 0000000..dfa8bc4 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/VideoEncoderSink.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/jni/NativeCodecBridge.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/jni/NativeCodecBridge.class new file mode 100644 index 0000000..feaebab Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/jni/NativeCodecBridge.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/jni/VpxEncodedFrame.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/jni/VpxEncodedFrame.class new file mode 100644 index 0000000..13a7dd7 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/media/codec/jni/VpxEncodedFrame.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/BackendEndpoints.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/BackendEndpoints.class new file mode 100644 index 0000000..7c2333a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/BackendEndpoints.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/BackendNtpSync$Action.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/BackendNtpSync$Action.class new file mode 100644 index 0000000..c6c18e1 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/BackendNtpSync$Action.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/BackendNtpSync$Result.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/BackendNtpSync$Result.class new file mode 100644 index 0000000..b2c2280 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/BackendNtpSync$Result.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/BackendNtpSync.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/BackendNtpSync.class new file mode 100644 index 0000000..7d7bb03 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/BackendNtpSync.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastCodecFlags$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastCodecFlags$1.class new file mode 100644 index 0000000..8b20963 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastCodecFlags$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastCodecFlags.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastCodecFlags.class new file mode 100644 index 0000000..0c50a77 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastCodecFlags.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastFramingContext.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastFramingContext.class new file mode 100644 index 0000000..e8ea05c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastFramingContext.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastPacketFramer.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastPacketFramer.class new file mode 100644 index 0000000..630e54b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastPacketFramer.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtoHeader.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtoHeader.class new file mode 100644 index 0000000..f8ceede Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtoHeader.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$AudioConfig.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$AudioConfig.class new file mode 100644 index 0000000..8c25a3a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$AudioConfig.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$AudioFrame.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$AudioFrame.class new file mode 100644 index 0000000..387c8f1 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$AudioFrame.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$Message.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$Message.class new file mode 100644 index 0000000..95d2b24 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$Message.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$NetworkControl.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$NetworkControl.class new file mode 100644 index 0000000..53e5cdf Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$NetworkControl.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$StreamConfig.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$StreamConfig.class new file mode 100644 index 0000000..ffe91f2 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$StreamConfig.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$VideoFrame.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$VideoFrame.class new file mode 100644 index 0000000..fb3e5e8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol$VideoFrame.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol.class new file mode 100644 index 0000000..0108e74 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastProtocol.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastSession$HandshakeResult.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastSession$HandshakeResult.class new file mode 100644 index 0000000..6734be2 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastSession$HandshakeResult.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastSession.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastSession.class new file mode 100644 index 0000000..35eebad Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastSession.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastSessionGate.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastSessionGate.class new file mode 100644 index 0000000..476853a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastSessionGate.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastTransport.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastTransport.class new file mode 100644 index 0000000..39360ba Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastTransport.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastTransportFactory.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastTransportFactory.class new file mode 100644 index 0000000..00489d9 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/CastTransportFactory.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/TcpCastTransport.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/TcpCastTransport.class new file mode 100644 index 0000000..073b07a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/TcpCastTransport.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/UdpCastTransport$Reassembly.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/UdpCastTransport$Reassembly.class new file mode 100644 index 0000000..4ec0098 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/UdpCastTransport$Reassembly.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/UdpCastTransport.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/UdpCastTransport.class new file mode 100644 index 0000000..798db64 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/UdpCastTransport.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/NetworkControlAdvice.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/NetworkControlAdvice.class new file mode 100644 index 0000000..b4e1c15 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/NetworkControlAdvice.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/NetworkControlPlane.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/NetworkControlPlane.class new file mode 100644 index 0000000..1512fd6 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/NetworkControlPlane.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/NetworkFeedbackManager.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/NetworkFeedbackManager.class new file mode 100644 index 0000000..e854bc8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/NetworkFeedbackManager.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/NetworkStatsSnapshot.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/NetworkStatsSnapshot.class new file mode 100644 index 0000000..76a88a9 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/NetworkStatsSnapshot.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/PassThroughNetworkControlPlane$StatsEnricher.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/PassThroughNetworkControlPlane$StatsEnricher.class new file mode 100644 index 0000000..b637665 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/PassThroughNetworkControlPlane$StatsEnricher.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/PassThroughNetworkControlPlane.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/PassThroughNetworkControlPlane.class new file mode 100644 index 0000000..ddf747f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/control/PassThroughNetworkControlPlane.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/CastDiagPing$Packet.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/CastDiagPing$Packet.class new file mode 100644 index 0000000..537d227 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/CastDiagPing$Packet.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/CastDiagPing.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/CastDiagPing.class new file mode 100644 index 0000000..3b24761 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/CastDiagPing.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/DiagPingMetrics$Snapshot.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/DiagPingMetrics$Snapshot.class new file mode 100644 index 0000000..eeccc40 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/DiagPingMetrics$Snapshot.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/DiagPingMetrics.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/DiagPingMetrics.class new file mode 100644 index 0000000..b397b48 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/DiagPingMetrics.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/DiagPingSession$SampleListener.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/DiagPingSession$SampleListener.class new file mode 100644 index 0000000..840dff7 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/DiagPingSession$SampleListener.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/DiagPingSession.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/DiagPingSession.class new file mode 100644 index 0000000..400ca1e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/diag/DiagPingSession.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/quic/CronetEngineProvider.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/quic/CronetEngineProvider.class new file mode 100644 index 0000000..19b16a3 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/quic/CronetEngineProvider.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/quic/QuicCronetCastTransport.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/quic/QuicCronetCastTransport.class new file mode 100644 index 0000000..2a92b2e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/quic/QuicCronetCastTransport.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/selftest/NetworkSelfTestBridge.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/selftest/NetworkSelfTestBridge.class new file mode 100644 index 0000000..b9a9123 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/selftest/NetworkSelfTestBridge.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/selftest/NetworkSelfTestService$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/selftest/NetworkSelfTestService$1.class new file mode 100644 index 0000000..f966151 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/selftest/NetworkSelfTestService$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/selftest/NetworkSelfTestService$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/selftest/NetworkSelfTestService$2.class new file mode 100644 index 0000000..2a60626 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/selftest/NetworkSelfTestService$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/selftest/NetworkSelfTestService$3.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/selftest/NetworkSelfTestService$3.class new file mode 100644 index 0000000..9cbfe9d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/selftest/NetworkSelfTestService$3.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/selftest/NetworkSelfTestService.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/selftest/NetworkSelfTestService.class new file mode 100644 index 0000000..ba27198 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/selftest/NetworkSelfTestService.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/CombinedProtectionEngine.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/CombinedProtectionEngine.class new file mode 100644 index 0000000..ebcf11f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/CombinedProtectionEngine.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/FecProtectionEngine$ShardDecodeResult$Status.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/FecProtectionEngine$ShardDecodeResult$Status.class new file mode 100644 index 0000000..8be17bc Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/FecProtectionEngine$ShardDecodeResult$Status.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/FecProtectionEngine$ShardDecodeResult.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/FecProtectionEngine$ShardDecodeResult.class new file mode 100644 index 0000000..fb2639c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/FecProtectionEngine$ShardDecodeResult.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/FecProtectionEngine$ShardNackRequester.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/FecProtectionEngine$ShardNackRequester.class new file mode 100644 index 0000000..749aa0e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/FecProtectionEngine$ShardNackRequester.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/FecProtectionEngine.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/FecProtectionEngine.class new file mode 100644 index 0000000..32e3f55 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/FecProtectionEngine.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackProtectionEngine$NackSender.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackProtectionEngine$NackSender.class new file mode 100644 index 0000000..aaed80c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackProtectionEngine$NackSender.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackProtectionEngine$RetransmitHandler.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackProtectionEngine$RetransmitHandler.class new file mode 100644 index 0000000..c3181ed Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackProtectionEngine$RetransmitHandler.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackProtectionEngine.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackProtectionEngine.class new file mode 100644 index 0000000..79c3f82 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackProtectionEngine.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackRateLimiter$Entry.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackRateLimiter$Entry.class new file mode 100644 index 0000000..e3a104e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackRateLimiter$Entry.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackRateLimiter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackRateLimiter.class new file mode 100644 index 0000000..196dc39 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackRateLimiter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/ProtectionNegotiationPrompts$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/ProtectionNegotiationPrompts$1.class new file mode 100644 index 0000000..115fdec Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/ProtectionNegotiationPrompts$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/ProtectionNegotiationPrompts.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/ProtectionNegotiationPrompts.class new file mode 100644 index 0000000..369636a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/ProtectionNegotiationPrompts.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/RetransmitCache$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/RetransmitCache$1.class new file mode 100644 index 0000000..3e7ad90 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/RetransmitCache$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/RetransmitCache$CachedMessage.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/RetransmitCache$CachedMessage.class new file mode 100644 index 0000000..9a6fb81 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/RetransmitCache$CachedMessage.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/RetransmitCache.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/RetransmitCache.class new file mode 100644 index 0000000..ddf91c5 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/RetransmitCache.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionCapability.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionCapability.class new file mode 100644 index 0000000..fb6a85e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionCapability.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionCompat.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionCompat.class new file mode 100644 index 0000000..0dfffce Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionCompat.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionEngine$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionEngine$1.class new file mode 100644 index 0000000..9278a64 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionEngine$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionEngine.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionEngine.class new file mode 100644 index 0000000..7f30358 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionEngine.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionFactory$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionFactory$1.class new file mode 100644 index 0000000..5f616a1 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionFactory$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionFactory.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionFactory.class new file mode 100644 index 0000000..ef72726 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionFactory.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionMode.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionMode.class new file mode 100644 index 0000000..d05e011 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionMode.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionNegotiation$Prompt$Target.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionNegotiation$Prompt$Target.class new file mode 100644 index 0000000..73d0d21 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionNegotiation$Prompt$Target.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionNegotiation$Prompt.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionNegotiation$Prompt.class new file mode 100644 index 0000000..ce8d473 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionNegotiation$Prompt.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionNegotiation.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionNegotiation.class new file mode 100644 index 0000000..bdf2385 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionNegotiation.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionNegotiator.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionNegotiator.class new file mode 100644 index 0000000..c5814dd Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionNegotiator.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionScopes.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionScopes.class new file mode 100644 index 0000000..9bfea30 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionScopes.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/TransportLossStats.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/TransportLossStats.class new file mode 100644 index 0000000..2001984 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/TransportLossStats.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/TransportLossStatsBridge.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/TransportLossStatsBridge.class new file mode 100644 index 0000000..7d0ece3 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/TransportLossStatsBridge.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/TransportStatsProvider.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/TransportStatsProvider.class new file mode 100644 index 0000000..e91ae75 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/TransportStatsProvider.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecEncodedGroup.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecEncodedGroup.class new file mode 100644 index 0000000..f711c22 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecEncodedGroup.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecShardReassembly.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecShardReassembly.class new file mode 100644 index 0000000..9cb94ca Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecShardReassembly.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecShardWire$Parsed.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecShardWire$Parsed.class new file mode 100644 index 0000000..1495c86 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecShardWire$Parsed.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecShardWire.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecShardWire.class new file mode 100644 index 0000000..2d4074a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecShardWire.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/GaloisField.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/GaloisField.class new file mode 100644 index 0000000..21f9740 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/GaloisField.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/ProtectionEnvelope$Decoded.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/ProtectionEnvelope$Decoded.class new file mode 100644 index 0000000..43abef4 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/ProtectionEnvelope$Decoded.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/ProtectionEnvelope.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/ProtectionEnvelope.class new file mode 100644 index 0000000..5abaaef Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/ProtectionEnvelope.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/ReedSolomonFec.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/ReedSolomonFec.class new file mode 100644 index 0000000..1c06cd1 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/ReedSolomonFec.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/usb/UsbTetherCastTransport$UsbTetherCastTransportStub.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/usb/UsbTetherCastTransport$UsbTetherCastTransportStub.class new file mode 100644 index 0000000..8d47365 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/usb/UsbTetherCastTransport$UsbTetherCastTransportStub.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/usb/UsbTetherCastTransport.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/usb/UsbTetherCastTransport.class new file mode 100644 index 0000000..864933a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/usb/UsbTetherCastTransport.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/usb/UsbTetherTransportFactory.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/usb/UsbTetherTransportFactory.class new file mode 100644 index 0000000..08f784f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/usb/UsbTetherTransportFactory.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcCastTransport$SignalingConfig.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcCastTransport$SignalingConfig.class new file mode 100644 index 0000000..f770b5f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcCastTransport$SignalingConfig.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcCastTransport$WebRtcCastTransportStub.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcCastTransport$WebRtcCastTransportStub.class new file mode 100644 index 0000000..a35b7e0 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcCastTransport$WebRtcCastTransportStub.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcCastTransport.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcCastTransport.class new file mode 100644 index 0000000..355cc1b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcCastTransport.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcPeerAdapter$Observer.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcPeerAdapter$Observer.class new file mode 100644 index 0000000..89307ba Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcPeerAdapter$Observer.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcPeerAdapter$WebRtcConnectionState.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcPeerAdapter$WebRtcConnectionState.class new file mode 100644 index 0000000..fd43933 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcPeerAdapter$WebRtcConnectionState.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcPeerAdapter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcPeerAdapter.class new file mode 100644 index 0000000..b6eeb4e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcPeerAdapter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcTransportFactory.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcTransportFactory.class new file mode 100644 index 0000000..4b34a70 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/network/webrtc/WebRtcTransportFactory.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaApkInstaller$ProgressListener.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaApkInstaller$ProgressListener.class new file mode 100644 index 0000000..8b39932 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaApkInstaller$ProgressListener.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaApkInstaller.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaApkInstaller.class new file mode 100644 index 0000000..f2d32c8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaApkInstaller.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaBundleInstaller.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaBundleInstaller.class new file mode 100644 index 0000000..4ea868c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaBundleInstaller.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaChannelPointer.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaChannelPointer.class new file mode 100644 index 0000000..da98bff Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaChannelPointer.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaJsonFetch.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaJsonFetch.class new file mode 100644 index 0000000..4b22256 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaJsonFetch.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaManifest.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaManifest.class new file mode 100644 index 0000000..516ab8a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaManifest.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaMqttFetch$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaMqttFetch$1.class new file mode 100644 index 0000000..afb29ec Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaMqttFetch$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaMqttFetch.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaMqttFetch.class new file mode 100644 index 0000000..35885f3 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaMqttFetch.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaRuntimeSettings.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaRuntimeSettings.class new file mode 100644 index 0000000..c541ea7 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaRuntimeSettings.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaSettingsStore.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaSettingsStore.class new file mode 100644 index 0000000..29d85fc Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaSettingsStore.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaSignBundle.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaSignBundle.class new file mode 100644 index 0000000..87dc8f9 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaSignBundle.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaUpdateChecker$Result.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaUpdateChecker$Result.class new file mode 100644 index 0000000..c6ec5b6 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaUpdateChecker$Result.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaUpdateChecker.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaUpdateChecker.class new file mode 100644 index 0000000..0eeb641 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaUpdateChecker.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaUpdateCoordinator$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaUpdateCoordinator$1.class new file mode 100644 index 0000000..5ca5000 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaUpdateCoordinator$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaUpdateCoordinator.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaUpdateCoordinator.class new file mode 100644 index 0000000..9e3f697 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaUpdateCoordinator.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaUpdateService.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaUpdateService.class new file mode 100644 index 0000000..50b554b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaUpdateService.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaVersion.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaVersion.class new file mode 100644 index 0000000..90ab631 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ota/OtaVersion.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/AudioDecoder$PendingFrame.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/AudioDecoder$PendingFrame.class new file mode 100644 index 0000000..0afad79 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/AudioDecoder$PendingFrame.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/AudioDecoder$RenderCallback.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/AudioDecoder$RenderCallback.class new file mode 100644 index 0000000..0323c2c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/AudioDecoder$RenderCallback.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/AudioDecoder$Stats.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/AudioDecoder$Stats.class new file mode 100644 index 0000000..4d01689 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/AudioDecoder$Stats.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/AudioDecoder.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/AudioDecoder.class new file mode 100644 index 0000000..8fde2fc Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/AudioDecoder.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/LibvpxVideoDecoder.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/LibvpxVideoDecoder.class new file mode 100644 index 0000000..e1a1390 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/LibvpxVideoDecoder.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/PlaybackViewState.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/PlaybackViewState.class new file mode 100644 index 0000000..dc17d1c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/PlaybackViewState.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$1.class new file mode 100644 index 0000000..83165d6 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$2.class new file mode 100644 index 0000000..899e167 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$3.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$3.class new file mode 100644 index 0000000..bc61646 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$3.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$4.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$4.class new file mode 100644 index 0000000..ad6afb7 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$4.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$CallbackAction.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$CallbackAction.class new file mode 100644 index 0000000..1c411e1 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$CallbackAction.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$Phase.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$Phase.class new file mode 100644 index 0000000..8925520 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService$Phase.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService.class new file mode 100644 index 0000000..b69a801 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverCastService.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPlaybackActivity$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPlaybackActivity$1.class new file mode 100644 index 0000000..eb75c2e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPlaybackActivity$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPlaybackActivity$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPlaybackActivity$2.class new file mode 100644 index 0000000..6ecf3c3 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPlaybackActivity$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPlaybackActivity$3.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPlaybackActivity$3.class new file mode 100644 index 0000000..c3d9716 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPlaybackActivity$3.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPlaybackActivity$4.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPlaybackActivity$4.class new file mode 100644 index 0000000..e9af744 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPlaybackActivity$4.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPlaybackActivity.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPlaybackActivity.class new file mode 100644 index 0000000..10f1313 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPlaybackActivity.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPrefs.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPrefs.class new file mode 100644 index 0000000..37ae922 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverPrefs.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverSession$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverSession$1.class new file mode 100644 index 0000000..25f6e96 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverSession$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverSession$Listener.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverSession$Listener.class new file mode 100644 index 0000000..dbe4f6f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverSession$Listener.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverSession.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverSession.class new file mode 100644 index 0000000..bb861bf Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/ReceiverSession.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/StreamMetrics.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/StreamMetrics.class new file mode 100644 index 0000000..e811e58 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/StreamMetrics.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/VideoDecoder$PendingFrame.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/VideoDecoder$PendingFrame.class new file mode 100644 index 0000000..4768676 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/VideoDecoder$PendingFrame.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/VideoDecoder.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/VideoDecoder.class new file mode 100644 index 0000000..2879ba7 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/VideoDecoder.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/AudioFilter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/AudioFilter.class new file mode 100644 index 0000000..46bad6f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/AudioFilter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/AudioFilterChain.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/AudioFilterChain.class new file mode 100644 index 0000000..e72a7a8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/AudioFilterChain.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/BassBoostAudioFilter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/BassBoostAudioFilter.class new file mode 100644 index 0000000..c1dfdaf Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/BassBoostAudioFilter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/DolbySurroundAudioFilter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/DolbySurroundAudioFilter.class new file mode 100644 index 0000000..184aad6 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/DolbySurroundAudioFilter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/GlExperimentalVideoPipeline.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/GlExperimentalVideoPipeline.class new file mode 100644 index 0000000..afe1abf Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/GlExperimentalVideoPipeline.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ImmersiveAudioFilter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ImmersiveAudioFilter.class new file mode 100644 index 0000000..9d160c0 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ImmersiveAudioFilter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/PassthroughAudioFilter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/PassthroughAudioFilter.class new file mode 100644 index 0000000..f24e6ab Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/PassthroughAudioFilter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/PassthroughVideoPipeline.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/PassthroughVideoPipeline.class new file mode 100644 index 0000000..c42b6a3 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/PassthroughVideoPipeline.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/PcmAudioFilters$SampleProcessor.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/PcmAudioFilters$SampleProcessor.class new file mode 100644 index 0000000..4ca823c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/PcmAudioFilters$SampleProcessor.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/PcmAudioFilters.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/PcmAudioFilters.class new file mode 100644 index 0000000..47a025c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/PcmAudioFilters.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverAudioPreset.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverAudioPreset.class new file mode 100644 index 0000000..b92517c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverAudioPreset.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverAvPipelineFactory$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverAvPipelineFactory$1.class new file mode 100644 index 0000000..d3aa0f5 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverAvPipelineFactory$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverAvPipelineFactory.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverAvPipelineFactory.class new file mode 100644 index 0000000..d789235 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverAvPipelineFactory.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverAvRuntime.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverAvRuntime.class new file mode 100644 index 0000000..9e00751 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverAvRuntime.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverVideoGlHub.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverVideoGlHub.class new file mode 100644 index 0000000..789b26f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverVideoGlHub.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverVideoGlRenderer.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverVideoGlRenderer.class new file mode 100644 index 0000000..33d8407 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverVideoGlRenderer.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverVideoPipeline.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverVideoPipeline.class new file mode 100644 index 0000000..0c7aca7 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverVideoPipeline.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverVideoPreset.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverVideoPreset.class new file mode 100644 index 0000000..384044a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverVideoPreset.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessCoordinator.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessCoordinator.class new file mode 100644 index 0000000..f09325b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessCoordinator.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessFailureReason.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessFailureReason.class new file mode 100644 index 0000000..c43f32f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessFailureReason.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessHeartbeatClient.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessHeartbeatClient.class new file mode 100644 index 0000000..fb06566 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessHeartbeatClient.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessMode.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessMode.class new file mode 100644 index 0000000..7c9357f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessMode.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessService$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessService$1.class new file mode 100644 index 0000000..bb2f4b8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessService$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessService$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessService$2.class new file mode 100644 index 0000000..27db954 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessService$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessService.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessService.class new file mode 100644 index 0000000..3041e35 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessService.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessStatusStore$Snapshot.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessStatusStore$Snapshot.class new file mode 100644 index 0000000..0b18957 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessStatusStore$Snapshot.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessStatusStore.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessStatusStore.class new file mode 100644 index 0000000..e726a3c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessStatusStore.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessTunnelHelper.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessTunnelHelper.class new file mode 100644 index 0000000..0aa76e4 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessTunnelHelper.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessVpnRouting$AppScope.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessVpnRouting$AppScope.class new file mode 100644 index 0000000..60947b3 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessVpnRouting$AppScope.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessVpnRouting$RouteScope.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessVpnRouting$RouteScope.class new file mode 100644 index 0000000..5d932cf Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessVpnRouting$RouteScope.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessVpnRouting.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessVpnRouting.class new file mode 100644 index 0000000..e462daa Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessVpnRouting.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/ReverseSshTunnelBridge.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/ReverseSshTunnelBridge.class new file mode 100644 index 0000000..ec592b9 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/ReverseSshTunnelBridge.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RsshLocalSshServer.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RsshLocalSshServer.class new file mode 100644 index 0000000..4e86649 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RsshLocalSshServer.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RsshSecuritySetup.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RsshSecuritySetup.class new file mode 100644 index 0000000..c46870f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RsshSecuritySetup.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/WireGuardConfigBuilder.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/WireGuardConfigBuilder.class new file mode 100644 index 0000000..eba4d77 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/WireGuardConfigBuilder.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/WireGuardQuickConfig.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/WireGuardQuickConfig.class new file mode 100644 index 0000000..1614864 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/WireGuardQuickConfig.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlAuth.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlAuth.class new file mode 100644 index 0000000..90e85f5 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlAuth.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$1.class new file mode 100644 index 0000000..eb5116a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$2.class new file mode 100644 index 0000000..0f3e3f3 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$3.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$3.class new file mode 100644 index 0000000..4e78fd8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$3.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$EndpointSnapshot.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$EndpointSnapshot.class new file mode 100644 index 0000000..50898c1 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$EndpointSnapshot.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$OperationListener.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$OperationListener.class new file mode 100644 index 0000000..cf51c41 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$OperationListener.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$ServiceTask.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$ServiceTask.class new file mode 100644 index 0000000..5c28b62 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient$ServiceTask.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient.class new file mode 100644 index 0000000..f8d539a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHostImpl.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHostImpl.class new file mode 100644 index 0000000..48c39ce Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHostImpl.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHttpServer$HostBridge.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHttpServer$HostBridge.class new file mode 100644 index 0000000..af47f4e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHttpServer$HostBridge.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHttpServer$HttpRequest.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHttpServer$HttpRequest.class new file mode 100644 index 0000000..94f7a96 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHttpServer$HttpRequest.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHttpServer.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHttpServer.class new file mode 100644 index 0000000..7733848 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHttpServer.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlPrefsMirror$ApplyResult.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlPrefsMirror$ApplyResult.class new file mode 100644 index 0000000..96b3658 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlPrefsMirror$ApplyResult.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlPrefsMirror.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlPrefsMirror.class new file mode 100644 index 0000000..24f30e0 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlPrefsMirror.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlService$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlService$1.class new file mode 100644 index 0000000..d411721 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlService$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlService$HostBridgeImpl.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlService$HostBridgeImpl.class new file mode 100644 index 0000000..2c8aa5a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlService$HostBridgeImpl.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlService.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlService.class new file mode 100644 index 0000000..8c3a2ac Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlService.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlShellHandler.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlShellHandler.class new file mode 100644 index 0000000..ed57071 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlShellHandler.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/AudioCapture$Callback.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/AudioCapture$Callback.class new file mode 100644 index 0000000..425b2e0 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/AudioCapture$Callback.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/AudioCapture.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/AudioCapture.class new file mode 100644 index 0000000..72983a5 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/AudioCapture.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/AudioEncoder.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/AudioEncoder.class new file mode 100644 index 0000000..c47251f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/AudioEncoder.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CastFanoutPump.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CastFanoutPump.class new file mode 100644 index 0000000..db2a69a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CastFanoutPump.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CastReceiverTarget.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CastReceiverTarget.class new file mode 100644 index 0000000..e8b7a69 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CastReceiverTarget.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CastSendPump$Outgoing.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CastSendPump$Outgoing.class new file mode 100644 index 0000000..184647b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CastSendPump$Outgoing.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CastSendPump.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CastSendPump.class new file mode 100644 index 0000000..54d59a2 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CastSendPump.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CodecCatalog$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CodecCatalog$1.class new file mode 100644 index 0000000..5e93eec Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CodecCatalog$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CodecCatalog$AudioCodecChoice.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CodecCatalog$AudioCodecChoice.class new file mode 100644 index 0000000..ada2f09 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CodecCatalog$AudioCodecChoice.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CodecCatalog$CapabilitySnapshot.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CodecCatalog$CapabilitySnapshot.class new file mode 100644 index 0000000..3c92c72 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CodecCatalog$CapabilitySnapshot.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CodecCatalog$VideoCodecChoice.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CodecCatalog$VideoCodecChoice.class new file mode 100644 index 0000000..7758346 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CodecCatalog$VideoCodecChoice.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CodecCatalog.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CodecCatalog.class new file mode 100644 index 0000000..3857f43 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/CodecCatalog.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/DeviceListAdapter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/DeviceListAdapter.class new file mode 100644 index 0000000..77fb214 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/DeviceListAdapter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/EncoderKeepalive$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/EncoderKeepalive$1.class new file mode 100644 index 0000000..8ccbefe Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/EncoderKeepalive$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/EncoderKeepalive.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/EncoderKeepalive.class new file mode 100644 index 0000000..62bad74 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/EncoderKeepalive.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/MultiCastCoordinator$ActivePeer.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/MultiCastCoordinator$ActivePeer.class new file mode 100644 index 0000000..da1e8a8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/MultiCastCoordinator$ActivePeer.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/MultiCastCoordinator$KeyframeRequester.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/MultiCastCoordinator$KeyframeRequester.class new file mode 100644 index 0000000..70ac10c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/MultiCastCoordinator$KeyframeRequester.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/MultiCastCoordinator.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/MultiCastCoordinator.class new file mode 100644 index 0000000..65442aa Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/MultiCastCoordinator.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$1.class new file mode 100644 index 0000000..31b9a2e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$2.class new file mode 100644 index 0000000..179be0f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$3.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$3.class new file mode 100644 index 0000000..d96bb36 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$3.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$4.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$4.class new file mode 100644 index 0000000..cb5e46a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$4.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$5.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$5.class new file mode 100644 index 0000000..b77dc03 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$5.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$6.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$6.class new file mode 100644 index 0000000..d2a85f8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$6.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$CaptureSetupTask.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$CaptureSetupTask.class new file mode 100644 index 0000000..a2a0982 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$CaptureSetupTask.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$PayloadBuilder.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$PayloadBuilder.class new file mode 100644 index 0000000..84d58a9 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService$PayloadBuilder.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService.class new file mode 100644 index 0000000..5e6fea9 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/ScreenCastService.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderActivity$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderActivity$1.class new file mode 100644 index 0000000..076a3a8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderActivity$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderActivity$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderActivity$2.class new file mode 100644 index 0000000..18d2e8f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderActivity$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderActivity$DiscoveryPhase.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderActivity$DiscoveryPhase.class new file mode 100644 index 0000000..5b03df1 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderActivity$DiscoveryPhase.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderActivity.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderActivity.class new file mode 100644 index 0000000..ce2ca35 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderActivity.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderAudioMetrics.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderAudioMetrics.class new file mode 100644 index 0000000..f909ae7 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderAudioMetrics.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderCapturePreview$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderCapturePreview$1.class new file mode 100644 index 0000000..8a903d5 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderCapturePreview$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderCapturePreview$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderCapturePreview$2.class new file mode 100644 index 0000000..ecc87f8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderCapturePreview$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderCapturePreview$3$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderCapturePreview$3$1.class new file mode 100644 index 0000000..048c717 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderCapturePreview$3$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderCapturePreview$3.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderCapturePreview$3.class new file mode 100644 index 0000000..4b0ebd8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderCapturePreview$3.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderCapturePreview.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderCapturePreview.class new file mode 100644 index 0000000..88fd41b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderCapturePreview.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderPreviewService.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderPreviewService.class new file mode 100644 index 0000000..ff92425 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderPreviewService.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderResolutionUi$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderResolutionUi$1.class new file mode 100644 index 0000000..869c6ee Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderResolutionUi$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderResolutionUi.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderResolutionUi.class new file mode 100644 index 0000000..107e516 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderResolutionUi.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderResolutionUiMode.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderResolutionUiMode.class new file mode 100644 index 0000000..5e10473 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderResolutionUiMode.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderScreenPreview$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderScreenPreview$1.class new file mode 100644 index 0000000..2b6d742 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderScreenPreview$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderScreenPreview$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderScreenPreview$2.class new file mode 100644 index 0000000..68eb73b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderScreenPreview$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderScreenPreview.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderScreenPreview.class new file mode 100644 index 0000000..57b1b07 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderScreenPreview.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderStreamMetrics.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderStreamMetrics.class new file mode 100644 index 0000000..a2bf037 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/SenderStreamMetrics.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/VideoEncoder.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/VideoEncoder.class new file mode 100644 index 0000000..687937a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/VideoEncoder.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationCastDriver$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationCastDriver$1.class new file mode 100644 index 0000000..81b8f7a Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationCastDriver$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationCastDriver$FallbackHost.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationCastDriver$FallbackHost.class new file mode 100644 index 0000000..4a4a235 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationCastDriver$FallbackHost.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationCastDriver$FeedMode.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationCastDriver$FeedMode.class new file mode 100644 index 0000000..91c1322 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationCastDriver$FeedMode.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationCastDriver.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationCastDriver.class new file mode 100644 index 0000000..986c6a1 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationCastDriver.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationEglRenderer.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationEglRenderer.class new file mode 100644 index 0000000..89aad45 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationEglRenderer.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationSourceDimensions.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationSourceDimensions.class new file mode 100644 index 0000000..7d48e4d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationSourceDimensions.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/TvCalibrationGenerator.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/TvCalibrationGenerator.class new file mode 100644 index 0000000..2420520 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/TvCalibrationGenerator.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/camera/CameraCastCapture$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/camera/CameraCastCapture$1.class new file mode 100644 index 0000000..3e66ee9 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/camera/CameraCastCapture$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/camera/CameraCastCapture$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/camera/CameraCastCapture$2.class new file mode 100644 index 0000000..876efda Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/camera/CameraCastCapture$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/camera/CameraCastCapture.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/camera/CameraCastCapture.class new file mode 100644 index 0000000..56240f5 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sender/camera/CameraCastCapture.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/settings/AppSettingsJson.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/settings/AppSettingsJson.class new file mode 100644 index 0000000..3df27c0 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/settings/AppSettingsJson.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sfu/SfuRelayGate.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sfu/SfuRelayGate.class new file mode 100644 index 0000000..eba8490 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/sfu/SfuRelayGate.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/GraphSessionUploader.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/GraphSessionUploader.class new file mode 100644 index 0000000..158c021 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/GraphSessionUploader.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/SessionEventJournal.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/SessionEventJournal.class new file mode 100644 index 0000000..6f89773 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/SessionEventJournal.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsContext.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsContext.class new file mode 100644 index 0000000..d430417 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsContext.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsEventMapper.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsEventMapper.class new file mode 100644 index 0000000..9176604 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsEventMapper.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsRecorder.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsRecorder.class new file mode 100644 index 0000000..8ded0f8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsRecorder.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsStore.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsStore.class new file mode 100644 index 0000000..b0aa47c Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsStore.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/ChartTickHelper$Tick.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/ChartTickHelper$Tick.class new file mode 100644 index 0000000..33af6f5 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/ChartTickHelper$Tick.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/ChartTickHelper.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/ChartTickHelper.class new file mode 100644 index 0000000..f6fd53b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/ChartTickHelper.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionBarChartView$Bar.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionBarChartView$Bar.class new file mode 100644 index 0000000..eb2e9e6 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionBarChartView$Bar.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionBarChartView.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionBarChartView.class new file mode 100644 index 0000000..4cdf667 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionBarChartView.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionLineChartView$Metric.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionLineChartView$Metric.class new file mode 100644 index 0000000..748c25d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionLineChartView$Metric.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionLineChartView$ScaleListener.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionLineChartView$ScaleListener.class new file mode 100644 index 0000000..1d7fb63 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionLineChartView$ScaleListener.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionLineChartView.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionLineChartView.class new file mode 100644 index 0000000..72954f4 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionLineChartView.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionRecord$ProtectionStats.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionRecord$ProtectionStats.class new file mode 100644 index 0000000..88c34dd Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionRecord$ProtectionStats.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionRecord$SamplePoint.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionRecord$SamplePoint.class new file mode 100644 index 0000000..26e6341 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionRecord$SamplePoint.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionRecord$UdpStats.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionRecord$UdpStats.class new file mode 100644 index 0000000..a5fc8b4 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionRecord$UdpStats.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionRecord.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionRecord.class new file mode 100644 index 0000000..d1e1945 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionRecord.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionStatsAnalyzerActivity.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionStatsAnalyzerActivity.class new file mode 100644 index 0000000..1a88242 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionStatsAnalyzerActivity.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionStatsListAdapter$Holder.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionStatsListAdapter$Holder.class new file mode 100644 index 0000000..7f31e1b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionStatsListAdapter$Holder.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionStatsListAdapter$Listener.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionStatsListAdapter$Listener.class new file mode 100644 index 0000000..a50b8fe Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionStatsListAdapter$Listener.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionStatsListAdapter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionStatsListAdapter.class new file mode 100644 index 0000000..62631bc Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionStatsListAdapter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionStatsParser.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionStatsParser.class new file mode 100644 index 0000000..30d373d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/stats/ui/SessionStatsParser.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/AspectRatioFrameLayout.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/AspectRatioFrameLayout.class new file mode 100644 index 0000000..5216588 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/AspectRatioFrameLayout.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/PlaybackTextureTransform.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/PlaybackTextureTransform.class new file mode 100644 index 0000000..5f66cd5 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/PlaybackTextureTransform.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsEnumSpinner$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsEnumSpinner$1.class new file mode 100644 index 0000000..1d5e66d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsEnumSpinner$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsEnumSpinner$DisabledAdapter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsEnumSpinner$DisabledAdapter.class new file mode 100644 index 0000000..f68bd07 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsEnumSpinner$DisabledAdapter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsEnumSpinner$ScoredDisabledAdapter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsEnumSpinner$ScoredDisabledAdapter.class new file mode 100644 index 0000000..92c4c9d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsEnumSpinner$ScoredDisabledAdapter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsEnumSpinner.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsEnumSpinner.class new file mode 100644 index 0000000..57d7666 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsEnumSpinner.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsScoredArrayAdapter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsScoredArrayAdapter.class new file mode 100644 index 0000000..7a51eb6 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsScoredArrayAdapter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsSpinnerDropdownStyle.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsSpinnerDropdownStyle.class new file mode 100644 index 0000000..3205d05 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsSpinnerDropdownStyle.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsStringArrayAdapter.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsStringArrayAdapter.class new file mode 100644 index 0000000..ffc3293 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/SettingsStringArrayAdapter.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/ZoomPanContainer$OnZoomChangedListener.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/ZoomPanContainer$OnZoomChangedListener.class new file mode 100644 index 0000000..774ab49 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/ZoomPanContainer$OnZoomChangedListener.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/ZoomPanContainer$PanListener.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/ZoomPanContainer$PanListener.class new file mode 100644 index 0000000..84459c1 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/ZoomPanContainer$PanListener.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/ZoomPanContainer$ScaleListener.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/ZoomPanContainer$ScaleListener.class new file mode 100644 index 0000000..dfb9913 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/ZoomPanContainer$ScaleListener.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/ZoomPanContainer.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/ZoomPanContainer.class new file mode 100644 index 0000000..f64589f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/ui/ZoomPanContainer.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/util/CastBackgroundExecutor$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/util/CastBackgroundExecutor$1.class new file mode 100644 index 0000000..193e98b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/util/CastBackgroundExecutor$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/util/CastBackgroundExecutor.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/util/CastBackgroundExecutor.class new file mode 100644 index 0000000..a12e2ae Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/util/CastBackgroundExecutor.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/util/IoUtils.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/util/IoUtils.class new file mode 100644 index 0000000..e5b44d7 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/util/IoUtils.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/AndroidCastVpnService$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/AndroidCastVpnService$1.class new file mode 100644 index 0000000..4502670 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/AndroidCastVpnService$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/AndroidCastVpnService.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/AndroidCastVpnService.class new file mode 100644 index 0000000..bdfa57b Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/AndroidCastVpnService.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/RemoteAccessVpnService.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/RemoteAccessVpnService.class new file mode 100644 index 0000000..6c0e749 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/RemoteAccessVpnService.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnCrashSimulator.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnCrashSimulator.class new file mode 100644 index 0000000..e92ac47 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnCrashSimulator.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$1.class new file mode 100644 index 0000000..5312186 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$2.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$2.class new file mode 100644 index 0000000..c70d85f Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$2.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$3.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$3.class new file mode 100644 index 0000000..ad8eb7e Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$3.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$OperationListener.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$OperationListener.class new file mode 100644 index 0000000..c307c08 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$OperationListener.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$ServiceTask.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$ServiceTask.class new file mode 100644 index 0000000..a36330d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$ServiceTask.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$StateListener.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$StateListener.class new file mode 100644 index 0000000..3191e06 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient$StateListener.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient.class new file mode 100644 index 0000000..28b24c8 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnServiceClient.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnState.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnState.class new file mode 100644 index 0000000..5e89d8d Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnState.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/WireGuardVpnEngine$1.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/WireGuardVpnEngine$1.class new file mode 100644 index 0000000..9df2c83 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/WireGuardVpnEngine$1.class differ diff --git a/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/WireGuardVpnEngine.class b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/WireGuardVpnEngine.class new file mode 100644 index 0000000..465dea9 Binary files /dev/null and b/app/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/foxx/androidcast/vpn/WireGuardVpnEngine.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/CastResolutionTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/CastResolutionTest.class new file mode 100644 index 0000000..9503b93 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/CastResolutionTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/CastTrayContentTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/CastTrayContentTest.class new file mode 100644 index 0000000..fe3bf09 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/CastTrayContentTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/crash/CrashReportStoreTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/crash/CrashReportStoreTest.class new file mode 100644 index 0000000..f582f2d Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/crash/CrashReportStoreTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/crash/CrashReporterProcessTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/crash/CrashReporterProcessTest.class new file mode 100644 index 0000000..9e572f3 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/crash/CrashReporterProcessTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbWifiHelperTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbWifiHelperTest.class new file mode 100644 index 0000000..44a864a Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/dev/DevAdbWifiHelperTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/dev/StreamDumpWriterTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/dev/StreamDumpWriterTest.class new file mode 100644 index 0000000..1406d13 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/dev/StreamDumpWriterTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastMtuSamplerTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastMtuSamplerTest.class new file mode 100644 index 0000000..9977cbe Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/diagnostics/CastMtuSamplerTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/discovery/DiscoverySelfFilterTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/discovery/DiscoverySelfFilterTest.class new file mode 100644 index 0000000..ad61427 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/discovery/DiscoverySelfFilterTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/display/ExternalDisplayCapturePolicyTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/display/ExternalDisplayCapturePolicyTest.class new file mode 100644 index 0000000..f0365ec Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/display/ExternalDisplayCapturePolicyTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementPolicyTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementPolicyTest.class new file mode 100644 index 0000000..7a6dffe Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/entitlements/EntitlementPolicyTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/media/AudioNegotiatorTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/media/AudioNegotiatorTest.class new file mode 100644 index 0000000..62cdf45 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/media/AudioNegotiatorTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/media/EncodedStreamProbeTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/media/EncodedStreamProbeTest.class new file mode 100644 index 0000000..4f0863e Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/media/EncodedStreamProbeTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/media/H264BitstreamHevcTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/media/H264BitstreamHevcTest.class new file mode 100644 index 0000000..5fb887b Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/media/H264BitstreamHevcTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/media/RgbToNv21Test.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/media/RgbToNv21Test.class new file mode 100644 index 0000000..03459b6 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/media/RgbToNv21Test.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/media/RgbToYuv420Test.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/media/RgbToYuv420Test.class new file mode 100644 index 0000000..57be5d5 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/media/RgbToYuv420Test.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/BackendEndpointsTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/BackendEndpointsTest.class new file mode 100644 index 0000000..3097c7d Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/BackendEndpointsTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/BackendNtpSyncTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/BackendNtpSyncTest.class new file mode 100644 index 0000000..57f3f0f Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/BackendNtpSyncTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/CastProtoHeaderTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/CastProtoHeaderTest.class new file mode 100644 index 0000000..5479c71 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/CastProtoHeaderTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/CastSessionGateTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/CastSessionGateTest.class new file mode 100644 index 0000000..6cb8879 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/CastSessionGateTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/UdpCastTransportBackwardCompatTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/UdpCastTransportBackwardCompatTest.class new file mode 100644 index 0000000..678b352 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/UdpCastTransportBackwardCompatTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/UdpCastTransportFecTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/UdpCastTransportFecTest.class new file mode 100644 index 0000000..fec9667 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/UdpCastTransportFecTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/diag/CastDiagPingTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/diag/CastDiagPingTest.class new file mode 100644 index 0000000..df9ebe9 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/diag/CastDiagPingTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/FecProtectionEngineShardTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/FecProtectionEngineShardTest.class new file mode 100644 index 0000000..79a1a0a Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/FecProtectionEngineShardTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackRateLimiterTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackRateLimiterTest.class new file mode 100644 index 0000000..d385dfa Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/NackRateLimiterTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionCompatTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionCompatTest.class new file mode 100644 index 0000000..11fac45 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionCompatTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionFactoryTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionFactoryTest.class new file mode 100644 index 0000000..7e5866b Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionFactoryTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionNegotiatorTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionNegotiatorTest.class new file mode 100644 index 0000000..244a1a5 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/StreamProtectionNegotiatorTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecShardReassemblyTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecShardReassemblyTest.class new file mode 100644 index 0000000..0d4d0ce Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecShardReassemblyTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecShardWireTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecShardWireTest.class new file mode 100644 index 0000000..262a018 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/FecShardWireTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/ReedSolomonFecTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/ReedSolomonFecTest.class new file mode 100644 index 0000000..134ab8f Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/transport/fec/ReedSolomonFecTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/usb/UsbTetherTransportFactoryTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/usb/UsbTetherTransportFactoryTest.class new file mode 100644 index 0000000..5a57369 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/network/usb/UsbTetherTransportFactoryTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/ota/OtaApkInstallerTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/ota/OtaApkInstallerTest.class new file mode 100644 index 0000000..012fa35 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/ota/OtaApkInstallerTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/ota/OtaBundleInstallerTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/ota/OtaBundleInstallerTest.class new file mode 100644 index 0000000..b886c9d Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/ota/OtaBundleInstallerTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/ota/OtaManifestTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/ota/OtaManifestTest.class new file mode 100644 index 0000000..aacbf08 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/ota/OtaManifestTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/ota/OtaVersionTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/ota/OtaVersionTest.class new file mode 100644 index 0000000..e45caac Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/ota/OtaVersionTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverAvPipelineFactoryTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverAvPipelineFactoryTest.class new file mode 100644 index 0000000..340cea9 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/receiver/av/ReceiverAvPipelineFactoryTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessFailureReasonTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessFailureReasonTest.class new file mode 100644 index 0000000..15bcb72 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessFailureReasonTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessModeTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessModeTest.class new file mode 100644 index 0000000..2e93bf3 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessModeTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessVpnRoutingTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessVpnRoutingTest.class new file mode 100644 index 0000000..b558254 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/RemoteAccessVpnRoutingTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/WireGuardConfigBuilderTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/WireGuardConfigBuilderTest.class new file mode 100644 index 0000000..917042b Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/WireGuardConfigBuilderTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/WireGuardConfigParseTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/WireGuardConfigParseTest.class new file mode 100644 index 0000000..55dae71 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/WireGuardConfigParseTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlAuthTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlAuthTest.class new file mode 100644 index 0000000..f45204a Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlAuthTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHttpServerTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHttpServerTest.class new file mode 100644 index 0000000..f337bdd Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHttpServerTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlPrefsMirrorTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlPrefsMirrorTest.class new file mode 100644 index 0000000..582682a Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlPrefsMirrorTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationSourceDimensionsTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationSourceDimensionsTest.class new file mode 100644 index 0000000..cddbcc4 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/sender/calibration/CalibrationSourceDimensionsTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/sfu/SfuRelayGateTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/sfu/SfuRelayGateTest.class new file mode 100644 index 0000000..a4d3aa3 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/sfu/SfuRelayGateTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsEventMapperTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsEventMapperTest.class new file mode 100644 index 0000000..6968c67 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsEventMapperTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsStoreTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsStoreTest.class new file mode 100644 index 0000000..00a0432 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/stats/SessionStatsStoreTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/ui/PlaybackTextureTransformTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/ui/PlaybackTextureTransformTest.class new file mode 100644 index 0000000..67e561a Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/ui/PlaybackTextureTransformTest.class differ diff --git a/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnStateTest.class b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnStateTest.class new file mode 100644 index 0000000..0c36255 Binary files /dev/null and b/app/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes/com/foxx/androidcast/vpn/VpnStateTest.class differ diff --git a/app/build/intermediates/linked_resources_binary_format/debug/processDebugResources/linked-resources-binary-format-debug.ap_ b/app/build/intermediates/linked_resources_binary_format/debug/processDebugResources/linked-resources-binary-format-debug.ap_ new file mode 100644 index 0000000..73d37f0 Binary files /dev/null and b/app/build/intermediates/linked_resources_binary_format/debug/processDebugResources/linked-resources-binary-format-debug.ap_ differ diff --git a/app/build/intermediates/linked_resources_binary_format/debug/processDebugResources/output-metadata.json b/app/build/intermediates/linked_resources_binary_format/debug/processDebugResources/output-metadata.json new file mode 100644 index 0000000..eacf6e3 --- /dev/null +++ b/app/build/intermediates/linked_resources_binary_format/debug/processDebugResources/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "LINKED_RESOURCES_BINARY_FORMAT", + "kind": "Directory" + }, + "applicationId": "com.foxx.androidcast", + "variantName": "debug", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 100, + "versionName": "0.1.0", + "outputFile": "linked-resources-binary-format-debug.ap_" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt b/app/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt new file mode 100644 index 0000000..041106f --- /dev/null +++ b/app/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt @@ -0,0 +1,604 @@ +R_DEF: Internal format may change without notice +local +anim robot_dance +color device_item_selected +color device_item_text +color device_live_border +color ic_launcher_background +color inverted_primary +color inverted_window_bg +color settings_app_info_divider +color settings_header_gradient_end +color settings_header_gradient_start +color settings_header_shadow +color settings_header_text +color settings_spinner_selected_underline +color settings_spinner_text +color settings_spinner_text_shadow +drawable bg_settings_drawer_handle +drawable bg_settings_section_header +drawable bg_settings_spinner +drawable bg_settings_spinner_item +drawable bg_settings_spinner_item_selected +drawable bg_settings_spinner_popup +drawable bg_spinner_item_underline_dark +drawable bg_spinner_item_underline_light +drawable calibration_chart_reference +drawable device_item_background +drawable device_item_live_border +drawable ic_android_robot +drawable ic_launcher_foreground +drawable ic_notification +drawable ic_picture_in_picture +drawable settings_app_info_divider +id aspect_container +id btn_check_ota +id btn_dev_adb_wifi_copy +id btn_dev_adb_wifi_refresh +id btn_dev_diag_stop +id btn_dev_network_selftest_force +id btn_licenses +id btn_licenses_accept +id btn_open_play_store_listing +id btn_open_session_stats +id btn_query_iap_products +id btn_receive +id btn_refresh_sessions +id btn_reload_codecs_json +id btn_request_play_review +id btn_reset_defaults +id btn_send +id btn_share_session +id btn_start_cast +id button_pip +id chart_session_bars +id chart_session_lines +id check_commercial_ads +id check_commercial_iap +id check_commercial_play_store +id check_dev_adb_wifi_keeper +id check_dev_backend_ntp_sync +id check_dev_diag_ping_pong +id check_dev_stream_dump +id check_grab_session_stats +id check_ota_on_launch +id check_receiver_adaptive_display +id check_receiver_debug_overlay +id check_receiver_pip +id check_send_crash_logs +id check_show_codec_priority_scores +id check_tray_icon +id check_usb_tether_transport +id check_wired_display_hints +id checkbox_audio +id content_root +id content_shell +id dev_diag_advertisement +id dev_diag_audio +id dev_diag_audio_codecs +id dev_diag_camera +id dev_diag_card_body +id dev_diag_card_spinner +id dev_diag_card_title +id dev_diag_cards +id dev_diag_casting +id dev_diag_hw +id dev_diag_network +id dev_panel_diagnostics +id dev_panel_network_selftest +id dev_panel_settings +id dev_settings_tab_host +id dev_settings_tabs +id device_label +id drawer_layout +id edit_ota_manifest_url +id edit_pin +id edit_settings_pin +id edit_username +id header_app_info +id header_global +id header_receiver +id header_sender +id image_robot +id label_app_version +id label_dev_av_intensity +id label_dev_remote_access_vpn_app +id label_dev_remote_access_vpn_route +id layout_capture_mode +id list_devices +id list_sessions +id overlay_awaiting +id panel_advanced +id panel_preview +id panel_session_detail +id progress_dev_network_selftest +id progress_discovery +id progress_ota_download +id radio_group_metric +id radio_metric_bitrate +id radio_metric_fps +id radio_metric_loss +id row_app_version +id section_app_info +id seek_dev_av_intensity +id settings_drawer_container +id settings_drawer_handle +id spinner_adjustment +id spinner_bitrate_mode +id spinner_capture_mode +id spinner_dev_audio_preset +id spinner_dev_diag_ping_response_mode +id spinner_dev_remote_access_mode +id spinner_dev_remote_access_vpn_app_scope +id spinner_dev_remote_access_vpn_route +id spinner_dev_sender_resolution_ui_mode +id spinner_dev_video_preset +id spinner_dropdown_item_root +id spinner_dropdown_text +id spinner_external_capture_policy +id spinner_item_label +id spinner_item_score +id spinner_language +id spinner_network_adoption +id spinner_quality +id spinner_receiver_network +id spinner_receiver_play_audio +id spinner_receiver_transport +id spinner_receiver_video_codec +id spinner_resolution +id spinner_sender_audio +id spinner_sender_audio_codec +id spinner_sender_bitrate +id spinner_sender_capture_mode +id spinner_sender_network +id spinner_sender_resolution +id spinner_sender_stream_protection +id spinner_sender_transport +id spinner_sender_video_codec +id spinner_theme +id spinner_transport +id spinner_video_codec +id surface_playback +id switch_mute +id tag_spinner_enum +id tag_spinner_selectable +id tag_spinner_values +id text_app_author_value +id text_app_built_value +id text_app_commit_value +id text_app_protocol_value +id text_app_version_value +id text_awaiting_message +id text_capture_mode_label +id text_chart_interaction_hint +id text_dev_adb_wifi_status +id text_dev_av_intensity_value +id text_dev_network_selftest_report +id text_diagnostics +id text_external_capture_policy_note +id text_licenses +id text_ota_download_status +id text_ota_installed_version +id text_preview_label +id text_sender_audio_hint +id text_session_stats_empty +id text_session_subtitle +id text_session_summary +id text_session_title +id text_status +id text_stream_protection_hint +id text_wired_display_status +id texture_preview +id zoom_container +layout activity_cast_settings +layout activity_dev_diagnostics_panel +layout activity_dev_network_selftest_panel +layout activity_dev_settings_panel +layout activity_developer_settings +layout activity_drawer_host +layout activity_licenses +layout activity_main +layout activity_playback +layout activity_sender +layout activity_session_stats_analyzer +layout activity_settings_panel +layout dialog_ota_download +layout fragment_cast_settings +layout include_app_info_section +layout include_settings_section_header +layout item_device +layout item_session_stats +layout overlay_cast_diagnostics +layout overlay_stream_awaiting +layout spinner_dropdown_item_scored +layout spinner_dropdown_item_settings +layout spinner_item_scored +layout spinner_item_settings +layout view_dev_diag_card +layout view_settings_drawer_handle +mipmap ic_launcher +string advanced_connect_title +string advanced_hidden +string advanced_unlocked +string app_name +string audio_consent_message +string audio_consent_no +string audio_consent_title +string audio_consent_yes +string audio_mic_permission_hint +string audio_playing +string audio_skipped +string audio_unavailable_message +string audio_unavailable_title +string authenticating +string bitrate_estimated +string btn_accept +string btn_licenses +string btn_reset_defaults +string capture_calibration_test +string capture_camera +string capture_camera_front +string capture_camera_open_failed +string capture_camera_permission_denied +string capture_camera_rear +string capture_camera_requires_api29 +string capture_camera_unavailable +string capture_denied +string capture_full_screen +string capture_user_choice +string capture_user_choice_unavailable +string cast_in_progress_pin_locked +string cast_settings_title +string casting_active +string casting_calibration +string casting_camera +string casting_from +string casting_from_codec +string casting_rotated +string casting_started +string codec_aac +string codec_audio_auto +string codec_audio_passthrough_debug +string codec_h264 +string codec_h265 +string codec_hint_negotiated +string codec_libvpx_vp8 +string codec_libvpx_vp9 +string codec_opus +string codec_passthrough +string codec_passthrough_unavailable +string codec_priority_score_suffix +string codec_speex +string commercial_ads_placeholder +string connecting +string connecting_to +string continue_video_only +string dev_adb_wifi_copied +string dev_adb_wifi_copy +string dev_adb_wifi_hint +string dev_adb_wifi_keeper +string dev_adb_wifi_notification_channel +string dev_adb_wifi_notification_channel_desc +string dev_adb_wifi_notification_line +string dev_adb_wifi_notification_title +string dev_adb_wifi_notification_waiting +string dev_adb_wifi_refresh +string dev_adb_wifi_section +string dev_adb_wifi_status_detail +string dev_adb_wifi_status_line +string dev_adb_wifi_status_waiting +string dev_av_audio_bass_boost +string dev_av_audio_default +string dev_av_audio_dolby_51 +string dev_av_audio_dolby_71 +string dev_av_audio_immersive +string dev_av_audio_preset +string dev_av_intensity +string dev_av_intensity_value +string dev_av_presets_hint +string dev_av_presets_section +string dev_av_video_default +string dev_av_video_hdr +string dev_av_video_immersive +string dev_av_video_preset +string dev_backend_ntp_sync_enable +string dev_backend_ntp_sync_hint +string dev_capture_policy_default +string dev_capture_policy_external_experimental +string dev_capture_policy_prefer_external +string dev_commercial_ads +string dev_commercial_enable_iap_first +string dev_commercial_enable_play_first +string dev_commercial_hint +string dev_commercial_iap +string dev_commercial_play_store +string dev_commercial_section +string dev_diag_advertisement_title +string dev_diag_audio_codecs_title +string dev_diag_audio_title +string dev_diag_camera_title +string dev_diag_casting_title +string dev_diag_hw_title +string dev_diag_intro +string dev_diag_network_title +string dev_diag_pending +string dev_diag_ping_hint +string dev_diag_ping_pong +string dev_diag_ping_response_mirror +string dev_diag_ping_response_mode +string dev_diag_ping_response_reply +string dev_diag_ping_response_smart +string dev_diag_running +string dev_diag_stop +string dev_diag_stopped +string dev_external_capture_policy +string dev_grab_session_stats +string dev_iap_query_done +string dev_network_selftest_force +string dev_network_selftest_intro +string dev_network_selftest_pending +string dev_network_selftest_run +string dev_network_selftest_running +string dev_network_selftest_unlocked +string dev_open_play_store_listing +string dev_query_iap_products +string dev_receiver_adaptive_display +string dev_reload_codecs_json +string dev_reload_codecs_json_hint +string dev_remote_access_applied +string dev_remote_access_disabled +string dev_remote_access_hint +string dev_remote_access_mode +string dev_remote_access_notification_channel +string dev_remote_access_notification_connected +string dev_remote_access_notification_poll +string dev_remote_access_notification_session +string dev_remote_access_notification_title +string dev_remote_access_rssh +string dev_remote_access_rssh_toast +string dev_remote_access_rssh_unavailable +string dev_remote_access_vpn_app_all +string dev_remote_access_vpn_app_hint +string dev_remote_access_vpn_app_scope +string dev_remote_access_vpn_app_this_only +string dev_remote_access_vpn_denied +string dev_remote_access_vpn_route_full_tunnel +string dev_remote_access_vpn_route_hint +string dev_remote_access_vpn_route_hub_only +string dev_remote_access_vpn_route_scope +string dev_remote_access_vpn_routing_applied +string dev_remote_access_wireguard +string dev_request_play_review +string dev_sender_resolution_ui_combined +string dev_sender_resolution_ui_hint +string dev_sender_resolution_ui_legacy +string dev_sender_resolution_ui_mode +string dev_sender_resolution_ui_section +string dev_sender_resolution_ui_separated +string dev_show_codec_priority_scores +string dev_show_receiver_debug_overlay +string dev_stream_dump +string dev_stream_dump_hint +string dev_tab_diagnostics +string dev_tab_network_self_test +string dev_tab_settings +string dev_usb_tether_transport +string dev_wired_display_hint +string dev_wired_display_hints +string dev_wired_display_section +string developer_settings_title +string device_selected +string devices_selected +string discovery_pinned_label +string enter_pin +string error_connect_failed +string error_missing_params +string error_no_intent +string error_projection_data +string error_receiver_refused +string found_receivers +string gateway_url_hint +string label_adjustment_preset +string label_app_author +string label_app_built +string label_app_commit +string label_app_protocol +string label_app_version +string label_audio +string label_audio_codec +string label_audio_unavailable +string label_bitrate_mode +string label_capture_mode +string label_capture_mode_sender_only +string label_language +string label_mute +string label_network_adoption +string label_quality +string label_receiver_audio +string label_receiver_display +string label_receiver_pip +string label_resolution +string label_send_anonymous_crash_logs +string label_show_tray_icon +string label_stream_protection +string label_theme +string label_transport +string label_username +string label_video_codec +string language_apply_restart +string language_english +string language_russian +string language_system +string licenses_load_error +string licenses_title +string main_hint +string manual_cast +string manual_connect_missing +string manual_host_hint +string manual_port_hint +string network_estimated_auto +string no_compatible_receivers +string open_settings +string option_auto +string option_balanced +string option_estimated +string option_none +string option_off +string option_on +string option_performance +string option_quality +string option_robust_less +string option_speed +string ota_check_failed +string ota_check_now +string ota_check_on_launch +string ota_dismissed_hint +string ota_download_failed +string ota_download_install +string ota_download_title +string ota_downloading +string ota_installed_version +string ota_later +string ota_manifest_url_hint +string ota_no_release_notes +string ota_no_url +string ota_notification_channel_name +string ota_section_hint +string ota_section_title +string ota_up_to_date +string ota_update_message +string ota_update_title +string permission_notifications_cast +string permissions_app_settings +string permissions_grant +string permissions_missing_title +string pin_anonymous_hint +string pin_hint +string pin_mismatch_message +string pin_mismatch_title +string pin_session_hint +string pip_disabled_message +string pip_disabled_title +string pip_enter +string pip_permissions_hint +string pip_unavailable +string playback_awaiting_stream +string playback_buffering +string playback_listening +string playback_opened +string playback_rendering +string playback_stream_ended +string playback_stream_lost +string playing_resolution +string press_back_again_to_stop_cast +string preview_calibration +string preview_camera +string preview_casting_active +string preview_placeholder +string preview_screen_active +string preview_tap_for_screen +string protection_fec_34 +string protection_fec_nack +string protection_fec_rs +string protection_nack +string protection_negotiation_agreed +string protection_negotiation_fec34_no_nack +string protection_negotiation_fec_family_rs +string protection_negotiation_mismatch +string protection_negotiation_nack_off +string protection_negotiation_nack_on +string protection_negotiation_nack_to_fec +string protection_negotiation_role_receiver +string protection_negotiation_role_sender +string protection_negotiation_use_none +string protection_none +string quality_high +string quality_low +string quality_medium +string receive_screen +string receiver_display_adaptive +string receiver_display_auto_fit +string receiver_listening +string receiver_pip_hint +string receiver_ready +string receiver_starting +string receiver_title +string receiver_use_settings_hint +string refresh +string refresh_countdown +string rescanning +string reset_defaults_confirm +string reset_defaults_done +string resolution_720p +string resolution_75 +string resolution_adaptive +string resolution_combined_adaptive +string resolution_combined_original +string resolution_fixed_1080p +string resolution_fixed_720p +string resolution_full +string resolution_half +string resolution_preset_480p +string resolution_preset_720p +string resolution_preset_auto +string resolution_preset_original +string searching +string select_receiver +string send_screen +string sender_check_notification +string sender_title +string session_stats_chart_hint +string session_stats_counters_title +string session_stats_disabled_hint +string session_stats_empty +string session_stats_metric_bitrate +string session_stats_metric_fps +string session_stats_metric_loss +string session_stats_open +string session_stats_refresh +string session_stats_share +string session_stats_share_failed +string session_stats_subtitle +string session_stats_title +string settings_drawer_handle_desc +string settings_saved +string settings_section_app_info +string settings_section_global +string settings_section_receiver +string settings_section_sender +string settings_title +string start_cast +string start_receiver +string stop +string stream_protection_hint +string surface_attached +string swipe_for_settings +string theme_apply_restart +string theme_dark +string theme_inverted +string theme_light +string theme_system +string too_many_receivers +string transport_mismatch +string transport_quic +string transport_tcp +string transport_udp +string transport_usb_tether +string transport_webrtc +string tray_cast_active +string tray_cast_idle +string tray_channel_description +string tray_channel_name +string waiting_receiver +string waiting_sender +string waiting_surface +string wired_display_detected_hint +style AppInfoLabel +style AppInfoValue +style Theme.AndroidCast +style Theme.AndroidCast.Dark +style Theme.AndroidCast.Dialog +style Theme.AndroidCast.Fullscreen +style Theme.AndroidCast.Inverted +style Theme.AndroidCast.Light +xml file_paths diff --git a/app/build/intermediates/manifest_merge_blame_file/debug/processDebugMainManifest/manifest-merger-blame-debug-report.txt b/app/build/intermediates/manifest_merge_blame_file/debug/processDebugMainManifest/manifest-merger-blame-debug-report.txt new file mode 100644 index 0000000..4475c1e --- /dev/null +++ b/app/build/intermediates/manifest_merge_blame_file/debug/processDebugMainManifest/manifest-merger-blame-debug-report.txt @@ -0,0 +1,549 @@ +1 +2 +6 +7 +10 +11 +11-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:5:5-67 +11-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:5:22-64 +12 +12-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:6:5-83 +12-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:6:22-80 +13 +13-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:7:5-79 +13-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:7:22-76 +14 +14-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:8:5-76 +14-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:8:22-73 +15 +15-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:9:5-86 +15-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:9:22-83 +16 +16-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:10:5-77 +16-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:10:22-74 +17 +17-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:11:5-94 +17-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:11:22-91 +18 +18-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:12:5-92 +18-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:12:22-89 +19 +19-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:13:5-77 +19-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:13:22-74 +20 +20-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:14:5-68 +20-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:14:22-65 +21 +21-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:15:5-71 +21-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:15:22-68 +22 +22-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:16:5-65 +22-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:16:22-62 +23 +24 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:17:5-85 +25 android:name="android.hardware.camera" +25-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:17:19-57 +26 android:required="false" /> +26-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:17:58-82 +27 +28 +28-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:18:5-88 +28-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:18:22-85 +29 +29-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:19:5-89 +29-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:19:22-86 +30 +30-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:20:5-87 +30-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:20:22-84 +31 +31-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:21:5-94 +31-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:21:22-91 +32 +32-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:22:5-23:47 +32-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:22:22-77 +33 +33-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:24:5-25:47 +33-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:24:22-60 +34 +34-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:10:5-67 +34-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:10:22-64 +35 +36 +36-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:12:5-19:15 +37 +37-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:13:9-15:18 +38 +38-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:14:13-91 +38-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:14:21-88 +39 +40 +40-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:16:9-18:18 +41 +41-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:17:13-116 +41-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:17:21-113 +42 +43 +44 +45 [androidx.core:core:1.13.0] /home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/AndroidManifest.xml:22:5-24:47 +46 android:name="com.foxx.androidcast.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" +46-->[androidx.core:core:1.13.0] /home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/AndroidManifest.xml:23:9-81 +47 android:protectionLevel="signature" /> +47-->[androidx.core:core:1.13.0] /home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/AndroidManifest.xml:24:9-44 +48 +49 +49-->[androidx.core:core:1.13.0] /home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/AndroidManifest.xml:26:5-97 +49-->[androidx.core:core:1.13.0] /home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/AndroidManifest.xml:26:22-94 +50 +51 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:27:5-197:19 +52 android:name="com.foxx.androidcast.AndroidCastApplication" +52-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:28:9-47 +53 android:allowBackup="true" +53-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:29:9-35 +54 android:appComponentFactory="androidx.core.app.CoreComponentFactory" +54-->[androidx.core:core:1.13.0] /home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/AndroidManifest.xml:28:18-86 +55 android:debuggable="true" +56 android:extractNativeLibs="false" +57 android:icon="@drawable/ic_launcher_foreground" +57-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:30:9-56 +58 android:label="@string/app_name" +58-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:31:9-41 +59 android:supportsRtl="true" +59-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:32:9-35 +60 android:theme="@style/Theme.AndroidCast" +60-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:33:9-49 +61 android:usesCleartextTraffic="true" > +61-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:34:9-44 +62 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:36:9-44:20 +63 android:name="com.foxx.androidcast.MainActivity" +63-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:37:13-41 +64 android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize|keyboardHidden|density" +64-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:39:13-114 +65 android:exported="true" > +65-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:38:13-36 +66 +66-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:40:13-43:29 +67 +67-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:41:17-69 +67-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:41:25-66 +68 +69 +69-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:42:17-77 +69-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:42:27-74 +70 +71 +72 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:46:9-49:117 +73 android:name="com.foxx.androidcast.sender.SenderActivity" +73-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:47:13-50 +74 android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize|keyboardHidden|density" +74-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:49:13-114 +75 android:exported="false" /> +75-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:48:13-37 +76 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:51:9-56:90 +77 android:name="com.foxx.androidcast.CastSettingsActivity" +77-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:52:13-49 +78 android:configChanges="orientation|screenSize|screenLayout|keyboardHidden" +78-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:56:13-87 +79 android:exported="false" +79-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:53:13-37 +80 android:label="@string/cast_settings_title" +80-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:54:13-56 +81 android:parentActivityName="com.foxx.androidcast.MainActivity" /> +81-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:55:13-55 +82 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:58:9-62:58 +83 android:name="com.foxx.androidcast.LicensesActivity" +83-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:59:13-45 +84 android:exported="false" +84-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:60:13-37 +85 android:label="@string/licenses_title" +85-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:61:13-51 +86 android:parentActivityName="com.foxx.androidcast.MainActivity" /> +86-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:62:13-55 +87 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:64:9-68:58 +88 android:name="com.foxx.androidcast.DeveloperSettingsActivity" +88-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:65:13-54 +89 android:exported="false" +89-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:66:13-37 +90 android:label="@string/developer_settings_title" +90-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:67:13-61 +91 android:parentActivityName="com.foxx.androidcast.MainActivity" /> +91-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:68:13-55 +92 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:70:9-74:71 +93 android:name="com.foxx.androidcast.stats.ui.SessionStatsAnalyzerActivity" +93-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:71:13-66 +94 android:exported="false" +94-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:72:13-37 +95 android:label="@string/session_stats_title" +95-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:73:13-56 +96 android:parentActivityName="com.foxx.androidcast.DeveloperSettingsActivity" /> +96-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:74:13-68 +97 +98 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:77:13-62 +100 android:authorities="com.foxx.androidcast.fileprovider" +100-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:78:13-64 +101 android:exported="false" +101-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:79:13-37 +102 android:grantUriPermissions="true" > +102-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:80:13-47 +103 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:81:13-83:54 +104 android:name="android.support.FILE_PROVIDER_PATHS" +104-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:82:17-67 +105 android:resource="@xml/file_paths" /> +105-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:83:17-51 +106 +107 +108 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:86:9-93:117 +109 android:name="com.foxx.androidcast.receiver.ReceiverPlaybackActivity" +109-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:87:13-62 +110 android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize|keyboardHidden|density" +110-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:93:13-114 +111 android:exported="false" +111-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:88:13-37 +112 android:launchMode="singleTop" +112-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:89:13-43 +113 android:resizeableActivity="true" +113-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:90:13-46 +114 android:supportsPictureInPicture="true" +114-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:91:13-52 +115 android:theme="@style/Theme.AndroidCast.Fullscreen" /> +115-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:92:13-64 +116 +117 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:95:9-98:56 +118 android:name="com.foxx.androidcast.ota.OtaUpdateService" +118-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:96:13-49 +119 android:exported="false" +119-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:97:13-37 +120 android:foregroundServiceType="dataSync" /> +120-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:98:13-53 +121 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:100:9-103:47 +122 android:name="com.foxx.androidcast.crash.CrashWatcherService" +122-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:101:13-54 +123 android:exported="false" +123-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:102:13-37 +124 android:process=":crashwatcher" /> +124-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:103:13-44 +125 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:105:9-108:46 +126 android:name="com.foxx.androidcast.network.selftest.NetworkSelfTestService" +126-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:106:13-68 +127 android:exported="false" +127-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:107:13-37 +128 android:process=":netselftest" /> +128-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:108:13-43 +129 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:110:9-114:74 +130 android:name="com.foxx.androidcast.sender.ScreenCastService" +130-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:111:13-53 +131 android:exported="false" +131-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:112:13-37 +132 android:foregroundServiceType="mediaProjection|microphone" +132-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:114:13-71 +133 android:stopWithTask="false" /> +133-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:113:13-41 +134 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:116:9-119:63 +135 android:name="com.foxx.androidcast.sender.SenderPreviewService" +135-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:117:13-56 +136 android:exported="false" +136-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:118:13-37 +137 android:foregroundServiceType="mediaProjection" /> +137-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:119:13-60 +138 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:121:9-125:61 +139 android:name="com.foxx.androidcast.receiver.ReceiverCastService" +139-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:122:13-57 +140 android:exported="false" +140-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:123:13-37 +141 android:foregroundServiceType="mediaPlayback" +141-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:125:13-58 +142 android:stopWithTask="true" /> +142-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:124:13-40 +143 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:127:9-134:19 +144 android:name="com.foxx.androidcast.TrayForegroundService" +144-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:128:13-50 +145 android:exported="false" +145-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:129:13-37 +146 android:foregroundServiceType="specialUse" > +146-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:130:13-55 +147 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:131:13-133:79 +148 android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE" +148-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:132:17-76 +149 android:value="Persistent status bar icon for Android Cast" /> +149-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:133:17-76 +150 +151 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:136:9-139:63 +152 android:name="com.foxx.androidcast.remoteaccess.RemoteAccessService" +152-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:137:13-61 +153 android:exported="false" +153-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:138:13-37 +154 android:foregroundServiceType="connectedDevice" /> +154-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:139:13-60 +155 +156 +157 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:142:9-145:45 +158 android:name="com.foxx.androidcast.remoteaccess.control.RemoteAccessControlService" +158-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:143:13-76 +159 android:exported="false" +159-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:144:13-37 +160 android:process=":ra_control" /> +160-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:145:13-42 +161 +162 +163 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:148:9-151:38 +164 android:name="com.foxx.androidcast.vpn.AndroidCastVpnService" +164-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:149:13-54 +165 android:exported="false" +165-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:150:13-37 +166 android:process=":vpn" /> +166-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:151:13-35 +167 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:153:9-162:19 +168 android:name="com.foxx.androidcast.vpn.RemoteAccessVpnService" +168-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:154:13-55 +169 android:exported="false" +169-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:155:13-37 +170 android:foregroundServiceType="connectedDevice" +170-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:158:13-60 +171 android:permission="android.permission.BIND_VPN_SERVICE" +171-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:157:13-69 +172 android:process=":vpn" > +172-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:156:13-35 +173 +173-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:159:13-161:29 +174 +174-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:160:17-65 +174-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:160:25-62 +175 +176 +177 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:164:9-173:19 +178 android:name="com.wireguard.android.backend.GoBackend$VpnService" +178-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:165:13-78 +179 android:exported="false" +179-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:166:13-37 +180 android:permission="android.permission.BIND_VPN_SERVICE" +180-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:168:13-69 +181 android:process=":vpn" > +181-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:167:13-35 +182 +182-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:159:13-161:29 +183 +183-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:160:17-65 +183-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:160:25-62 +184 +185 +186 +187 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:175:9-177:40 +188 android:name="com.foxx.androidcast.TrayNotificationReceiver" +188-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:176:13-53 +189 android:exported="false" /> +189-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:177:13-37 +190 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:179:9-185:20 +191 android:name="com.foxx.androidcast.dev.DevAdbWifiReceiver" +191-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:180:13-51 +192 android:exported="false" > +192-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:181:13-37 +193 +193-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:182:13-184:29 +194 +194-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:183:17-84 +194-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:183:25-81 +195 +196 +197 /home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:187:9-196:20 +198 android:name="com.foxx.androidcast.dev.DebugDeployWakeReceiver" +198-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:188:13-56 +199 android:exported="false" > +199-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:189:13-37 +200 +200-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:190:13-192:29 +201 +201-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:191:17-84 +201-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:191:25-81 +202 +203 +203-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:193:13-195:29 +204 +204-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:194:17-86 +204-->/home/foxx/repos/My Projects/android cast/app/src/main/AndroidManifest.xml:194:25-83 +205 +206 +207 +208 [com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:22:9-24:37 +209 android:name="com.google.android.play.billingclient.version" +209-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:23:13-73 +210 android:value="7.1.1" /> +210-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:24:13-34 +211 +212 [com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:26:9-30:75 +213 android:name="com.android.billingclient.api.ProxyBillingActivity" +213-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:27:13-78 +214 android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" +214-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:28:13-96 +215 android:exported="false" +215-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:29:13-37 +216 android:theme="@android:style/Theme.Translucent.NoTitleBar" /> +216-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:30:13-72 +217 [com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:31:9-35:75 +218 android:name="com.android.billingclient.api.ProxyBillingActivityV2" +218-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:32:13-80 +219 android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" +219-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:33:13-96 +220 android:exported="false" +220-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:34:13-37 +221 android:theme="@android:style/Theme.Translucent.NoTitleBar" /> +221-->[com.android.billingclient:billing:7.1.1] /home/foxx/.gradle/caches/8.9/transforms/e332ffe657c872410fafef97a7dcbc8f/transformed/billing-7.1.1/AndroidManifest.xml:35:13-72 +222 [com.google.android.gms:play-services-base:18.5.0] /home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/AndroidManifest.xml:5:9-173 +223 android:name="com.google.android.gms.common.api.GoogleApiActivity" +223-->[com.google.android.gms:play-services-base:18.5.0] /home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/AndroidManifest.xml:5:19-85 +224 android:exported="false" +224-->[com.google.android.gms:play-services-base:18.5.0] /home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/AndroidManifest.xml:5:146-170 +225 android:theme="@android:style/Theme.Translucent.NoTitleBar" /> +225-->[com.google.android.gms:play-services-base:18.5.0] /home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/AndroidManifest.xml:5:86-145 +226 +227 [com.google.android.gms:play-services-basement:18.4.0] /home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/AndroidManifest.xml:6:9-122 +228 android:name="com.google.android.gms.version" +228-->[com.google.android.gms:play-services-basement:18.4.0] /home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/AndroidManifest.xml:6:20-65 +229 android:value="@integer/google_play_services_version" /> +229-->[com.google.android.gms:play-services-basement:18.4.0] /home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/AndroidManifest.xml:6:66-119 +230 +231 [androidx.emoji2:emoji2:1.3.0] /home/foxx/.gradle/caches/8.9/transforms/a71db1730372a85609b79dc760cf4f58/transformed/emoji2-1.3.0/AndroidManifest.xml:24:9-32:20 +232 android:name="androidx.startup.InitializationProvider" +232-->[androidx.emoji2:emoji2:1.3.0] /home/foxx/.gradle/caches/8.9/transforms/a71db1730372a85609b79dc760cf4f58/transformed/emoji2-1.3.0/AndroidManifest.xml:25:13-67 +233 android:authorities="com.foxx.androidcast.androidx-startup" +233-->[androidx.emoji2:emoji2:1.3.0] /home/foxx/.gradle/caches/8.9/transforms/a71db1730372a85609b79dc760cf4f58/transformed/emoji2-1.3.0/AndroidManifest.xml:26:13-68 +234 android:exported="false" > +234-->[androidx.emoji2:emoji2:1.3.0] /home/foxx/.gradle/caches/8.9/transforms/a71db1730372a85609b79dc760cf4f58/transformed/emoji2-1.3.0/AndroidManifest.xml:27:13-37 +235 [androidx.emoji2:emoji2:1.3.0] /home/foxx/.gradle/caches/8.9/transforms/a71db1730372a85609b79dc760cf4f58/transformed/emoji2-1.3.0/AndroidManifest.xml:29:13-31:52 +236 android:name="androidx.emoji2.text.EmojiCompatInitializer" +236-->[androidx.emoji2:emoji2:1.3.0] /home/foxx/.gradle/caches/8.9/transforms/a71db1730372a85609b79dc760cf4f58/transformed/emoji2-1.3.0/AndroidManifest.xml:30:17-75 +237 android:value="androidx.startup" /> +237-->[androidx.emoji2:emoji2:1.3.0] /home/foxx/.gradle/caches/8.9/transforms/a71db1730372a85609b79dc760cf4f58/transformed/emoji2-1.3.0/AndroidManifest.xml:31:17-49 +238 [androidx.lifecycle:lifecycle-process:2.6.2] /home/foxx/.gradle/caches/8.9/transforms/ae8d65403f5e3ca314f8a0cca0f92c5a/transformed/lifecycle-process-2.6.2/AndroidManifest.xml:29:13-31:52 +239 android:name="androidx.lifecycle.ProcessLifecycleInitializer" +239-->[androidx.lifecycle:lifecycle-process:2.6.2] /home/foxx/.gradle/caches/8.9/transforms/ae8d65403f5e3ca314f8a0cca0f92c5a/transformed/lifecycle-process-2.6.2/AndroidManifest.xml:30:17-78 +240 android:value="androidx.startup" /> +240-->[androidx.lifecycle:lifecycle-process:2.6.2] /home/foxx/.gradle/caches/8.9/transforms/ae8d65403f5e3ca314f8a0cca0f92c5a/transformed/lifecycle-process-2.6.2/AndroidManifest.xml:31:17-49 +241 [androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:29:13-31:52 +242 android:name="androidx.profileinstaller.ProfileInstallerInitializer" +242-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:30:17-85 +243 android:value="androidx.startup" /> +243-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:31:17-49 +244 +245 +246 [androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:34:9-52:20 +247 android:name="androidx.profileinstaller.ProfileInstallReceiver" +247-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:35:13-76 +248 android:directBootAware="false" +248-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:36:13-44 +249 android:enabled="true" +249-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:37:13-35 +250 android:exported="true" +250-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:38:13-36 +251 android:permission="android.permission.DUMP" > +251-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:39:13-57 +252 +252-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:40:13-42:29 +253 +253-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:41:17-91 +253-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:41:25-88 +254 +255 +255-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:43:13-45:29 +256 +256-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:44:17-85 +256-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:44:25-82 +257 +258 +258-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:46:13-48:29 +259 +259-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:47:17-88 +259-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:47:25-85 +260 +261 +261-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:49:13-51:29 +262 +262-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:50:17-95 +262-->[androidx.profileinstaller:profileinstaller:1.4.0] /home/foxx/.gradle/caches/8.9/transforms/f1e8b866e5f30d566ee5eaa302236278/transformed/profileinstaller-1.4.0/AndroidManifest.xml:50:25-92 +263 +264 +265 +266 [com.google.android.datatransport:transport-backend-cct:3.1.8] /home/foxx/.gradle/caches/8.9/transforms/5dce148917bdb8775961fe073acb96f8/transformed/transport-backend-cct-3.1.8/AndroidManifest.xml:28:9-34:19 +267 android:name="com.google.android.datatransport.runtime.backends.TransportBackendDiscovery" +267-->[com.google.android.datatransport:transport-backend-cct:3.1.8] /home/foxx/.gradle/caches/8.9/transforms/5dce148917bdb8775961fe073acb96f8/transformed/transport-backend-cct-3.1.8/AndroidManifest.xml:29:13-103 +268 android:exported="false" > +268-->[com.google.android.datatransport:transport-backend-cct:3.1.8] /home/foxx/.gradle/caches/8.9/transforms/5dce148917bdb8775961fe073acb96f8/transformed/transport-backend-cct-3.1.8/AndroidManifest.xml:30:13-37 +269 [com.google.android.datatransport:transport-backend-cct:3.1.8] /home/foxx/.gradle/caches/8.9/transforms/5dce148917bdb8775961fe073acb96f8/transformed/transport-backend-cct-3.1.8/AndroidManifest.xml:31:13-33:39 +270 android:name="backend:com.google.android.datatransport.cct.CctBackendFactory" +270-->[com.google.android.datatransport:transport-backend-cct:3.1.8] /home/foxx/.gradle/caches/8.9/transforms/5dce148917bdb8775961fe073acb96f8/transformed/transport-backend-cct-3.1.8/AndroidManifest.xml:32:17-94 +271 android:value="cct" /> +271-->[com.google.android.datatransport:transport-backend-cct:3.1.8] /home/foxx/.gradle/caches/8.9/transforms/5dce148917bdb8775961fe073acb96f8/transformed/transport-backend-cct-3.1.8/AndroidManifest.xml:33:17-36 +272 +273 [com.google.android.datatransport:transport-runtime:3.1.8] /home/foxx/.gradle/caches/8.9/transforms/06e3d43726b6dc7a2e7beafd2cac21f7/transformed/transport-runtime-3.1.8/AndroidManifest.xml:26:9-30:19 +274 android:name="com.google.android.datatransport.runtime.scheduling.jobscheduling.JobInfoSchedulerService" +274-->[com.google.android.datatransport:transport-runtime:3.1.8] /home/foxx/.gradle/caches/8.9/transforms/06e3d43726b6dc7a2e7beafd2cac21f7/transformed/transport-runtime-3.1.8/AndroidManifest.xml:27:13-117 +275 android:exported="false" +275-->[com.google.android.datatransport:transport-runtime:3.1.8] /home/foxx/.gradle/caches/8.9/transforms/06e3d43726b6dc7a2e7beafd2cac21f7/transformed/transport-runtime-3.1.8/AndroidManifest.xml:28:13-37 +276 android:permission="android.permission.BIND_JOB_SERVICE" > +276-->[com.google.android.datatransport:transport-runtime:3.1.8] /home/foxx/.gradle/caches/8.9/transforms/06e3d43726b6dc7a2e7beafd2cac21f7/transformed/transport-runtime-3.1.8/AndroidManifest.xml:29:13-69 +277 +278 +279 [com.google.android.datatransport:transport-runtime:3.1.8] /home/foxx/.gradle/caches/8.9/transforms/06e3d43726b6dc7a2e7beafd2cac21f7/transformed/transport-runtime-3.1.8/AndroidManifest.xml:32:9-34:40 +280 android:name="com.google.android.datatransport.runtime.scheduling.jobscheduling.AlarmManagerSchedulerBroadcastReceiver" +280-->[com.google.android.datatransport:transport-runtime:3.1.8] /home/foxx/.gradle/caches/8.9/transforms/06e3d43726b6dc7a2e7beafd2cac21f7/transformed/transport-runtime-3.1.8/AndroidManifest.xml:33:13-132 +281 android:exported="false" /> +281-->[com.google.android.datatransport:transport-runtime:3.1.8] /home/foxx/.gradle/caches/8.9/transforms/06e3d43726b6dc7a2e7beafd2cac21f7/transformed/transport-runtime-3.1.8/AndroidManifest.xml:34:13-37 +282 [com.google.android.play:core-common:2.0.4] /home/foxx/.gradle/caches/8.9/transforms/68e97725e1781378fe335998c8e500ec/transformed/core-common-2.0.4/AndroidManifest.xml:14:9-18:65 +283 android:name="com.google.android.play.core.common.PlayCoreDialogWrapperActivity" +283-->[com.google.android.play:core-common:2.0.4] /home/foxx/.gradle/caches/8.9/transforms/68e97725e1781378fe335998c8e500ec/transformed/core-common-2.0.4/AndroidManifest.xml:15:13-93 +284 android:exported="false" +284-->[com.google.android.play:core-common:2.0.4] /home/foxx/.gradle/caches/8.9/transforms/68e97725e1781378fe335998c8e500ec/transformed/core-common-2.0.4/AndroidManifest.xml:16:13-37 +285 android:stateNotNeeded="true" +285-->[com.google.android.play:core-common:2.0.4] /home/foxx/.gradle/caches/8.9/transforms/68e97725e1781378fe335998c8e500ec/transformed/core-common-2.0.4/AndroidManifest.xml:17:13-42 +286 android:theme="@style/Theme.PlayCore.Transparent" /> +286-->[com.google.android.play:core-common:2.0.4] /home/foxx/.gradle/caches/8.9/transforms/68e97725e1781378fe335998c8e500ec/transformed/core-common-2.0.4/AndroidManifest.xml:18:13-62 +287 +288 +289 diff --git a/app/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/base.jar b/app/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/base.jar new file mode 100644 index 0000000..fdaac72 Binary files /dev/null and b/app/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/base.jar differ diff --git a/app/build/intermediates/merged_manifest/debug/processDebugMainManifest/AndroidManifest.xml b/app/build/intermediates/merged_manifest/debug/processDebugMainManifest/AndroidManifest.xml new file mode 100644 index 0000000..828cfa4 --- /dev/null +++ b/app/build/intermediates/merged_manifest/debug/processDebugMainManifest/AndroidManifest.xml @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build/intermediates/merged_manifests/debug/processDebugManifest/AndroidManifest.xml b/app/build/intermediates/merged_manifests/debug/processDebugManifest/AndroidManifest.xml new file mode 100644 index 0000000..828cfa4 --- /dev/null +++ b/app/build/intermediates/merged_manifests/debug/processDebugManifest/AndroidManifest.xml @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build/intermediates/merged_manifests/debug/processDebugManifest/output-metadata.json b/app/build/intermediates/merged_manifests/debug/processDebugManifest/output-metadata.json new file mode 100644 index 0000000..870cc07 --- /dev/null +++ b/app/build/intermediates/merged_manifests/debug/processDebugManifest/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "MERGED_MANIFESTS", + "kind": "Directory" + }, + "applicationId": "com.foxx.androidcast", + "variantName": "debug", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 100, + "versionName": "0.1.0", + "outputFile": "AndroidManifest.xml" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libandroidcast_codecs.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libandroidcast_codecs.so new file mode 100644 index 0000000..eb5493c Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libandroidcast_codecs.so differ diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libandroidcast_entitlements.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libandroidcast_entitlements.so new file mode 100644 index 0000000..69dcdc5 Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libandroidcast_entitlements.so differ diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libc++_shared.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libc++_shared.so new file mode 100644 index 0000000..a80c8b3 Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libc++_shared.so differ diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libwg-quick.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libwg-quick.so new file mode 100644 index 0000000..182088c Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libwg-quick.so differ diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libwg.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libwg.so new file mode 100644 index 0000000..4b72385 Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/arm64-v8a/libwg.so differ diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libandroidcast_codecs.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libandroidcast_codecs.so new file mode 100644 index 0000000..d91c449 Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libandroidcast_codecs.so differ diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libandroidcast_entitlements.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libandroidcast_entitlements.so new file mode 100644 index 0000000..132c1a6 Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libandroidcast_entitlements.so differ diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libc++_shared.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libc++_shared.so new file mode 100644 index 0000000..cbff8a9 Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libc++_shared.so differ diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libwg-quick.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libwg-quick.so new file mode 100644 index 0000000..fc4d7d9 Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libwg-quick.so differ diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libwg.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libwg.so new file mode 100644 index 0000000..cc48fc3 Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/armeabi-v7a/libwg.so differ diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86/libwg-quick.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86/libwg-quick.so new file mode 100644 index 0000000..59db986 Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86/libwg-quick.so differ diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86/libwg.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86/libwg.so new file mode 100644 index 0000000..f91f332 Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86/libwg.so differ diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libandroidcast_codecs.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libandroidcast_codecs.so new file mode 100644 index 0000000..01d8427 Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libandroidcast_codecs.so differ diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libandroidcast_entitlements.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libandroidcast_entitlements.so new file mode 100644 index 0000000..c3ab209 Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libandroidcast_entitlements.so differ diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libc++_shared.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libc++_shared.so new file mode 100644 index 0000000..a373f86 Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libc++_shared.so differ diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libwg-quick.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libwg-quick.so new file mode 100644 index 0000000..3ef7b61 Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libwg-quick.so differ diff --git a/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libwg.so b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libwg.so new file mode 100644 index 0000000..edb88bd Binary files /dev/null and b/app/build/intermediates/merged_native_libs/debug/mergeDebugNativeLibs/out/lib/x86_64/libwg.so differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/anim_robot_dance.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/anim_robot_dance.xml.flat new file mode 100644 index 0000000..62f90ed Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/anim_robot_dance.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/color_device_item_text.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/color_device_item_text.xml.flat new file mode 100644 index 0000000..da8a6d9 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/color_device_item_text.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/color_settings_spinner_text.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/color_settings_spinner_text.xml.flat new file mode 100644 index 0000000..6212224 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/color_settings_spinner_text.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable-nodpi_calibration_chart_reference.png.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable-nodpi_calibration_chart_reference.png.flat new file mode 100644 index 0000000..26378af Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable-nodpi_calibration_chart_reference.png.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_drawer_handle.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_drawer_handle.xml.flat new file mode 100644 index 0000000..ae5d4e6 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_drawer_handle.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_section_header.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_section_header.xml.flat new file mode 100644 index 0000000..59556c6 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_section_header.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_spinner.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_spinner.xml.flat new file mode 100644 index 0000000..850024c Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_spinner.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_spinner_item.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_spinner_item.xml.flat new file mode 100644 index 0000000..02f5064 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_spinner_item.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_spinner_item_selected.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_spinner_item_selected.xml.flat new file mode 100644 index 0000000..92a6710 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_spinner_item_selected.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_spinner_popup.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_spinner_popup.xml.flat new file mode 100644 index 0000000..e642aff Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_settings_spinner_popup.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_spinner_item_underline_dark.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_spinner_item_underline_dark.xml.flat new file mode 100644 index 0000000..0726aae Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_spinner_item_underline_dark.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_spinner_item_underline_light.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_spinner_item_underline_light.xml.flat new file mode 100644 index 0000000..3791e8e Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_bg_spinner_item_underline_light.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_device_item_background.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_device_item_background.xml.flat new file mode 100644 index 0000000..36659fb Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_device_item_background.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_device_item_live_border.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_device_item_live_border.xml.flat new file mode 100644 index 0000000..f856ff7 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_device_item_live_border.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_android_robot.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_android_robot.xml.flat new file mode 100644 index 0000000..5b821ab Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_android_robot.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_launcher_foreground.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_launcher_foreground.xml.flat new file mode 100644 index 0000000..e73e2df Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_launcher_foreground.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_notification.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_notification.xml.flat new file mode 100644 index 0000000..88a3dfc Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_notification.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_picture_in_picture.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_picture_in_picture.xml.flat new file mode 100644 index 0000000..f41d4d9 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_ic_picture_in_picture.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_settings_app_info_divider.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_settings_app_info_divider.xml.flat new file mode 100644 index 0000000..5606cd4 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/drawable_settings_app_info_divider.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout-land_activity_sender.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout-land_activity_sender.xml.flat new file mode 100644 index 0000000..0b1a95e Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout-land_activity_sender.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_cast_settings.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_cast_settings.xml.flat new file mode 100644 index 0000000..b3181ad Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_cast_settings.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_dev_diagnostics_panel.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_dev_diagnostics_panel.xml.flat new file mode 100644 index 0000000..2225ce2 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_dev_diagnostics_panel.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_dev_network_selftest_panel.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_dev_network_selftest_panel.xml.flat new file mode 100644 index 0000000..8faddf2 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_dev_network_selftest_panel.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_dev_settings_panel.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_dev_settings_panel.xml.flat new file mode 100644 index 0000000..dbb2479 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_dev_settings_panel.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_developer_settings.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_developer_settings.xml.flat new file mode 100644 index 0000000..7c5c468 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_developer_settings.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_drawer_host.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_drawer_host.xml.flat new file mode 100644 index 0000000..1adb631 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_drawer_host.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_licenses.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_licenses.xml.flat new file mode 100644 index 0000000..c3f6bb6 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_licenses.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_main.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_main.xml.flat new file mode 100644 index 0000000..4491d1d Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_main.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_playback.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_playback.xml.flat new file mode 100644 index 0000000..66c664b Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_playback.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_sender.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_sender.xml.flat new file mode 100644 index 0000000..2a2ec36 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_sender.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_session_stats_analyzer.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_session_stats_analyzer.xml.flat new file mode 100644 index 0000000..1183983 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_session_stats_analyzer.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_settings_panel.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_settings_panel.xml.flat new file mode 100644 index 0000000..44499cc Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_activity_settings_panel.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_dialog_ota_download.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_dialog_ota_download.xml.flat new file mode 100644 index 0000000..8030c87 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_dialog_ota_download.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_fragment_cast_settings.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_fragment_cast_settings.xml.flat new file mode 100644 index 0000000..61ef3b0 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_fragment_cast_settings.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_include_app_info_section.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_include_app_info_section.xml.flat new file mode 100644 index 0000000..5444587 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_include_app_info_section.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_include_settings_section_header.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_include_settings_section_header.xml.flat new file mode 100644 index 0000000..78c69c0 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_include_settings_section_header.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_item_device.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_item_device.xml.flat new file mode 100644 index 0000000..e747aa1 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_item_device.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_item_session_stats.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_item_session_stats.xml.flat new file mode 100644 index 0000000..13dc7e9 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_item_session_stats.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_overlay_cast_diagnostics.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_overlay_cast_diagnostics.xml.flat new file mode 100644 index 0000000..0f743f8 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_overlay_cast_diagnostics.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_overlay_stream_awaiting.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_overlay_stream_awaiting.xml.flat new file mode 100644 index 0000000..ad25022 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_overlay_stream_awaiting.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_spinner_dropdown_item_scored.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_spinner_dropdown_item_scored.xml.flat new file mode 100644 index 0000000..d207f35 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_spinner_dropdown_item_scored.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_spinner_dropdown_item_settings.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_spinner_dropdown_item_settings.xml.flat new file mode 100644 index 0000000..2e7ecc3 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_spinner_dropdown_item_settings.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_spinner_item_scored.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_spinner_item_scored.xml.flat new file mode 100644 index 0000000..2515299 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_spinner_item_scored.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_spinner_item_settings.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_spinner_item_settings.xml.flat new file mode 100644 index 0000000..2f97b77 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_spinner_item_settings.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_view_dev_diag_card.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_view_dev_diag_card.xml.flat new file mode 100644 index 0000000..c4cd91d Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_view_dev_diag_card.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_view_settings_drawer_handle.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_view_settings_drawer_handle.xml.flat new file mode 100644 index 0000000..df55845 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/layout_view_settings_drawer_handle.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/mipmap-anydpi-v26_ic_launcher.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/mipmap-anydpi-v26_ic_launcher.xml.flat new file mode 100644 index 0000000..dca7f51 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/mipmap-anydpi-v26_ic_launcher.xml.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-af_values-af.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-af_values-af.arsc.flat new file mode 100644 index 0000000..7b856bd Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-af_values-af.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-am_values-am.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-am_values-am.arsc.flat new file mode 100644 index 0000000..0425aaa Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-am_values-am.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ar_values-ar.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ar_values-ar.arsc.flat new file mode 100644 index 0000000..f296d3a Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ar_values-ar.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-as_values-as.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-as_values-as.arsc.flat new file mode 100644 index 0000000..3c44b09 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-as_values-as.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-az_values-az.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-az_values-az.arsc.flat new file mode 100644 index 0000000..1c91dc3 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-az_values-az.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-b+es+419_values-b+es+419.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-b+es+419_values-b+es+419.arsc.flat new file mode 100644 index 0000000..3f59d8a Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-b+es+419_values-b+es+419.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-b+sr+Latn_values-b+sr+Latn.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-b+sr+Latn_values-b+sr+Latn.arsc.flat new file mode 100644 index 0000000..d3d7506 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-b+sr+Latn_values-b+sr+Latn.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-be_values-be.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-be_values-be.arsc.flat new file mode 100644 index 0000000..2f31df6 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-be_values-be.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-bg_values-bg.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-bg_values-bg.arsc.flat new file mode 100644 index 0000000..c573936 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-bg_values-bg.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-bn_values-bn.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-bn_values-bn.arsc.flat new file mode 100644 index 0000000..c7eabf0 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-bn_values-bn.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-bs_values-bs.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-bs_values-bs.arsc.flat new file mode 100644 index 0000000..af9facc Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-bs_values-bs.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ca_values-ca.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ca_values-ca.arsc.flat new file mode 100644 index 0000000..b7b628d Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ca_values-ca.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-cs_values-cs.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-cs_values-cs.arsc.flat new file mode 100644 index 0000000..7b6f395 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-cs_values-cs.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-da_values-da.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-da_values-da.arsc.flat new file mode 100644 index 0000000..1f24d12 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-da_values-da.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-de_values-de.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-de_values-de.arsc.flat new file mode 100644 index 0000000..188359f Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-de_values-de.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-el_values-el.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-el_values-el.arsc.flat new file mode 100644 index 0000000..15c335e Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-el_values-el.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-en-rAU_values-en-rAU.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-en-rAU_values-en-rAU.arsc.flat new file mode 100644 index 0000000..3081c7c Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-en-rAU_values-en-rAU.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-en-rCA_values-en-rCA.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-en-rCA_values-en-rCA.arsc.flat new file mode 100644 index 0000000..0c95792 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-en-rCA_values-en-rCA.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-en-rGB_values-en-rGB.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-en-rGB_values-en-rGB.arsc.flat new file mode 100644 index 0000000..8d74124 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-en-rGB_values-en-rGB.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-en-rIN_values-en-rIN.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-en-rIN_values-en-rIN.arsc.flat new file mode 100644 index 0000000..f8cb7a8 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-en-rIN_values-en-rIN.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-en-rXC_values-en-rXC.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-en-rXC_values-en-rXC.arsc.flat new file mode 100644 index 0000000..fe60533 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-en-rXC_values-en-rXC.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-es-rUS_values-es-rUS.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-es-rUS_values-es-rUS.arsc.flat new file mode 100644 index 0000000..39a0005 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-es-rUS_values-es-rUS.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-es_values-es.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-es_values-es.arsc.flat new file mode 100644 index 0000000..862f3a3 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-es_values-es.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-et_values-et.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-et_values-et.arsc.flat new file mode 100644 index 0000000..c4cd18c Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-et_values-et.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-eu_values-eu.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-eu_values-eu.arsc.flat new file mode 100644 index 0000000..b792d3f Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-eu_values-eu.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-fa_values-fa.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-fa_values-fa.arsc.flat new file mode 100644 index 0000000..ce05bdd Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-fa_values-fa.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-fi_values-fi.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-fi_values-fi.arsc.flat new file mode 100644 index 0000000..6dad2ba Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-fi_values-fi.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-fr-rCA_values-fr-rCA.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-fr-rCA_values-fr-rCA.arsc.flat new file mode 100644 index 0000000..1649946 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-fr-rCA_values-fr-rCA.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-fr_values-fr.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-fr_values-fr.arsc.flat new file mode 100644 index 0000000..7443e25 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-fr_values-fr.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-gl_values-gl.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-gl_values-gl.arsc.flat new file mode 100644 index 0000000..8144b06 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-gl_values-gl.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-gu_values-gu.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-gu_values-gu.arsc.flat new file mode 100644 index 0000000..7a878b6 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-gu_values-gu.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-h320dp-port-v13_values-h320dp-port-v13.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-h320dp-port-v13_values-h320dp-port-v13.arsc.flat new file mode 100644 index 0000000..cebdd98 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-h320dp-port-v13_values-h320dp-port-v13.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-h360dp-land-v13_values-h360dp-land-v13.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-h360dp-land-v13_values-h360dp-land-v13.arsc.flat new file mode 100644 index 0000000..2484646 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-h360dp-land-v13_values-h360dp-land-v13.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-h480dp-land-v13_values-h480dp-land-v13.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-h480dp-land-v13_values-h480dp-land-v13.arsc.flat new file mode 100644 index 0000000..f9feadf Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-h480dp-land-v13_values-h480dp-land-v13.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-h550dp-port-v13_values-h550dp-port-v13.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-h550dp-port-v13_values-h550dp-port-v13.arsc.flat new file mode 100644 index 0000000..0128afa Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-h550dp-port-v13_values-h550dp-port-v13.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-h720dp-v13_values-h720dp-v13.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-h720dp-v13_values-h720dp-v13.arsc.flat new file mode 100644 index 0000000..f6a9886 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-h720dp-v13_values-h720dp-v13.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-hdpi-v4_values-hdpi-v4.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-hdpi-v4_values-hdpi-v4.arsc.flat new file mode 100644 index 0000000..d7a4f98 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-hdpi-v4_values-hdpi-v4.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-hi_values-hi.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-hi_values-hi.arsc.flat new file mode 100644 index 0000000..7a91447 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-hi_values-hi.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-hr_values-hr.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-hr_values-hr.arsc.flat new file mode 100644 index 0000000..45d0244 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-hr_values-hr.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-hu_values-hu.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-hu_values-hu.arsc.flat new file mode 100644 index 0000000..7a6e815 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-hu_values-hu.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-hy_values-hy.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-hy_values-hy.arsc.flat new file mode 100644 index 0000000..1182873 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-hy_values-hy.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-in_values-in.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-in_values-in.arsc.flat new file mode 100644 index 0000000..434b88c Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-in_values-in.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-is_values-is.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-is_values-is.arsc.flat new file mode 100644 index 0000000..c2a2d96 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-is_values-is.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-it_values-it.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-it_values-it.arsc.flat new file mode 100644 index 0000000..69cf65e Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-it_values-it.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-iw_values-iw.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-iw_values-iw.arsc.flat new file mode 100644 index 0000000..3146529 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-iw_values-iw.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ja_values-ja.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ja_values-ja.arsc.flat new file mode 100644 index 0000000..c335b28 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ja_values-ja.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ka_values-ka.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ka_values-ka.arsc.flat new file mode 100644 index 0000000..34ff9ea Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ka_values-ka.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-kk_values-kk.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-kk_values-kk.arsc.flat new file mode 100644 index 0000000..9269e69 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-kk_values-kk.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-km_values-km.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-km_values-km.arsc.flat new file mode 100644 index 0000000..f6f766e Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-km_values-km.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-kn_values-kn.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-kn_values-kn.arsc.flat new file mode 100644 index 0000000..d1de27e Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-kn_values-kn.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ko_values-ko.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ko_values-ko.arsc.flat new file mode 100644 index 0000000..0370b05 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ko_values-ko.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ky_values-ky.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ky_values-ky.arsc.flat new file mode 100644 index 0000000..b4412f6 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ky_values-ky.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-land_values-land.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-land_values-land.arsc.flat new file mode 100644 index 0000000..be4e06d Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-land_values-land.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-large-v4_values-large-v4.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-large-v4_values-large-v4.arsc.flat new file mode 100644 index 0000000..53311c7 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-large-v4_values-large-v4.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ldltr-v21_values-ldltr-v21.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ldltr-v21_values-ldltr-v21.arsc.flat new file mode 100644 index 0000000..eaa470b Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ldltr-v21_values-ldltr-v21.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ldrtl-v17_values-ldrtl-v17.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ldrtl-v17_values-ldrtl-v17.arsc.flat new file mode 100644 index 0000000..62fe85e Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ldrtl-v17_values-ldrtl-v17.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-lo_values-lo.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-lo_values-lo.arsc.flat new file mode 100644 index 0000000..354d7da Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-lo_values-lo.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-lt_values-lt.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-lt_values-lt.arsc.flat new file mode 100644 index 0000000..b0cb5d4 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-lt_values-lt.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-lv_values-lv.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-lv_values-lv.arsc.flat new file mode 100644 index 0000000..76d0892 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-lv_values-lv.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-mk_values-mk.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-mk_values-mk.arsc.flat new file mode 100644 index 0000000..caf0301 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-mk_values-mk.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ml_values-ml.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ml_values-ml.arsc.flat new file mode 100644 index 0000000..eabfcaa Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ml_values-ml.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-mn_values-mn.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-mn_values-mn.arsc.flat new file mode 100644 index 0000000..0f38de0 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-mn_values-mn.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-mr_values-mr.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-mr_values-mr.arsc.flat new file mode 100644 index 0000000..b212441 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-mr_values-mr.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ms_values-ms.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ms_values-ms.arsc.flat new file mode 100644 index 0000000..6fc8556 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ms_values-ms.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-my_values-my.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-my_values-my.arsc.flat new file mode 100644 index 0000000..776aae9 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-my_values-my.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-nb_values-nb.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-nb_values-nb.arsc.flat new file mode 100644 index 0000000..1f9b547 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-nb_values-nb.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ne_values-ne.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ne_values-ne.arsc.flat new file mode 100644 index 0000000..6dd3d21 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ne_values-ne.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-night-v8_values-night-v8.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-night-v8_values-night-v8.arsc.flat new file mode 100644 index 0000000..9541d62 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-night-v8_values-night-v8.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-nl_values-nl.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-nl_values-nl.arsc.flat new file mode 100644 index 0000000..ccbf1b6 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-nl_values-nl.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-or_values-or.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-or_values-or.arsc.flat new file mode 100644 index 0000000..8f39963 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-or_values-or.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-pa_values-pa.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-pa_values-pa.arsc.flat new file mode 100644 index 0000000..0cee64a Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-pa_values-pa.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-pl_values-pl.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-pl_values-pl.arsc.flat new file mode 100644 index 0000000..fd54b47 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-pl_values-pl.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-port_values-port.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-port_values-port.arsc.flat new file mode 100644 index 0000000..56060bb Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-port_values-port.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-pt-rBR_values-pt-rBR.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-pt-rBR_values-pt-rBR.arsc.flat new file mode 100644 index 0000000..8554715 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-pt-rBR_values-pt-rBR.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-pt-rPT_values-pt-rPT.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-pt-rPT_values-pt-rPT.arsc.flat new file mode 100644 index 0000000..d39f4c7 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-pt-rPT_values-pt-rPT.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-pt_values-pt.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-pt_values-pt.arsc.flat new file mode 100644 index 0000000..df09e8d Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-pt_values-pt.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ro_values-ro.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ro_values-ro.arsc.flat new file mode 100644 index 0000000..89c1311 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ro_values-ro.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ru_values-ru.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ru_values-ru.arsc.flat new file mode 100644 index 0000000..2447aa3 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ru_values-ru.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-si_values-si.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-si_values-si.arsc.flat new file mode 100644 index 0000000..5e49de2 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-si_values-si.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sk_values-sk.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sk_values-sk.arsc.flat new file mode 100644 index 0000000..22bee9f Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sk_values-sk.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sl_values-sl.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sl_values-sl.arsc.flat new file mode 100644 index 0000000..d790373 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sl_values-sl.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-small-v4_values-small-v4.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-small-v4_values-small-v4.arsc.flat new file mode 100644 index 0000000..7478cc6 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-small-v4_values-small-v4.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sq_values-sq.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sq_values-sq.arsc.flat new file mode 100644 index 0000000..7b70cee Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sq_values-sq.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sr_values-sr.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sr_values-sr.arsc.flat new file mode 100644 index 0000000..c5ba6b0 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sr_values-sr.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sv_values-sv.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sv_values-sv.arsc.flat new file mode 100644 index 0000000..0f88a7d Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sv_values-sv.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sw600dp-v13_values-sw600dp-v13.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sw600dp-v13_values-sw600dp-v13.arsc.flat new file mode 100644 index 0000000..42d6db0 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sw600dp-v13_values-sw600dp-v13.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sw_values-sw.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sw_values-sw.arsc.flat new file mode 100644 index 0000000..133efc5 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-sw_values-sw.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ta_values-ta.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ta_values-ta.arsc.flat new file mode 100644 index 0000000..80e164a Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ta_values-ta.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-te_values-te.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-te_values-te.arsc.flat new file mode 100644 index 0000000..56c62df Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-te_values-te.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-th_values-th.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-th_values-th.arsc.flat new file mode 100644 index 0000000..0ba3071 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-th_values-th.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-tl_values-tl.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-tl_values-tl.arsc.flat new file mode 100644 index 0000000..7bcb12f Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-tl_values-tl.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-tr_values-tr.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-tr_values-tr.arsc.flat new file mode 100644 index 0000000..c3bf35b Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-tr_values-tr.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-uk_values-uk.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-uk_values-uk.arsc.flat new file mode 100644 index 0000000..1f88f2c Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-uk_values-uk.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ur_values-ur.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ur_values-ur.arsc.flat new file mode 100644 index 0000000..4c89379 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-ur_values-ur.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-uz_values-uz.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-uz_values-uz.arsc.flat new file mode 100644 index 0000000..721d517 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-uz_values-uz.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v16_values-v16.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v16_values-v16.arsc.flat new file mode 100644 index 0000000..66f7a98 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v16_values-v16.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v17_values-v17.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v17_values-v17.arsc.flat new file mode 100644 index 0000000..69cf564 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v17_values-v17.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v18_values-v18.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v18_values-v18.arsc.flat new file mode 100644 index 0000000..e8f5fd2 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v18_values-v18.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v21_values-v21.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v21_values-v21.arsc.flat new file mode 100644 index 0000000..fc894fc Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v21_values-v21.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v22_values-v22.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v22_values-v22.arsc.flat new file mode 100644 index 0000000..c21192c Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v22_values-v22.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v23_values-v23.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v23_values-v23.arsc.flat new file mode 100644 index 0000000..57c4a88 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v23_values-v23.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v24_values-v24.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v24_values-v24.arsc.flat new file mode 100644 index 0000000..380f2a4 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v24_values-v24.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v25_values-v25.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v25_values-v25.arsc.flat new file mode 100644 index 0000000..0bbc1df Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v25_values-v25.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v26_values-v26.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v26_values-v26.arsc.flat new file mode 100644 index 0000000..e5a2d60 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v26_values-v26.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v28_values-v28.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v28_values-v28.arsc.flat new file mode 100644 index 0000000..8b18a37 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v28_values-v28.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v31_values-v31.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v31_values-v31.arsc.flat new file mode 100644 index 0000000..4b8b714 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v31_values-v31.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v34_values-v34.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v34_values-v34.arsc.flat new file mode 100644 index 0000000..19a24dc Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-v34_values-v34.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-vi_values-vi.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-vi_values-vi.arsc.flat new file mode 100644 index 0000000..aaa3a35 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-vi_values-vi.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-w320dp-land-v13_values-w320dp-land-v13.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-w320dp-land-v13_values-w320dp-land-v13.arsc.flat new file mode 100644 index 0000000..ca66704 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-w320dp-land-v13_values-w320dp-land-v13.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-w360dp-port-v13_values-w360dp-port-v13.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-w360dp-port-v13_values-w360dp-port-v13.arsc.flat new file mode 100644 index 0000000..2c0fd9b Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-w360dp-port-v13_values-w360dp-port-v13.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-w400dp-port-v13_values-w400dp-port-v13.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-w400dp-port-v13_values-w400dp-port-v13.arsc.flat new file mode 100644 index 0000000..bb6f8a6 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-w400dp-port-v13_values-w400dp-port-v13.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-w600dp-land-v13_values-w600dp-land-v13.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-w600dp-land-v13_values-w600dp-land-v13.arsc.flat new file mode 100644 index 0000000..80e2af0 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-w600dp-land-v13_values-w600dp-land-v13.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-watch-v20_values-watch-v20.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-watch-v20_values-watch-v20.arsc.flat new file mode 100644 index 0000000..9fc791c Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-watch-v20_values-watch-v20.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-watch-v21_values-watch-v21.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-watch-v21_values-watch-v21.arsc.flat new file mode 100644 index 0000000..01e0055 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-watch-v21_values-watch-v21.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-xlarge-v4_values-xlarge-v4.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-xlarge-v4_values-xlarge-v4.arsc.flat new file mode 100644 index 0000000..6081cbc Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-xlarge-v4_values-xlarge-v4.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-zh-rCN_values-zh-rCN.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-zh-rCN_values-zh-rCN.arsc.flat new file mode 100644 index 0000000..317f66e Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-zh-rCN_values-zh-rCN.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-zh-rHK_values-zh-rHK.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-zh-rHK_values-zh-rHK.arsc.flat new file mode 100644 index 0000000..94adbc1 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-zh-rHK_values-zh-rHK.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-zh-rTW_values-zh-rTW.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-zh-rTW_values-zh-rTW.arsc.flat new file mode 100644 index 0000000..d9388c5 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-zh-rTW_values-zh-rTW.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values-zu_values-zu.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-zu_values-zu.arsc.flat new file mode 100644 index 0000000..7613645 Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values-zu_values-zu.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/values_values.arsc.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/values_values.arsc.flat new file mode 100644 index 0000000..6724cbb Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/values_values.arsc.flat differ diff --git a/app/build/intermediates/merged_res/debug/mergeDebugResources/xml_file_paths.xml.flat b/app/build/intermediates/merged_res/debug/mergeDebugResources/xml_file_paths.xml.flat new file mode 100644 index 0000000..c62cccf Binary files /dev/null and b/app/build/intermediates/merged_res/debug/mergeDebugResources/xml_file_paths.xml.flat differ diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/mergeDebugResources.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/mergeDebugResources.json new file mode 100644 index 0000000..2301024 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/mergeDebugResources.json @@ -0,0 +1,9175 @@ +{ + "logs": [ + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-bs_values-bs.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-bs/values-bs.xml", + "from": { + "startLines": "2,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,327,406,486,568,670,764,860,986,1067,1129,1195,1287,1364,1427,1535,1595,1661,1717,1788,1848,1902,2021,2078,2140,2194,2269,2393,2481,2558,2652,2736,2819,2964,3049,3135,3268,3356,3434,3488,3542,3608,3682,3760,3831,3913,3985,4062,4135,4205,4314,4407,4479,4571,4667,4741,4817,4913,4966,5048,5115,5202,5289,5351,5415,5478,5547,5655,5760,5861,5964,6022,6080,6160,6246,6322", + "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "endColumns": "12,78,79,81,101,93,95,125,80,61,65,91,76,62,107,59,65,55,70,59,53,118,56,61,53,74,123,87,76,93,83,82,144,84,85,132,87,77,53,53,65,73,77,70,81,71,76,72,69,108,92,71,91,95,73,75,95,52,81,66,86,86,61,63,62,68,107,104,100,102,57,57,79,85,75,76", + "endOffsets": "322,401,481,563,665,759,855,981,1062,1124,1190,1282,1359,1422,1530,1590,1656,1712,1783,1843,1897,2016,2073,2135,2189,2264,2388,2476,2553,2647,2731,2814,2959,3044,3130,3263,3351,3429,3483,3537,3603,3677,3755,3826,3908,3980,4057,4130,4200,4309,4402,4474,4566,4662,4736,4812,4908,4961,5043,5110,5197,5284,5346,5410,5473,5542,5650,5755,5856,5959,6017,6075,6155,6241,6317,6394" + }, + "to": { + "startLines": "2,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3107,3186,3266,3348,3450,4269,4365,4491,6765,6827,6893,6985,7062,7125,7233,7293,7359,7415,7486,7546,7600,7719,7776,7838,7892,7967,8091,8179,8256,8350,8434,8517,8662,8747,8833,8966,9054,9132,9186,9240,9306,9380,9458,9529,9611,9683,9760,9833,9903,10012,10105,10177,10269,10365,10439,10515,10611,10664,10746,10813,10900,10987,11049,11113,11176,11245,11353,11458,11559,11662,11720,11778,11945,12031,12107", + "endLines": "6,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "endColumns": "12,78,79,81,101,93,95,125,80,61,65,91,76,62,107,59,65,55,70,59,53,118,56,61,53,74,123,87,76,93,83,82,144,84,85,132,87,77,53,53,65,73,77,70,81,71,76,72,69,108,92,71,91,95,73,75,95,52,81,66,86,86,61,63,62,68,107,104,100,102,57,57,79,85,75,76", + "endOffsets": "372,3181,3261,3343,3445,3539,4360,4486,4567,6822,6888,6980,7057,7120,7228,7288,7354,7410,7481,7541,7595,7714,7771,7833,7887,7962,8086,8174,8251,8345,8429,8512,8657,8742,8828,8961,9049,9127,9181,9235,9301,9375,9453,9524,9606,9678,9755,9828,9898,10007,10100,10172,10264,10360,10434,10510,10606,10659,10741,10808,10895,10982,11044,11108,11171,11240,11348,11453,11554,11657,11715,11773,11853,12026,12102,12179" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-bs/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "136", + "endOffsets": "331" + }, + "to": { + "startLines": "57", + "startColumns": "4", + "startOffsets": "5564", + "endColumns": "140", + "endOffsets": "5700" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-bs/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,451,573,679,825,947,1055,1153,1303,1406,1563,1686,1832,1974,2038,2096", + "endColumns": "101,155,121,105,145,121,107,97,149,102,156,122,145,141,63,57,80", + "endOffsets": "294,450,572,678,824,946,1054,1152,1302,1405,1562,1685,1831,1973,2037,2095,2176" + }, + "to": { + "startLines": "49,50,51,52,53,54,55,56,58,59,60,61,62,63,64,65,66", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4572,4678,4838,4964,5074,5224,5350,5462,5705,5859,5966,6127,6254,6404,6550,6618,6680", + "endColumns": "105,159,125,109,149,125,111,101,153,106,160,126,149,145,67,61,84", + "endOffsets": "4673,4833,4959,5069,5219,5345,5457,5559,5854,5961,6122,6249,6399,6545,6613,6675,6760" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-bs/values-bs.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,226,323,430,516,620,742,827,909,1000,1093,1188,1282,1382,1475,1570,1665,1756,1847,1935,2038,2142,2248,2353,2467,2570,2739,2835", + "endColumns": "120,96,106,85,103,121,84,81,90,92,94,93,99,92,94,94,90,90,87,102,103,105,104,113,102,168,95,86", + "endOffsets": "221,318,425,511,615,737,822,904,995,1088,1183,1277,1377,1470,1565,1660,1751,1842,1930,2033,2137,2243,2348,2462,2565,2734,2830,2917" + }, + "to": { + "startLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,131", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "377,498,595,702,788,892,1014,1099,1181,1272,1365,1460,1554,1654,1747,1842,1937,2028,2119,2207,2310,2414,2520,2625,2739,2842,3011,11858", + "endColumns": "120,96,106,85,103,121,84,81,90,92,94,93,99,92,94,94,90,90,87,102,103,105,104,113,102,168,95,86", + "endOffsets": "493,590,697,783,887,1009,1094,1176,1267,1360,1455,1549,1649,1742,1837,1932,2023,2114,2202,2305,2409,2515,2620,2734,2837,3006,3102,11940" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-bs/values-bs.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,353,457,561,663,780", + "endColumns": "97,101,97,103,103,101,116,100", + "endOffsets": "148,250,348,452,556,658,775,876" + }, + "to": { + "startLines": "39,40,41,42,43,44,45,135", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3544,3642,3744,3842,3946,4050,4152,12184", + "endColumns": "97,101,97,103,103,101,116,100", + "endOffsets": "3637,3739,3837,3941,4045,4147,4264,12280" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-v25_values-v25.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v25/values-v25.xml", + "from": { + "startLines": "2,3,4,6", + "startColumns": "4,4,4,4", + "startOffsets": "55,126,209,308", + "endLines": "2,3,5,7", + "endColumns": "70,82,12,12", + "endOffsets": "121,204,303,414" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-h320dp-port-v13_values-h320dp-port-v13.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-h320dp-port-v13/values-h320dp-port-v13.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "63", + "endOffsets": "114" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-w600dp-land-v13_values-w600dp-land-v13.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-w600dp-land-v13/values-w600dp-land-v13.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "54", + "endOffsets": "105" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-h720dp-v13_values-h720dp-v13.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-h720dp-v13/values-h720dp-v13.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "66", + "endOffsets": "117" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-te_values-te.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-te/values-te.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,276,365,455,541,639,726,830,946,1037,1098,1164,1258,1325,1387,1480,1544,1612,1675,1749,1814,1868,1989,2046,2108,2162,2241,2369,2457,2538,2636,2719,2811,2956,3036,3118,3243,3331,3413,3473,3525,3591,3666,3744,3815,3894,3967,4043,4124,4193,4313,4418,4495,4586,4679,4753,4830,4922,4979,5060,5126,5210,5296,5359,5424,5488,5557,5667,5775,5874,5980,6044,6100,6183,6280,6358", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,88,89,85,97,86,103,115,90,60,65,93,66,61,92,63,67,62,73,64,53,120,56,61,53,78,127,87,80,97,82,91,144,79,81,124,87,81,59,51,65,74,77,70,78,72,75,80,68,119,104,76,90,92,73,76,91,56,80,65,83,85,62,64,63,68,109,107,98,105,63,55,82,96,77,73", + "endOffsets": "271,360,450,536,634,721,825,941,1032,1093,1159,1253,1320,1382,1475,1539,1607,1670,1744,1809,1863,1984,2041,2103,2157,2236,2364,2452,2533,2631,2714,2806,2951,3031,3113,3238,3326,3408,3468,3520,3586,3661,3739,3810,3889,3962,4038,4119,4188,4308,4413,4490,4581,4674,4748,4825,4917,4974,5055,5121,5205,5291,5354,5419,5483,5552,5662,5770,5869,5975,6039,6095,6178,6275,6353,6427" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3080,3169,3259,3345,3443,4280,4384,4500,6785,6846,6912,7006,7073,7135,7228,7292,7360,7423,7497,7562,7616,7737,7794,7856,7910,7989,8117,8205,8286,8384,8467,8559,8704,8784,8866,8991,9079,9161,9221,9273,9339,9414,9492,9563,9642,9715,9791,9872,9941,10061,10166,10243,10334,10427,10501,10578,10670,10727,10808,10874,10958,11044,11107,11172,11236,11305,11415,11523,11622,11728,11792,11848,12014,12111,12189", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,88,89,85,97,86,103,115,90,60,65,93,66,61,92,63,67,62,73,64,53,120,56,61,53,78,127,87,80,97,82,91,144,79,81,124,87,81,59,51,65,74,77,70,78,72,75,80,68,119,104,76,90,92,73,76,91,56,80,65,83,85,62,64,63,68,109,107,98,105,63,55,82,96,77,73", + "endOffsets": "321,3164,3254,3340,3438,3525,4379,4495,4586,6841,6907,7001,7068,7130,7223,7287,7355,7418,7492,7557,7611,7732,7789,7851,7905,7984,8112,8200,8281,8379,8462,8554,8699,8779,8861,8986,9074,9156,9216,9268,9334,9409,9487,9558,9637,9710,9786,9867,9936,10056,10161,10238,10329,10422,10496,10573,10665,10722,10803,10869,10953,11039,11102,11167,11231,11300,11410,11518,11617,11723,11787,11843,11926,12106,12184,12258" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-te/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "133", + "endOffsets": "328" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5569", + "endColumns": "137", + "endOffsets": "5702" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-te/values-te.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,157,265,367,468,574,681,805", + "endColumns": "101,107,101,100,105,106,123,100", + "endOffsets": "152,260,362,463,569,676,800,901" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3530,3632,3740,3842,3943,4049,4156,12263", + "endColumns": "101,107,101,100,105,106,123,100", + "endOffsets": "3627,3735,3837,3938,4044,4151,4275,12359" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-te/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,301,451,577,688,821,942,1043,1139,1284,1392,1541,1669,1816,1975,2035,2101", + "endColumns": "107,149,125,110,132,120,100,95,144,107,148,127,146,158,59,65,79", + "endOffsets": "300,450,576,687,820,941,1042,1138,1283,1391,1540,1668,1815,1974,2034,2100,2180" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4591,4703,4857,4987,5102,5239,5364,5469,5707,5856,5968,6121,6253,6404,6567,6631,6701", + "endColumns": "111,153,129,114,136,124,104,99,148,111,152,131,150,162,63,69,83", + "endOffsets": "4698,4852,4982,5097,5234,5359,5464,5564,5851,5963,6116,6248,6399,6562,6626,6696,6780" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-te/values-te.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,222,334,447,537,642,761,839,915,1006,1099,1194,1288,1388,1481,1576,1671,1762,1853,1942,2056,2160,2259,2374,2479,2594,2756,2859", + "endColumns": "116,111,112,89,104,118,77,75,90,92,94,93,99,92,94,94,90,90,88,113,103,98,114,104,114,161,102,82", + "endOffsets": "217,329,442,532,637,756,834,910,1001,1094,1189,1283,1383,1476,1571,1666,1757,1848,1937,2051,2155,2254,2369,2474,2589,2751,2854,2937" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "326,443,555,668,758,863,982,1060,1136,1227,1320,1415,1509,1609,1702,1797,1892,1983,2074,2163,2277,2381,2480,2595,2700,2815,2977,11931", + "endColumns": "116,111,112,89,104,118,77,75,90,92,94,93,99,92,94,94,90,90,88,113,103,98,114,104,114,161,102,82", + "endOffsets": "438,550,663,753,858,977,1055,1131,1222,1315,1410,1504,1604,1697,1792,1887,1978,2069,2158,2272,2376,2475,2590,2695,2810,2972,3075,12009" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-v31_values-v31.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-v31/values-v31.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,277,342,408", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,149,243,336,430,524,618,712,806,900,994,1088,1181,1274,1376,1478,1579,1681,1783,1885,1987,2089,2191,2293,2395,2496,2597,2690,2783,2875,2968,3061,3154,3247,3340,3433,3526,3619,3711,3803,3898,3993,4087,4182,4277,4372,4467,4562,4657,4752,4847,4941,5035,5129,5223,5316,5410,5504,5598,5692,5786,5880,5974,6068,6161,6254,6364,6475,6583,6691,6797,6900,7013,7120,7237,7340,7459,7564,7679,7787,7903,8003,8113,8217,8331,8438,8553,8671,8794,8920,9042,9166,9277,9393,9495,9607,9719,9831,9940,10049,10156,10261,10375,10484,10602,10706,10826,10933,11049,11158,11275,11376,11487,11592,11707,11816,11932,12051,12175,12302,12425,12552,12665,12782,12885,12998,13102,13214,13322,13438,13544,13658,13759,13864,13969,14078,14181,14288,14379,14490,14587,14704,14797,14910,15009,15128,15219,15312,15407,15500,15593,15686,15779,15872,15965,16058,16151,16244,16337,16444,16553,16664,16773,16882,16991,17100,17209,17318,17427,17536,17645,17754,17845,17938,18033,18126,18219,18312,18405,18498,18591,18684,18777,18870,18963,19058,19155,19254,19351,19448,19545,19642,19739,19836,19933,20030,20127,20224,20317,20412,20509,20604,20699,20794,20889,20984,21079,21174,21269,21364,21459,27071,32713,38445", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,276,341,407,473", + "endColumns": "93,93,92,93,93,93,93,93,93,93,93,92,92,101,101,100,101,101,101,101,101,101,101,101,100,100,92,92,91,92,92,92,92,92,92,92,92,91,91,94,94,93,94,94,94,94,94,94,94,94,93,93,93,93,92,93,93,93,93,93,93,93,93,92,92,109,110,107,107,105,102,112,106,116,102,118,104,114,107,115,99,109,103,113,106,114,117,122,125,121,123,110,115,101,111,111,111,108,108,106,104,113,108,117,103,119,106,115,108,116,100,110,104,114,108,115,118,123,126,122,126,112,116,102,112,103,111,107,115,105,113,100,104,104,108,102,106,90,110,96,116,92,112,98,118,90,92,94,92,92,92,92,92,92,92,92,92,92,106,108,110,108,108,108,108,108,108,108,108,108,108,90,92,94,92,92,92,92,92,92,92,92,92,92,94,96,98,96,96,96,96,96,96,96,96,96,96,92,94,96,94,94,94,94,94,94,94,94,94,94,10,10,10,10", + "endOffsets": "144,238,331,425,519,613,707,801,895,989,1083,1176,1269,1371,1473,1574,1676,1778,1880,1982,2084,2186,2288,2390,2491,2592,2685,2778,2870,2963,3056,3149,3242,3335,3428,3521,3614,3706,3798,3893,3988,4082,4177,4272,4367,4462,4557,4652,4747,4842,4936,5030,5124,5218,5311,5405,5499,5593,5687,5781,5875,5969,6063,6156,6249,6359,6470,6578,6686,6792,6895,7008,7115,7232,7335,7454,7559,7674,7782,7898,7998,8108,8212,8326,8433,8548,8666,8789,8915,9037,9161,9272,9388,9490,9602,9714,9826,9935,10044,10151,10256,10370,10479,10597,10701,10821,10928,11044,11153,11270,11371,11482,11587,11702,11811,11927,12046,12170,12297,12420,12547,12660,12777,12880,12993,13097,13209,13317,13433,13539,13653,13754,13859,13964,14073,14176,14283,14374,14485,14582,14699,14792,14905,15004,15123,15214,15307,15402,15495,15588,15681,15774,15867,15960,16053,16146,16239,16332,16439,16548,16659,16768,16877,16986,17095,17204,17313,17422,17531,17640,17749,17840,17933,18028,18121,18214,18307,18400,18493,18586,18679,18772,18865,18958,19053,19150,19249,19346,19443,19540,19637,19734,19831,19928,20025,20122,20219,20312,20407,20504,20599,20694,20789,20884,20979,21074,21169,21264,21359,21454,27066,32708,38440,44202" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-bn_values-bn.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-bn/values-bn.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,271,369,462,545,646,738,842,959,1040,1101,1167,1258,1324,1385,1475,1539,1606,1667,1736,1798,1852,1959,2018,2079,2133,2207,2327,2412,2502,2608,2698,2782,2917,2988,3058,3190,3277,3360,3418,3474,3540,3613,3693,3764,3846,3915,3991,4071,4140,4249,4344,4427,4517,4612,4686,4760,4853,4907,4992,5059,5145,5230,5292,5356,5419,5485,5587,5686,5779,5878,5940,6000,6080,6163,6242", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,97,92,82,100,91,103,116,80,60,65,90,65,60,89,63,66,60,68,61,53,106,58,60,53,73,119,84,89,105,89,83,134,70,69,131,86,82,57,55,65,72,79,70,81,68,75,79,68,108,94,82,89,94,73,73,92,53,84,66,85,84,61,63,62,65,101,98,92,98,61,59,79,82,78,72", + "endOffsets": "266,364,457,540,641,733,837,954,1035,1096,1162,1253,1319,1380,1470,1534,1601,1662,1731,1793,1847,1954,2013,2074,2128,2202,2322,2407,2497,2603,2693,2777,2912,2983,3053,3185,3272,3355,3413,3469,3535,3608,3688,3759,3841,3910,3986,4066,4135,4244,4339,4422,4512,4607,4681,4755,4848,4902,4987,5054,5140,5225,5287,5351,5414,5480,5582,5681,5774,5873,5935,5995,6075,6158,6237,6310" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3051,3149,3242,3325,3426,4247,4351,4468,6716,6777,6843,6934,7000,7061,7151,7215,7282,7343,7412,7474,7528,7635,7694,7755,7809,7883,8003,8088,8178,8284,8374,8458,8593,8664,8734,8866,8953,9036,9094,9150,9216,9289,9369,9440,9522,9591,9667,9747,9816,9925,10020,10103,10193,10288,10362,10436,10529,10583,10668,10735,10821,10906,10968,11032,11095,11161,11263,11362,11455,11554,11616,11676,11843,11926,12005", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,97,92,82,100,91,103,116,80,60,65,90,65,60,89,63,66,60,68,61,53,106,58,60,53,73,119,84,89,105,89,83,134,70,69,131,86,82,57,55,65,72,79,70,81,68,75,79,68,108,94,82,89,94,73,73,92,53,84,66,85,84,61,63,62,65,101,98,92,98,61,59,79,82,78,72", + "endOffsets": "316,3144,3237,3320,3421,3513,4346,4463,4544,6772,6838,6929,6995,7056,7146,7210,7277,7338,7407,7469,7523,7630,7689,7750,7804,7878,7998,8083,8173,8279,8369,8453,8588,8659,8729,8861,8948,9031,9089,9145,9211,9284,9364,9435,9517,9586,9662,9742,9811,9920,10015,10098,10188,10283,10357,10431,10524,10578,10663,10730,10816,10901,10963,11027,11090,11156,11258,11357,11450,11549,11611,11671,11751,11921,12000,12073" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-bn/values-bn.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,319,425,514,619,740,823,905,996,1089,1183,1277,1377,1470,1565,1659,1750,1841,1927,2037,2141,2244,2352,2460,2565,2730,2835", + "endColumns": "107,105,105,88,104,120,82,81,90,92,93,93,99,92,94,93,90,90,85,109,103,102,107,107,104,164,104,86", + "endOffsets": "208,314,420,509,614,735,818,900,991,1084,1178,1272,1372,1465,1560,1654,1745,1836,1922,2032,2136,2239,2347,2455,2560,2725,2830,2917" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "321,429,535,641,730,835,956,1039,1121,1212,1305,1399,1493,1593,1686,1781,1875,1966,2057,2143,2253,2357,2460,2568,2676,2781,2946,11756", + "endColumns": "107,105,105,88,104,120,82,81,90,92,93,93,99,92,94,93,90,90,85,109,103,102,107,107,104,164,104,86", + "endOffsets": "424,530,636,725,830,951,1034,1116,1207,1300,1394,1488,1588,1681,1776,1870,1961,2052,2138,2248,2352,2455,2563,2671,2776,2941,3046,11838" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-bn/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,298,453,577,684,816,934,1042,1142,1281,1386,1538,1662,1791,1935,1991,2054", + "endColumns": "104,154,123,106,131,117,107,99,138,104,151,123,128,143,55,62,85", + "endOffsets": "297,452,576,683,815,933,1041,1141,1280,1385,1537,1661,1790,1934,1990,2053,2139" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4549,4658,4817,4945,5056,5192,5314,5426,5682,5825,5934,6090,6218,6351,6499,6559,6626", + "endColumns": "108,158,127,110,135,121,111,103,142,108,155,127,132,147,59,66,89", + "endOffsets": "4653,4812,4940,5051,5187,5309,5421,5525,5820,5929,6085,6213,6346,6494,6554,6621,6711" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-bn/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "147", + "endOffsets": "342" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5530", + "endColumns": "151", + "endOffsets": "5677" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-bn/values-bn.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,154,256,358,461,562,664,784", + "endColumns": "98,101,101,102,100,101,119,100", + "endOffsets": "149,251,353,456,557,659,779,880" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3518,3617,3719,3821,3924,4025,4127,12078", + "endColumns": "98,101,101,102,100,101,119,100", + "endOffsets": "3612,3714,3816,3919,4020,4122,4242,12174" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-watch-v21_values-watch-v21.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-watch-v21/values-watch-v21.xml", + "from": { + "startLines": "2,6,10", + "startColumns": "4,4,4", + "startOffsets": "55,271,499", + "endLines": "5,9,13", + "endColumns": "12,12,12", + "endOffsets": "266,494,724" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-sw_values-sw.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-sw/values-sw.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,259,335,409,482,579,668,767,896,979,1044,1112,1204,1277,1340,1426,1488,1551,1616,1684,1747,1801,1933,1990,2052,2106,2180,2318,2399,2479,2582,2666,2746,2878,2963,3050,3191,3279,3358,3412,3465,3531,3603,3685,3756,3841,3913,3988,4059,4132,4238,4335,4409,4504,4601,4675,4760,4860,4913,4998,5066,5154,5244,5306,5370,5433,5500,5617,5729,5840,5951,6009,6066,6147,6232,6313", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,75,73,72,96,88,98,128,82,64,67,91,72,62,85,61,62,64,67,62,53,131,56,61,53,73,137,80,79,102,83,79,131,84,86,140,87,78,53,52,65,71,81,70,84,71,74,70,72,105,96,73,94,96,73,84,99,52,84,67,87,89,61,63,62,66,116,111,110,110,57,56,80,84,80,79", + "endOffsets": "254,330,404,477,574,663,762,891,974,1039,1107,1199,1272,1335,1421,1483,1546,1611,1679,1742,1796,1928,1985,2047,2101,2175,2313,2394,2474,2577,2661,2741,2873,2958,3045,3186,3274,3353,3407,3460,3526,3598,3680,3751,3836,3908,3983,4054,4127,4233,4330,4404,4499,4596,4670,4755,4855,4908,4993,5061,5149,5239,5301,5365,5428,5495,5612,5724,5835,5946,6004,6061,6142,6227,6308,6388" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3005,3081,3155,3228,3325,4137,4236,4365,6709,6774,6842,6934,7007,7070,7156,7218,7281,7346,7414,7477,7531,7663,7720,7782,7836,7910,8048,8129,8209,8312,8396,8476,8608,8693,8780,8921,9009,9088,9142,9195,9261,9333,9415,9486,9571,9643,9718,9789,9862,9968,10065,10139,10234,10331,10405,10490,10590,10643,10728,10796,10884,10974,11036,11100,11163,11230,11347,11459,11570,11681,11739,11796,11960,12045,12126", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,75,73,72,96,88,98,128,82,64,67,91,72,62,85,61,62,64,67,62,53,131,56,61,53,73,137,80,79,102,83,79,131,84,86,140,87,78,53,52,65,71,81,70,84,71,74,70,72,105,96,73,94,96,73,84,99,52,84,67,87,89,61,63,62,66,116,111,110,110,57,56,80,84,80,79", + "endOffsets": "304,3076,3150,3223,3320,3409,4231,4360,4443,6769,6837,6929,7002,7065,7151,7213,7276,7341,7409,7472,7526,7658,7715,7777,7831,7905,8043,8124,8204,8307,8391,8471,8603,8688,8775,8916,9004,9083,9137,9190,9256,9328,9410,9481,9566,9638,9713,9784,9857,9963,10060,10134,10229,10326,10400,10485,10585,10638,10723,10791,10879,10969,11031,11095,11158,11225,11342,11454,11565,11676,11734,11791,11872,12040,12121,12201" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-sw/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "141", + "endOffsets": "336" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5463", + "endColumns": "145", + "endOffsets": "5604" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-sw/values-sw.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,149,251,348,449,556,663,778", + "endColumns": "93,101,96,100,106,106,114,100", + "endOffsets": "144,246,343,444,551,658,773,874" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3414,3508,3610,3707,3808,3915,4022,12206", + "endColumns": "93,101,96,100,106,106,114,100", + "endOffsets": "3503,3605,3702,3803,3910,4017,4132,12302" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-sw/values-sw.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,208,307,415,505,610,727,810,892,983,1076,1171,1265,1365,1458,1553,1647,1738,1829,1911,2012,2120,2219,2326,2438,2542,2704,2801", + "endColumns": "102,98,107,89,104,116,82,81,90,92,94,93,99,92,94,93,90,90,81,100,107,98,106,111,103,161,96,82", + "endOffsets": "203,302,410,500,605,722,805,887,978,1071,1166,1260,1360,1453,1548,1642,1733,1824,1906,2007,2115,2214,2321,2433,2537,2699,2796,2879" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "309,412,511,619,709,814,931,1014,1096,1187,1280,1375,1469,1569,1662,1757,1851,1942,2033,2115,2216,2324,2423,2530,2642,2746,2908,11877", + "endColumns": "102,98,107,89,104,116,82,81,90,92,94,93,99,92,94,93,90,90,81,100,107,98,106,111,103,161,96,82", + "endOffsets": "407,506,614,704,809,926,1009,1091,1182,1275,1370,1464,1564,1657,1752,1846,1937,2028,2110,2211,2319,2418,2525,2637,2741,2903,3000,11955" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-sw/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,293,445,566,671,830,951,1066,1176,1337,1439,1589,1712,1858,2013,2077,2148", + "endColumns": "99,151,120,104,158,120,114,109,160,101,149,122,145,154,63,70,91", + "endOffsets": "292,444,565,670,829,950,1065,1175,1336,1438,1588,1711,1857,2012,2076,2147,2239" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4448,4552,4708,4833,4942,5105,5230,5349,5609,5774,5880,6034,6161,6311,6470,6538,6613", + "endColumns": "103,155,124,108,162,124,118,113,164,105,153,126,149,158,67,74,95", + "endOffsets": "4547,4703,4828,4937,5100,5225,5344,5458,5769,5875,6029,6156,6306,6465,6533,6608,6704" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-ca_values-ca.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ca/values-ca.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,274,355,435,523,626,718,819,947,1031,1092,1157,1254,1334,1399,1494,1558,1630,1692,1768,1831,1888,2009,2067,2128,2185,2265,2402,2489,2564,2657,2737,2821,2960,3038,3117,3269,3358,3434,3491,3547,3613,3691,3772,3843,3931,4009,4086,4160,4239,4349,4439,4531,4623,4724,4798,4880,4981,5031,5114,5180,5272,5359,5421,5485,5548,5621,5744,5857,5961,6069,6130,6190,6276,6362,6439", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,80,79,87,102,91,100,127,83,60,64,96,79,64,94,63,71,61,75,62,56,120,57,60,56,79,136,86,74,92,79,83,138,77,78,151,88,75,56,55,65,77,80,70,87,77,76,73,78,109,89,91,91,100,73,81,100,49,82,65,91,86,61,63,62,72,122,112,103,107,60,59,85,85,76,78", + "endOffsets": "269,350,430,518,621,713,814,942,1026,1087,1152,1249,1329,1394,1489,1553,1625,1687,1763,1826,1883,2004,2062,2123,2180,2260,2397,2484,2559,2652,2732,2816,2955,3033,3112,3264,3353,3429,3486,3542,3608,3686,3767,3838,3926,4004,4081,4155,4234,4344,4434,4526,4618,4719,4793,4875,4976,5026,5109,5175,5267,5354,5416,5480,5543,5616,5739,5852,5956,6064,6125,6185,6271,6357,6434,6513" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3049,3130,3210,3298,3401,4224,4325,4453,6785,6846,6911,7008,7088,7153,7248,7312,7384,7446,7522,7585,7642,7763,7821,7882,7939,8019,8156,8243,8318,8411,8491,8575,8714,8792,8871,9023,9112,9188,9245,9301,9367,9445,9526,9597,9685,9763,9840,9914,9993,10103,10193,10285,10377,10478,10552,10634,10735,10785,10868,10934,11026,11113,11175,11239,11302,11375,11498,11611,11715,11823,11884,11944,12112,12198,12275", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,80,79,87,102,91,100,127,83,60,64,96,79,64,94,63,71,61,75,62,56,120,57,60,56,79,136,86,74,92,79,83,138,77,78,151,88,75,56,55,65,77,80,70,87,77,76,73,78,109,89,91,91,100,73,81,100,49,82,65,91,86,61,63,62,72,122,112,103,107,60,59,85,85,76,78", + "endOffsets": "319,3125,3205,3293,3396,3488,4320,4448,4532,6841,6906,7003,7083,7148,7243,7307,7379,7441,7517,7580,7637,7758,7816,7877,7934,8014,8151,8238,8313,8406,8486,8570,8709,8787,8866,9018,9107,9183,9240,9296,9362,9440,9521,9592,9680,9758,9835,9909,9988,10098,10188,10280,10372,10473,10547,10629,10730,10780,10863,10929,11021,11108,11170,11234,11297,11370,11493,11606,11710,11818,11879,11939,12025,12193,12270,12349" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ca/values-ca.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,228,333,440,523,629,755,839,918,1009,1102,1195,1290,1388,1481,1574,1668,1759,1850,1931,2042,2150,2248,2358,2463,2571,2731,2830", + "endColumns": "122,104,106,82,105,125,83,78,90,92,92,94,97,92,92,93,90,90,80,110,107,97,109,104,107,159,98,81", + "endOffsets": "223,328,435,518,624,750,834,913,1004,1097,1190,1285,1383,1476,1569,1663,1754,1845,1926,2037,2145,2243,2353,2458,2566,2726,2825,2907" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "324,447,552,659,742,848,974,1058,1137,1228,1321,1414,1509,1607,1700,1793,1887,1978,2069,2150,2261,2369,2467,2577,2682,2790,2950,12030", + "endColumns": "122,104,106,82,105,125,83,78,90,92,92,94,97,92,92,93,90,90,80,110,107,97,109,104,107,159,98,81", + "endOffsets": "442,547,654,737,843,969,1053,1132,1223,1316,1409,1504,1602,1695,1788,1882,1973,2064,2145,2256,2364,2462,2572,2677,2785,2945,3044,12107" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ca/values-ca.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,352,449,555,660,786", + "endColumns": "95,101,98,96,105,104,125,100", + "endOffsets": "146,248,347,444,550,655,781,882" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3493,3589,3691,3790,3887,3993,4098,12354", + "endColumns": "95,101,98,96,105,104,125,100", + "endOffsets": "3584,3686,3785,3882,3988,4093,4219,12450" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ca/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,294,442,565,670,816,939,1058,1162,1329,1434,1589,1716,1876,2030,2091,2155", + "endColumns": "100,147,122,104,145,122,118,103,166,104,154,126,159,153,60,63,82", + "endOffsets": "293,441,564,669,815,938,1057,1161,1328,1433,1588,1715,1875,2029,2090,2154,2237" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4537,4642,4794,4921,5030,5180,5307,5430,5673,5844,5953,6112,6243,6407,6565,6630,6698", + "endColumns": "104,151,126,108,149,126,122,107,170,108,158,130,163,157,64,67,86", + "endOffsets": "4637,4789,4916,5025,5175,5302,5425,5533,5839,5948,6107,6238,6402,6560,6625,6693,6780" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ca/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "130", + "endOffsets": "325" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5538", + "endColumns": "134", + "endOffsets": "5668" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-cs_values-cs.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-cs/values-cs.xml", + "from": { + "startLines": "2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,368,446,524,601,704,796,888,1014,1095,1156,1221,1320,1396,1457,1546,1610,1677,1731,1799,1859,1913,2030,2090,2152,2206,2278,2400,2484,2563,2657,2740,2832,2969,3047,3129,3256,3344,3424,3478,3529,3595,3667,3744,3815,3896,3968,4045,4119,4190,4295,4383,4454,4547,4642,4716,4790,4886,4938,5021,5088,5174,5262,5324,5388,5451,5519,5629,5735,5834,5948,6006,6061,6140,6223,6298", + "endLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "endColumns": "12,77,77,76,102,91,91,125,80,60,64,98,75,60,88,63,66,53,67,59,53,116,59,61,53,71,121,83,78,93,82,91,136,77,81,126,87,79,53,50,65,71,76,70,80,71,76,73,70,104,87,70,92,94,73,73,95,51,82,66,85,87,61,63,62,67,109,105,98,113,57,54,78,82,74,78", + "endOffsets": "363,441,519,596,699,791,883,1009,1090,1151,1216,1315,1391,1452,1541,1605,1672,1726,1794,1854,1908,2025,2085,2147,2201,2273,2395,2479,2558,2652,2735,2827,2964,3042,3124,3251,3339,3419,3473,3524,3590,3662,3739,3810,3891,3963,4040,4114,4185,4290,4378,4449,4542,4637,4711,4785,4881,4933,5016,5083,5169,5257,5319,5383,5446,5514,5624,5730,5829,5943,6001,6056,6135,6218,6293,6372" + }, + "to": { + "startLines": "2,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3112,3190,3268,3345,3448,4271,4363,4489,6822,6883,6948,7047,7123,7184,7273,7337,7404,7458,7526,7586,7640,7757,7817,7879,7933,8005,8127,8211,8290,8384,8467,8559,8696,8774,8856,8983,9071,9151,9205,9256,9322,9394,9471,9542,9623,9695,9772,9846,9917,10022,10110,10181,10274,10369,10443,10517,10613,10665,10748,10815,10901,10989,11051,11115,11178,11246,11356,11462,11561,11675,11733,11788,11950,12033,12108", + "endLines": "7,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "endColumns": "12,77,77,76,102,91,91,125,80,60,64,98,75,60,88,63,66,53,67,59,53,116,59,61,53,71,121,83,78,93,82,91,136,77,81,126,87,79,53,50,65,71,76,70,80,71,76,73,70,104,87,70,92,94,73,73,95,51,82,66,85,87,61,63,62,67,109,105,98,113,57,54,78,82,74,78", + "endOffsets": "413,3185,3263,3340,3443,3535,4358,4484,4565,6878,6943,7042,7118,7179,7268,7332,7399,7453,7521,7581,7635,7752,7812,7874,7928,8000,8122,8206,8285,8379,8462,8554,8691,8769,8851,8978,9066,9146,9200,9251,9317,9389,9466,9537,9618,9690,9767,9841,9912,10017,10105,10176,10269,10364,10438,10512,10608,10660,10743,10810,10896,10984,11046,11110,11173,11241,11351,11457,11556,11670,11728,11783,11862,12028,12103,12182" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-cs/values-cs.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,356,455,560,667,786", + "endColumns": "97,101,100,98,104,106,118,100", + "endOffsets": "148,250,351,450,555,662,781,882" + }, + "to": { + "startLines": "40,41,42,43,44,45,46,136", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3540,3638,3740,3841,3940,4045,4152,12187", + "endColumns": "97,101,100,98,104,106,118,100", + "endOffsets": "3633,3735,3836,3935,4040,4147,4266,12283" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-cs/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "138", + "endOffsets": "333" + }, + "to": { + "startLines": "58", + "startColumns": "4", + "startOffsets": "5564", + "endColumns": "142", + "endOffsets": "5702" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-cs/values-cs.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,212,314,424,510,615,732,810,886,977,1070,1165,1259,1353,1446,1541,1638,1729,1820,1904,2008,2120,2219,2325,2436,2538,2701,2799", + "endColumns": "106,101,109,85,104,116,77,75,90,92,94,93,93,92,94,96,90,90,83,103,111,98,105,110,101,162,97,82", + "endOffsets": "207,309,419,505,610,727,805,881,972,1065,1160,1254,1348,1441,1536,1633,1724,1815,1899,2003,2115,2214,2320,2431,2533,2696,2794,2877" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,132", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "418,525,627,737,823,928,1045,1123,1199,1290,1383,1478,1572,1666,1759,1854,1951,2042,2133,2217,2321,2433,2532,2638,2749,2851,3014,11867", + "endColumns": "106,101,109,85,104,116,77,75,90,92,94,93,93,92,94,96,90,90,83,103,111,98,105,110,101,162,97,82", + "endOffsets": "520,622,732,818,923,1040,1118,1194,1285,1378,1473,1567,1661,1754,1849,1946,2037,2128,2212,2316,2428,2527,2633,2744,2846,3009,3107,11945" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-cs/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,451,572,678,827,950,1058,1155,1326,1433,1593,1717,1874,2025,2089,2152", + "endColumns": "101,155,120,105,148,122,107,96,170,106,159,123,156,150,63,62,81", + "endOffsets": "294,450,571,677,826,949,1057,1154,1325,1432,1592,1716,1873,2024,2088,2151,2233" + }, + "to": { + "startLines": "50,51,52,53,54,55,56,57,59,60,61,62,63,64,65,66,67", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4570,4676,4836,4961,5071,5224,5351,5463,5707,5882,5993,6157,6285,6446,6601,6669,6736", + "endColumns": "105,159,124,109,152,126,111,100,174,110,163,127,160,154,67,66,85", + "endOffsets": "4671,4831,4956,5066,5219,5346,5458,5559,5877,5988,6152,6280,6441,6596,6664,6731,6817" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-es_values-es.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-es/values-es.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,154,256,356,454,561,667,787", + "endColumns": "98,101,99,97,106,105,119,100", + "endOffsets": "149,251,351,449,556,662,782,883" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3503,3602,3704,3804,3902,4009,4115,12392", + "endColumns": "98,101,99,97,106,105,119,100", + "endOffsets": "3597,3699,3799,3897,4004,4110,4230,12488" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-es/values-es.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,278,359,438,525,626,722,826,948,1029,1091,1156,1251,1332,1395,1484,1548,1617,1680,1754,1818,1875,1993,2051,2113,2170,2250,2389,2478,2554,2649,2730,2812,2953,3034,3114,3265,3355,3435,3491,3547,3613,3692,3774,3845,3934,4008,4085,4155,4234,4334,4418,4502,4594,4694,4768,4849,4951,5004,5089,5156,5249,5338,5400,5464,5527,5595,5708,5815,5919,6020,6080,6140,6223,6306,6382", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,80,78,86,100,95,103,121,80,61,64,94,80,62,88,63,68,62,73,63,56,117,57,61,56,79,138,88,75,94,80,81,140,80,79,150,89,79,55,55,65,78,81,70,88,73,76,69,78,99,83,83,91,99,73,80,101,52,84,66,92,88,61,63,62,67,112,106,103,100,59,59,82,82,75,76", + "endOffsets": "273,354,433,520,621,717,821,943,1024,1086,1151,1246,1327,1390,1479,1543,1612,1675,1749,1813,1870,1988,2046,2108,2165,2245,2384,2473,2549,2644,2725,2807,2948,3029,3109,3260,3350,3430,3486,3542,3608,3687,3769,3840,3929,4003,4080,4150,4229,4329,4413,4497,4589,4689,4763,4844,4946,4999,5084,5151,5244,5333,5395,5459,5522,5590,5703,5810,5914,6015,6075,6135,6218,6301,6377,6454" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3059,3140,3219,3306,3407,4235,4339,4461,6879,6941,7006,7101,7182,7245,7334,7398,7467,7530,7604,7668,7725,7843,7901,7963,8020,8100,8239,8328,8404,8499,8580,8662,8803,8884,8964,9115,9205,9285,9341,9397,9463,9542,9624,9695,9784,9858,9935,10005,10084,10184,10268,10352,10444,10544,10618,10699,10801,10854,10939,11006,11099,11188,11250,11314,11377,11445,11558,11665,11769,11870,11930,11990,12156,12239,12315", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,80,78,86,100,95,103,121,80,61,64,94,80,62,88,63,68,62,73,63,56,117,57,61,56,79,138,88,75,94,80,81,140,80,79,150,89,79,55,55,65,78,81,70,88,73,76,69,78,99,83,83,91,99,73,80,101,52,84,66,92,88,61,63,62,67,112,106,103,100,59,59,82,82,75,76", + "endOffsets": "323,3135,3214,3301,3402,3498,4334,4456,4537,6936,7001,7096,7177,7240,7329,7393,7462,7525,7599,7663,7720,7838,7896,7958,8015,8095,8234,8323,8399,8494,8575,8657,8798,8879,8959,9110,9200,9280,9336,9392,9458,9537,9619,9690,9779,9853,9930,10000,10079,10179,10263,10347,10439,10539,10613,10694,10796,10849,10934,11001,11094,11183,11245,11309,11372,11440,11553,11660,11764,11865,11925,11985,12068,12234,12310,12387" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-es/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "155", + "endOffsets": "350" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5578", + "endColumns": "159", + "endOffsets": "5733" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-es/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,456,583,687,844,973,1091,1197,1385,1490,1651,1779,1940,2093,2156,2221", + "endColumns": "103,158,126,103,156,128,117,105,187,104,160,127,160,152,62,64,80", + "endOffsets": "296,455,582,686,843,972,1090,1196,1384,1489,1650,1778,1939,2092,2155,2220,2301" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4542,4650,4813,4944,5052,5213,5346,5468,5738,5930,6039,6204,6336,6501,6658,6725,6794", + "endColumns": "107,162,130,107,160,132,121,109,191,108,164,131,164,156,66,68,84", + "endOffsets": "4645,4808,4939,5047,5208,5341,5463,5573,5925,6034,6199,6331,6496,6653,6720,6789,6874" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-es/values-es.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,207,320,428,513,614,742,828,909,1001,1095,1192,1286,1386,1480,1576,1672,1764,1856,1938,2045,2156,2255,2363,2471,2578,2737,2836", + "endColumns": "101,112,107,84,100,127,85,80,91,93,96,93,99,93,95,95,91,91,81,106,110,98,107,107,106,158,98,82", + "endOffsets": "202,315,423,508,609,737,823,904,996,1090,1187,1281,1381,1475,1571,1667,1759,1851,1933,2040,2151,2250,2358,2466,2573,2732,2831,2914" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "328,430,543,651,736,837,965,1051,1132,1224,1318,1415,1509,1609,1703,1799,1895,1987,2079,2161,2268,2379,2478,2586,2694,2801,2960,12073", + "endColumns": "101,112,107,84,100,127,85,80,91,93,96,93,99,93,95,95,91,91,81,106,110,98,107,107,106,158,98,82", + "endOffsets": "425,538,646,731,832,960,1046,1127,1219,1313,1410,1504,1604,1698,1794,1890,1982,2074,2156,2263,2374,2473,2581,2689,2796,2955,3054,12151" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-or_values-or.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-or/values-or.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,272,354,432,509,595,679,773,878,957,1017,1082,1171,1236,1295,1381,1445,1509,1572,1645,1709,1763,1875,1933,1995,2049,2121,2243,2330,2406,2498,2580,2666,2806,2883,2964,3091,3182,3259,3313,3364,3430,3500,3577,3648,3723,3794,3871,3940,4009,4116,4207,4279,4368,4457,4531,4603,4689,4739,4818,4884,4964,5048,5110,5174,5237,5306,5406,5501,5593,5685,5743,5798,5882,5963,6038", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,81,77,76,85,83,93,104,78,59,64,88,64,58,85,63,63,62,72,63,53,111,57,61,53,71,121,86,75,91,81,85,139,76,80,126,90,76,53,50,65,69,76,70,74,70,76,68,68,106,90,71,88,88,73,71,85,49,78,65,79,83,61,63,62,68,99,94,91,91,57,54,83,80,74,74", + "endOffsets": "267,349,427,504,590,674,768,873,952,1012,1077,1166,1231,1290,1376,1440,1504,1567,1640,1704,1758,1870,1928,1990,2044,2116,2238,2325,2401,2493,2575,2661,2801,2878,2959,3086,3177,3254,3308,3359,3425,3495,3572,3643,3718,3789,3866,3935,4004,4111,4202,4274,4363,4452,4526,4598,4684,4734,4813,4879,4959,5043,5105,5169,5232,5301,5401,5496,5588,5680,5738,5793,5877,5958,6033,6108" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3074,3156,3234,3311,3397,4216,4310,4415,6774,6834,6899,6988,7053,7112,7198,7262,7326,7389,7462,7526,7580,7692,7750,7812,7866,7938,8060,8147,8223,8315,8397,8483,8623,8700,8781,8908,8999,9076,9130,9181,9247,9317,9394,9465,9540,9611,9688,9757,9826,9933,10024,10096,10185,10274,10348,10420,10506,10556,10635,10701,10781,10865,10927,10991,11054,11123,11223,11318,11410,11502,11560,11615,11789,11870,11945", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,81,77,76,85,83,93,104,78,59,64,88,64,58,85,63,63,62,72,63,53,111,57,61,53,71,121,86,75,91,81,85,139,76,80,126,90,76,53,50,65,69,76,70,74,70,76,68,68,106,90,71,88,88,73,71,85,49,78,65,79,83,61,63,62,68,99,94,91,91,57,54,83,80,74,74", + "endOffsets": "317,3151,3229,3306,3392,3476,4305,4410,4489,6829,6894,6983,7048,7107,7193,7257,7321,7384,7457,7521,7575,7687,7745,7807,7861,7933,8055,8142,8218,8310,8392,8478,8618,8695,8776,8903,8994,9071,9125,9176,9242,9312,9389,9460,9535,9606,9683,9752,9821,9928,10019,10091,10180,10269,10343,10415,10501,10551,10630,10696,10776,10860,10922,10986,11049,11118,11218,11313,11405,11497,11555,11610,11694,11865,11940,12015" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-or/values-or.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,216,326,433,519,623,743,822,903,994,1087,1188,1283,1383,1476,1571,1667,1758,1848,1937,2047,2151,2257,2368,2470,2588,2751,2857", + "endColumns": "110,109,106,85,103,119,78,80,90,92,100,94,99,92,94,95,90,89,88,109,103,105,110,101,117,162,105,89", + "endOffsets": "211,321,428,514,618,738,817,898,989,1082,1183,1278,1378,1471,1566,1662,1753,1843,1932,2042,2146,2252,2363,2465,2583,2746,2852,2942" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "322,433,543,650,736,840,960,1039,1120,1211,1304,1405,1500,1600,1693,1788,1884,1975,2065,2154,2264,2368,2474,2585,2687,2805,2968,11699", + "endColumns": "110,109,106,85,103,119,78,80,90,92,100,94,99,92,94,95,90,89,88,109,103,105,110,101,117,162,105,89", + "endOffsets": "428,538,645,731,835,955,1034,1115,1206,1299,1400,1495,1595,1688,1783,1879,1970,2060,2149,2259,2363,2469,2580,2682,2800,2963,3069,11784" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-or/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,300,457,585,698,849,980,1090,1196,1359,1468,1625,1754,1900,2053,2114,2182", + "endColumns": "106,156,127,112,150,130,109,105,162,108,156,128,145,152,60,67,82", + "endOffsets": "299,456,584,697,848,979,1089,1195,1358,1467,1624,1753,1899,2052,2113,2181,2264" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4494,4605,4766,4898,5015,5170,5305,5419,5669,5836,5949,6110,6243,6393,6550,6615,6687", + "endColumns": "110,160,131,116,154,134,113,109,166,112,160,132,149,156,64,71,86", + "endOffsets": "4600,4761,4893,5010,5165,5300,5414,5524,5831,5944,6105,6238,6388,6545,6610,6682,6769" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-or/values-or.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,158,260,363,468,569,671,790", + "endColumns": "102,101,102,104,100,101,118,100", + "endOffsets": "153,255,358,463,564,666,785,886" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3481,3584,3686,3789,3894,3995,4097,12020", + "endColumns": "102,101,102,104,100,101,118,100", + "endOffsets": "3579,3681,3784,3889,3990,4092,4211,12116" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-or/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "135", + "endOffsets": "330" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5529", + "endColumns": "139", + "endOffsets": "5664" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-it_values-it.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-it/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,294,441,562,666,820,944,1060,1160,1313,1416,1566,1689,1841,2018,2081,2138", + "endColumns": "100,146,120,103,153,123,115,99,152,102,149,122,151,176,62,56,72", + "endOffsets": "293,440,561,665,819,943,1059,1159,1312,1415,1565,1688,1840,2017,2080,2137,2210" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4517,4622,4773,4898,5006,5164,5292,5412,5652,5809,5916,6070,6197,6353,6534,6601,6662", + "endColumns": "104,150,124,107,157,127,119,103,156,106,153,126,155,180,66,60,76", + "endOffsets": "4617,4768,4893,5001,5159,5287,5407,5511,5804,5911,6065,6192,6348,6529,6596,6657,6734" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-it/values-it.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,354,456,565,672,802", + "endColumns": "97,101,98,101,108,106,129,100", + "endOffsets": "148,250,349,451,560,667,797,898" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3448,3546,3648,3747,3849,3958,4065,12233", + "endColumns": "97,101,98,101,108,106,129,100", + "endOffsets": "3541,3643,3742,3844,3953,4060,4190,12329" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-it/values-it.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,268,352,433,510,609,704,803,943,1026,1090,1156,1251,1336,1398,1486,1548,1617,1680,1753,1816,1870,1991,2048,2110,2164,2241,2378,2463,2543,2642,2728,2810,2945,3026,3107,3253,3344,3434,3489,3540,3606,3679,3759,3830,3910,3985,4062,4131,4208,4313,4401,4490,4583,4676,4750,4830,4924,4975,5059,5125,5209,5297,5359,5423,5486,5554,5669,5783,5889,5998,6057,6112,6192,6277,6356", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,83,80,76,98,94,98,139,82,63,65,94,84,61,87,61,68,62,72,62,53,120,56,61,53,76,136,84,79,98,85,81,134,80,80,145,90,89,54,50,65,72,79,70,79,74,76,68,76,104,87,88,92,92,73,79,93,50,83,65,83,87,61,63,62,67,114,113,105,108,58,54,79,84,78,81", + "endOffsets": "263,347,428,505,604,699,798,938,1021,1085,1151,1246,1331,1393,1481,1543,1612,1675,1748,1811,1865,1986,2043,2105,2159,2236,2373,2458,2538,2637,2723,2805,2940,3021,3102,3248,3339,3429,3484,3535,3601,3674,3754,3825,3905,3980,4057,4126,4203,4308,4396,4485,4578,4671,4745,4825,4919,4970,5054,5120,5204,5292,5354,5418,5481,5549,5664,5778,5884,5993,6052,6107,6187,6272,6351,6433" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3012,3096,3177,3254,3353,4195,4294,4434,6739,6803,6869,6964,7049,7111,7199,7261,7330,7393,7466,7529,7583,7704,7761,7823,7877,7954,8091,8176,8256,8355,8441,8523,8658,8739,8820,8966,9057,9147,9202,9253,9319,9392,9472,9543,9623,9698,9775,9844,9921,10026,10114,10203,10296,10389,10463,10543,10637,10688,10772,10838,10922,11010,11072,11136,11199,11267,11382,11496,11602,11711,11770,11825,11987,12072,12151", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,83,80,76,98,94,98,139,82,63,65,94,84,61,87,61,68,62,72,62,53,120,56,61,53,76,136,84,79,98,85,81,134,80,80,145,90,89,54,50,65,72,79,70,79,74,76,68,76,104,87,88,92,92,73,79,93,50,83,65,83,87,61,63,62,67,114,113,105,108,58,54,79,84,78,81", + "endOffsets": "313,3091,3172,3249,3348,3443,4289,4429,4512,6798,6864,6959,7044,7106,7194,7256,7325,7388,7461,7524,7578,7699,7756,7818,7872,7949,8086,8171,8251,8350,8436,8518,8653,8734,8815,8961,9052,9142,9197,9248,9314,9387,9467,9538,9618,9693,9770,9839,9916,10021,10109,10198,10291,10384,10458,10538,10632,10683,10767,10833,10917,11005,11067,11131,11194,11262,11377,11491,11597,11706,11765,11820,11900,12067,12146,12228" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-it/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "131", + "endOffsets": "326" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5516", + "endColumns": "135", + "endOffsets": "5647" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-it/values-it.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,210,313,422,506,611,730,808,883,975,1069,1162,1256,1357,1451,1548,1643,1735,1827,1908,2014,2121,2219,2323,2429,2536,2699,2799", + "endColumns": "104,102,108,83,104,118,77,74,91,93,92,93,100,93,96,94,91,91,80,105,106,97,103,105,106,162,99,81", + "endOffsets": "205,308,417,501,606,725,803,878,970,1064,1157,1251,1352,1446,1543,1638,1730,1822,1903,2009,2116,2214,2318,2424,2531,2694,2794,2876" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "318,423,526,635,719,824,943,1021,1096,1188,1282,1375,1469,1570,1664,1761,1856,1948,2040,2121,2227,2334,2432,2536,2642,2749,2912,11905", + "endColumns": "104,102,108,83,104,118,77,74,91,93,92,93,100,93,96,94,91,91,80,105,106,97,103,105,106,162,99,81", + "endOffsets": "418,521,630,714,819,938,1016,1091,1183,1277,1370,1464,1565,1659,1756,1851,1943,2035,2116,2222,2329,2427,2531,2637,2744,2907,3007,11982" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-h360dp-land-v13_values-h360dp-land-v13.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-h360dp-land-v13/values-h360dp-land-v13.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10", + "startColumns": "4,4,4,4,4,4,4,4,4", + "startOffsets": "55,114,170,226,293,358,413,478,547", + "endColumns": "58,55,55,66,64,54,64,68,68", + "endOffsets": "109,165,221,288,353,408,473,542,611" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-ky_values-ky.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ky/values-ky.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,265,348,433,518,633,743,844,985,1069,1129,1193,1287,1357,1418,1505,1568,1632,1691,1765,1827,1881,1998,2056,2117,2171,2245,2367,2451,2530,2630,2716,2812,2944,3022,3100,3229,3318,3398,3459,3514,3580,3649,3726,3797,3878,3952,4028,4118,4191,4293,4378,4457,4547,4639,4713,4798,4888,4940,5024,5089,5174,5259,5321,5385,5448,5517,5634,5742,5842,5946,6011,6070,6152,6238,6314", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,82,84,84,114,109,100,140,83,59,63,93,69,60,86,62,63,58,73,61,53,116,57,60,53,73,121,83,78,99,85,95,131,77,77,128,88,79,60,54,65,68,76,70,80,73,75,89,72,101,84,78,89,91,73,84,89,51,83,64,84,84,61,63,62,68,116,107,99,103,64,58,81,85,75,82", + "endOffsets": "260,343,428,513,628,738,839,980,1064,1124,1188,1282,1352,1413,1500,1563,1627,1686,1760,1822,1876,1993,2051,2112,2166,2240,2362,2446,2525,2625,2711,2807,2939,3017,3095,3224,3313,3393,3454,3509,3575,3644,3721,3792,3873,3947,4023,4113,4186,4288,4373,4452,4542,4634,4708,4793,4883,4935,5019,5084,5169,5254,5316,5380,5443,5512,5629,5737,5837,5941,6006,6065,6147,6233,6309,6392" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3027,3110,3195,3280,3395,4236,4337,4478,6766,6826,6890,6984,7054,7115,7202,7265,7329,7388,7462,7524,7578,7695,7753,7814,7868,7942,8064,8148,8227,8327,8413,8509,8641,8719,8797,8926,9015,9095,9156,9211,9277,9346,9423,9494,9575,9649,9725,9815,9888,9990,10075,10154,10244,10336,10410,10495,10585,10637,10721,10786,10871,10956,11018,11082,11145,11214,11331,11439,11539,11643,11708,11767,11931,12017,12093", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,82,84,84,114,109,100,140,83,59,63,93,69,60,86,62,63,58,73,61,53,116,57,60,53,73,121,83,78,99,85,95,131,77,77,128,88,79,60,54,65,68,76,70,80,73,75,89,72,101,84,78,89,91,73,84,89,51,83,64,84,84,61,63,62,68,116,107,99,103,64,58,81,85,75,82", + "endOffsets": "310,3105,3190,3275,3390,3500,4332,4473,4557,6821,6885,6979,7049,7110,7197,7260,7324,7383,7457,7519,7573,7690,7748,7809,7863,7937,8059,8143,8222,8322,8408,8504,8636,8714,8792,8921,9010,9090,9151,9206,9272,9341,9418,9489,9570,9644,9720,9810,9883,9985,10070,10149,10239,10331,10405,10490,10580,10632,10716,10781,10866,10951,11013,11077,11140,11209,11326,11434,11534,11638,11703,11762,11844,12012,12088,12171" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ky/values-ky.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,216,325,437,522,627,744,823,901,992,1085,1180,1274,1374,1467,1562,1657,1748,1839,1920,2026,2131,2229,2336,2439,2554,2715,2817", + "endColumns": "110,108,111,84,104,116,78,77,90,92,94,93,99,92,94,94,90,90,80,105,104,97,106,102,114,160,101,81", + "endOffsets": "211,320,432,517,622,739,818,896,987,1080,1175,1269,1369,1462,1557,1652,1743,1834,1915,2021,2126,2224,2331,2434,2549,2710,2812,2894" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "315,426,535,647,732,837,954,1033,1111,1202,1295,1390,1484,1584,1677,1772,1867,1958,2049,2130,2236,2341,2439,2546,2649,2764,2925,11849", + "endColumns": "110,108,111,84,104,116,78,77,90,92,94,93,99,92,94,94,90,90,80,105,104,97,106,102,114,160,101,81", + "endOffsets": "421,530,642,727,832,949,1028,1106,1197,1290,1385,1479,1579,1672,1767,1862,1953,2044,2125,2231,2336,2434,2541,2644,2759,2920,3022,11926" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ky/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "153", + "endOffsets": "348" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5549", + "endColumns": "157", + "endOffsets": "5702" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ky/values-ky.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,155,257,360,467,571,675,786", + "endColumns": "99,101,102,106,103,103,110,100", + "endOffsets": "150,252,355,462,566,670,781,882" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3505,3605,3707,3810,3917,4021,4125,12176", + "endColumns": "99,101,102,106,103,103,110,100", + "endOffsets": "3600,3702,3805,3912,4016,4120,4231,12272" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ky/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,440,565,668,809,932,1043,1148,1313,1416,1562,1688,1821,1981,2041,2097", + "endColumns": "101,144,124,102,140,122,110,104,164,102,145,125,132,159,59,55,73", + "endOffsets": "294,439,564,667,808,931,1042,1147,1312,1415,1561,1687,1820,1980,2040,2096,2170" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4562,4668,4817,4946,5053,5198,5325,5440,5707,5876,5983,6133,6263,6400,6564,6628,6688", + "endColumns": "105,148,128,106,144,126,114,108,168,106,149,129,136,163,63,59,77", + "endOffsets": "4663,4812,4941,5048,5193,5320,5435,5544,5871,5978,6128,6258,6395,6559,6623,6683,6761" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-si_values-si.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-si/values-si.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,157,260,365,470,569,673,787", + "endColumns": "101,102,104,104,98,103,113,100", + "endOffsets": "152,255,360,465,564,668,782,883" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3442,3544,3647,3752,3857,3956,4060,11982", + "endColumns": "101,102,104,104,98,103,113,100", + "endOffsets": "3539,3642,3747,3852,3951,4055,4169,12078" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-si/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "134", + "endOffsets": "329" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5453", + "endColumns": "138", + "endOffsets": "5587" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-si/values-si.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,269,345,422,500,591,676,778,893,976,1037,1101,1190,1257,1317,1411,1475,1538,1594,1664,1731,1786,1905,1962,2026,2080,2153,2275,2358,2441,2534,2620,2705,2837,2915,2995,3117,3203,3287,3347,3399,3465,3535,3608,3679,3756,3828,3905,3977,4047,4160,4253,4326,4416,4509,4583,4655,4746,4800,4880,4946,5030,5115,5177,5241,5304,5370,5475,5580,5675,5776,5840,5896,5976,6061,6136", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,75,76,77,90,84,101,114,82,60,63,88,66,59,93,63,62,55,69,66,54,118,56,63,53,72,121,82,82,92,85,84,131,77,79,121,85,83,59,51,65,69,72,70,76,71,76,71,69,112,92,72,89,92,73,71,90,53,79,65,83,84,61,63,62,65,104,104,94,100,63,55,79,84,74,75", + "endOffsets": "264,340,417,495,586,671,773,888,971,1032,1096,1185,1252,1312,1406,1470,1533,1589,1659,1726,1781,1900,1957,2021,2075,2148,2270,2353,2436,2529,2615,2700,2832,2910,2990,3112,3198,3282,3342,3394,3460,3530,3603,3674,3751,3823,3900,3972,4042,4155,4248,4321,4411,4504,4578,4650,4741,4795,4875,4941,5025,5110,5172,5236,5299,5365,5470,5575,5670,5771,5835,5891,5971,6056,6131,6207" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3035,3111,3188,3266,3357,4174,4276,4391,6664,6725,6789,6878,6945,7005,7099,7163,7226,7282,7352,7419,7474,7593,7650,7714,7768,7841,7963,8046,8129,8222,8308,8393,8525,8603,8683,8805,8891,8975,9035,9087,9153,9223,9296,9367,9444,9516,9593,9665,9735,9848,9941,10014,10104,10197,10271,10343,10434,10488,10568,10634,10718,10803,10865,10929,10992,11058,11163,11268,11363,11464,11528,11584,11746,11831,11906", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,75,76,77,90,84,101,114,82,60,63,88,66,59,93,63,62,55,69,66,54,118,56,63,53,72,121,82,82,92,85,84,131,77,79,121,85,83,59,51,65,69,72,70,76,71,76,71,69,112,92,72,89,92,73,71,90,53,79,65,83,84,61,63,62,65,104,104,94,100,63,55,79,84,74,75", + "endOffsets": "314,3106,3183,3261,3352,3437,4271,4386,4469,6720,6784,6873,6940,7000,7094,7158,7221,7277,7347,7414,7469,7588,7645,7709,7763,7836,7958,8041,8124,8217,8303,8388,8520,8598,8678,8800,8886,8970,9030,9082,9148,9218,9291,9362,9439,9511,9588,9660,9730,9843,9936,10009,10099,10192,10266,10338,10429,10483,10563,10629,10713,10798,10860,10924,10987,11053,11158,11263,11358,11459,11523,11579,11659,11826,11901,11977" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-si/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,447,567,676,814,934,1046,1140,1287,1398,1550,1677,1817,1974,2043,2100", + "endColumns": "103,149,119,108,137,119,111,93,146,110,151,126,139,156,68,56,75", + "endOffsets": "296,446,566,675,813,933,1045,1139,1286,1397,1549,1676,1816,1973,2042,2099,2175" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4474,4582,4736,4860,4973,5115,5239,5355,5592,5743,5858,6014,6145,6289,6450,6523,6584", + "endColumns": "107,153,123,112,141,123,115,97,150,114,155,130,143,160,72,60,79", + "endOffsets": "4577,4731,4855,4968,5110,5234,5350,5448,5738,5853,6009,6140,6284,6445,6518,6579,6659" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-si/values-si.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,221,328,435,518,623,739,829,915,1006,1099,1193,1287,1387,1480,1575,1669,1760,1851,1935,2044,2148,2246,2356,2456,2563,2722,2821", + "endColumns": "115,106,106,82,104,115,89,85,90,92,93,93,99,92,94,93,90,90,83,108,103,97,109,99,106,158,98,81", + "endOffsets": "216,323,430,513,618,734,824,910,1001,1094,1188,1282,1382,1475,1570,1664,1755,1846,1930,2039,2143,2241,2351,2451,2558,2717,2816,2898" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "319,435,542,649,732,837,953,1043,1129,1220,1313,1407,1501,1601,1694,1789,1883,1974,2065,2149,2258,2362,2460,2570,2670,2777,2936,11664", + "endColumns": "115,106,106,82,104,115,89,85,90,92,93,93,99,92,94,93,90,90,83,108,103,97,109,99,106,158,98,81", + "endOffsets": "430,537,644,727,832,948,1038,1124,1215,1308,1402,1496,1596,1689,1784,1878,1969,2060,2144,2253,2357,2455,2565,2665,2772,2931,3030,11741" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-en-rCA_values-en-rCA.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-en-rCA/values-en-rCA.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,352,451,555,657,773", + "endColumns": "95,101,98,98,103,101,115,100", + "endOffsets": "146,248,347,446,550,652,768,869" + }, + "to": { + "startLines": "29,30,31,32,33,34,35,37", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "2762,2858,2960,3059,3158,3262,3364,3563", + "endColumns": "95,101,98,98,103,101,115,100", + "endOffsets": "2853,2955,3054,3153,3257,3359,3475,3659" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-en-rCA/values-en-rCA.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,209,309,417,501,601,716,794,869,960,1053,1148,1242,1342,1435,1530,1624,1715,1806,1888,1991,2094,2193,2298,2402,2506,2662,2762", + "endColumns": "103,99,107,83,99,114,77,74,90,92,94,93,99,92,94,93,90,90,81,102,102,98,104,103,103,155,99,82", + "endOffsets": "204,304,412,496,596,711,789,864,955,1048,1143,1237,1337,1430,1525,1619,1710,1801,1883,1986,2089,2188,2293,2397,2501,2657,2757,2840" + }, + "to": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,209,309,417,501,601,716,794,869,960,1053,1148,1242,1342,1435,1530,1624,1715,1806,1888,1991,2094,2193,2298,2402,2506,2662,3480", + "endColumns": "103,99,107,83,99,114,77,74,90,92,94,93,99,92,94,93,90,90,81,102,102,98,104,103,103,155,99,82", + "endOffsets": "204,304,412,496,596,711,789,864,955,1048,1143,1237,1337,1430,1525,1619,1710,1801,1883,1986,2089,2188,2293,2397,2501,2657,2757,3558" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-v16_values-v16.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v16/values-v16.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endLines": "5", + "endColumns": "12", + "endOffsets": "223" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-large-v4_values-large-v4.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-large-v4/values-large-v4.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10", + "startColumns": "4,4,4,4,4,4,4,4,4", + "startOffsets": "55,114,185,256,326,396,464,532,636", + "endColumns": "58,70,70,69,69,67,67,103,115", + "endOffsets": "109,180,251,321,391,459,527,631,747" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-large-v4/values-large-v4.xml", + "from": { + "startLines": "2,3,4,5", + "startColumns": "4,4,4,4", + "startOffsets": "55,169,285,407", + "endColumns": "113,115,121,133", + "endOffsets": "164,280,402,536" + }, + "to": { + "startLines": "11,12,13,14", + "startColumns": "4,4,4,4", + "startOffsets": "752,866,982,1104", + "endColumns": "113,115,121,133", + "endOffsets": "861,977,1099,1233" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-en-rGB_values-en-rGB.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-en-rGB/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "199", + "endColumns": "133", + "endOffsets": "332" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5379", + "endColumns": "137", + "endOffsets": "5512" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-en-rGB/values-en-rGB.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,272,354,432,509,595,679,777,892,971,1031,1096,1186,1253,1312,1402,1466,1530,1593,1662,1726,1780,1892,1950,2012,2066,2138,2260,2347,2422,2513,2594,2675,2815,2892,2973,3100,3191,3268,3322,3373,3439,3509,3586,3657,3732,3803,3880,3949,4018,4125,4216,4288,4377,4466,4540,4612,4698,4748,4827,4893,4973,5057,5119,5183,5246,5315,5415,5510,5602,5694,5752,5807,5885,5966,6041", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,81,77,76,85,83,97,114,78,59,64,89,66,58,89,63,63,62,68,63,53,111,57,61,53,71,121,86,74,90,80,80,139,76,80,126,90,76,53,50,65,69,76,70,74,70,76,68,68,106,90,71,88,88,73,71,85,49,78,65,79,83,61,63,62,68,99,94,91,91,57,54,77,80,74,74", + "endOffsets": "267,349,427,504,590,674,772,887,966,1026,1091,1181,1248,1307,1397,1461,1525,1588,1657,1721,1775,1887,1945,2007,2061,2133,2255,2342,2417,2508,2589,2670,2810,2887,2968,3095,3186,3263,3317,3368,3434,3504,3581,3652,3727,3798,3875,3944,4013,4120,4211,4283,4372,4461,4535,4607,4693,4743,4822,4888,4968,5052,5114,5178,5241,5310,5410,5505,5597,5689,5747,5802,5880,5961,6036,6111" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2979,3061,3139,3216,3302,4105,4203,4318,6556,6616,6681,6771,6838,6897,6987,7051,7115,7178,7247,7311,7365,7477,7535,7597,7651,7723,7845,7932,8007,8098,8179,8260,8400,8477,8558,8685,8776,8853,8907,8958,9024,9094,9171,9242,9317,9388,9465,9534,9603,9710,9801,9873,9962,10051,10125,10197,10283,10333,10412,10478,10558,10642,10704,10768,10831,10900,11000,11095,11187,11279,11337,11392,11553,11634,11709", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,81,77,76,85,83,97,114,78,59,64,89,66,58,89,63,63,62,68,63,53,111,57,61,53,71,121,86,74,90,80,80,139,76,80,126,90,76,53,50,65,69,76,70,74,70,76,68,68,106,90,71,88,88,73,71,85,49,78,65,79,83,61,63,62,68,99,94,91,91,57,54,77,80,74,74", + "endOffsets": "317,3056,3134,3211,3297,3381,4198,4313,4392,6611,6676,6766,6833,6892,6982,7046,7110,7173,7242,7306,7360,7472,7530,7592,7646,7718,7840,7927,8002,8093,8174,8255,8395,8472,8553,8680,8771,8848,8902,8953,9019,9089,9166,9237,9312,9383,9460,9529,9598,9705,9796,9868,9957,10046,10120,10192,10278,10328,10407,10473,10553,10637,10699,10763,10826,10895,10995,11090,11182,11274,11332,11387,11465,11629,11704,11779" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-en-rGB/values-en-rGB.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,209,309,417,501,601,716,794,869,960,1053,1148,1242,1342,1435,1530,1624,1715,1806,1888,1991,2094,2193,2298,2402,2506,2662,2762", + "endColumns": "103,99,107,83,99,114,77,74,90,92,94,93,99,92,94,93,90,90,81,102,102,98,104,103,103,155,99,82", + "endOffsets": "204,304,412,496,596,711,789,864,955,1048,1143,1237,1337,1430,1525,1619,1710,1801,1883,1986,2089,2188,2293,2397,2501,2657,2757,2840" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "322,426,526,634,718,818,933,1011,1086,1177,1270,1365,1459,1559,1652,1747,1841,1932,2023,2105,2208,2311,2410,2515,2619,2723,2879,11470", + "endColumns": "103,99,107,83,99,114,77,74,90,92,94,93,99,92,94,93,90,90,81,102,102,98,104,103,103,155,99,82", + "endOffsets": "421,521,629,713,813,928,1006,1081,1172,1265,1360,1454,1554,1647,1742,1836,1927,2018,2100,2203,2306,2405,2510,2614,2718,2874,2974,11548" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-en-rGB/values-en-rGB.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,352,451,555,658,774", + "endColumns": "95,101,98,98,103,102,115,100", + "endOffsets": "146,248,347,446,550,653,769,870" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3386,3482,3584,3683,3782,3886,3989,11784", + "endColumns": "95,101,98,98,103,102,115,100", + "endOffsets": "3477,3579,3678,3777,3881,3984,4100,11880" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-en-rGB/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "197,298,446,567,670,817,936,1048,1147,1302,1403,1551,1672,1814,1958,2017,2075", + "endColumns": "100,147,120,102,146,118,111,98,154,100,147,120,141,143,58,57,74", + "endOffsets": "297,445,566,669,816,935,1047,1146,1301,1402,1550,1671,1813,1957,2016,2074,2149" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4397,4502,4654,4779,4886,5037,5160,5276,5517,5676,5781,5933,6058,6204,6352,6415,6477", + "endColumns": "104,151,124,106,150,122,115,102,158,104,151,124,145,147,62,61,78", + "endOffsets": "4497,4649,4774,4881,5032,5155,5271,5374,5671,5776,5928,6053,6199,6347,6410,6472,6551" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-en-rIN_values-en-rIN.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-en-rIN/values-en-rIN.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,209,309,417,501,601,716,794,869,960,1053,1148,1242,1342,1435,1530,1624,1715,1806,1888,1991,2094,2193,2298,2402,2506,2662,2762", + "endColumns": "103,99,107,83,99,114,77,74,90,92,94,93,99,92,94,93,90,90,81,102,102,98,104,103,103,155,99,82", + "endOffsets": "204,304,412,496,596,711,789,864,955,1048,1143,1237,1337,1430,1525,1619,1710,1801,1883,1986,2089,2188,2293,2397,2501,2657,2757,2840" + }, + "to": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,209,309,417,501,601,716,794,869,960,1053,1148,1242,1342,1435,1530,1624,1715,1806,1888,1991,2094,2193,2298,2402,2506,2662,3481", + "endColumns": "103,99,107,83,99,114,77,74,90,92,94,93,99,92,94,93,90,90,81,102,102,98,104,103,103,155,99,82", + "endOffsets": "204,304,412,496,596,711,789,864,955,1048,1143,1237,1337,1430,1525,1619,1710,1801,1883,1986,2089,2188,2293,2397,2501,2657,2757,3559" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-en-rIN/values-en-rIN.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,352,451,555,658,774", + "endColumns": "95,101,98,98,103,102,115,100", + "endOffsets": "146,248,347,446,550,653,769,870" + }, + "to": { + "startLines": "29,30,31,32,33,34,35,37", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "2762,2858,2960,3059,3158,3262,3365,3564", + "endColumns": "95,101,98,98,103,102,115,100", + "endOffsets": "2853,2955,3054,3153,3257,3360,3476,3660" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-en-rXC_values-en-rXC.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-en-rXC/values-en-rXC.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,312,515,725,912,1113,1329,1509,1684,1878,2072,2267,2464,2663,2858,3056,3253,3447,3641,3826,4031,4234,4435,4641,4846,5053,5327,5528", + "endColumns": "206,202,209,186,200,215,179,174,193,193,194,196,198,194,197,196,193,193,184,204,202,200,205,204,206,273,200,185", + "endOffsets": "307,510,720,907,1108,1324,1504,1679,1873,2067,2262,2459,2658,2853,3051,3248,3442,3636,3821,4026,4229,4430,4636,4841,5048,5322,5523,5709" + }, + "to": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,312,515,725,912,1113,1329,1509,1684,1878,2072,2267,2464,2663,2858,3056,3253,3447,3641,3826,4031,4234,4435,4641,4846,5053,5327,6955", + "endColumns": "206,202,209,186,200,215,179,174,193,193,194,196,198,194,197,196,193,193,184,204,202,200,205,204,206,273,200,185", + "endOffsets": "307,510,720,907,1108,1324,1504,1679,1873,2067,2262,2459,2658,2853,3051,3248,3442,3636,3821,4026,4229,4430,4636,4841,5048,5322,5523,7136" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-en-rXC/values-en-rXC.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,251,456,657,858,1065,1270,1482", + "endColumns": "195,204,200,200,206,204,211,203", + "endOffsets": "246,451,652,853,1060,1265,1477,1681" + }, + "to": { + "startLines": "29,30,31,32,33,34,35,37", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "5528,5724,5929,6130,6331,6538,6743,7141", + "endColumns": "195,204,200,200,206,204,211,203", + "endOffsets": "5719,5924,6125,6326,6533,6738,6950,7340" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-gl_values-gl.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-gl/values-gl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,154,256,356,454,561,667,783", + "endColumns": "98,101,99,97,106,105,115,100", + "endOffsets": "149,251,351,449,556,662,778,879" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3519,3618,3720,3820,3918,4025,4131,12420", + "endColumns": "98,101,99,97,106,105,115,100", + "endOffsets": "3613,3715,3815,3913,4020,4126,4242,12516" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-gl/values-gl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,209,313,421,506,607,735,821,902,994,1088,1185,1279,1379,1473,1569,1664,1756,1848,1929,2037,2144,2251,2360,2465,2579,2756,2855", + "endColumns": "103,103,107,84,100,127,85,80,91,93,96,93,99,93,95,94,91,91,80,107,106,106,108,104,113,176,98,82", + "endOffsets": "204,308,416,501,602,730,816,897,989,1083,1180,1274,1374,1468,1564,1659,1751,1843,1924,2032,2139,2246,2355,2460,2574,2751,2850,2933" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "325,429,533,641,726,827,955,1041,1122,1214,1308,1405,1499,1599,1693,1789,1884,1976,2068,2149,2257,2364,2471,2580,2685,2799,2976,12097", + "endColumns": "103,103,107,84,100,127,85,80,91,93,96,93,99,93,95,94,91,91,80,107,106,106,108,104,113,176,98,82", + "endOffsets": "424,528,636,721,822,950,1036,1117,1209,1303,1400,1494,1594,1688,1784,1879,1971,2063,2144,2252,2359,2466,2575,2680,2794,2971,3070,12175" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-gl/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "129", + "endOffsets": "324" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5590", + "endColumns": "133", + "endOffsets": "5719" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-gl/values-gl.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,275,356,436,521,623,719,824,957,1037,1099,1177,1273,1352,1415,1510,1574,1643,1706,1780,1844,1900,2021,2079,2141,2197,2274,2413,2501,2578,2674,2758,2838,2978,3058,3138,3287,3377,3458,3514,3570,3636,3715,3796,3867,3955,4034,4111,4193,4282,4383,4467,4559,4652,4753,4827,4919,5021,5073,5157,5223,5315,5403,5465,5529,5592,5662,5773,5878,5984,6083,6143,6203,6288,6371,6450", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,80,79,84,101,95,104,132,79,61,77,95,78,62,94,63,68,62,73,63,55,120,57,61,55,76,138,87,76,95,83,79,139,79,79,148,89,80,55,55,65,78,80,70,87,78,76,81,88,100,83,91,92,100,73,91,101,51,83,65,91,87,61,63,62,69,110,104,105,98,59,59,84,82,78,77", + "endOffsets": "270,351,431,516,618,714,819,952,1032,1094,1172,1268,1347,1410,1505,1569,1638,1701,1775,1839,1895,2016,2074,2136,2192,2269,2408,2496,2573,2669,2753,2833,2973,3053,3133,3282,3372,3453,3509,3565,3631,3710,3791,3862,3950,4029,4106,4188,4277,4378,4462,4554,4647,4748,4822,4914,5016,5068,5152,5218,5310,5398,5460,5524,5587,5657,5768,5873,5979,6078,6138,6198,6283,6366,6445,6523" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3075,3156,3236,3321,3423,4247,4352,4485,6846,6908,6986,7082,7161,7224,7319,7383,7452,7515,7589,7653,7709,7830,7888,7950,8006,8083,8222,8310,8387,8483,8567,8647,8787,8867,8947,9096,9186,9267,9323,9379,9445,9524,9605,9676,9764,9843,9920,10002,10091,10192,10276,10368,10461,10562,10636,10728,10830,10882,10966,11032,11124,11212,11274,11338,11401,11471,11582,11687,11793,11892,11952,12012,12180,12263,12342", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,80,79,84,101,95,104,132,79,61,77,95,78,62,94,63,68,62,73,63,55,120,57,61,55,76,138,87,76,95,83,79,139,79,79,148,89,80,55,55,65,78,80,70,87,78,76,81,88,100,83,91,92,100,73,91,101,51,83,65,91,87,61,63,62,69,110,104,105,98,59,59,84,82,78,77", + "endOffsets": "320,3151,3231,3316,3418,3514,4347,4480,4560,6903,6981,7077,7156,7219,7314,7378,7447,7510,7584,7648,7704,7825,7883,7945,8001,8078,8217,8305,8382,8478,8562,8642,8782,8862,8942,9091,9181,9262,9318,9374,9440,9519,9600,9671,9759,9838,9915,9997,10086,10187,10271,10363,10456,10557,10631,10723,10825,10877,10961,11027,11119,11207,11269,11333,11396,11466,11577,11682,11788,11887,11947,12007,12092,12258,12337,12415" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-gl/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,454,579,683,838,966,1081,1186,1353,1458,1623,1754,1915,2063,2126,2191", + "endColumns": "101,158,124,103,154,127,114,104,166,104,164,130,160,147,62,64,80", + "endOffsets": "294,453,578,682,837,965,1080,1185,1352,1457,1622,1753,1914,2062,2125,2190,2271" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4565,4671,4834,4963,5071,5230,5362,5481,5724,5895,6004,6173,6308,6473,6625,6692,6761", + "endColumns": "105,162,128,107,158,131,118,108,170,108,168,134,164,151,66,68,84", + "endOffsets": "4666,4829,4958,5066,5225,5357,5476,5585,5890,5999,6168,6303,6468,6620,6687,6756,6841" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-night-v8_values-night-v8.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-night-v8/values-night-v8.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,125,209,293,389,491,593,687", + "endColumns": "69,83,83,95,101,101,93,88", + "endOffsets": "120,204,288,384,486,588,682,771" + }, + "to": { + "startLines": "7,8,9,10,11,12,13,40", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "365,435,519,603,699,801,903,3885", + "endColumns": "69,83,83,95,101,101,93,88", + "endOffsets": "430,514,598,694,796,898,992,3969" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values-night/colors.xml", + "from": { + "startLines": "7,4,3,6,5", + "startColumns": "4,4,4,4,4", + "startOffsets": "361,180,113,302,245", + "endColumns": "61,64,66,58,56", + "endOffsets": "418,240,175,356,297" + }, + "to": { + "startLines": "2,3,4,5,6", + "startColumns": "4,4,4,4,4", + "startOffsets": "55,117,182,249,308", + "endColumns": "61,64,66,58,56", + "endOffsets": "112,177,244,303,360" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-night-v8/values-night-v8.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,130,241,330,431,538,645,744,851,954,1081,1169,1293,1395,1497,1613,1715,1829,1957,2073,2195,2331,2451,2585,2705,2817,2943,3060,3184,3314,3436,3574,3708,3824", + "endColumns": "74,110,88,100,106,106,98,106,102,126,87,123,101,101,115,101,113,127,115,121,135,119,133,119,111,125,116,123,129,121,137,133,115,119", + "endOffsets": "125,236,325,426,533,640,739,846,949,1076,1164,1288,1390,1492,1608,1710,1824,1952,2068,2190,2326,2446,2580,2700,2812,2938,3055,3179,3309,3431,3569,3703,3819,3939" + }, + "to": { + "startLines": "14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,41,42,43,44,45,46,47,48", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "997,1072,1183,1272,1373,1480,1587,1686,1793,1896,2023,2111,2235,2337,2439,2555,2657,2771,2899,3015,3137,3273,3393,3527,3647,3759,3974,4091,4215,4345,4467,4605,4739,4855", + "endColumns": "74,110,88,100,106,106,98,106,102,126,87,123,101,101,115,101,113,127,115,121,135,119,133,119,111,125,116,123,129,121,137,133,115,119", + "endOffsets": "1067,1178,1267,1368,1475,1582,1681,1788,1891,2018,2106,2230,2332,2434,2550,2652,2766,2894,3010,3132,3268,3388,3522,3642,3754,3880,4086,4210,4340,4462,4600,4734,4850,4970" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-af_values-af.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-af/values-af.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,274,355,435,513,608,696,796,910,991,1051,1115,1203,1269,1332,1418,1480,1541,1599,1665,1728,1783,1901,1958,2020,2075,2144,2263,2351,2426,2519,2604,2687,2826,2909,2990,3118,3205,3282,3340,3391,3457,3526,3602,3673,3749,3823,3902,3975,4046,4149,4236,4307,4396,4486,4558,4633,4720,4771,4850,4917,4998,5082,5144,5208,5271,5341,5445,5548,5644,5744,5806,5861,5938,6021,6097", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,80,79,77,94,87,99,113,80,59,63,87,65,62,85,61,60,57,65,62,54,117,56,61,54,68,118,87,74,92,84,82,138,82,80,127,86,76,57,50,65,68,75,70,75,73,78,72,70,102,86,70,88,89,71,74,86,50,78,66,80,83,61,63,62,69,103,102,95,99,61,54,76,82,75,72", + "endOffsets": "269,350,430,508,603,691,791,905,986,1046,1110,1198,1264,1327,1413,1475,1536,1594,1660,1723,1778,1896,1953,2015,2070,2139,2258,2346,2421,2514,2599,2682,2821,2904,2985,3113,3200,3277,3335,3386,3452,3521,3597,3668,3744,3818,3897,3970,4041,4144,4231,4302,4391,4481,4553,4628,4715,4766,4845,4912,4993,5077,5139,5203,5266,5336,5440,5543,5639,5739,5801,5856,5933,6016,6092,6165" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2996,3077,3157,3235,3330,4150,4250,4364,6641,6701,6765,6853,6919,6982,7068,7130,7191,7249,7315,7378,7433,7551,7608,7670,7725,7794,7913,8001,8076,8169,8254,8337,8476,8559,8640,8768,8855,8932,8990,9041,9107,9176,9252,9323,9399,9473,9552,9625,9696,9799,9886,9957,10046,10136,10208,10283,10370,10421,10500,10567,10648,10732,10794,10858,10921,10991,11095,11198,11294,11394,11456,11511,11669,11752,11828", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,80,79,77,94,87,99,113,80,59,63,87,65,62,85,61,60,57,65,62,54,117,56,61,54,68,118,87,74,92,84,82,138,82,80,127,86,76,57,50,65,68,75,70,75,73,78,72,70,102,86,70,88,89,71,74,86,50,78,66,80,83,61,63,62,69,103,102,95,99,61,54,76,82,75,72", + "endOffsets": "319,3072,3152,3230,3325,3413,4245,4359,4440,6696,6760,6848,6914,6977,7063,7125,7186,7244,7310,7373,7428,7546,7603,7665,7720,7789,7908,7996,8071,8164,8249,8332,8471,8554,8635,8763,8850,8927,8985,9036,9102,9171,9247,9318,9394,9468,9547,9620,9691,9794,9881,9952,10041,10131,10203,10278,10365,10416,10495,10562,10643,10727,10789,10853,10916,10986,11090,11193,11289,11389,11451,11506,11583,11747,11823,11896" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-af/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "138", + "endOffsets": "333" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5439", + "endColumns": "142", + "endOffsets": "5577" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-af/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,448,570,676,822,940,1057,1155,1317,1421,1574,1697,1832,1982,2044,2103", + "endColumns": "102,151,121,105,145,117,116,97,161,103,152,122,134,149,61,58,74", + "endOffsets": "295,447,569,675,821,939,1056,1154,1316,1420,1573,1696,1831,1981,2043,2102,2177" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4445,4552,4708,4834,4944,5094,5216,5337,5582,5748,5856,6013,6140,6279,6433,6499,6562", + "endColumns": "106,155,125,109,149,121,120,101,165,107,156,126,138,153,65,62,78", + "endOffsets": "4547,4703,4829,4939,5089,5211,5332,5434,5743,5851,6008,6135,6274,6428,6494,6557,6636" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-af/values-af.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,353,451,558,667,787", + "endColumns": "97,101,97,97,106,108,119,100", + "endOffsets": "148,250,348,446,553,662,782,883" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3418,3516,3618,3716,3814,3921,4030,11901", + "endColumns": "97,101,97,97,106,108,119,100", + "endOffsets": "3511,3613,3711,3809,3916,4025,4145,11997" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-af/values-af.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,309,415,500,603,721,798,874,965,1058,1153,1247,1346,1439,1534,1633,1728,1822,1903,2010,2115,2212,2320,2423,2525,2679,2777", + "endColumns": "107,95,105,84,102,117,76,75,90,92,94,93,98,92,94,98,94,93,80,106,104,96,107,102,101,153,97,80", + "endOffsets": "208,304,410,495,598,716,793,869,960,1053,1148,1242,1341,1434,1529,1628,1723,1817,1898,2005,2110,2207,2315,2418,2520,2674,2772,2853" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "324,432,528,634,719,822,940,1017,1093,1184,1277,1372,1466,1565,1658,1753,1852,1947,2041,2122,2229,2334,2431,2539,2642,2744,2898,11588", + "endColumns": "107,95,105,84,102,117,76,75,90,92,94,93,98,92,94,98,94,93,80,106,104,96,107,102,101,153,97,80", + "endOffsets": "427,523,629,714,817,935,1012,1088,1179,1272,1367,1461,1560,1653,1748,1847,1942,2036,2117,2224,2329,2426,2534,2637,2739,2893,2991,11664" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-ar_values-ar.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ar/values-ar.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,148,250,345,448,551,653,767", + "endColumns": "92,101,94,102,102,101,113,100", + "endOffsets": "143,245,340,443,546,648,762,863" + }, + "to": { + "startLines": "42,43,44,45,46,47,48,138", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3582,3675,3777,3872,3975,4078,4180,12092", + "endColumns": "92,101,94,102,102,101,113,100", + "endOffsets": "3670,3772,3867,3970,4073,4175,4289,12188" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ar/values-ar.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,317,424,506,607,721,801,880,971,1064,1156,1250,1350,1443,1538,1631,1722,1816,1895,2000,2098,2196,2304,2404,2507,2662,2759", + "endColumns": "107,103,106,81,100,113,79,78,90,92,91,93,99,92,94,92,90,93,78,104,97,97,107,99,102,154,96,81", + "endOffsets": "208,312,419,501,602,716,796,875,966,1059,1151,1245,1345,1438,1533,1626,1717,1811,1890,1995,2093,2191,2299,2399,2502,2657,2754,2836" + }, + "to": { + "startLines": "10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,134", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "515,623,727,834,916,1017,1131,1211,1290,1381,1474,1566,1660,1760,1853,1948,2041,2132,2226,2305,2410,2508,2606,2714,2814,2917,3072,11780", + "endColumns": "107,103,106,81,100,113,79,78,90,92,91,93,99,92,94,92,90,93,78,104,97,97,107,99,102,154,96,81", + "endOffsets": "618,722,829,911,1012,1126,1206,1285,1376,1469,1561,1655,1755,1848,1943,2036,2127,2221,2300,2405,2503,2601,2709,2809,2912,3067,3164,11857" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ar/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "125", + "endOffsets": "320" + }, + "to": { + "startLines": "60", + "startColumns": "4", + "startOffsets": "5545", + "endColumns": "129", + "endOffsets": "5670" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ar/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,293,433,551,652,786,910,1017,1115,1248,1348,1494,1612,1747,1889,1949,2011", + "endColumns": "99,139,117,100,133,123,106,97,132,99,145,117,134,141,59,61,79", + "endOffsets": "292,432,550,651,785,909,1016,1114,1247,1347,1493,1611,1746,1888,1948,2010,2090" + }, + "to": { + "startLines": "52,53,54,55,56,57,58,59,61,62,63,64,65,66,67,68,69", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4591,4695,4839,4961,5066,5204,5332,5443,5675,5812,5916,6066,6188,6327,6473,6537,6603", + "endColumns": "103,143,121,104,137,127,110,101,136,103,149,121,138,145,63,65,83", + "endOffsets": "4690,4834,4956,5061,5199,5327,5438,5540,5807,5911,6061,6183,6322,6468,6532,6598,6682" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ar/values-ar.xml", + "from": { + "startLines": "2,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,465,543,619,703,795,878,979,1098,1175,1234,1297,1388,1457,1524,1624,1687,1752,1813,1881,1943,2001,2115,2175,2236,2293,2366,2489,2570,2662,2769,2867,2947,3095,3176,3257,3385,3474,3550,3603,3657,3723,3801,3881,3952,4034,4106,4180,4253,4323,4432,4523,4594,4684,4779,4853,4936,5029,5078,5159,5228,5314,5399,5461,5525,5588,5657,5766,5876,5973,6073,6130,6188,6268,6347,6422", + "endLines": "9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84", + "endColumns": "12,77,75,83,91,82,100,118,76,58,62,90,68,66,99,62,64,60,67,61,57,113,59,60,56,72,122,80,91,106,97,79,147,80,80,127,88,75,52,53,65,77,79,70,81,71,73,72,69,108,90,70,89,94,73,82,92,48,80,68,85,84,61,63,62,68,108,109,96,99,56,57,79,78,74,75", + "endOffsets": "460,538,614,698,790,873,974,1093,1170,1229,1292,1383,1452,1519,1619,1682,1747,1808,1876,1938,1996,2110,2170,2231,2288,2361,2484,2565,2657,2764,2862,2942,3090,3171,3252,3380,3469,3545,3598,3652,3718,3796,3876,3947,4029,4101,4175,4248,4318,4427,4518,4589,4679,4774,4848,4931,5024,5073,5154,5223,5309,5394,5456,5520,5583,5652,5761,5871,5968,6068,6125,6183,6263,6342,6417,6493" + }, + "to": { + "startLines": "2,37,38,39,40,41,49,50,51,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,135,136,137", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3169,3247,3323,3407,3499,4294,4395,4514,6687,6746,6809,6900,6969,7036,7136,7199,7264,7325,7393,7455,7513,7627,7687,7748,7805,7878,8001,8082,8174,8281,8379,8459,8607,8688,8769,8897,8986,9062,9115,9169,9235,9313,9393,9464,9546,9618,9692,9765,9835,9944,10035,10106,10196,10291,10365,10448,10541,10590,10671,10740,10826,10911,10973,11037,11100,11169,11278,11388,11485,11585,11642,11700,11862,11941,12016", + "endLines": "9,37,38,39,40,41,49,50,51,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,135,136,137", + "endColumns": "12,77,75,83,91,82,100,118,76,58,62,90,68,66,99,62,64,60,67,61,57,113,59,60,56,72,122,80,91,106,97,79,147,80,80,127,88,75,52,53,65,77,79,70,81,71,73,72,69,108,90,70,89,94,73,82,92,48,80,68,85,84,61,63,62,68,108,109,96,99,56,57,79,78,74,75", + "endOffsets": "510,3242,3318,3402,3494,3577,4390,4509,4586,6741,6804,6895,6964,7031,7131,7194,7259,7320,7388,7450,7508,7622,7682,7743,7800,7873,7996,8077,8169,8276,8374,8454,8602,8683,8764,8892,8981,9057,9110,9164,9230,9308,9388,9459,9541,9613,9687,9760,9830,9939,10030,10101,10191,10286,10360,10443,10536,10585,10666,10735,10821,10906,10968,11032,11095,11164,11273,11383,11480,11580,11637,11695,11775,11936,12011,12087" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-my_values-my.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-my/values-my.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,158,262,365,467,572,678,797", + "endColumns": "102,103,102,101,104,105,118,100", + "endOffsets": "153,257,360,462,567,673,792,893" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3547,3650,3754,3857,3959,4064,4170,12388", + "endColumns": "102,103,102,101,104,105,118,100", + "endOffsets": "3645,3749,3852,3954,4059,4165,4284,12484" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-my/values-my.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,285,386,485,561,652,736,842,971,1056,1119,1184,1274,1349,1408,1499,1562,1627,1686,1757,1819,1876,1995,2053,2114,2169,2242,2374,2465,2549,2649,2735,2824,2965,3043,3120,3243,3335,3412,3470,3521,3587,3659,3741,3812,3890,3965,4039,4111,4190,4298,4395,4476,4562,4654,4728,4807,4893,4947,5023,5091,5174,5255,5317,5381,5444,5512,5624,5735,5839,5952,6013,6068,6150,6237,6317", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,100,98,75,90,83,105,128,84,62,64,89,74,58,90,62,64,58,70,61,56,118,57,60,54,72,131,90,83,99,85,88,140,77,76,122,91,76,57,50,65,71,81,70,77,74,73,71,78,107,96,80,85,91,73,78,85,53,75,67,82,80,61,63,62,67,111,110,103,112,60,54,81,86,79,77", + "endOffsets": "280,381,480,556,647,731,837,966,1051,1114,1179,1269,1344,1403,1494,1557,1622,1681,1752,1814,1871,1990,2048,2109,2164,2237,2369,2460,2544,2644,2730,2819,2960,3038,3115,3238,3330,3407,3465,3516,3582,3654,3736,3807,3885,3960,4034,4106,4185,4293,4390,4471,4557,4649,4723,4802,4888,4942,5018,5086,5169,5250,5312,5376,5439,5507,5619,5730,5834,5947,6008,6063,6145,6232,6312,6390" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3096,3197,3296,3372,3463,4289,4395,4524,6963,7026,7091,7181,7256,7315,7406,7469,7534,7593,7664,7726,7783,7902,7960,8021,8076,8149,8281,8372,8456,8556,8642,8731,8872,8950,9027,9150,9242,9319,9377,9428,9494,9566,9648,9719,9797,9872,9946,10018,10097,10205,10302,10383,10469,10561,10635,10714,10800,10854,10930,10998,11081,11162,11224,11288,11351,11419,11531,11642,11746,11859,11920,11975,12143,12230,12310", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,100,98,75,90,83,105,128,84,62,64,89,74,58,90,62,64,58,70,61,56,118,57,60,54,72,131,90,83,99,85,88,140,77,76,122,91,76,57,50,65,71,81,70,77,74,73,71,78,107,96,80,85,91,73,78,85,53,75,67,82,80,61,63,62,67,111,110,103,112,60,54,81,86,79,77", + "endOffsets": "330,3192,3291,3367,3458,3542,4390,4519,4604,7021,7086,7176,7251,7310,7401,7464,7529,7588,7659,7721,7778,7897,7955,8016,8071,8144,8276,8367,8451,8551,8637,8726,8867,8945,9022,9145,9237,9314,9372,9423,9489,9561,9643,9714,9792,9867,9941,10013,10092,10200,10297,10378,10464,10556,10630,10709,10795,10849,10925,10993,11076,11157,11219,11283,11346,11414,11526,11637,11741,11854,11915,11970,12052,12225,12305,12383" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-my/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,456,586,693,836,964,1083,1189,1361,1463,1629,1768,1922,2105,2171,2240", + "endColumns": "102,159,129,106,142,127,118,105,171,101,165,138,153,182,65,68,84", + "endOffsets": "295,455,585,692,835,963,1082,1188,1360,1462,1628,1767,1921,2104,2170,2239,2324" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4609,4716,4880,5014,5125,5272,5404,5527,5791,5967,6073,6243,6386,6544,6731,6801,6874", + "endColumns": "106,163,133,110,146,131,122,109,175,105,169,142,157,186,69,72,88", + "endOffsets": "4711,4875,5009,5120,5267,5399,5522,5632,5962,6068,6238,6381,6539,6726,6796,6869,6958" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-my/values-my.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,218,325,441,528,637,760,839,917,1008,1101,1196,1290,1390,1483,1578,1672,1763,1854,1939,2054,2163,2262,2388,2495,2603,2763,2866", + "endColumns": "112,106,115,86,108,122,78,77,90,92,94,93,99,92,94,93,90,90,84,114,108,98,125,106,107,159,102,85", + "endOffsets": "213,320,436,523,632,755,834,912,1003,1096,1191,1285,1385,1478,1573,1667,1758,1849,1934,2049,2158,2257,2383,2490,2598,2758,2861,2947" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "335,448,555,671,758,867,990,1069,1147,1238,1331,1426,1520,1620,1713,1808,1902,1993,2084,2169,2284,2393,2492,2618,2725,2833,2993,12057", + "endColumns": "112,106,115,86,108,122,78,77,90,92,94,93,99,92,94,93,90,90,84,114,108,98,125,106,107,159,102,85", + "endOffsets": "443,550,666,753,862,985,1064,1142,1233,1326,1421,1515,1615,1708,1803,1897,1988,2079,2164,2279,2388,2487,2613,2720,2828,2988,3091,12138" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-my/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "149", + "endOffsets": "344" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5637", + "endColumns": "153", + "endOffsets": "5786" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-watch-v20_values-watch-v20.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-watch-v20/values-watch-v20.xml", + "from": { + "startLines": "2,5,8", + "startColumns": "4,4,4", + "startOffsets": "55,214,385", + "endLines": "4,7,10", + "endColumns": "12,12,12", + "endOffsets": "209,380,553" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-v26_values-v26.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v26/values-v26.xml", + "from": { + "startLines": "2,3,4,8,12,16", + "startColumns": "4,4,4,4,4,4", + "startOffsets": "55,130,217,381,557,796", + "endLines": "2,3,7,11,15,16", + "endColumns": "74,86,12,12,12,92", + "endOffsets": "125,212,376,552,791,884" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-pa_values-pa.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-pa/values-pa.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,358,459,561,659,788", + "endColumns": "97,101,102,100,101,97,128,100", + "endOffsets": "148,250,353,454,556,654,783,884" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3400,3498,3600,3703,3804,3906,4004,11984", + "endColumns": "97,101,102,100,101,97,128,100", + "endOffsets": "3493,3595,3698,3799,3901,3999,4128,12080" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-pa/values-pa.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,208,305,410,496,596,709,787,864,955,1048,1142,1236,1336,1429,1524,1618,1709,1800,1879,1989,2092,2188,2299,2401,2511,2670,2767", + "endColumns": "102,96,104,85,99,112,77,76,90,92,93,93,99,92,94,93,90,90,78,109,102,95,110,101,109,158,96,79", + "endOffsets": "203,300,405,491,591,704,782,859,950,1043,1137,1231,1331,1424,1519,1613,1704,1795,1874,1984,2087,2183,2294,2396,2506,2665,2762,2842" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "313,416,513,618,704,804,917,995,1072,1163,1256,1350,1444,1544,1637,1732,1826,1917,2008,2087,2197,2300,2396,2507,2609,2719,2878,11670", + "endColumns": "102,96,104,85,99,112,77,76,90,92,93,93,99,92,94,93,90,90,78,109,102,95,110,101,109,158,96,79", + "endOffsets": "411,508,613,699,799,912,990,1067,1158,1251,1345,1439,1539,1632,1727,1821,1912,2003,2082,2192,2295,2391,2502,2604,2714,2873,2970,11745" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-pa/values-pa.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,263,340,419,500,599,688,796,908,991,1047,1111,1203,1272,1331,1416,1479,1541,1599,1663,1724,1778,1892,1950,2010,2064,2134,2261,2342,2432,2531,2628,2707,2842,2918,2995,3124,3208,3290,3345,3400,3466,3535,3612,3683,3762,3830,3906,3976,4041,4143,4238,4311,4405,4498,4572,4641,4735,4791,4874,4941,5025,5113,5175,5239,5302,5369,5466,5572,5663,5765,5824,5883,5960,6045,6121", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,76,78,80,98,88,107,111,82,55,63,91,68,58,84,62,61,57,63,60,53,113,57,59,53,69,126,80,89,98,96,78,134,75,76,128,83,81,54,54,65,68,76,70,78,67,75,69,64,101,94,72,93,92,73,68,93,55,82,66,83,87,61,63,62,66,96,105,90,101,58,58,76,84,75,72", + "endOffsets": "258,335,414,495,594,683,791,903,986,1042,1106,1198,1267,1326,1411,1474,1536,1594,1658,1719,1773,1887,1945,2005,2059,2129,2256,2337,2427,2526,2623,2702,2837,2913,2990,3119,3203,3285,3340,3395,3461,3530,3607,3678,3757,3825,3901,3971,4036,4138,4233,4306,4400,4493,4567,4636,4730,4786,4869,4936,5020,5108,5170,5234,5297,5364,5461,5567,5658,5760,5819,5878,5955,6040,6116,6189" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2975,3052,3131,3212,3311,4133,4241,4353,6701,6757,6821,6913,6982,7041,7126,7189,7251,7309,7373,7434,7488,7602,7660,7720,7774,7844,7971,8052,8142,8241,8338,8417,8552,8628,8705,8834,8918,9000,9055,9110,9176,9245,9322,9393,9472,9540,9616,9686,9751,9853,9948,10021,10115,10208,10282,10351,10445,10501,10584,10651,10735,10823,10885,10949,11012,11079,11176,11282,11373,11475,11534,11593,11750,11835,11911", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,76,78,80,98,88,107,111,82,55,63,91,68,58,84,62,61,57,63,60,53,113,57,59,53,69,126,80,89,98,96,78,134,75,76,128,83,81,54,54,65,68,76,70,78,67,75,69,64,101,94,72,93,92,73,68,93,55,82,66,83,87,61,63,62,66,96,105,90,101,58,58,76,84,75,72", + "endOffsets": "308,3047,3126,3207,3306,3395,4236,4348,4431,6752,6816,6908,6977,7036,7121,7184,7246,7304,7368,7429,7483,7597,7655,7715,7769,7839,7966,8047,8137,8236,8333,8412,8547,8623,8700,8829,8913,8995,9050,9105,9171,9240,9317,9388,9467,9535,9611,9681,9746,9848,9943,10016,10110,10203,10277,10346,10440,10496,10579,10646,10730,10818,10880,10944,11007,11074,11171,11277,11368,11470,11529,11588,11665,11830,11906,11979" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-pa/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "146", + "endOffsets": "341" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5447", + "endColumns": "150", + "endOffsets": "5593" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-pa/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,465,591,696,839,964,1073,1172,1330,1435,1604,1732,1881,2038,2099,2161", + "endColumns": "102,168,125,104,142,124,108,98,157,104,168,127,148,156,60,61,77", + "endOffsets": "295,464,590,695,838,963,1072,1171,1329,1434,1603,1731,1880,2037,2098,2160,2238" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4436,4543,4716,4846,4955,5102,5231,5344,5598,5760,5869,6042,6174,6327,6488,6553,6619", + "endColumns": "106,172,129,108,146,128,112,102,161,108,172,131,152,160,64,65,81", + "endOffsets": "4538,4711,4841,4950,5097,5226,5339,5442,5755,5864,6037,6169,6322,6483,6548,6614,6696" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-kk_values-kk.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-kk/values-kk.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,150,252,354,457,561,658,769", + "endColumns": "94,101,101,102,103,96,110,100", + "endOffsets": "145,247,349,452,556,653,764,865" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3429,3524,3626,3728,3831,3935,4032,12036", + "endColumns": "94,101,101,102,103,96,110,100", + "endOffsets": "3519,3621,3723,3826,3930,4027,4138,12132" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-kk/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,292,441,563,665,801,923,1042,1147,1308,1410,1563,1688,1837,1990,2049,2104", + "endColumns": "98,148,121,101,135,121,118,104,160,101,152,124,148,152,58,54,73", + "endOffsets": "291,440,562,664,800,922,1041,1146,1307,1409,1562,1687,1836,1989,2048,2103,2177" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4429,4532,4685,4811,4917,5057,5183,5306,5579,5744,5850,6007,6136,6289,6446,6509,6568", + "endColumns": "102,152,125,105,139,125,122,108,164,105,156,128,152,156,62,58,77", + "endOffsets": "4527,4680,4806,4912,5052,5178,5301,5410,5739,5845,6002,6131,6284,6441,6504,6563,6641" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-kk/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "159", + "endOffsets": "354" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5415", + "endColumns": "163", + "endOffsets": "5574" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-kk/values-kk.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,318,428,513,619,738,818,895,986,1079,1174,1268,1368,1461,1556,1653,1744,1835,1916,2021,2124,2222,2329,2435,2535,2701,2796", + "endColumns": "107,104,109,84,105,118,79,76,90,92,94,93,99,92,94,96,90,90,80,104,102,97,106,105,99,165,94,81", + "endOffsets": "208,313,423,508,614,733,813,890,981,1074,1169,1263,1363,1456,1551,1648,1739,1830,1911,2016,2119,2217,2324,2430,2530,2696,2791,2873" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "323,431,536,646,731,837,956,1036,1113,1204,1297,1392,1486,1586,1679,1774,1871,1962,2053,2134,2239,2342,2440,2547,2653,2753,2919,11715", + "endColumns": "107,104,109,84,105,118,79,76,90,92,94,93,99,92,94,96,90,90,80,104,102,97,106,105,99,165,94,81", + "endOffsets": "426,531,641,726,832,951,1031,1108,1199,1292,1387,1481,1581,1674,1769,1866,1957,2048,2129,2234,2337,2435,2542,2648,2748,2914,3009,11792" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-kk/values-kk.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,273,351,427,506,600,688,780,892,974,1034,1098,1193,1263,1326,1433,1498,1565,1626,1693,1755,1809,1923,1982,2043,2097,2172,2298,2386,2472,2573,2663,2753,2895,2967,3040,3177,3266,3347,3404,3460,3526,3597,3674,3745,3825,3897,3973,4054,4124,4224,4311,4383,4474,4567,4641,4716,4808,4860,4942,5008,5092,5178,5240,5304,5367,5436,5540,5644,5738,5838,5899,5959,6043,6127,6203", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,77,75,78,93,87,91,111,81,59,63,94,69,62,106,64,66,60,66,61,53,113,58,60,53,74,125,87,85,100,89,89,141,71,72,136,88,80,56,55,65,70,76,70,79,71,75,80,69,99,86,71,90,92,73,74,91,51,81,65,83,85,61,63,62,68,103,103,93,99,60,59,83,83,75,78", + "endOffsets": "268,346,422,501,595,683,775,887,969,1029,1093,1188,1258,1321,1428,1493,1560,1621,1688,1750,1804,1918,1977,2038,2092,2167,2293,2381,2467,2568,2658,2748,2890,2962,3035,3172,3261,3342,3399,3455,3521,3592,3669,3740,3820,3892,3968,4049,4119,4219,4306,4378,4469,4562,4636,4711,4803,4855,4937,5003,5087,5173,5235,5299,5362,5431,5535,5639,5733,5833,5894,5954,6038,6122,6198,6277" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3014,3092,3168,3247,3341,4143,4235,4347,6646,6706,6770,6865,6935,6998,7105,7170,7237,7298,7365,7427,7481,7595,7654,7715,7769,7844,7970,8058,8144,8245,8335,8425,8567,8639,8712,8849,8938,9019,9076,9132,9198,9269,9346,9417,9497,9569,9645,9726,9796,9896,9983,10055,10146,10239,10313,10388,10480,10532,10614,10680,10764,10850,10912,10976,11039,11108,11212,11316,11410,11510,11571,11631,11797,11881,11957", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,77,75,78,93,87,91,111,81,59,63,94,69,62,106,64,66,60,66,61,53,113,58,60,53,74,125,87,85,100,89,89,141,71,72,136,88,80,56,55,65,70,76,70,79,71,75,80,69,99,86,71,90,92,73,74,91,51,81,65,83,85,61,63,62,68,103,103,93,99,60,59,83,83,75,78", + "endOffsets": "318,3087,3163,3242,3336,3424,4230,4342,4424,6701,6765,6860,6930,6993,7100,7165,7232,7293,7360,7422,7476,7590,7649,7710,7764,7839,7965,8053,8139,8240,8330,8420,8562,8634,8707,8844,8933,9014,9071,9127,9193,9264,9341,9412,9492,9564,9640,9721,9791,9891,9978,10050,10141,10234,10308,10383,10475,10527,10609,10675,10759,10845,10907,10971,11034,11103,11207,11311,11405,11505,11566,11626,11710,11876,11952,12031" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-v28_values-v28.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-v28/values-v28.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,153,249,344,441,529,617,705,793,880,967,1054,1141", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,17", + "endColumns": "97,95,94,96,87,87,87,87,86,86,86,86,10", + "endOffsets": "148,244,339,436,524,612,700,788,875,962,1049,1136,1423" + }, + "to": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,24", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,153,249,344,441,529,617,705,793,880,967,1054,1675", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,27", + "endColumns": "97,95,94,96,87,87,87,87,86,86,86,86,10", + "endOffsets": "148,244,339,436,524,612,700,788,875,962,1049,1136,1957" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v28/values-v28.xml", + "from": { + "startLines": "2,3,4,8", + "startColumns": "4,4,4,4", + "startOffsets": "55,130,217,397", + "endLines": "2,3,7,11", + "endColumns": "74,86,12,12", + "endOffsets": "125,212,392,584" + }, + "to": { + "startLines": "14,15,16,20", + "startColumns": "4,4,4,4", + "startOffsets": "1141,1216,1303,1483", + "endLines": "14,15,19,23", + "endColumns": "74,86,12,12", + "endOffsets": "1211,1298,1478,1670" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-port_values-port.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-port/values-port.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "55", + "endOffsets": "106" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-v24_values-v24.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v24/values-v24.xml", + "from": { + "startLines": "2,3", + "startColumns": "4,4", + "startOffsets": "55,212", + "endColumns": "156,134", + "endOffsets": "207,342" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-v24/values-v24.xml", + "from": { + "startLines": "2,3,4,5,6,9,12,15", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,140,239,326,427,626,839,1040", + "endLines": "2,3,4,5,8,11,14,17", + "endColumns": "84,98,86,100,10,10,10,10", + "endOffsets": "135,234,321,422,621,834,1035,1250" + }, + "to": { + "startLines": "4,5,6,7,8,11,14,17", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "347,432,531,618,719,918,1131,1332", + "endLines": "4,5,6,7,10,13,16,19", + "endColumns": "84,98,86,100,10,10,10,10", + "endOffsets": "427,526,613,714,913,1126,1327,1542" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-zh-rTW_values-zh-rTW.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-zh-rTW/values-zh-rTW.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,247,311,373,440,510,587,681,788,861,912,974,1052,1112,1172,1250,1311,1369,1425,1485,1543,1597,1682,1738,1796,1850,1915,2007,2081,2153,2235,2309,2386,2506,2569,2632,2731,2808,2882,2932,2983,3049,3112,3180,3251,3322,3383,3454,3521,3583,3670,3749,3814,3897,3982,4056,4120,4196,4244,4317,4381,4457,4535,4597,4661,4724,4790,4870,4948,5024,5103,5157,5212,5281,5356,5429", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,63,61,66,69,76,93,106,72,50,61,77,59,59,77,60,57,55,59,57,53,84,55,57,53,64,91,73,71,81,73,76,119,62,62,98,76,73,49,50,65,62,67,70,70,60,70,66,61,86,78,64,82,84,73,63,75,47,72,63,75,77,61,63,62,65,79,77,75,78,53,54,68,74,72,69", + "endOffsets": "242,306,368,435,505,582,676,783,856,907,969,1047,1107,1167,1245,1306,1364,1420,1480,1538,1592,1677,1733,1791,1845,1910,2002,2076,2148,2230,2304,2381,2501,2564,2627,2726,2803,2877,2927,2978,3044,3107,3175,3246,3317,3378,3449,3516,3578,3665,3744,3809,3892,3977,4051,4115,4191,4239,4312,4376,4452,4530,4592,4656,4719,4785,4865,4943,5019,5098,5152,5207,5276,5351,5424,5494" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2863,2927,2989,3056,3126,3864,3958,4065,5957,6008,6070,6148,6208,6268,6346,6407,6465,6521,6581,6639,6693,6778,6834,6892,6946,7011,7103,7177,7249,7331,7405,7482,7602,7665,7728,7827,7904,7978,8028,8079,8145,8208,8276,8347,8418,8479,8550,8617,8679,8766,8845,8910,8993,9078,9152,9216,9292,9340,9413,9477,9553,9631,9693,9757,9820,9886,9966,10044,10120,10199,10253,10308,10456,10531,10604", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,63,61,66,69,76,93,106,72,50,61,77,59,59,77,60,57,55,59,57,53,84,55,57,53,64,91,73,71,81,73,76,119,62,62,98,76,73,49,50,65,62,67,70,70,60,70,66,61,86,78,64,82,84,73,63,75,47,72,63,75,77,61,63,62,65,79,77,75,78,53,54,68,74,72,69", + "endOffsets": "292,2922,2984,3051,3121,3198,3953,4060,4133,6003,6065,6143,6203,6263,6341,6402,6460,6516,6576,6634,6688,6773,6829,6887,6941,7006,7098,7172,7244,7326,7400,7477,7597,7660,7723,7822,7899,7973,8023,8074,8140,8203,8271,8342,8413,8474,8545,8612,8674,8761,8840,8905,8988,9073,9147,9211,9287,9335,9408,9472,9548,9626,9688,9752,9815,9881,9961,10039,10115,10194,10248,10303,10372,10526,10599,10669" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-zh-rTW/values-zh-rTW.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,200,293,393,475,572,680,757,832,924,1018,1115,1211,1306,1400,1496,1588,1680,1772,1850,1946,2041,2136,2233,2329,2427,2577,2671", + "endColumns": "94,92,99,81,96,107,76,74,91,93,96,95,94,93,95,91,91,91,77,95,94,94,96,95,97,149,93,78", + "endOffsets": "195,288,388,470,567,675,752,827,919,1013,1110,1206,1301,1395,1491,1583,1675,1767,1845,1941,2036,2131,2228,2324,2422,2572,2666,2745" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "297,392,485,585,667,764,872,949,1024,1116,1210,1307,1403,1498,1592,1688,1780,1872,1964,2042,2138,2233,2328,2425,2521,2619,2769,10377", + "endColumns": "94,92,99,81,96,107,76,74,91,93,96,95,94,93,95,91,91,91,77,95,94,94,96,95,97,149,93,78", + "endOffsets": "387,480,580,662,759,867,944,1019,1111,1205,1302,1398,1493,1587,1683,1775,1867,1959,2037,2133,2228,2323,2420,2516,2614,2764,2858,10451" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-zh-rTW/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "199", + "endColumns": "98", + "endOffsets": "297" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5002", + "endColumns": "102", + "endOffsets": "5100" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-zh-rTW/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "197,294,418,529,627,730,842,938,1029,1135,1232,1357,1468,1566,1670,1722,1775", + "endColumns": "96,123,110,97,102,111,95,90,105,96,124,110,97,103,51,52,69", + "endOffsets": "293,417,528,626,729,841,937,1028,1134,1231,1356,1467,1565,1669,1721,1774,1844" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4138,4239,4367,4482,4584,4691,4807,4907,5105,5215,5316,5445,5560,5662,5770,5826,5883", + "endColumns": "100,127,114,101,106,115,99,94,109,100,128,114,101,107,55,56,73", + "endOffsets": "4234,4362,4477,4579,4686,4802,4902,4997,5210,5311,5440,5555,5657,5765,5821,5878,5952" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-zh-rTW/values-zh-rTW.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,147,246,340,434,527,620,716", + "endColumns": "91,98,93,93,92,92,95,100", + "endOffsets": "142,241,335,429,522,615,711,812" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3203,3295,3394,3488,3582,3675,3768,10674", + "endColumns": "91,98,93,93,92,92,95,100", + "endOffsets": "3290,3389,3483,3577,3670,3763,3859,10770" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-pt-rPT_values-pt-rPT.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-pt-rPT/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "197,298,457,581,685,849,973,1091,1196,1380,1484,1650,1777,1932,2106,2170,2235", + "endColumns": "100,158,123,103,163,123,117,104,183,103,165,126,154,173,63,64,82", + "endOffsets": "297,456,580,684,848,972,1090,1195,1379,1483,1649,1776,1931,2105,2169,2234,2317" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4528,4633,4796,4924,5032,5200,5328,5450,5704,5892,6000,6170,6301,6460,6638,6706,6775", + "endColumns": "104,162,127,107,167,127,121,108,187,107,169,130,158,177,67,68,86", + "endOffsets": "4628,4791,4919,5027,5195,5323,5445,5554,5887,5995,6165,6296,6455,6633,6701,6770,6857" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-pt-rPT/values-pt-rPT.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,273,354,434,516,615,711,814,934,1015,1075,1139,1231,1310,1375,1465,1529,1597,1659,1732,1796,1850,1976,2034,2096,2150,2226,2369,2456,2536,2635,2721,2803,2942,3024,3106,3242,3329,3409,3465,3516,3582,3657,3737,3808,3887,3960,4037,4106,4180,4287,4380,4457,4550,4648,4722,4803,4902,4955,5039,5105,5194,5282,5344,5408,5471,5539,5655,5763,5870,5972,6032,6087,6173,6256,6335", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,80,79,81,98,95,102,119,80,59,63,91,78,64,89,63,67,61,72,63,53,125,57,61,53,75,142,86,79,98,85,81,138,81,81,135,86,79,55,50,65,74,79,70,78,72,76,68,73,106,92,76,92,97,73,80,98,52,83,65,88,87,61,63,62,67,115,107,106,101,59,54,85,82,78,78", + "endOffsets": "268,349,429,511,610,706,809,929,1010,1070,1134,1226,1305,1370,1460,1524,1592,1654,1727,1791,1845,1971,2029,2091,2145,2221,2364,2451,2531,2630,2716,2798,2937,3019,3101,3237,3324,3404,3460,3511,3577,3652,3732,3803,3882,3955,4032,4101,4175,4282,4375,4452,4545,4643,4717,4798,4897,4950,5034,5100,5189,5277,5339,5403,5466,5534,5650,5758,5865,5967,6027,6082,6168,6251,6330,6409" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3054,3135,3215,3297,3396,4224,4327,4447,6862,6922,6986,7078,7157,7222,7312,7376,7444,7506,7579,7643,7697,7823,7881,7943,7997,8073,8216,8303,8383,8482,8568,8650,8789,8871,8953,9089,9176,9256,9312,9363,9429,9504,9584,9655,9734,9807,9884,9953,10027,10134,10227,10304,10397,10495,10569,10650,10749,10802,10886,10952,11041,11129,11191,11255,11318,11386,11502,11610,11717,11819,11879,11934,12106,12189,12268", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,80,79,81,98,95,102,119,80,59,63,91,78,64,89,63,67,61,72,63,53,125,57,61,53,75,142,86,79,98,85,81,138,81,81,135,86,79,55,50,65,74,79,70,78,72,76,68,73,106,92,76,92,97,73,80,98,52,83,65,88,87,61,63,62,67,115,107,106,101,59,54,85,82,78,78", + "endOffsets": "318,3130,3210,3292,3391,3487,4322,4442,4523,6917,6981,7073,7152,7217,7307,7371,7439,7501,7574,7638,7692,7818,7876,7938,7992,8068,8211,8298,8378,8477,8563,8645,8784,8866,8948,9084,9171,9251,9307,9358,9424,9499,9579,9650,9729,9802,9879,9948,10022,10129,10222,10299,10392,10490,10564,10645,10744,10797,10881,10947,11036,11124,11186,11250,11313,11381,11497,11605,11712,11814,11874,11929,12015,12184,12263,12342" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-pt-rPT/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "199", + "endColumns": "140", + "endOffsets": "339" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5559", + "endColumns": "144", + "endOffsets": "5699" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-pt-rPT/values-pt-rPT.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,319,426,515,616,734,819,899,991,1085,1182,1276,1375,1469,1565,1660,1752,1844,1929,2036,2147,2249,2357,2465,2572,2737,2836", + "endColumns": "107,105,106,88,100,117,84,79,91,93,96,93,98,93,95,94,91,91,84,106,110,101,107,107,106,164,98,85", + "endOffsets": "208,314,421,510,611,729,814,894,986,1080,1177,1271,1370,1464,1560,1655,1747,1839,1924,2031,2142,2244,2352,2460,2567,2732,2831,2917" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "323,431,537,644,733,834,952,1037,1117,1209,1303,1400,1494,1593,1687,1783,1878,1970,2062,2147,2254,2365,2467,2575,2683,2790,2955,12020", + "endColumns": "107,105,106,88,100,117,84,79,91,93,96,93,98,93,95,94,91,91,84,106,110,101,107,107,106,164,98,85", + "endOffsets": "426,532,639,728,829,947,1032,1112,1204,1298,1395,1489,1588,1682,1778,1873,1965,2057,2142,2249,2360,2462,2570,2678,2785,2950,3049,12101" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-pt-rPT/values-pt-rPT.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,353,453,560,666,787", + "endColumns": "96,101,98,99,106,105,120,100", + "endOffsets": "147,249,348,448,555,661,782,883" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3492,3589,3691,3790,3890,3997,4103,12347", + "endColumns": "96,101,98,99,106,105,120,100", + "endOffsets": "3584,3686,3785,3885,3992,4098,4219,12443" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-zu_values-zu.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-zu/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,300,472,603,703,867,992,1112,1218,1374,1480,1641,1768,1922,2075,2132,2197", + "endColumns": "106,171,130,99,163,124,119,105,155,105,160,126,153,152,56,64,80", + "endOffsets": "299,471,602,702,866,991,1111,1217,1373,1479,1640,1767,1921,2074,2131,2196,2277" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4470,4581,4757,4892,4996,5164,5293,5417,5659,5819,5929,6094,6225,6383,6540,6601,6670", + "endColumns": "110,175,134,103,167,128,123,109,159,109,164,130,157,156,60,68,84", + "endOffsets": "4576,4752,4887,4991,5159,5288,5412,5522,5814,5924,6089,6220,6378,6535,6596,6665,6750" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-zu/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "127", + "endOffsets": "322" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5527", + "endColumns": "131", + "endOffsets": "5654" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-zu/values-zu.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,320,432,520,623,738,817,894,985,1078,1173,1267,1367,1460,1555,1649,1740,1833,1914,2018,2121,2219,2326,2433,2538,2695,2791", + "endColumns": "107,106,111,87,102,114,78,76,90,92,94,93,99,92,94,93,90,92,80,103,102,97,106,106,104,156,95,81", + "endOffsets": "208,315,427,515,618,733,812,889,980,1073,1168,1262,1362,1455,1550,1644,1735,1828,1909,2013,2116,2214,2321,2428,2533,2690,2786,2868" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "321,429,536,648,736,839,954,1033,1110,1201,1294,1389,1483,1583,1676,1771,1865,1956,2049,2130,2234,2337,2435,2542,2649,2754,2911,11957", + "endColumns": "107,106,111,87,102,114,78,76,90,92,94,93,99,92,94,93,90,92,80,103,102,97,106,106,104,156,95,81", + "endOffsets": "424,531,643,731,834,949,1028,1105,1196,1289,1384,1478,1578,1671,1766,1860,1951,2044,2125,2229,2332,2430,2537,2644,2749,2906,3002,12034" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-zu/values-zu.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,271,349,426,503,597,685,797,923,1004,1075,1142,1245,1320,1383,1475,1546,1611,1678,1750,1822,1876,1997,2056,2120,2174,2251,2383,2468,2545,2635,2715,2796,2945,3032,3115,3257,3349,3427,3483,3541,3607,3679,3756,3827,3910,3990,4069,4144,4223,4327,4417,4490,4584,4681,4755,4828,4927,4982,5066,5134,5222,5311,5373,5437,5500,5571,5680,5791,5894,6002,6062,6124,6206,6289,6365", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,77,76,76,93,87,111,125,80,70,66,102,74,62,91,70,64,66,71,71,53,120,58,63,53,76,131,84,76,89,79,80,148,86,82,141,91,77,55,57,65,71,76,70,82,79,78,74,78,103,89,72,93,96,73,72,98,54,83,67,87,88,61,63,62,70,108,110,102,107,59,61,81,82,75,82", + "endOffsets": "266,344,421,498,592,680,792,918,999,1070,1137,1240,1315,1378,1470,1541,1606,1673,1745,1817,1871,1992,2051,2115,2169,2246,2378,2463,2540,2630,2710,2791,2940,3027,3110,3252,3344,3422,3478,3536,3602,3674,3751,3822,3905,3985,4064,4139,4218,4322,4412,4485,4579,4676,4750,4823,4922,4977,5061,5129,5217,5306,5368,5432,5495,5566,5675,5786,5889,5997,6057,6119,6201,6284,6360,6443" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3007,3085,3162,3239,3333,4151,4263,4389,6755,6826,6893,6996,7071,7134,7226,7297,7362,7429,7501,7573,7627,7748,7807,7871,7925,8002,8134,8219,8296,8386,8466,8547,8696,8783,8866,9008,9100,9178,9234,9292,9358,9430,9507,9578,9661,9741,9820,9895,9974,10078,10168,10241,10335,10432,10506,10579,10678,10733,10817,10885,10973,11062,11124,11188,11251,11322,11431,11542,11645,11753,11813,11875,12039,12122,12198", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,77,76,76,93,87,111,125,80,70,66,102,74,62,91,70,64,66,71,71,53,120,58,63,53,76,131,84,76,89,79,80,148,86,82,141,91,77,55,57,65,71,76,70,82,79,78,74,78,103,89,72,93,96,73,72,98,54,83,67,87,88,61,63,62,70,108,110,102,107,59,61,81,82,75,82", + "endOffsets": "316,3080,3157,3234,3328,3416,4258,4384,4465,6821,6888,6991,7066,7129,7221,7292,7357,7424,7496,7568,7622,7743,7802,7866,7920,7997,8129,8214,8291,8381,8461,8542,8691,8778,8861,9003,9095,9173,9229,9287,9353,9425,9502,9573,9656,9736,9815,9890,9969,10073,10163,10236,10330,10427,10501,10574,10673,10728,10812,10880,10968,11057,11119,11183,11246,11317,11426,11537,11640,11748,11808,11870,11952,12117,12193,12276" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-zu/values-zu.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,257,356,459,565,672,785", + "endColumns": "97,103,98,102,105,106,112,100", + "endOffsets": "148,252,351,454,560,667,780,881" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3421,3519,3623,3722,3825,3931,4038,12281", + "endColumns": "97,103,98,102,105,106,112,100", + "endOffsets": "3514,3618,3717,3820,3926,4033,4146,12377" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-h480dp-land-v13_values-h480dp-land-v13.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-h480dp-land-v13/values-h480dp-land-v13.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10", + "startColumns": "4,4,4,4,4,4,4,4,4", + "startOffsets": "55,114,170,226,293,358,413,478,547", + "endColumns": "58,55,55,66,64,54,64,68,68", + "endOffsets": "109,165,221,288,353,408,473,542,611" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-ne_values-ne.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ne/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,300,454,584,697,864,996,1102,1203,1379,1489,1649,1778,1922,2070,2132,2200", + "endColumns": "106,153,129,112,166,131,105,100,175,109,159,128,143,147,61,67,87", + "endOffsets": "299,453,583,696,863,995,1101,1202,1378,1488,1648,1777,1921,2069,2131,2199,2287" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4541,4652,4810,4944,5061,5232,5368,5478,5747,5927,6041,6205,6338,6486,6638,6704,6776", + "endColumns": "110,157,133,116,170,135,109,104,179,113,163,132,147,151,65,71,91", + "endOffsets": "4647,4805,4939,5056,5227,5363,5473,5578,5922,6036,6200,6333,6481,6633,6699,6771,6863" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ne/values-ne.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,262,351,439,521,616,705,807,917,1004,1064,1130,1226,1292,1353,1458,1522,1594,1652,1726,1788,1842,1955,2015,2076,2135,2213,2337,2418,2500,2600,2685,2770,2906,2987,3070,3201,3284,3370,3432,3486,3552,3629,3708,3779,3862,3931,4007,4088,4156,4260,4351,4429,4522,4619,4693,4772,4870,4930,5018,5084,5172,5260,5322,5390,5453,5519,5624,5730,5825,5930,5996,6054,6138,6227,6303", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,88,87,81,94,88,101,109,86,59,65,95,65,60,104,63,71,57,73,61,53,112,59,60,58,77,123,80,81,99,84,84,135,80,82,130,82,85,61,53,65,76,78,70,82,68,75,80,67,103,90,77,92,96,73,78,97,59,87,65,87,87,61,67,62,65,104,105,94,104,65,57,83,88,75,72", + "endOffsets": "257,346,434,516,611,700,802,912,999,1059,1125,1221,1287,1348,1453,1517,1589,1647,1721,1783,1837,1950,2010,2071,2130,2208,2332,2413,2495,2595,2680,2765,2901,2982,3065,3196,3279,3365,3427,3481,3547,3624,3703,3774,3857,3926,4002,4083,4151,4255,4346,4424,4517,4614,4688,4767,4865,4925,5013,5079,5167,5255,5317,5385,5448,5514,5619,5725,5820,5925,5991,6049,6133,6222,6298,6371" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3079,3168,3256,3338,3433,4242,4344,4454,6868,6928,6994,7090,7156,7217,7322,7386,7458,7516,7590,7652,7706,7819,7879,7940,7999,8077,8201,8282,8364,8464,8549,8634,8770,8851,8934,9065,9148,9234,9296,9350,9416,9493,9572,9643,9726,9795,9871,9952,10020,10124,10215,10293,10386,10483,10557,10636,10734,10794,10882,10948,11036,11124,11186,11254,11317,11383,11488,11594,11689,11794,11860,11918,12082,12171,12247", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,88,87,81,94,88,101,109,86,59,65,95,65,60,104,63,71,57,73,61,53,112,59,60,58,77,123,80,81,99,84,84,135,80,82,130,82,85,61,53,65,76,78,70,82,68,75,80,67,103,90,77,92,96,73,78,97,59,87,65,87,87,61,67,62,65,104,105,94,104,65,57,83,88,75,72", + "endOffsets": "307,3163,3251,3333,3428,3517,4339,4449,4536,6923,6989,7085,7151,7212,7317,7381,7453,7511,7585,7647,7701,7814,7874,7935,7994,8072,8196,8277,8359,8459,8544,8629,8765,8846,8929,9060,9143,9229,9291,9345,9411,9488,9567,9638,9721,9790,9866,9947,10015,10119,10210,10288,10381,10478,10552,10631,10729,10789,10877,10943,11031,11119,11181,11249,11312,11378,11483,11589,11684,11789,11855,11913,11997,12166,12242,12315" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ne/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "159", + "endOffsets": "354" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5583", + "endColumns": "163", + "endOffsets": "5742" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ne/values-ne.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,158,261,363,469,567,667,775", + "endColumns": "102,102,101,105,97,99,107,100", + "endOffsets": "153,256,358,464,562,662,770,871" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3522,3625,3728,3830,3936,4034,4134,12320", + "endColumns": "102,102,101,105,97,99,107,100", + "endOffsets": "3620,3723,3825,3931,4029,4129,4237,12416" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ne/values-ne.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,214,325,433,524,631,751,835,914,1005,1098,1193,1287,1387,1480,1575,1669,1760,1851,1937,2050,2151,2254,2367,2477,2594,2761,2872", + "endColumns": "108,110,107,90,106,119,83,78,90,92,94,93,99,92,94,93,90,90,85,112,100,102,112,109,116,166,110,79", + "endOffsets": "209,320,428,519,626,746,830,909,1000,1093,1188,1282,1382,1475,1570,1664,1755,1846,1932,2045,2146,2249,2362,2472,2589,2756,2867,2947" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "312,421,532,640,731,838,958,1042,1121,1212,1305,1400,1494,1594,1687,1782,1876,1967,2058,2144,2257,2358,2461,2574,2684,2801,2968,12002", + "endColumns": "108,110,107,90,106,119,83,78,90,92,94,93,99,92,94,93,90,90,85,112,100,102,112,109,116,166,110,79", + "endOffsets": "416,527,635,726,833,953,1037,1116,1207,1300,1395,1489,1589,1682,1777,1871,1962,2053,2139,2252,2353,2456,2569,2679,2796,2963,3074,12077" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-sv_values-sv.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-sv/values-sv.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,150,252,350,449,557,662,783", + "endColumns": "94,101,97,98,107,104,120,100", + "endOffsets": "145,247,345,444,552,657,778,879" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3441,3536,3638,3736,3835,3943,4048,11929", + "endColumns": "94,101,97,98,107,104,120,100", + "endOffsets": "3531,3633,3731,3830,3938,4043,4164,12025" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-sv/values-sv.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,266,365,457,538,640,720,818,940,1019,1078,1141,1233,1297,1357,1449,1514,1577,1639,1706,1770,1824,1929,1988,2049,2103,2172,2291,2374,2451,2541,2625,2709,2845,2924,3008,3130,3216,3294,3348,3399,3465,3534,3608,3679,3755,3827,3904,3975,4049,4160,4251,4330,4417,4505,4577,4651,4736,4787,4866,4933,5014,5098,5160,5224,5287,5355,5462,5561,5660,5755,5813,5868,5946,6027,6106", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,98,91,80,101,79,97,121,78,58,62,91,63,59,91,64,62,61,66,63,53,104,58,60,53,68,118,82,76,89,83,83,135,78,83,121,85,77,53,50,65,68,73,70,75,71,76,70,73,110,90,78,86,87,71,73,84,50,78,66,80,83,61,63,62,67,106,98,98,94,57,54,77,80,78,87", + "endOffsets": "261,360,452,533,635,715,813,935,1014,1073,1136,1228,1292,1352,1444,1509,1572,1634,1701,1765,1819,1924,1983,2044,2098,2167,2286,2369,2446,2536,2620,2704,2840,2919,3003,3125,3211,3289,3343,3394,3460,3529,3603,3674,3750,3822,3899,3970,4044,4155,4246,4325,4412,4500,4572,4646,4731,4782,4861,4928,5009,5093,5155,5219,5282,5350,5457,5556,5655,5750,5808,5863,5941,6022,6101,6189" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2987,3086,3178,3259,3361,4169,4267,4389,6674,6733,6796,6888,6952,7012,7104,7169,7232,7294,7361,7425,7479,7584,7643,7704,7758,7827,7946,8029,8106,8196,8280,8364,8500,8579,8663,8785,8871,8949,9003,9054,9120,9189,9263,9334,9410,9482,9559,9630,9704,9815,9906,9985,10072,10160,10232,10306,10391,10442,10521,10588,10669,10753,10815,10879,10942,11010,11117,11216,11315,11410,11468,11523,11681,11762,11841", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,98,91,80,101,79,97,121,78,58,62,91,63,59,91,64,62,61,66,63,53,104,58,60,53,68,118,82,76,89,83,83,135,78,83,121,85,77,53,50,65,68,73,70,75,71,76,70,73,110,90,78,86,87,71,73,84,50,78,66,80,83,61,63,62,67,106,98,98,94,57,54,77,80,78,87", + "endOffsets": "311,3081,3173,3254,3356,3436,4262,4384,4463,6728,6791,6883,6947,7007,7099,7164,7227,7289,7356,7420,7474,7579,7638,7699,7753,7822,7941,8024,8101,8191,8275,8359,8495,8574,8658,8780,8866,8944,8998,9049,9115,9184,9258,9329,9405,9477,9554,9625,9699,9810,9901,9980,10067,10155,10227,10301,10386,10437,10516,10583,10664,10748,10810,10874,10937,11005,11112,11211,11310,11405,11463,11518,11596,11757,11836,11924" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-sv/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,449,572,678,815,936,1055,1155,1299,1403,1561,1685,1835,1987,2049,2108", + "endColumns": "102,152,122,105,136,120,118,99,143,103,157,123,149,151,61,58,74", + "endOffsets": "295,448,571,677,814,935,1054,1154,1298,1402,1560,1684,1834,1986,2048,2107,2182" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4468,4575,4732,4859,4969,5110,5235,5358,5610,5758,5866,6028,6156,6310,6466,6532,6595", + "endColumns": "106,156,126,109,140,124,122,103,147,107,161,127,153,155,65,62,78", + "endOffsets": "4570,4727,4854,4964,5105,5230,5353,5457,5753,5861,6023,6151,6305,6461,6527,6590,6669" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-sv/values-sv.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,208,311,422,506,606,719,796,871,964,1059,1154,1248,1350,1445,1542,1640,1736,1829,1909,2015,2114,2210,2315,2418,2520,2674,2776", + "endColumns": "102,102,110,83,99,112,76,74,92,94,94,93,101,94,96,97,95,92,79,105,98,95,104,102,101,153,101,79", + "endOffsets": "203,306,417,501,601,714,791,866,959,1054,1149,1243,1345,1440,1537,1635,1731,1824,1904,2010,2109,2205,2310,2413,2515,2669,2771,2851" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "316,419,522,633,717,817,930,1007,1082,1175,1270,1365,1459,1561,1656,1753,1851,1947,2040,2120,2226,2325,2421,2526,2629,2731,2885,11601", + "endColumns": "102,102,110,83,99,112,76,74,92,94,94,93,101,94,96,97,95,92,79,105,98,95,104,102,101,153,101,79", + "endOffsets": "414,517,628,712,812,925,1002,1077,1170,1265,1360,1454,1556,1651,1748,1846,1942,2035,2115,2221,2320,2416,2521,2624,2726,2880,2982,11676" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-sv/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "143", + "endOffsets": "338" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5462", + "endColumns": "147", + "endOffsets": "5605" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-mk_values-mk.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-mk/values-mk.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,317,425,511,619,738,822,903,994,1087,1183,1277,1377,1470,1565,1661,1752,1843,1930,2036,2142,2243,2350,2462,2566,2722,2820", + "endColumns": "107,103,107,85,107,118,83,80,90,92,95,93,99,92,94,95,90,90,86,105,105,100,106,111,103,155,97,87", + "endOffsets": "208,312,420,506,614,733,817,898,989,1082,1178,1272,1372,1465,1560,1656,1747,1838,1925,2031,2137,2238,2345,2457,2561,2717,2815,2903" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "321,429,533,641,727,835,954,1038,1119,1210,1303,1399,1493,1593,1686,1781,1877,1968,2059,2146,2252,2358,2459,2566,2678,2782,2938,11859", + "endColumns": "107,103,107,85,107,118,83,80,90,92,95,93,99,92,94,95,90,90,86,105,105,100,106,111,103,155,97,87", + "endOffsets": "424,528,636,722,830,949,1033,1114,1205,1298,1394,1488,1588,1681,1776,1872,1963,2054,2141,2247,2353,2454,2561,2673,2777,2933,3031,11942" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-mk/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,453,582,688,829,958,1074,1180,1333,1436,1598,1727,1876,2031,2096,2156", + "endColumns": "102,156,128,105,140,128,115,105,152,102,161,128,148,154,64,59,74", + "endOffsets": "295,452,581,687,828,957,1073,1179,1332,1435,1597,1726,1875,2030,2095,2155,2230" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4491,4598,4759,4892,5002,5147,5280,5400,5647,5804,5911,6077,6210,6363,6522,6591,6655", + "endColumns": "106,160,132,109,144,132,119,109,156,106,165,132,152,158,68,63,78", + "endOffsets": "4593,4754,4887,4997,5142,5275,5395,5505,5799,5906,6072,6205,6358,6517,6586,6650,6729" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-mk/values-mk.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,352,450,555,658,774", + "endColumns": "97,101,96,97,104,102,115,100", + "endOffsets": "148,250,347,445,550,653,769,870" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3465,3563,3665,3762,3860,3965,4068,12199", + "endColumns": "97,101,96,97,104,102,115,100", + "endOffsets": "3558,3660,3757,3855,3960,4063,4179,12295" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-mk/values-mk.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,271,352,432,514,611,700,796,920,1007,1070,1136,1227,1297,1361,1464,1527,1592,1652,1720,1783,1838,1966,2023,2085,2140,2215,2355,2442,2521,2614,2700,2783,2916,2998,3083,3229,3316,3393,3447,3502,3568,3641,3717,3788,3866,3939,4015,4090,4160,4269,4357,4432,4524,4616,4690,4764,4856,4909,4991,5058,5141,5228,5290,5354,5417,5487,5601,5716,5818,5930,5988,6047,6132,6221,6305", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,80,79,81,96,88,95,123,86,62,65,90,69,63,102,62,64,59,67,62,54,127,56,61,54,74,139,86,78,92,85,82,132,81,84,145,86,76,53,54,65,72,75,70,77,72,75,74,69,108,87,74,91,91,73,73,91,52,81,66,82,86,61,63,62,69,113,114,101,111,57,58,84,88,83,78", + "endOffsets": "266,347,427,509,606,695,791,915,1002,1065,1131,1222,1292,1356,1459,1522,1587,1647,1715,1778,1833,1961,2018,2080,2135,2210,2350,2437,2516,2609,2695,2778,2911,2993,3078,3224,3311,3388,3442,3497,3563,3636,3712,3783,3861,3934,4010,4085,4155,4264,4352,4427,4519,4611,4685,4759,4851,4904,4986,5053,5136,5223,5285,5349,5412,5482,5596,5711,5813,5925,5983,6042,6127,6216,6300,6379" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3036,3117,3197,3279,3376,4184,4280,4404,6734,6797,6863,6954,7024,7088,7191,7254,7319,7379,7447,7510,7565,7693,7750,7812,7867,7942,8082,8169,8248,8341,8427,8510,8643,8725,8810,8956,9043,9120,9174,9229,9295,9368,9444,9515,9593,9666,9742,9817,9887,9996,10084,10159,10251,10343,10417,10491,10583,10636,10718,10785,10868,10955,11017,11081,11144,11214,11328,11443,11545,11657,11715,11774,11947,12036,12120", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,80,79,81,96,88,95,123,86,62,65,90,69,63,102,62,64,59,67,62,54,127,56,61,54,74,139,86,78,92,85,82,132,81,84,145,86,76,53,54,65,72,75,70,77,72,75,74,69,108,87,74,91,91,73,73,91,52,81,66,82,86,61,63,62,69,113,114,101,111,57,58,84,88,83,78", + "endOffsets": "316,3112,3192,3274,3371,3460,4275,4399,4486,6792,6858,6949,7019,7083,7186,7249,7314,7374,7442,7505,7560,7688,7745,7807,7862,7937,8077,8164,8243,8336,8422,8505,8638,8720,8805,8951,9038,9115,9169,9224,9290,9363,9439,9510,9588,9661,9737,9812,9882,9991,10079,10154,10246,10338,10412,10486,10578,10631,10713,10780,10863,10950,11012,11076,11139,11209,11323,11438,11540,11652,11710,11769,11854,12031,12115,12194" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-mk/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "132", + "endOffsets": "327" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5510", + "endColumns": "136", + "endOffsets": "5642" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-bg_values-bg.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-bg/values-bg.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,262,364,465,572,677,796", + "endColumns": "96,109,101,100,106,104,118,100", + "endOffsets": "147,257,359,460,567,672,791,892" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3537,3634,3744,3846,3947,4054,4159,12385", + "endColumns": "96,109,101,100,106,104,118,100", + "endOffsets": "3629,3739,3841,3942,4049,4154,4273,12481" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-bg/values-bg.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,225,331,436,522,632,753,833,910,1001,1094,1189,1283,1383,1476,1571,1679,1770,1861,1944,2058,2166,2266,2380,2487,2595,2755,2854", + "endColumns": "119,105,104,85,109,120,79,76,90,92,94,93,99,92,94,107,90,90,82,113,107,99,113,106,107,159,98,83", + "endOffsets": "220,326,431,517,627,748,828,905,996,1089,1184,1278,1378,1471,1566,1674,1765,1856,1939,2053,2161,2261,2375,2482,2590,2750,2849,2933" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "315,435,541,646,732,842,963,1043,1120,1211,1304,1399,1493,1593,1686,1781,1889,1980,2071,2154,2268,2376,2476,2590,2697,2805,2965,12055", + "endColumns": "119,105,104,85,109,120,79,76,90,92,94,93,99,92,94,107,90,90,82,113,107,99,113,106,107,159,98,83", + "endOffsets": "430,536,641,727,837,958,1038,1115,1206,1299,1394,1488,1588,1681,1776,1884,1975,2066,2149,2263,2371,2471,2585,2692,2800,2960,3059,12134" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-bg/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "133", + "endOffsets": "328" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5645", + "endColumns": "137", + "endOffsets": "5778" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-bg/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,298,459,590,697,860,991,1106,1211,1376,1484,1655,1789,1942,2104,2170,2225", + "endColumns": "104,160,130,106,162,130,114,104,164,107,170,133,152,161,65,54,68", + "endOffsets": "297,458,589,696,859,990,1105,1210,1375,1483,1654,1788,1941,2103,2169,2224,2293" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4595,4704,4869,5004,5115,5282,5417,5536,5783,5952,6064,6239,6377,6534,6700,6770,6829", + "endColumns": "108,164,134,110,166,134,118,108,168,111,174,137,156,165,69,58,72", + "endOffsets": "4699,4864,4999,5110,5277,5412,5531,5640,5947,6059,6234,6372,6529,6695,6765,6824,6897" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-bg/values-bg.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,265,344,423,506,628,738,833,966,1055,1118,1184,1281,1361,1423,1512,1575,1640,1699,1772,1835,1889,2017,2074,2136,2190,2263,2406,2490,2568,2661,2743,2831,2967,3055,3143,3279,3364,3441,3494,3545,3611,3686,3762,3833,3912,3989,4065,4142,4216,4328,4419,4494,4585,4677,4751,4838,4929,4984,5066,5132,5215,5301,5363,5427,5490,5560,5677,5789,5900,6010,6067,6122,6208,6299,6375", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,78,78,82,121,109,94,132,88,62,65,96,79,61,88,62,64,58,72,62,53,127,56,61,53,72,142,83,77,92,81,87,135,87,87,135,84,76,52,50,65,74,75,70,78,76,75,76,73,111,90,74,90,91,73,86,90,54,81,65,82,85,61,63,62,69,116,111,110,109,56,54,85,90,75,78", + "endOffsets": "260,339,418,501,623,733,828,961,1050,1113,1179,1276,1356,1418,1507,1570,1635,1694,1767,1830,1884,2012,2069,2131,2185,2258,2401,2485,2563,2656,2738,2826,2962,3050,3138,3274,3359,3436,3489,3540,3606,3681,3757,3828,3907,3984,4060,4137,4211,4323,4414,4489,4580,4672,4746,4833,4924,4979,5061,5127,5210,5296,5358,5422,5485,5555,5672,5784,5895,6005,6062,6117,6203,6294,6370,6449" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3064,3143,3222,3305,3427,4278,4373,4506,6902,6965,7031,7128,7208,7270,7359,7422,7487,7546,7619,7682,7736,7864,7921,7983,8037,8110,8253,8337,8415,8508,8590,8678,8814,8902,8990,9126,9211,9288,9341,9392,9458,9533,9609,9680,9759,9836,9912,9989,10063,10175,10266,10341,10432,10524,10598,10685,10776,10831,10913,10979,11062,11148,11210,11274,11337,11407,11524,11636,11747,11857,11914,11969,12139,12230,12306", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,78,78,82,121,109,94,132,88,62,65,96,79,61,88,62,64,58,72,62,53,127,56,61,53,72,142,83,77,92,81,87,135,87,87,135,84,76,52,50,65,74,75,70,78,76,75,76,73,111,90,74,90,91,73,86,90,54,81,65,82,85,61,63,62,69,116,111,110,109,56,54,85,90,75,78", + "endOffsets": "310,3138,3217,3300,3422,3532,4368,4501,4590,6960,7026,7123,7203,7265,7354,7417,7482,7541,7614,7677,7731,7859,7916,7978,8032,8105,8248,8332,8410,8503,8585,8673,8809,8897,8985,9121,9206,9283,9336,9387,9453,9528,9604,9675,9754,9831,9907,9984,10058,10170,10261,10336,10427,10519,10593,10680,10771,10826,10908,10974,11057,11143,11205,11269,11332,11402,11519,11631,11742,11852,11909,11964,12050,12225,12301,12380" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-gu_values-gu.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-gu/values-gu.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,268,342,414,496,602,700,799,919,1003,1060,1123,1214,1281,1340,1430,1493,1558,1622,1691,1753,1807,1922,1980,2041,2095,2168,2295,2381,2463,2562,2647,2731,2864,2939,3015,3148,3234,3315,3369,3421,3487,3560,3640,3711,3791,3862,3938,4017,4086,4193,4289,4367,4462,4558,4632,4707,4806,4857,4939,5006,5093,5183,5245,5309,5372,5439,5541,5646,5743,5845,5903,5959,6037,6123,6198", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,73,71,81,105,97,98,119,83,56,62,90,66,58,89,62,64,63,68,61,53,114,57,60,53,72,126,85,81,98,84,83,132,74,75,132,85,80,53,51,65,72,79,70,79,70,75,78,68,106,95,77,94,95,73,74,98,50,81,66,86,89,61,63,62,66,101,104,96,101,57,55,77,85,74,72", + "endOffsets": "263,337,409,491,597,695,794,914,998,1055,1118,1209,1276,1335,1425,1488,1553,1617,1686,1748,1802,1917,1975,2036,2090,2163,2290,2376,2458,2557,2642,2726,2859,2934,3010,3143,3229,3310,3364,3416,3482,3555,3635,3706,3786,3857,3933,4012,4081,4188,4284,4362,4457,4553,4627,4702,4801,4852,4934,5001,5088,5178,5240,5304,5367,5434,5536,5641,5738,5840,5898,5954,6032,6118,6193,6266" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3001,3075,3147,3229,3335,4151,4250,4370,6630,6687,6750,6841,6908,6967,7057,7120,7185,7249,7318,7380,7434,7549,7607,7668,7722,7795,7922,8008,8090,8189,8274,8358,8491,8566,8642,8775,8861,8942,8996,9048,9114,9187,9267,9338,9418,9489,9565,9644,9713,9820,9916,9994,10089,10185,10259,10334,10433,10484,10566,10633,10720,10810,10872,10936,10999,11066,11168,11273,11370,11472,11530,11586,11745,11831,11906", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,73,71,81,105,97,98,119,83,56,62,90,66,58,89,62,64,63,68,61,53,114,57,60,53,72,126,85,81,98,84,83,132,74,75,132,85,80,53,51,65,72,79,70,79,70,75,78,68,106,95,77,94,95,73,74,98,50,81,66,86,89,61,63,62,66,101,104,96,101,57,55,77,85,74,72", + "endOffsets": "313,3070,3142,3224,3330,3428,4245,4365,4449,6682,6745,6836,6903,6962,7052,7115,7180,7244,7313,7375,7429,7544,7602,7663,7717,7790,7917,8003,8085,8184,8269,8353,8486,8561,8637,8770,8856,8937,8991,9043,9109,9182,9262,9333,9413,9484,9560,9639,9708,9815,9911,9989,10084,10180,10254,10329,10428,10479,10561,10628,10715,10805,10867,10931,10994,11061,11163,11268,11365,11467,11525,11581,11659,11826,11901,11974" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-gu/values-gu.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,149,252,349,451,553,651,773", + "endColumns": "93,102,96,101,101,97,121,100", + "endOffsets": "144,247,344,446,548,646,768,869" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3433,3527,3630,3727,3829,3931,4029,11979", + "endColumns": "93,102,96,101,101,97,121,100", + "endOffsets": "3522,3625,3722,3824,3926,4024,4146,12075" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-gu/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "142", + "endOffsets": "337" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5436", + "endColumns": "146", + "endOffsets": "5578" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-gu/values-gu.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,212,316,423,510,610,730,808,885,976,1069,1164,1258,1358,1451,1546,1640,1731,1822,1902,2008,2109,2206,2315,2415,2525,2685,2788", + "endColumns": "106,103,106,86,99,119,77,76,90,92,94,93,99,92,94,93,90,90,79,105,100,96,108,99,109,159,102,80", + "endOffsets": "207,311,418,505,605,725,803,880,971,1064,1159,1253,1353,1446,1541,1635,1726,1817,1897,2003,2104,2201,2310,2410,2520,2680,2783,2864" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "318,425,529,636,723,823,943,1021,1098,1189,1282,1377,1471,1571,1664,1759,1853,1944,2035,2115,2221,2322,2419,2528,2628,2738,2898,11664", + "endColumns": "106,103,106,86,99,119,77,76,90,92,94,93,99,92,94,93,90,90,79,105,100,96,108,99,109,159,102,80", + "endOffsets": "420,524,631,718,818,938,1016,1093,1184,1277,1372,1466,1566,1659,1754,1848,1939,2030,2110,2216,2317,2414,2523,2623,2733,2893,2996,11740" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-gu/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,459,580,688,822,940,1047,1143,1287,1391,1551,1672,1811,1957,2014,2076", + "endColumns": "103,161,120,107,133,117,106,95,143,103,159,120,138,145,56,61,77", + "endOffsets": "296,458,579,687,821,939,1046,1142,1286,1390,1550,1671,1810,1956,2013,2075,2153" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4454,4562,4728,4853,4965,5103,5225,5336,5583,5731,5839,6003,6128,6271,6421,6482,6548", + "endColumns": "107,165,124,111,137,121,110,99,147,107,163,124,142,149,60,65,81", + "endOffsets": "4557,4723,4848,4960,5098,5220,5331,5431,5726,5834,5998,6123,6266,6416,6477,6543,6625" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-h550dp-port-v13_values-h550dp-port-v13.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-h550dp-port-v13/values-h550dp-port-v13.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "64", + "endOffsets": "115" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-sq_values-sq.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-sq/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "124", + "endOffsets": "319" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5556", + "endColumns": "128", + "endOffsets": "5680" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-sq/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,465,598,701,858,988,1110,1222,1388,1492,1663,1797,1955,2135,2196,2259", + "endColumns": "102,168,132,102,156,129,121,111,165,103,170,133,157,179,60,62,77", + "endOffsets": "295,464,597,700,857,987,1109,1221,1387,1491,1662,1796,1954,2134,2195,2258,2336" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4495,4602,4775,4912,5019,5180,5314,5440,5685,5855,5963,6138,6276,6438,6622,6687,6754", + "endColumns": "106,172,136,106,160,133,125,115,169,107,174,137,161,183,64,66,81", + "endOffsets": "4597,4770,4907,5014,5175,5309,5435,5551,5850,5958,6133,6271,6433,6617,6682,6749,6831" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-sq/values-sq.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,219,319,431,517,623,746,828,906,997,1090,1185,1279,1380,1473,1568,1665,1756,1849,1930,2036,2140,2238,2344,2448,2550,2704,2801", + "endColumns": "113,99,111,85,105,122,81,77,90,92,94,93,100,92,94,96,90,92,80,105,103,97,105,103,101,153,96,81", + "endOffsets": "214,314,426,512,618,741,823,901,992,1085,1180,1274,1375,1468,1563,1660,1751,1844,1925,2031,2135,2233,2339,2443,2545,2699,2796,2878" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "317,431,531,643,729,835,958,1040,1118,1209,1302,1397,1491,1592,1685,1780,1877,1968,2061,2142,2248,2352,2450,2556,2660,2762,2916,11974", + "endColumns": "113,99,111,85,105,122,81,77,90,92,94,93,100,92,94,96,90,92,80,105,103,97,105,103,101,153,96,81", + "endOffsets": "426,526,638,724,830,953,1035,1113,1204,1297,1392,1486,1587,1680,1775,1872,1963,2056,2137,2243,2347,2445,2551,2655,2757,2911,3008,12051" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-sq/values-sq.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,267,346,424,510,610,702,803,929,1012,1077,1142,1242,1312,1371,1469,1531,1595,1654,1726,1789,1843,1960,2017,2079,2133,2205,2340,2423,2502,2598,2681,2759,2900,2984,3066,3214,3304,3382,3435,3494,3560,3631,3710,3781,3864,3940,4018,4090,4163,4267,4356,4428,4522,4621,4695,4767,4868,4918,5003,5069,5159,5248,5310,5374,5437,5504,5620,5733,5842,5947,6004,6067,6150,6235,6309", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,78,77,85,99,91,100,125,82,64,64,99,69,58,97,61,63,58,71,62,53,116,56,61,53,71,134,82,78,95,82,77,140,83,81,147,89,77,52,58,65,70,78,70,82,75,77,71,72,103,88,71,93,98,73,71,100,49,84,65,89,88,61,63,62,66,115,112,108,104,56,62,82,84,73,77", + "endOffsets": "262,341,419,505,605,697,798,924,1007,1072,1137,1237,1307,1366,1464,1526,1590,1649,1721,1784,1838,1955,2012,2074,2128,2200,2335,2418,2497,2593,2676,2754,2895,2979,3061,3209,3299,3377,3430,3489,3555,3626,3705,3776,3859,3935,4013,4085,4158,4262,4351,4423,4517,4616,4690,4762,4863,4913,4998,5064,5154,5243,5305,5369,5432,5499,5615,5728,5837,5942,5999,6062,6145,6230,6304,6382" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3013,3092,3170,3256,3356,4185,4286,4412,6836,6901,6966,7066,7136,7195,7293,7355,7419,7478,7550,7613,7667,7784,7841,7903,7957,8029,8164,8247,8326,8422,8505,8583,8724,8808,8890,9038,9128,9206,9259,9318,9384,9455,9534,9605,9688,9764,9842,9914,9987,10091,10180,10252,10346,10445,10519,10591,10692,10742,10827,10893,10983,11072,11134,11198,11261,11328,11444,11557,11666,11771,11828,11891,12056,12141,12215", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,78,77,85,99,91,100,125,82,64,64,99,69,58,97,61,63,58,71,62,53,116,56,61,53,71,134,82,78,95,82,77,140,83,81,147,89,77,52,58,65,70,78,70,82,75,77,71,72,103,88,71,93,98,73,71,100,49,84,65,89,88,61,63,62,66,115,112,108,104,56,62,82,84,73,77", + "endOffsets": "312,3087,3165,3251,3351,3443,4281,4407,4490,6896,6961,7061,7131,7190,7288,7350,7414,7473,7545,7608,7662,7779,7836,7898,7952,8024,8159,8242,8321,8417,8500,8578,8719,8803,8885,9033,9123,9201,9254,9313,9379,9450,9529,9600,9683,9759,9837,9909,9982,10086,10175,10247,10341,10440,10514,10586,10687,10737,10822,10888,10978,11067,11129,11193,11256,11323,11439,11552,11661,11766,11823,11886,11969,12136,12210,12288" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-sq/values-sq.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,154,256,354,451,559,670,792", + "endColumns": "98,101,97,96,107,110,121,100", + "endOffsets": "149,251,349,446,554,665,787,888" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3448,3547,3649,3747,3844,3952,4063,12293", + "endColumns": "98,101,97,96,107,110,121,100", + "endOffsets": "3542,3644,3742,3839,3947,4058,4180,12389" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-b+sr+Latn_values-b+sr+Latn.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-b+sr+Latn/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "200,303,457,580,686,836,959,1067,1165,1310,1413,1569,1692,1837,1976,2040,2101", + "endColumns": "102,153,122,105,149,122,107,97,144,102,155,122,144,138,63,60,75", + "endOffsets": "302,456,579,685,835,958,1066,1164,1309,1412,1568,1691,1836,1975,2039,2100,2176" + }, + "to": { + "startLines": "49,50,51,52,53,54,55,56,58,59,60,61,62,63,64,65,66", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4574,4681,4839,4966,5076,5230,5357,5469,5701,5850,5957,6117,6244,6393,6536,6604,6669", + "endColumns": "106,157,126,109,153,126,111,101,148,106,159,126,148,142,67,64,79", + "endOffsets": "4676,4834,4961,5071,5225,5352,5464,5566,5845,5952,6112,6239,6388,6531,6599,6664,6744" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-b+sr+Latn/values-b+sr+Latn.xml", + "from": { + "startLines": "2,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,324,401,478,558,666,760,854,986,1067,1130,1196,1289,1357,1420,1523,1583,1649,1705,1776,1836,1890,2002,2059,2120,2174,2250,2375,2462,2539,2632,2716,2799,2938,3020,3103,3234,3322,3400,3454,3510,3576,3650,3728,3799,3881,3957,4033,4108,4180,4287,4377,4450,4542,4638,4710,4786,4882,4935,5017,5084,5171,5258,5320,5384,5447,5516,5621,5731,5827,5935,5993,6053,6133,6216,6292", + "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "endColumns": "12,76,76,79,107,93,93,131,80,62,65,92,67,62,102,59,65,55,70,59,53,111,56,60,53,75,124,86,76,92,83,82,138,81,82,130,87,77,53,55,65,73,77,70,81,75,75,74,71,106,89,72,91,95,71,75,95,52,81,66,86,86,61,63,62,68,104,109,95,107,57,59,79,82,75,76", + "endOffsets": "319,396,473,553,661,755,849,981,1062,1125,1191,1284,1352,1415,1518,1578,1644,1700,1771,1831,1885,1997,2054,2115,2169,2245,2370,2457,2534,2627,2711,2794,2933,3015,3098,3229,3317,3395,3449,3505,3571,3645,3723,3794,3876,3952,4028,4103,4175,4282,4372,4445,4537,4633,4705,4781,4877,4930,5012,5079,5166,5253,5315,5379,5442,5511,5616,5726,5822,5930,5988,6048,6128,6211,6287,6364" + }, + "to": { + "startLines": "2,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3105,3182,3259,3339,3447,4267,4361,4493,6749,6812,6878,6971,7039,7102,7205,7265,7331,7387,7458,7518,7572,7684,7741,7802,7856,7932,8057,8144,8221,8314,8398,8481,8620,8702,8785,8916,9004,9082,9136,9192,9258,9332,9410,9481,9563,9639,9715,9790,9862,9969,10059,10132,10224,10320,10392,10468,10564,10617,10699,10766,10853,10940,11002,11066,11129,11198,11303,11413,11509,11617,11675,11735,11902,11985,12061", + "endLines": "6,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "endColumns": "12,76,76,79,107,93,93,131,80,62,65,92,67,62,102,59,65,55,70,59,53,111,56,60,53,75,124,86,76,92,83,82,138,81,82,130,87,77,53,55,65,73,77,70,81,75,75,74,71,106,89,72,91,95,71,75,95,52,81,66,86,86,61,63,62,68,104,109,95,107,57,59,79,82,75,76", + "endOffsets": "369,3177,3254,3334,3442,3536,4356,4488,4569,6807,6873,6966,7034,7097,7200,7260,7326,7382,7453,7513,7567,7679,7736,7797,7851,7927,8052,8139,8216,8309,8393,8476,8615,8697,8780,8911,8999,9077,9131,9187,9253,9327,9405,9476,9558,9634,9710,9785,9857,9964,10054,10127,10219,10315,10387,10463,10559,10612,10694,10761,10848,10935,10997,11061,11124,11193,11298,11408,11504,11612,11670,11730,11810,11980,12056,12133" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-b+sr+Latn/values-b+sr+Latn.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,352,456,560,665,781", + "endColumns": "97,101,96,103,103,104,115,100", + "endOffsets": "148,250,347,451,555,660,776,877" + }, + "to": { + "startLines": "39,40,41,42,43,44,45,135", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3541,3639,3741,3838,3942,4046,4151,12138", + "endColumns": "97,101,96,103,103,104,115,100", + "endOffsets": "3634,3736,3833,3937,4041,4146,4262,12234" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-b+sr+Latn/values-b+sr+Latn.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,212,313,419,505,609,731,816,898,989,1082,1177,1271,1371,1464,1559,1664,1755,1846,1932,2037,2143,2246,2353,2462,2569,2739,2836", + "endColumns": "106,100,105,85,103,121,84,81,90,92,94,93,99,92,94,104,90,90,85,104,105,102,106,108,106,169,96,86", + "endOffsets": "207,308,414,500,604,726,811,893,984,1077,1172,1266,1366,1459,1554,1659,1750,1841,1927,2032,2138,2241,2348,2457,2564,2734,2831,2918" + }, + "to": { + "startLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,131", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "374,481,582,688,774,878,1000,1085,1167,1258,1351,1446,1540,1640,1733,1828,1933,2024,2115,2201,2306,2412,2515,2622,2731,2838,3008,11815", + "endColumns": "106,100,105,85,103,121,84,81,90,92,94,93,99,92,94,104,90,90,85,104,105,102,106,108,106,169,96,86", + "endOffsets": "476,577,683,769,873,995,1080,1162,1253,1346,1441,1535,1635,1728,1823,1928,2019,2110,2196,2301,2407,2510,2617,2726,2833,3003,3100,11897" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-b+sr+Latn/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "202", + "endColumns": "125", + "endOffsets": "327" + }, + "to": { + "startLines": "57", + "startColumns": "4", + "startOffsets": "5571", + "endColumns": "129", + "endOffsets": "5696" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-pt-rBR_values-pt-rBR.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-pt-rBR/values-pt-rBR.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,225,331,438,527,628,747,832,912,1003,1096,1191,1285,1385,1478,1573,1668,1759,1850,1935,2042,2153,2255,2363,2471,2581,2743,2843", + "endColumns": "119,105,106,88,100,118,84,79,90,92,94,93,99,92,94,94,90,90,84,106,110,101,107,107,109,161,99,85", + "endOffsets": "220,326,433,522,623,742,827,907,998,1091,1186,1280,1380,1473,1568,1663,1754,1845,1930,2037,2148,2250,2358,2466,2576,2738,2838,2924" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "323,443,549,656,745,846,965,1050,1130,1221,1314,1409,1503,1603,1696,1791,1886,1977,2068,2153,2260,2371,2473,2581,2689,2799,2961,11918", + "endColumns": "119,105,106,88,100,118,84,79,90,92,94,93,99,92,94,94,90,90,84,106,110,101,107,107,109,161,99,85", + "endOffsets": "438,544,651,740,841,960,1045,1125,1216,1309,1404,1498,1598,1691,1786,1881,1972,2063,2148,2255,2366,2468,2576,2684,2794,2956,3056,11999" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-pt-rBR/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "197,298,442,565,669,832,958,1076,1177,1343,1447,1607,1733,1886,2039,2104,2166", + "endColumns": "100,143,122,103,162,125,117,100,165,103,159,125,152,152,64,61,79", + "endOffsets": "297,441,564,668,831,957,1075,1176,1342,1446,1606,1732,1885,2038,2103,2165,2245" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4525,4630,4778,4905,5013,5180,5310,5432,5682,5852,5960,6124,6254,6411,6568,6637,6703", + "endColumns": "104,147,126,107,166,129,121,104,169,107,163,129,156,156,68,65,83", + "endOffsets": "4625,4773,4900,5008,5175,5305,5427,5532,5847,5955,6119,6249,6406,6563,6632,6698,6782" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-pt-rBR/values-pt-rBR.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,353,453,560,670,790", + "endColumns": "96,101,98,99,106,109,119,100", + "endOffsets": "147,249,348,448,555,665,785,886" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3488,3585,3687,3786,3886,3993,4103,12243", + "endColumns": "96,101,98,99,106,109,119,100", + "endOffsets": "3580,3682,3781,3881,3988,4098,4218,12339" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-pt-rBR/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "199", + "endColumns": "140", + "endOffsets": "339" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5537", + "endColumns": "144", + "endOffsets": "5677" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-pt-rBR/values-pt-rBR.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,273,354,432,516,611,700,801,921,1002,1062,1126,1218,1297,1357,1447,1511,1582,1645,1720,1784,1838,1965,2023,2085,2139,2218,2359,2446,2522,2617,2698,2780,2919,3002,3086,3225,3312,3392,3448,3499,3565,3639,3719,3790,3873,3946,4023,4092,4166,4268,4356,4433,4526,4622,4696,4776,4873,4925,5009,5075,5162,5250,5312,5376,5439,5507,5616,5727,5831,5941,6001,6056,6133,6216,6293", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,80,77,83,94,88,100,119,80,59,63,91,78,59,89,63,70,62,74,63,53,126,57,61,53,78,140,86,75,94,80,81,138,82,83,138,86,79,55,50,65,73,79,70,82,72,76,68,73,101,87,76,92,95,73,79,96,51,83,65,86,87,61,63,62,67,108,110,103,109,59,54,76,82,76,78", + "endOffsets": "268,349,427,511,606,695,796,916,997,1057,1121,1213,1292,1352,1442,1506,1577,1640,1715,1779,1833,1960,2018,2080,2134,2213,2354,2441,2517,2612,2693,2775,2914,2997,3081,3220,3307,3387,3443,3494,3560,3634,3714,3785,3868,3941,4018,4087,4161,4263,4351,4428,4521,4617,4691,4771,4868,4920,5004,5070,5157,5245,5307,5371,5434,5502,5611,5722,5826,5936,5996,6051,6128,6211,6288,6367" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3061,3142,3220,3304,3399,4223,4324,4444,6787,6847,6911,7003,7082,7142,7232,7296,7367,7430,7505,7569,7623,7750,7808,7870,7924,8003,8144,8231,8307,8402,8483,8565,8704,8787,8871,9010,9097,9177,9233,9284,9350,9424,9504,9575,9658,9731,9808,9877,9951,10053,10141,10218,10311,10407,10481,10561,10658,10710,10794,10860,10947,11035,11097,11161,11224,11292,11401,11512,11616,11726,11786,11841,12004,12087,12164", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,80,77,83,94,88,100,119,80,59,63,91,78,59,89,63,70,62,74,63,53,126,57,61,53,78,140,86,75,94,80,81,138,82,83,138,86,79,55,50,65,73,79,70,82,72,76,68,73,101,87,76,92,95,73,79,96,51,83,65,86,87,61,63,62,67,108,110,103,109,59,54,76,82,76,78", + "endOffsets": "318,3137,3215,3299,3394,3483,4319,4439,4520,6842,6906,6998,7077,7137,7227,7291,7362,7425,7500,7564,7618,7745,7803,7865,7919,7998,8139,8226,8302,8397,8478,8560,8699,8782,8866,9005,9092,9172,9228,9279,9345,9419,9499,9570,9653,9726,9803,9872,9946,10048,10136,10213,10306,10402,10476,10556,10653,10705,10789,10855,10942,11030,11092,11156,11219,11287,11396,11507,11611,11721,11781,11836,11913,12082,12159,12238" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-w320dp-land-v13_values-w320dp-land-v13.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-w320dp-land-v13/values-w320dp-land-v13.xml", + "from": { + "startLines": "2,3", + "startColumns": "4,4", + "startOffsets": "55,110", + "endColumns": "54,61", + "endOffsets": "105,167" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-ml_values-ml.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ml/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "155", + "endOffsets": "350" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5616", + "endColumns": "159", + "endOffsets": "5771" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ml/values-ml.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,271,351,434,521,627,726,820,930,1022,1084,1149,1248,1314,1374,1476,1538,1614,1672,1750,1815,1869,1986,2050,2114,2168,2248,2382,2468,2555,2658,2754,2843,2979,3064,3152,3304,3399,3482,3540,3592,3658,3737,3819,3890,3977,4053,4130,4207,4278,4388,4495,4575,4672,4772,4846,4927,5032,5090,5178,5245,5336,5428,5490,5554,5617,5686,5789,5896,6001,6106,6168,6224,6308,6402,6480", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,79,82,86,105,98,93,109,91,61,64,98,65,59,101,61,75,57,77,64,53,116,63,63,53,79,133,85,86,102,95,88,135,84,87,151,94,82,57,51,65,78,81,70,86,75,76,76,70,109,106,79,96,99,73,80,104,57,87,66,90,91,61,63,62,68,102,106,104,104,61,55,83,93,77,75", + "endOffsets": "266,346,429,516,622,721,815,925,1017,1079,1144,1243,1309,1369,1471,1533,1609,1667,1745,1810,1864,1981,2045,2109,2163,2243,2377,2463,2550,2653,2749,2838,2974,3059,3147,3299,3394,3477,3535,3587,3653,3732,3814,3885,3972,4048,4125,4202,4273,4383,4490,4570,4667,4767,4841,4922,5027,5085,5173,5240,5331,5423,5485,5549,5612,5681,5784,5891,5996,6101,6163,6219,6303,6397,6475,6551" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3070,3150,3233,3320,3426,4262,4356,4466,6919,6981,7046,7145,7211,7271,7373,7435,7511,7569,7647,7712,7766,7883,7947,8011,8065,8145,8279,8365,8452,8555,8651,8740,8876,8961,9049,9201,9296,9379,9437,9489,9555,9634,9716,9787,9874,9950,10027,10104,10175,10285,10392,10472,10569,10669,10743,10824,10929,10987,11075,11142,11233,11325,11387,11451,11514,11583,11686,11793,11898,12003,12065,12121,12288,12382,12460", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,79,82,86,105,98,93,109,91,61,64,98,65,59,101,61,75,57,77,64,53,116,63,63,53,79,133,85,86,102,95,88,135,84,87,151,94,82,57,51,65,78,81,70,86,75,76,76,70,109,106,79,96,99,73,80,104,57,87,66,90,91,61,63,62,68,102,106,104,104,61,55,83,93,77,75", + "endOffsets": "316,3145,3228,3315,3421,3520,4351,4461,4553,6976,7041,7140,7206,7266,7368,7430,7506,7564,7642,7707,7761,7878,7942,8006,8060,8140,8274,8360,8447,8550,8646,8735,8871,8956,9044,9196,9291,9374,9432,9484,9550,9629,9711,9782,9869,9945,10022,10099,10170,10280,10387,10467,10564,10664,10738,10819,10924,10982,11070,11137,11228,11320,11382,11446,11509,11578,11681,11788,11893,11998,12060,12116,12200,12377,12455,12531" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ml/values-ml.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,157,260,362,466,569,670,792", + "endColumns": "101,102,101,103,102,100,121,100", + "endOffsets": "152,255,357,461,564,665,787,888" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3525,3627,3730,3832,3936,4039,4140,12536", + "endColumns": "101,102,101,103,102,100,121,100", + "endOffsets": "3622,3725,3827,3931,4034,4135,4257,12632" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ml/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,308,483,618,735,895,1016,1117,1219,1397,1509,1679,1811,1956,2113,2173,2238", + "endColumns": "114,174,134,116,159,120,100,101,177,111,169,131,144,156,59,64,87", + "endOffsets": "307,482,617,734,894,1015,1116,1218,1396,1508,1678,1810,1955,2112,2172,2237,2325" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4558,4677,4856,4995,5116,5280,5405,5510,5776,5958,6074,6248,6384,6533,6694,6758,6827", + "endColumns": "118,178,138,120,163,124,104,105,181,115,173,135,148,160,63,68,91", + "endOffsets": "4672,4851,4990,5111,5275,5400,5505,5611,5953,6069,6243,6379,6528,6689,6753,6822,6914" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ml/values-ml.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,212,318,429,520,625,747,825,900,991,1084,1185,1279,1379,1473,1568,1667,1758,1849,1931,2040,2144,2243,2355,2467,2588,2753,2854", + "endColumns": "106,105,110,90,104,121,77,74,90,92,100,93,99,93,94,98,90,90,81,108,103,98,111,111,120,164,100,82", + "endOffsets": "207,313,424,515,620,742,820,895,986,1079,1180,1274,1374,1468,1563,1662,1753,1844,1926,2035,2139,2238,2350,2462,2583,2748,2849,2932" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "321,428,534,645,736,841,963,1041,1116,1207,1300,1401,1495,1595,1689,1784,1883,1974,2065,2147,2256,2360,2459,2571,2683,2804,2969,12205", + "endColumns": "106,105,110,90,104,121,77,74,90,92,100,93,99,93,94,98,90,90,81,108,103,98,111,111,120,164,100,82", + "endOffsets": "423,529,640,731,836,958,1036,1111,1202,1295,1396,1490,1590,1684,1779,1878,1969,2060,2142,2251,2355,2454,2566,2678,2799,2964,3065,12283" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-xlarge-v4_values-xlarge-v4.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-xlarge-v4/values-xlarge-v4.xml", + "from": { + "startLines": "2,3,4,5,6,7", + "startColumns": "4,4,4,4,4,4", + "startOffsets": "55,126,197,267,337,405", + "endColumns": "70,70,69,69,67,67", + "endOffsets": "121,192,262,332,400,468" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-fr_values-fr.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-fr/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,471,597,702,869,998,1115,1224,1398,1506,1687,1819,1975,2150,2219,2282", + "endColumns": "101,175,125,104,166,128,116,108,173,107,180,131,155,174,68,62,79", + "endOffsets": "294,470,596,701,868,997,1114,1223,1397,1505,1686,1818,1974,2149,2218,2281,2361" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4563,4669,4849,4979,5088,5259,5392,5513,5791,5969,6081,6266,6402,6562,6741,6814,6881", + "endColumns": "105,179,129,108,170,132,120,112,177,111,184,135,159,178,72,66,83", + "endOffsets": "4664,4844,4974,5083,5254,5387,5508,5621,5964,6076,6261,6397,6557,6736,6809,6876,6960" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-fr/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "160", + "endOffsets": "355" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5626", + "endColumns": "164", + "endOffsets": "5786" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-fr/values-fr.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,283,363,444,527,636,731,829,959,1044,1109,1175,1272,1355,1421,1523,1588,1663,1719,1798,1858,1912,2034,2093,2155,2209,2291,2426,2518,2593,2688,2769,2853,2997,3076,3157,3298,3391,3470,3525,3576,3642,3722,3803,3874,3954,4027,4105,4178,4250,4362,4455,4527,4619,4711,4785,4869,4961,5018,5102,5168,5251,5338,5400,5464,5527,5605,5707,5811,5908,6012,6071,6126,6215,6302,6379", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,79,80,82,108,94,97,129,84,64,65,96,82,65,101,64,74,55,78,59,53,121,58,61,53,81,134,91,74,94,80,83,143,78,80,140,92,78,54,50,65,79,80,70,79,72,77,72,71,111,92,71,91,91,73,83,91,56,83,65,82,86,61,63,62,77,101,103,96,103,58,54,88,86,76,80", + "endOffsets": "278,358,439,522,631,726,824,954,1039,1104,1170,1267,1350,1416,1518,1583,1658,1714,1793,1853,1907,2029,2088,2150,2204,2286,2421,2513,2588,2683,2764,2848,2992,3071,3152,3293,3386,3465,3520,3571,3637,3717,3798,3869,3949,4022,4100,4173,4245,4357,4450,4522,4614,4706,4780,4864,4956,5013,5097,5163,5246,5333,5395,5459,5522,5600,5702,5806,5903,6007,6066,6121,6210,6297,6374,6455" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3075,3155,3236,3319,3428,4250,4348,4478,6965,7030,7096,7193,7276,7342,7444,7509,7584,7640,7719,7779,7833,7955,8014,8076,8130,8212,8347,8439,8514,8609,8690,8774,8918,8997,9078,9219,9312,9391,9446,9497,9563,9643,9724,9795,9875,9948,10026,10099,10171,10283,10376,10448,10540,10632,10706,10790,10882,10939,11023,11089,11172,11259,11321,11385,11448,11526,11628,11732,11829,11933,11992,12047,12223,12310,12387", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,79,80,82,108,94,97,129,84,64,65,96,82,65,101,64,74,55,78,59,53,121,58,61,53,81,134,91,74,94,80,83,143,78,80,140,92,78,54,50,65,79,80,70,79,72,77,72,71,111,92,71,91,91,73,83,91,56,83,65,82,86,61,63,62,77,101,103,96,103,58,54,88,86,76,80", + "endOffsets": "328,3150,3231,3314,3423,3518,4343,4473,4558,7025,7091,7188,7271,7337,7439,7504,7579,7635,7714,7774,7828,7950,8009,8071,8125,8207,8342,8434,8509,8604,8685,8769,8913,8992,9073,9214,9307,9386,9441,9492,9558,9638,9719,9790,9870,9943,10021,10094,10166,10278,10371,10443,10535,10627,10701,10785,10877,10934,11018,11084,11167,11254,11316,11380,11443,11521,11623,11727,11824,11928,11987,12042,12131,12305,12382,12463" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-fr/values-fr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,354,456,560,664,782", + "endColumns": "97,101,98,101,103,103,117,100", + "endOffsets": "148,250,349,451,555,659,777,878" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3523,3621,3723,3822,3924,4028,4132,12468", + "endColumns": "97,101,98,101,103,103,117,100", + "endOffsets": "3616,3718,3817,3919,4023,4127,4245,12564" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-fr/values-fr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,216,331,441,523,629,759,837,913,1004,1097,1195,1290,1390,1483,1576,1671,1762,1853,1939,2049,2160,2263,2374,2482,2589,2748,2847", + "endColumns": "110,114,109,81,105,129,77,75,90,92,97,94,99,92,92,94,90,90,85,109,110,102,110,107,106,158,98,86", + "endOffsets": "211,326,436,518,624,754,832,908,999,1092,1190,1285,1385,1478,1571,1666,1757,1848,1934,2044,2155,2258,2369,2477,2584,2743,2842,2929" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "333,444,559,669,751,857,987,1065,1141,1232,1325,1423,1518,1618,1711,1804,1899,1990,2081,2167,2277,2388,2491,2602,2710,2817,2976,12136", + "endColumns": "110,114,109,81,105,129,77,75,90,92,97,94,99,92,92,94,90,90,85,109,110,102,110,107,106,158,98,86", + "endOffsets": "439,554,664,746,852,982,1060,1136,1227,1320,1418,1513,1613,1706,1799,1894,1985,2076,2162,2272,2383,2486,2597,2705,2812,2971,3070,12218" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-sr_values-sr.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-sr/values-sr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,212,313,419,505,609,731,815,896,987,1080,1175,1269,1369,1462,1557,1662,1753,1844,1930,2035,2141,2244,2350,2459,2566,2736,2833", + "endColumns": "106,100,105,85,103,121,83,80,90,92,94,93,99,92,94,104,90,90,85,104,105,102,105,108,106,169,96,86", + "endOffsets": "207,308,414,500,604,726,810,891,982,1075,1170,1264,1364,1457,1552,1657,1748,1839,1925,2030,2136,2239,2345,2454,2561,2731,2828,2915" + }, + "to": { + "startLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,131", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "371,478,579,685,771,875,997,1081,1162,1253,1346,1441,1535,1635,1728,1823,1928,2019,2110,2196,2301,2407,2510,2616,2725,2832,3002,11792", + "endColumns": "106,100,105,85,103,121,83,80,90,92,94,93,99,92,94,104,90,90,85,104,105,102,105,108,106,169,96,86", + "endOffsets": "473,574,680,766,870,992,1076,1157,1248,1341,1436,1530,1630,1723,1818,1923,2014,2105,2191,2296,2402,2505,2611,2720,2827,2997,3094,11874" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-sr/values-sr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,352,456,560,665,781", + "endColumns": "97,101,96,103,103,104,115,100", + "endOffsets": "148,250,347,451,555,660,776,877" + }, + "to": { + "startLines": "39,40,41,42,43,44,45,135", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3531,3629,3731,3828,3932,4036,4141,12115", + "endColumns": "97,101,96,103,103,104,115,100", + "endOffsets": "3624,3726,3823,3927,4031,4136,4252,12211" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-sr/values-sr.xml", + "from": { + "startLines": "2,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,321,397,473,553,660,753,847,978,1059,1121,1187,1279,1347,1410,1513,1573,1639,1695,1766,1826,1880,1992,2049,2110,2164,2240,2365,2451,2528,2621,2705,2788,2926,3007,3090,3221,3309,3387,3441,3497,3563,3637,3715,3786,3868,3943,4019,4094,4165,4272,4362,4435,4527,4623,4695,4771,4867,4920,5002,5069,5156,5243,5305,5369,5432,5501,5606,5716,5812,5920,5978,6038,6118,6201,6277", + "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "endColumns": "12,75,75,79,106,92,93,130,80,61,65,91,67,62,102,59,65,55,70,59,53,111,56,60,53,75,124,85,76,92,83,82,137,80,82,130,87,77,53,55,65,73,77,70,81,74,75,74,70,106,89,72,91,95,71,75,95,52,81,66,86,86,61,63,62,68,104,109,95,107,57,59,79,82,75,76", + "endOffsets": "316,392,468,548,655,748,842,973,1054,1116,1182,1274,1342,1405,1508,1568,1634,1690,1761,1821,1875,1987,2044,2105,2159,2235,2360,2446,2523,2616,2700,2783,2921,3002,3085,3216,3304,3382,3436,3492,3558,3632,3710,3781,3863,3938,4014,4089,4160,4267,4357,4430,4522,4618,4690,4766,4862,4915,4997,5064,5151,5238,5300,5364,5427,5496,5601,5711,5807,5915,5973,6033,6113,6196,6272,6349" + }, + "to": { + "startLines": "2,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3099,3175,3251,3331,3438,4257,4351,4482,6733,6795,6861,6953,7021,7084,7187,7247,7313,7369,7440,7500,7554,7666,7723,7784,7838,7914,8039,8125,8202,8295,8379,8462,8600,8681,8764,8895,8983,9061,9115,9171,9237,9311,9389,9460,9542,9617,9693,9768,9839,9946,10036,10109,10201,10297,10369,10445,10541,10594,10676,10743,10830,10917,10979,11043,11106,11175,11280,11390,11486,11594,11652,11712,11879,11962,12038", + "endLines": "6,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "endColumns": "12,75,75,79,106,92,93,130,80,61,65,91,67,62,102,59,65,55,70,59,53,111,56,60,53,75,124,85,76,92,83,82,137,80,82,130,87,77,53,55,65,73,77,70,81,74,75,74,70,106,89,72,91,95,71,75,95,52,81,66,86,86,61,63,62,68,104,109,95,107,57,59,79,82,75,76", + "endOffsets": "366,3170,3246,3326,3433,3526,4346,4477,4558,6790,6856,6948,7016,7079,7182,7242,7308,7364,7435,7495,7549,7661,7718,7779,7833,7909,8034,8120,8197,8290,8374,8457,8595,8676,8759,8890,8978,9056,9110,9166,9232,9306,9384,9455,9537,9612,9688,9763,9834,9941,10031,10104,10196,10292,10364,10440,10536,10589,10671,10738,10825,10912,10974,11038,11101,11170,11275,11385,11481,11589,11647,11707,11787,11957,12033,12110" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-sr/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,447,569,675,825,948,1056,1154,1299,1402,1558,1681,1826,1964,2028,2089", + "endColumns": "101,151,121,105,149,122,107,97,144,102,155,122,144,137,63,60,75", + "endOffsets": "294,446,568,674,824,947,1055,1153,1298,1401,1557,1680,1825,1963,2027,2088,2164" + }, + "to": { + "startLines": "49,50,51,52,53,54,55,56,58,59,60,61,62,63,64,65,66", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4563,4669,4825,4951,5061,5215,5342,5454,5686,5835,5942,6102,6229,6378,6520,6588,6653", + "endColumns": "105,155,125,109,153,126,111,101,148,106,159,126,148,141,67,64,79", + "endOffsets": "4664,4820,4946,5056,5210,5337,5449,5551,5830,5937,6097,6224,6373,6515,6583,6648,6728" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-sr/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "125", + "endOffsets": "320" + }, + "to": { + "startLines": "57", + "startColumns": "4", + "startOffsets": "5556", + "endColumns": "129", + "endOffsets": "5681" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-v34_values-v34.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-v34/values-v34.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,156,247,358,468,572,676,783,880,997,1098,1219,1324,1449,1550,1667,1770,1893,1988,2099,2194,2309,2408,2527,2622,2731,2846,2971,3102,3225,3354,3457,3568,3665,3782,3885,3978,4091,4201,4305,4409,4518,4617,4736,4839,4962,5069,5196,5299,5418,5523,5648,5745,5858,5955,6072,6173,6294,6391,6502,6619,6746,6879,7004,7135,7240,7353,7452,7571,7674,7793,7900,8023,8128,8249,8346,8451,8552,8661,8760,8867,8966,9085,9190,9315,9416,9537,9644", + "endColumns": "100,90,110,109,103,103,106,96,116,100,120,104,124,100,116,102,122,94,110,94,114,98,118,94,108,114,124,130,122,128,102,110,96,116,102,92,112,109,103,103,108,98,118,102,122,106,126,102,118,104,124,96,112,96,116,100,120,96,110,116,126,132,124,130,104,112,98,118,102,118,106,122,104,120,96,104,100,108,98,106,98,118,104,124,100,120,106,126", + "endOffsets": "151,242,353,463,567,671,778,875,992,1093,1214,1319,1444,1545,1662,1765,1888,1983,2094,2189,2304,2403,2522,2617,2726,2841,2966,3097,3220,3349,3452,3563,3660,3777,3880,3973,4086,4196,4300,4404,4513,4612,4731,4834,4957,5064,5191,5294,5413,5518,5643,5740,5853,5950,6067,6168,6289,6386,6497,6614,6741,6874,6999,7130,7235,7348,7447,7566,7669,7788,7895,8018,8123,8244,8341,8446,8547,8656,8755,8862,8961,9080,9185,9310,9411,9532,9639,9766" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-as_values-as.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-as/values-as.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,272,354,432,509,595,679,781,904,983,1043,1108,1197,1262,1321,1407,1471,1535,1598,1668,1732,1786,1891,1949,2011,2065,2137,2254,2341,2417,2509,2591,2674,2814,2891,2972,3099,3190,3267,3321,3372,3438,3508,3585,3656,3731,3802,3879,3948,4017,4124,4215,4287,4376,4465,4539,4611,4697,4747,4826,4892,4972,5056,5118,5182,5245,5314,5414,5509,5601,5693,5751,5806,5887,5968,6043", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,81,77,76,85,83,101,122,78,59,64,88,64,58,85,63,63,62,69,63,53,104,57,61,53,71,116,86,75,91,81,82,139,76,80,126,90,76,53,50,65,69,76,70,74,70,76,68,68,106,90,71,88,88,73,71,85,49,78,65,79,83,61,63,62,68,99,94,91,91,57,54,80,80,74,74", + "endOffsets": "267,349,427,504,590,674,776,899,978,1038,1103,1192,1257,1316,1402,1466,1530,1593,1663,1727,1781,1886,1944,2006,2060,2132,2249,2336,2412,2504,2586,2669,2809,2886,2967,3094,3185,3262,3316,3367,3433,3503,3580,3651,3726,3797,3874,3943,4012,4119,4210,4282,4371,4460,4534,4606,4692,4742,4821,4887,4967,5051,5113,5177,5240,5309,5409,5504,5596,5688,5746,5801,5882,5963,6038,6113" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3065,3147,3225,3302,3388,4222,4324,4447,6648,6708,6773,6862,6927,6986,7072,7136,7200,7263,7333,7397,7451,7556,7614,7676,7730,7802,7919,8006,8082,8174,8256,8339,8479,8556,8637,8764,8855,8932,8986,9037,9103,9173,9250,9321,9396,9467,9544,9613,9682,9789,9880,9952,10041,10130,10204,10276,10362,10412,10491,10557,10637,10721,10783,10847,10910,10979,11079,11174,11266,11358,11416,11471,11635,11716,11791", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,81,77,76,85,83,101,122,78,59,64,88,64,58,85,63,63,62,69,63,53,104,57,61,53,71,116,86,75,91,81,82,139,76,80,126,90,76,53,50,65,69,76,70,74,70,76,68,68,106,90,71,88,88,73,71,85,49,78,65,79,83,61,63,62,68,99,94,91,91,57,54,80,80,74,74", + "endOffsets": "317,3142,3220,3297,3383,3467,4319,4442,4521,6703,6768,6857,6922,6981,7067,7131,7195,7258,7328,7392,7446,7551,7609,7671,7725,7797,7914,8001,8077,8169,8251,8334,8474,8551,8632,8759,8850,8927,8981,9032,9098,9168,9245,9316,9391,9462,9539,9608,9677,9784,9875,9947,10036,10125,10199,10271,10357,10407,10486,10552,10632,10716,10778,10842,10905,10974,11074,11169,11261,11353,11411,11466,11547,11711,11786,11861" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-as/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,446,565,671,797,915,1024,1132,1271,1376,1522,1643,1772,1921,1977,2039", + "endColumns": "103,148,118,105,125,117,108,107,138,104,145,120,128,148,55,61,81", + "endOffsets": "296,445,564,670,796,914,1023,1131,1270,1375,1521,1642,1771,1920,1976,2038,2120" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4526,4634,4787,4910,5020,5150,5272,5385,5623,5766,5875,6025,6150,6283,6436,6496,6562", + "endColumns": "107,152,122,109,129,121,112,111,142,108,149,124,132,152,59,65,85", + "endOffsets": "4629,4782,4905,5015,5145,5267,5380,5492,5761,5870,6020,6145,6278,6431,6491,6557,6643" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-as/values-as.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,312,419,510,615,735,812,887,978,1071,1166,1260,1360,1453,1548,1642,1733,1824,1910,2023,2131,2234,2343,2459,2579,2746,2848", + "endColumns": "107,98,106,90,104,119,76,74,90,92,94,93,99,92,94,93,90,90,85,112,107,102,108,115,119,166,101,82", + "endOffsets": "208,307,414,505,610,730,807,882,973,1066,1161,1255,1355,1448,1543,1637,1728,1819,1905,2018,2126,2229,2338,2454,2574,2741,2843,2926" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "322,430,529,636,727,832,952,1029,1104,1195,1288,1383,1477,1577,1670,1765,1859,1950,2041,2127,2240,2348,2451,2560,2676,2796,2963,11552", + "endColumns": "107,98,106,90,104,119,76,74,90,92,94,93,99,92,94,93,90,90,85,112,107,102,108,115,119,166,101,82", + "endOffsets": "425,524,631,722,827,947,1024,1099,1190,1283,1378,1472,1572,1665,1760,1854,1945,2036,2122,2235,2343,2446,2555,2671,2791,2958,3060,11630" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-as/values-as.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,156,259,367,472,576,676,805", + "endColumns": "100,102,107,104,103,99,128,100", + "endOffsets": "151,254,362,467,571,671,800,901" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3472,3573,3676,3784,3889,3993,4093,11866", + "endColumns": "100,102,107,104,103,99,128,100", + "endOffsets": "3568,3671,3779,3884,3988,4088,4217,11962" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-as/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "121", + "endOffsets": "316" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5497", + "endColumns": "125", + "endOffsets": "5618" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-ur_values-ur.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ur/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "147", + "endOffsets": "342" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5472", + "endColumns": "151", + "endOffsets": "5619" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ur/values-ur.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,357,461,564,662,776", + "endColumns": "97,101,101,103,102,97,113,100", + "endOffsets": "148,250,352,456,559,657,771,872" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3457,3555,3657,3759,3863,3966,4064,12066", + "endColumns": "97,101,101,103,102,97,113,100", + "endOffsets": "3550,3652,3754,3858,3961,4059,4173,12162" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ur/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,457,579,686,822,945,1053,1153,1301,1407,1575,1699,1841,2006,2065,2128", + "endColumns": "103,159,121,106,135,122,107,99,147,105,167,123,141,164,58,62,83", + "endOffsets": "296,456,578,685,821,944,1052,1152,1300,1406,1574,1698,1840,2005,2064,2127,2211" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4480,4588,4752,4878,4989,5129,5256,5368,5624,5776,5886,6058,6186,6332,6501,6564,6631", + "endColumns": "107,163,125,110,139,126,111,103,151,109,171,127,145,168,62,66,87", + "endOffsets": "4583,4747,4873,4984,5124,5251,5363,5467,5771,5881,6053,6181,6327,6496,6559,6626,6714" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ur/values-ur.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,259,337,415,493,591,680,780,899,982,1038,1103,1197,1267,1326,1416,1480,1549,1607,1676,1736,1800,1912,1971,2030,2085,2160,2283,2363,2446,2540,2627,2711,2844,2926,3007,3138,3225,3307,3365,3421,3487,3562,3642,3713,3792,3859,3934,4011,4075,4182,4276,4346,4435,4528,4602,4677,4767,4823,4902,4969,5053,5137,5199,5263,5326,5392,5492,5599,5693,5801,5863,5923,6003,6088,6169", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,77,77,77,97,88,99,118,82,55,64,93,69,58,89,63,68,57,68,59,63,111,58,58,54,74,122,79,82,93,86,83,132,81,80,130,86,81,57,55,65,74,79,70,78,66,74,76,63,106,93,69,88,92,73,74,89,55,78,66,83,83,61,63,62,65,99,106,93,107,61,59,79,84,80,73", + "endOffsets": "254,332,410,488,586,675,775,894,977,1033,1098,1192,1262,1321,1411,1475,1544,1602,1671,1731,1795,1907,1966,2025,2080,2155,2278,2358,2441,2535,2622,2706,2839,2921,3002,3133,3220,3302,3360,3416,3482,3557,3637,3708,3787,3854,3929,4006,4070,4177,4271,4341,4430,4523,4597,4672,4762,4818,4897,4964,5048,5132,5194,5258,5321,5387,5487,5594,5688,5796,5858,5918,5998,6083,6164,6238" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3036,3114,3192,3270,3368,4178,4278,4397,6719,6775,6840,6934,7004,7063,7153,7217,7286,7344,7413,7473,7537,7649,7708,7767,7822,7897,8020,8100,8183,8277,8364,8448,8581,8663,8744,8875,8962,9044,9102,9158,9224,9299,9379,9450,9529,9596,9671,9748,9812,9919,10013,10083,10172,10265,10339,10414,10504,10560,10639,10706,10790,10874,10936,11000,11063,11129,11229,11336,11430,11538,11600,11660,11826,11911,11992", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,77,77,77,97,88,99,118,82,55,64,93,69,58,89,63,68,57,68,59,63,111,58,58,54,74,122,79,82,93,86,83,132,81,80,130,86,81,57,55,65,74,79,70,78,66,74,76,63,106,93,69,88,92,73,74,89,55,78,66,83,83,61,63,62,65,99,106,93,107,61,59,79,84,80,73", + "endOffsets": "304,3109,3187,3265,3363,3452,4273,4392,4475,6770,6835,6929,6999,7058,7148,7212,7281,7339,7408,7468,7532,7644,7703,7762,7817,7892,8015,8095,8178,8272,8359,8443,8576,8658,8739,8870,8957,9039,9097,9153,9219,9294,9374,9445,9524,9591,9666,9743,9807,9914,10008,10078,10167,10260,10334,10409,10499,10555,10634,10701,10785,10869,10931,10995,11058,11124,11224,11331,11425,11533,11595,11655,11735,11906,11987,12061" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ur/values-ur.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,219,325,434,520,624,744,821,896,988,1082,1177,1271,1372,1466,1562,1656,1748,1840,1925,2033,2139,2241,2352,2453,2569,2734,2832", + "endColumns": "113,105,108,85,103,119,76,74,91,93,94,93,100,93,95,93,91,91,84,107,105,101,110,100,115,164,97,85", + "endOffsets": "214,320,429,515,619,739,816,891,983,1077,1172,1266,1367,1461,1557,1651,1743,1835,1920,2028,2134,2236,2347,2448,2564,2729,2827,2913" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "309,423,529,638,724,828,948,1025,1100,1192,1286,1381,1475,1576,1670,1766,1860,1952,2044,2129,2237,2343,2445,2556,2657,2773,2938,11740", + "endColumns": "113,105,108,85,103,119,76,74,91,93,94,93,100,93,95,93,91,91,84,107,105,101,110,100,115,164,97,85", + "endOffsets": "418,524,633,719,823,943,1020,1095,1187,1281,1376,1470,1571,1665,1761,1855,1947,2039,2124,2232,2338,2440,2551,2652,2768,2933,3031,11821" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-hdpi-v4_values-hdpi-v4.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-hdpi-v4/values-hdpi-v4.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endLines": "6", + "endColumns": "13", + "endOffsets": "327" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-v22_values-v22.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v22/values-v22.xml", + "from": { + "startLines": "2,3,4,9", + "startColumns": "4,4,4,4", + "startOffsets": "55,130,217,487", + "endLines": "2,3,8,13", + "endColumns": "74,86,12,12", + "endOffsets": "125,212,482,764" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-et_values-et.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-et/values-et.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,211,310,421,507,609,726,807,884,976,1070,1166,1268,1377,1471,1572,1666,1758,1851,1934,2045,2149,2248,2358,2460,2559,2725,2827", + "endColumns": "105,98,110,85,101,116,80,76,91,93,95,101,108,93,100,93,91,92,82,110,103,98,109,101,98,165,101,82", + "endOffsets": "206,305,416,502,604,721,802,879,971,1065,1161,1263,1372,1466,1567,1661,1753,1846,1929,2040,2144,2243,2353,2455,2554,2720,2822,2905" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "316,422,521,632,718,820,937,1018,1095,1187,1281,1377,1479,1588,1682,1783,1877,1969,2062,2145,2256,2360,2459,2569,2671,2770,2936,11726", + "endColumns": "105,98,110,85,101,116,80,76,91,93,95,101,108,93,100,93,91,92,82,110,103,98,109,101,98,165,101,82", + "endOffsets": "417,516,627,713,815,932,1013,1090,1182,1276,1372,1474,1583,1677,1778,1872,1964,2057,2140,2251,2355,2454,2564,2666,2765,2931,3033,11804" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-et/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,292,450,573,677,823,948,1060,1159,1315,1419,1579,1707,1858,1999,2058,2119", + "endColumns": "98,157,122,103,145,124,111,98,155,103,159,127,150,140,58,60,83", + "endOffsets": "291,449,572,676,822,947,1059,1158,1314,1418,1578,1706,1857,1998,2057,2118,2202" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4488,4591,4753,4880,4988,5138,5267,5383,5626,5786,5894,6058,6190,6345,6490,6553,6618", + "endColumns": "102,161,126,107,149,128,115,102,159,107,163,131,154,144,62,64,87", + "endOffsets": "4586,4748,4875,4983,5133,5262,5378,5481,5781,5889,6053,6185,6340,6485,6548,6613,6701" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-et/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "135", + "endOffsets": "330" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5486", + "endColumns": "139", + "endOffsets": "5621" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-et/values-et.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,150,252,350,453,559,664,784", + "endColumns": "94,101,97,102,105,104,119,100", + "endOffsets": "145,247,345,448,554,659,779,880" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3461,3556,3658,3756,3859,3965,4070,12053", + "endColumns": "94,101,97,102,105,104,119,100", + "endOffsets": "3551,3653,3751,3854,3960,4065,4185,12149" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-et/values-et.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,266,346,425,510,602,689,788,905,987,1047,1111,1196,1264,1328,1415,1479,1543,1602,1674,1738,1792,1911,1971,2032,2086,2159,2292,2376,2453,2546,2626,2719,2857,2937,3016,3142,3230,3309,3364,3415,3481,3554,3633,3704,3783,3856,3931,4005,4077,4190,4278,4355,4446,4538,4612,4686,4777,4831,4913,4982,5065,5151,5213,5277,5340,5408,5511,5614,5711,5812,5871,5926,6007,6096,6173", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,79,78,84,91,86,98,116,81,59,63,84,67,63,86,63,63,58,71,63,53,118,59,60,53,72,132,83,76,92,79,92,137,79,78,125,87,78,54,50,65,72,78,70,78,72,74,73,71,112,87,76,90,91,73,73,90,53,81,68,82,85,61,63,62,67,102,102,96,100,58,54,80,88,76,77", + "endOffsets": "261,341,420,505,597,684,783,900,982,1042,1106,1191,1259,1323,1410,1474,1538,1597,1669,1733,1787,1906,1966,2027,2081,2154,2287,2371,2448,2541,2621,2714,2852,2932,3011,3137,3225,3304,3359,3410,3476,3549,3628,3699,3778,3851,3926,4000,4072,4185,4273,4350,4441,4533,4607,4681,4772,4826,4908,4977,5060,5146,5208,5272,5335,5403,5506,5609,5706,5807,5866,5921,6002,6091,6168,6246" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3038,3118,3197,3282,3374,4190,4289,4406,6706,6766,6830,6915,6983,7047,7134,7198,7262,7321,7393,7457,7511,7630,7690,7751,7805,7878,8011,8095,8172,8265,8345,8438,8576,8656,8735,8861,8949,9028,9083,9134,9200,9273,9352,9423,9502,9575,9650,9724,9796,9909,9997,10074,10165,10257,10331,10405,10496,10550,10632,10701,10784,10870,10932,10996,11059,11127,11230,11333,11430,11531,11590,11645,11809,11898,11975", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,79,78,84,91,86,98,116,81,59,63,84,67,63,86,63,63,58,71,63,53,118,59,60,53,72,132,83,76,92,79,92,137,79,78,125,87,78,54,50,65,72,78,70,78,72,74,73,71,112,87,76,90,91,73,73,90,53,81,68,82,85,61,63,62,67,102,102,96,100,58,54,80,88,76,77", + "endOffsets": "311,3113,3192,3277,3369,3456,4284,4401,4483,6761,6825,6910,6978,7042,7129,7193,7257,7316,7388,7452,7506,7625,7685,7746,7800,7873,8006,8090,8167,8260,8340,8433,8571,8651,8730,8856,8944,9023,9078,9129,9195,9268,9347,9418,9497,9570,9645,9719,9791,9904,9992,10069,10160,10252,10326,10400,10491,10545,10627,10696,10779,10865,10927,10991,11054,11122,11225,11328,11425,11526,11585,11640,11721,11893,11970,12048" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-ldrtl-v17_values-ldrtl-v17.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ldrtl-v17/values-ldrtl-v17.xml", + "from": { + "startLines": "2,3", + "startColumns": "4,4", + "startOffsets": "55,191", + "endColumns": "135,140", + "endOffsets": "186,327" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-ro_values-ro.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ro/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "139", + "endOffsets": "334" + }, + "to": { + "startLines": "57", + "startColumns": "4", + "startOffsets": "5613", + "endColumns": "143", + "endOffsets": "5752" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ro/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,453,579,685,832,958,1077,1182,1340,1447,1602,1731,1873,2035,2100,2164", + "endColumns": "103,155,125,105,146,125,118,104,157,106,154,128,141,161,64,63,78", + "endOffsets": "296,452,578,684,831,957,1076,1181,1339,1446,1601,1730,1872,2034,2099,2163,2242" + }, + "to": { + "startLines": "49,50,51,52,53,54,55,56,58,59,60,61,62,63,64,65,66", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4592,4700,4860,4990,5100,5251,5381,5504,5757,5919,6030,6189,6322,6468,6634,6703,6771", + "endColumns": "107,159,129,109,150,129,122,108,161,110,158,132,145,165,68,67,82", + "endOffsets": "4695,4855,4985,5095,5246,5376,5499,5608,5914,6025,6184,6317,6463,6629,6698,6766,6849" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ro/values-ro.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,228,334,447,531,636,755,840,920,1011,1104,1199,1293,1393,1486,1581,1675,1766,1858,1939,2049,2157,2255,2367,2473,2577,2739,2840", + "endColumns": "122,105,112,83,104,118,84,79,90,92,94,93,99,92,94,93,90,91,80,109,107,97,111,105,103,161,100,81", + "endOffsets": "223,329,442,526,631,750,835,915,1006,1099,1194,1288,1388,1481,1576,1670,1761,1853,1934,2044,2152,2250,2362,2468,2572,2734,2835,2917" + }, + "to": { + "startLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,131", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "371,494,600,713,797,902,1021,1106,1186,1277,1370,1465,1559,1659,1752,1847,1941,2032,2124,2205,2315,2423,2521,2633,2739,2843,3005,11981", + "endColumns": "122,105,112,83,104,118,84,79,90,92,94,93,99,92,94,93,90,91,80,109,107,97,111,105,103,161,100,81", + "endOffsets": "489,595,708,792,897,1016,1101,1181,1272,1365,1460,1554,1654,1747,1842,1936,2027,2119,2200,2310,2418,2516,2628,2734,2838,3000,3101,12058" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ro/values-ro.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,355,454,556,665,782", + "endColumns": "97,101,99,98,101,108,116,100", + "endOffsets": "148,250,350,449,551,660,777,878" + }, + "to": { + "startLines": "39,40,41,42,43,44,45,135", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3559,3657,3759,3859,3958,4060,4169,12305", + "endColumns": "97,101,99,98,101,108,116,100", + "endOffsets": "3652,3754,3854,3953,4055,4164,4281,12401" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ro/values-ro.xml", + "from": { + "startLines": "2,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,321,413,501,588,684,774,875,996,1080,1142,1208,1303,1377,1437,1521,1583,1649,1707,1780,1843,1899,2018,2075,2136,2192,2266,2411,2497,2572,2661,2740,2824,2957,3039,3122,3268,3358,3438,3493,3544,3610,3683,3761,3832,3917,3988,4065,4139,4211,4317,4408,4482,4577,4675,4749,4829,4930,4983,5069,5135,5224,5314,5376,5440,5503,5577,5689,5799,5909,6014,6073,6128,6207,6293,6370", + "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "endColumns": "12,91,87,86,95,89,100,120,83,61,65,94,73,59,83,61,65,57,72,62,55,118,56,60,55,73,144,85,74,88,78,83,132,81,82,145,89,79,54,50,65,72,77,70,84,70,76,73,71,105,90,73,94,97,73,79,100,52,85,65,88,89,61,63,62,73,111,109,109,104,58,54,78,85,76,78", + "endOffsets": "316,408,496,583,679,769,870,991,1075,1137,1203,1298,1372,1432,1516,1578,1644,1702,1775,1838,1894,2013,2070,2131,2187,2261,2406,2492,2567,2656,2735,2819,2952,3034,3117,3263,3353,3433,3488,3539,3605,3678,3756,3827,3912,3983,4060,4134,4206,4312,4403,4477,4572,4670,4744,4824,4925,4978,5064,5130,5219,5309,5371,5435,5498,5572,5684,5794,5904,6009,6068,6123,6202,6288,6365,6444" + }, + "to": { + "startLines": "2,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3106,3198,3286,3373,3469,4286,4387,4508,6854,6916,6982,7077,7151,7211,7295,7357,7423,7481,7554,7617,7673,7792,7849,7910,7966,8040,8185,8271,8346,8435,8514,8598,8731,8813,8896,9042,9132,9212,9267,9318,9384,9457,9535,9606,9691,9762,9839,9913,9985,10091,10182,10256,10351,10449,10523,10603,10704,10757,10843,10909,10998,11088,11150,11214,11277,11351,11463,11573,11683,11788,11847,11902,12063,12149,12226", + "endLines": "6,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "endColumns": "12,91,87,86,95,89,100,120,83,61,65,94,73,59,83,61,65,57,72,62,55,118,56,60,55,73,144,85,74,88,78,83,132,81,82,145,89,79,54,50,65,72,77,70,84,70,76,73,71,105,90,73,94,97,73,79,100,52,85,65,88,89,61,63,62,73,111,109,109,104,58,54,78,85,76,78", + "endOffsets": "366,3193,3281,3368,3464,3554,4382,4503,4587,6911,6977,7072,7146,7206,7290,7352,7418,7476,7549,7612,7668,7787,7844,7905,7961,8035,8180,8266,8341,8430,8509,8593,8726,8808,8891,9037,9127,9207,9262,9313,9379,9452,9530,9601,9686,9757,9834,9908,9980,10086,10177,10251,10346,10444,10518,10598,10699,10752,10838,10904,10993,11083,11145,11209,11272,11346,11458,11568,11678,11783,11842,11897,11976,12144,12221,12300" + } + } + ] + }, + { + "outputFile": "com.foxx.androidcast.app-debug-38:/values_values.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/6562528685bcf4f32771c81c31bdb251/transformed/recyclerview-1.3.2/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "508,1125,1126,1127,1135,1136,1137,1830", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "25699,67518,67577,67625,68292,68367,68443,122060", + "endColumns": "55,58,47,55,74,75,71,65", + "endOffsets": "25750,67572,67620,67676,68362,68438,68510,122121" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/cc91afd01cb4f955b418c94caa09925e/transformed/lifecycle-runtime-2.6.2/res/values/values.xml", + "from": { + "startLines": "-1", + "startColumns": "-1", + "startOffsets": "-1" + }, + "to": { + "startLines": "1899", + "startColumns": "4", + "startOffsets": "125643", + "endColumns": "42", + "endOffsets": "125681" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/451be4cb7f62a323593f851d2cb28156/transformed/fragment-1.5.4/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1", + "startColumns": "-1,-1,-1", + "startOffsets": "-1,-1,-1" + }, + "to": { + "startLines": "1825,1860,1903", + "startColumns": "4,4,4", + "startOffsets": "121828,123636,125850", + "endColumns": "56,64,63", + "endOffsets": "121880,123696,125909" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "137,227,230,574,627,628,630,631,632,633,634,635,636,639,640,641,642,643,644,645,646,647,648,649,650,702,703,704,705,706,707,708,709,710,711,886,887,888,889,890,891,892,893,894,895,896,897,954,955,956,957,958,959,960,961,962,963,964,965,966,967,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1123,1124,1128,1129,1130,1131,1132,1133,1134,1776,1777,1778,1779,1780,1781,1782,1783,1821,1822,1823,1824,1828,1851,1852,1861,1896,1904,1905,1908,1909,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2488,2548,2549,2550,2551,2552,2582,2590,2591,2595,2599,2610,2615,2644,2651,2655,2659,2664,2668,2672,2676,2680,2684,2688,2694,2698,2704,2708,2714,2718,2723,2727,2730,2734,2740,2744,2750,2754,2760,2763,2767,2771,2775,2779,2783,2784,2785,2786,2789,2792,2795,2798,2802,2803,2804,2805,2846,2849,2851,2853,2855,2860,2861,2865,2871,2875,2876,2878,2890,2891,2895,2901,2905,2982,2983,2987,3014,3018,3019,3023,4825,4997,5023,5194,5220,5251,5259,5265,5281,5303,5308,5313,5323,5332,5341,5345,5352,5371,5378,5379,5388,5391,5394,5398,5402,5406,5409,5410,5415,5420,5430,5435,5442,5448,5449,5452,5456,5461,5463,5465,5468,5471,5473,5477,5480,5487,5490,5493,5497,5499,5503,5505,5507,5509,5513,5521,5529,5541,5547,5556,5559,5570,5573,5574,5579,5580,6060,6129,6203,6204,6214,6223,6224,6226,6230,6233,6236,6239,6242,6245,6248,6251,6255,6258,6261,6264,6268,6271,6275,6423,6424,6425,6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6445,6447,6448,6449,6450,6451,6452,6453,6454,6456,6457,6459,6460,6462,6464,6465,6467,6468,6469,6470,6471,6472,6474,6475,6476,6477,6478,6763,6765,6767,6803,6804,6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6815,6817,6818,6819,6820,6821,6822,6823,6825,6829,7008,7009,7010,7011,7012,7013,7017,7018,7019,7560,7562,7564,7566,7568,7570,7571,7572,7573,7575,7577,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7593,7594,7595,7596,7598,7600,7601,7603,7604,7606,7608,7610,7611,7612,7613,7614,7615,7616,7617,7618,7619,7620,7621,7623,7624,7625,7626,7628,7629,7630,7631,7632,7634,7636,7638,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "6941,11486,11639,29595,31778,31833,31957,32021,32091,32152,32227,32303,32380,32618,32703,32785,32861,32937,33014,33092,33198,33304,33383,33463,33520,37164,37238,37313,37378,37444,37504,37565,37637,37710,37777,51103,51162,51221,51280,51339,51398,51452,51506,51559,51613,51667,51721,56113,56187,56266,56339,56413,56484,56556,56628,56701,56758,56816,56889,56963,57037,57559,57631,57704,57774,57845,57905,57966,58035,58104,58174,58248,58324,58388,58465,58541,58618,58683,58752,58829,58904,58973,59041,59118,59184,59245,59342,59407,59476,59575,59646,59705,59763,59820,59879,59943,60014,60086,60158,60230,60302,60369,60437,60505,60564,60627,60691,60781,60872,60932,60998,61065,61131,61201,61265,61318,61385,61446,61513,61626,61684,61747,61812,61877,61952,62025,62097,62141,62188,62234,62283,62344,62405,62466,62528,62592,62656,62720,62785,62848,62908,62969,63035,63094,63154,63216,63287,63347,67345,67431,67681,67771,67858,67946,68028,68111,68201,118770,118822,118880,118925,118991,119055,119112,119169,121623,121680,121728,121777,121972,123221,123268,123701,125518,125914,125978,126168,126228,130945,131019,131089,131167,131221,131291,131376,131424,131470,131531,131594,131660,131724,131795,131858,131923,131987,132048,132109,132161,132234,132308,132377,132452,132526,132600,132741,181509,186327,186405,186495,186583,186679,188488,189070,189159,189406,189687,190353,190638,192447,192924,193146,193368,193644,193871,194101,194331,194561,194791,195018,195437,195663,196088,196318,196746,196965,197248,197456,197587,197814,198240,198465,198892,199113,199538,199658,199934,200235,200559,200850,201164,201301,201432,201537,201779,201946,202150,202358,202629,202741,202853,202958,205051,205265,205411,205551,205637,205985,206073,206319,206737,206986,207068,207166,207823,207923,208175,208599,208854,214744,214833,215070,217094,217336,217438,217691,353260,363941,365457,376152,377680,379437,380063,380483,381744,383009,383265,383501,384048,384542,385147,385345,385925,387293,387668,387786,388324,388481,388677,388950,389206,389376,389517,389581,389946,390313,390989,391253,391591,391944,392038,392224,392530,392792,392917,393044,393283,393494,393613,393806,393983,394438,394619,394741,395000,395113,395300,395402,395509,395638,395913,396421,396917,397794,398088,398658,398807,399539,399711,399795,400131,400223,430961,436192,441907,441969,442547,443131,443222,443335,443564,443724,443876,444047,444213,444382,444549,444712,444955,445125,445298,445469,445743,445942,446147,455513,455597,455693,455789,455887,455987,456089,456191,456293,456395,456497,456597,456693,456805,456934,457057,457188,457319,457417,457531,457625,457765,457899,457995,458107,458207,458323,458419,458531,458631,458771,458907,459071,459201,459359,459509,459650,459794,459929,460041,460191,460319,460447,460583,460715,460845,460975,461087,478745,478891,479035,481103,481169,481259,481335,481439,481529,481631,481739,481847,481947,482027,482119,482217,482327,482379,482457,482563,482655,482759,482869,482991,483154,496639,496719,496819,496909,497019,497109,497350,497444,497550,537429,537529,537641,537755,537871,537987,538081,538195,538307,538409,538529,538651,538733,538837,538957,539083,539181,539275,539363,539475,539591,539713,539825,540000,540116,540202,540294,540406,540530,540597,540723,540791,540919,541063,541191,541260,541355,541470,541583,541682,541791,541902,542013,542114,542219,542319,542449,542540,542663,542757,542869,542955,543059,543155,543243,543361,543465,543569,543695,543783,543891,543991,544081,544191,544275,544377,544461,544515,544579,544685,544771,544881,544965", + "endLines": "137,227,230,574,627,628,630,631,632,633,634,635,636,639,640,641,642,643,644,645,646,647,648,649,650,702,703,704,705,706,707,708,709,710,711,886,887,888,889,890,891,892,893,894,895,896,897,954,955,956,957,958,959,960,961,962,963,964,965,966,967,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1123,1124,1128,1129,1130,1131,1132,1133,1134,1776,1777,1778,1779,1780,1781,1782,1783,1821,1822,1823,1824,1828,1851,1852,1861,1896,1904,1905,1908,1909,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2488,2548,2549,2550,2551,2552,2589,2590,2594,2598,2602,2614,2620,2650,2654,2658,2663,2667,2671,2675,2679,2683,2687,2693,2697,2703,2707,2713,2717,2722,2726,2729,2733,2739,2743,2749,2753,2759,2762,2766,2770,2774,2778,2782,2783,2784,2785,2788,2791,2794,2797,2801,2802,2803,2804,2805,2848,2850,2852,2854,2859,2860,2864,2870,2874,2875,2877,2889,2890,2894,2900,2904,2905,2982,2986,3013,3017,3018,3022,3050,4996,5022,5193,5219,5250,5258,5264,5280,5302,5307,5312,5322,5331,5340,5344,5351,5370,5377,5378,5387,5390,5393,5397,5401,5405,5408,5409,5414,5419,5429,5434,5441,5447,5448,5451,5455,5460,5462,5464,5467,5470,5472,5476,5479,5486,5489,5492,5496,5498,5502,5504,5506,5508,5512,5520,5528,5540,5546,5555,5558,5569,5572,5573,5578,5579,5584,6128,6198,6203,6213,6222,6223,6225,6229,6232,6235,6238,6241,6244,6247,6250,6254,6257,6260,6263,6267,6270,6274,6278,6423,6424,6425,6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6444,6446,6447,6448,6449,6450,6451,6452,6453,6455,6456,6458,6459,6461,6463,6464,6466,6467,6468,6469,6470,6471,6473,6474,6475,6476,6477,6478,6764,6766,6768,6803,6804,6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6816,6817,6818,6819,6820,6821,6822,6824,6828,6832,7008,7009,7010,7011,7012,7016,7017,7018,7019,7561,7563,7565,7567,7569,7570,7571,7572,7574,7576,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7592,7593,7594,7595,7597,7599,7600,7602,7603,7605,7607,7609,7610,7611,7612,7613,7614,7615,7616,7617,7618,7619,7620,7622,7623,7624,7625,7627,7628,7629,7630,7631,7633,7635,7637,7639,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654", + "endColumns": "54,44,48,40,54,61,63,69,60,74,75,76,77,84,81,75,75,76,77,105,105,78,79,56,57,73,74,64,65,59,60,71,72,66,67,58,58,58,58,58,53,53,52,53,53,53,53,73,78,72,73,70,71,71,72,56,57,72,73,73,74,71,72,69,70,59,60,68,68,69,73,75,63,76,75,76,64,68,76,74,68,67,76,65,60,96,64,68,98,70,58,57,56,58,63,70,71,71,71,71,66,67,67,58,62,63,89,90,59,65,66,65,69,63,52,66,60,66,112,57,62,64,64,74,72,71,43,46,45,48,60,60,60,61,63,63,63,64,62,59,60,65,58,59,61,70,59,67,85,86,89,86,87,81,82,89,90,51,57,44,65,63,56,56,53,56,47,48,50,33,46,48,45,31,63,61,59,56,73,69,77,53,69,84,47,45,60,62,65,63,70,62,64,63,60,60,51,72,73,68,74,73,73,140,69,52,77,89,87,95,89,12,88,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,136,130,104,12,12,12,12,12,111,111,104,116,12,12,12,12,12,87,12,12,12,81,12,12,99,12,12,12,93,88,12,12,12,101,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,117,12,12,12,12,12,12,12,63,12,12,12,12,12,12,93,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,12,91,12,12,12,61,12,12,90,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,95,95,97,99,101,101,101,101,101,99,95,111,128,122,130,130,97,113,93,12,12,95,111,99,115,95,111,99,12,135,12,129,12,12,140,12,134,111,149,127,127,12,131,129,129,111,139,12,12,12,65,89,75,103,89,101,107,107,99,79,91,97,12,51,77,105,91,103,109,12,12,12,79,99,89,109,89,12,93,105,91,12,12,12,12,12,93,113,111,12,12,12,81,103,119,125,97,93,87,111,115,121,111,12,115,85,91,12,12,66,12,67,12,12,12,68,94,114,112,98,108,110,110,100,104,99,12,90,122,93,12,85,103,95,87,12,12,12,12,87,107,99,89,109,83,101,83,53,63,105,85,109,83,119", + "endOffsets": "6991,11526,11683,29631,31828,31890,32016,32086,32147,32222,32298,32375,32453,32698,32780,32856,32932,33009,33087,33193,33299,33378,33458,33515,33573,37233,37308,37373,37439,37499,37560,37632,37705,37772,37840,51157,51216,51275,51334,51393,51447,51501,51554,51608,51662,51716,51770,56182,56261,56334,56408,56479,56551,56623,56696,56753,56811,56884,56958,57032,57107,57626,57699,57769,57840,57900,57961,58030,58099,58169,58243,58319,58383,58460,58536,58613,58678,58747,58824,58899,58968,59036,59113,59179,59240,59337,59402,59471,59570,59641,59700,59758,59815,59874,59938,60009,60081,60153,60225,60297,60364,60432,60500,60559,60622,60686,60776,60867,60927,60993,61060,61126,61196,61260,61313,61380,61441,61508,61621,61679,61742,61807,61872,61947,62020,62092,62136,62183,62229,62278,62339,62400,62461,62523,62587,62651,62715,62780,62843,62903,62964,63030,63089,63149,63211,63282,63342,63410,67426,67513,67766,67853,67941,68023,68106,68196,68287,118817,118875,118920,118986,119050,119107,119164,119218,121675,121723,121772,121823,122001,123263,123312,123742,125545,125973,126035,126223,126280,131014,131084,131162,131216,131286,131371,131419,131465,131526,131589,131655,131719,131790,131853,131918,131982,132043,132104,132156,132229,132303,132372,132447,132521,132595,132736,132806,181557,186400,186490,186578,186674,186764,189065,189154,189401,189682,189934,190633,191026,192919,193141,193363,193639,193866,194096,194326,194556,194786,195013,195432,195658,196083,196313,196741,196960,197243,197451,197582,197809,198235,198460,198887,199108,199533,199653,199929,200230,200554,200845,201159,201296,201427,201532,201774,201941,202145,202353,202624,202736,202848,202953,203070,205260,205406,205546,205632,205980,206068,206314,206732,206981,207063,207161,207818,207918,208170,208594,208849,208943,214828,215065,217089,217331,217433,217686,219842,363936,365452,376147,377675,379432,380058,380478,381739,383004,383260,383496,384043,384537,385142,385340,385920,387288,387663,387781,388319,388476,388672,388945,389201,389371,389512,389576,389941,390308,390984,391248,391586,391939,392033,392219,392525,392787,392912,393039,393278,393489,393608,393801,393978,394433,394614,394736,394995,395108,395295,395397,395504,395633,395908,396416,396912,397789,398083,398653,398802,399534,399706,399790,400126,400218,400496,436187,441558,441964,442542,443126,443217,443330,443559,443719,443871,444042,444208,444377,444544,444707,444950,445120,445293,445464,445738,445937,446142,446472,455592,455688,455784,455882,455982,456084,456186,456288,456390,456492,456592,456688,456800,456929,457052,457183,457314,457412,457526,457620,457760,457894,457990,458102,458202,458318,458414,458526,458626,458766,458902,459066,459196,459354,459504,459645,459789,459924,460036,460186,460314,460442,460578,460710,460840,460970,461082,461222,478886,479030,479168,481164,481254,481330,481434,481524,481626,481734,481842,481942,482022,482114,482212,482322,482374,482452,482558,482650,482754,482864,482986,483149,483306,496714,496814,496904,497014,497104,497345,497439,497545,497637,537524,537636,537750,537866,537982,538076,538190,538302,538404,538524,538646,538728,538832,538952,539078,539176,539270,539358,539470,539586,539708,539820,539995,540111,540197,540289,540401,540525,540592,540718,540786,540914,541058,541186,541255,541350,541465,541578,541677,541786,541897,542008,542109,542214,542314,542444,542535,542658,542752,542864,542950,543054,543150,543238,543356,543460,543564,543690,543778,543886,543986,544076,544186,544270,544372,544456,544510,544574,544680,544766,544876,544960,545080" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/8c994b5da60099950ae0b0677f9a0925/transformed/lifecycle-viewmodel-2.6.2/res/values/values.xml", + "from": { + "startLines": "-1", + "startColumns": "-1", + "startOffsets": "-1" + }, + "to": { + "startLines": "1902", + "startColumns": "4", + "startOffsets": "125800", + "endColumns": "49", + "endOffsets": "125845" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values/strings.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "2005,2006,2007,2009,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2028,2029,2030,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2219,2221,2222,2223,2224,2228,2229,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2282,2283,2284,2285,2286,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2492,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2521,2522,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "132811,132885,132953,133108,133308,133413,133469,133534,133591,133725,133791,133860,134035,134098,134157,135302,135348,135398,135974,136052,136117,136181,136289,136428,136490,136625,136717,136793,136855,136938,137050,137142,137212,137284,137359,137424,137483,137555,137623,138060,138102,138152,138230,138281,138333,138437,138495,138553,138597,138663,138762,138826,138872,141320,141371,141433,141503,141575,141643,141977,142067,142146,142268,142344,142420,142504,142582,142654,142766,142836,142929,142992,143063,143140,143217,143278,143339,143401,143488,143718,143805,143876,143940,144016,144077,144157,144412,144497,144606,144708,144787,144883,144986,145153,145239,145323,145410,145491,145574,145637,145702,145777,145853,145993,146052,146106,146247,146327,146411,146500,146587,146675,146729,146782,146835,146932,147012,147091,147161,147442,147526,147593,147669,147758,147838,147914,148013,148083,148250,148324,148388,148579,148662,148743,148839,148921,149013,149098,149168,149268,149377,149462,149667,149753,149831,149941,150033,150228,150319,150409,150527,150593,150672,150779,150954,151040,151121,151210,151315,151413,151504,151590,151713,151773,151845,151899,152013,152241,152348,152427,152499,152571,152640,152698,152906,153051,153131,153190,153281,153836,153903,154350,154425,154478,154529,154582,154639,154694,154780,154838,154931,154986,155063,155157,155209,155253,155321,155387,155476,155538,155622,155686,155772,155852,155928,155974,156028,156080,156138,156206,156259,156312,156373,156450,158419,158578,158632,158703,158768,172430,172498,172601,172652,172707,172760,172815,172860,172903,172944,173014,173065,173134,173181,173252,173316,173416,173519,173589,173661,173727,173788,173861,173907,173990,174057,174186,174256,174451,174515,174583,174742,175606,175692,175758,175810,175883,175961,176002,176126,176186,176243,176370,176445,176502,176624,176719,176801,176879,176964,177038,177099,177182,177274,177339,177430,177503,177561,177637,177737,177802,177898,177952,178011,178076,178125,178214,178368,178538,178697,178766,178833,178946,179020,179090,179261,179320,179385,179449,179531,179600,179678,179751,179817,180002,180069,180142,180202,180302,180346,180407,180472,180560,180641,180716,180768,180849,180930,181005,181087,181166,181223,181277,181333,181389,181445,181720,182133,182201,182270,182368,182426,182566,182653,182770,182880,182945,183009,183070,183142,183200,183259,183343,183491,183558,183628,183686,183749,183821,183893,183961,184367,184417,184577,184615,184743,184808,184893,184955,184999,185051,185097,185155,185232,185323,185393,185459,185528,185603,185670,185745,185819,185924,185980,186060,186123,186199", + "endColumns": "73,67,71,49,104,55,64,56,133,65,68,174,62,58,55,45,49,64,77,64,63,107,138,61,134,91,75,61,82,111,91,69,71,74,64,58,71,67,59,41,49,77,50,51,103,57,57,43,65,98,63,45,114,50,61,69,71,67,333,89,78,121,75,75,83,77,71,111,69,92,62,70,76,76,60,60,61,86,229,86,70,63,75,60,79,254,84,108,101,78,95,102,166,85,83,86,80,82,62,64,74,75,139,58,53,140,79,83,88,86,87,53,52,52,96,79,78,69,280,83,66,75,88,79,75,98,69,166,73,63,190,82,80,95,81,91,84,69,99,108,84,204,85,77,109,91,194,90,89,117,65,78,106,174,85,80,88,104,97,90,85,122,59,71,53,113,227,106,78,71,71,68,57,47,79,79,58,90,151,66,80,74,52,50,52,56,54,85,57,92,54,76,93,51,43,67,65,88,61,83,63,85,79,75,45,53,51,57,67,52,52,60,76,51,158,53,70,64,65,67,102,50,54,52,54,44,42,40,69,50,68,46,70,63,99,102,69,71,65,60,72,45,82,66,128,69,194,63,67,158,61,85,65,51,72,77,40,123,59,56,126,74,56,121,94,81,77,84,73,60,82,91,64,90,72,57,75,99,64,95,53,58,64,48,88,153,169,158,68,66,112,73,69,170,58,64,63,81,68,77,72,65,184,66,72,59,99,43,60,64,87,80,74,51,80,80,74,81,78,56,53,55,55,55,63,62,67,68,97,57,139,86,116,109,64,63,60,71,57,58,83,147,66,69,57,62,71,71,67,57,49,88,37,127,64,84,61,43,51,45,57,76,90,69,65,68,74,66,74,73,104,55,79,62,75,127", + "endOffsets": "132880,132948,133020,133153,133408,133464,133529,133586,133720,133786,133855,134030,134093,134152,134208,135343,135393,135458,136047,136112,136176,136284,136423,136485,136620,136712,136788,136850,136933,137045,137137,137207,137279,137354,137419,137478,137550,137618,137678,138097,138147,138225,138276,138328,138432,138490,138548,138592,138658,138757,138821,138867,138982,141366,141428,141498,141570,141638,141972,142062,142141,142263,142339,142415,142499,142577,142649,142761,142831,142924,142987,143058,143135,143212,143273,143334,143396,143483,143713,143800,143871,143935,144011,144072,144152,144407,144492,144601,144703,144782,144878,144981,145148,145234,145318,145405,145486,145569,145632,145697,145772,145848,145988,146047,146101,146242,146322,146406,146495,146582,146670,146724,146777,146830,146927,147007,147086,147156,147437,147521,147588,147664,147753,147833,147909,148008,148078,148245,148319,148383,148574,148657,148738,148834,148916,149008,149093,149163,149263,149372,149457,149662,149748,149826,149936,150028,150223,150314,150404,150522,150588,150667,150774,150949,151035,151116,151205,151310,151408,151499,151585,151708,151768,151840,151894,152008,152236,152343,152422,152494,152566,152635,152693,152741,152981,153126,153185,153276,153428,153898,153979,154420,154473,154524,154577,154634,154689,154775,154833,154926,154981,155058,155152,155204,155248,155316,155382,155471,155533,155617,155681,155767,155847,155923,155969,156023,156075,156133,156201,156254,156307,156368,156445,156497,158573,158627,158698,158763,158829,172493,172596,172647,172702,172755,172810,172855,172898,172939,173009,173060,173129,173176,173247,173311,173411,173514,173584,173656,173722,173783,173856,173902,173985,174052,174181,174251,174446,174510,174578,174737,174799,175687,175753,175805,175878,175956,175997,176121,176181,176238,176365,176440,176497,176619,176714,176796,176874,176959,177033,177094,177177,177269,177334,177425,177498,177556,177632,177732,177797,177893,177947,178006,178071,178120,178209,178363,178533,178692,178761,178828,178941,179015,179085,179256,179315,179380,179444,179526,179595,179673,179746,179812,179997,180064,180137,180197,180297,180341,180402,180467,180555,180636,180711,180763,180844,180925,181000,181082,181161,181218,181272,181328,181384,181440,181504,181778,182196,182265,182363,182421,182561,182648,182765,182875,182940,183004,183065,183137,183195,183254,183338,183486,183553,183623,183681,183744,183816,183888,183956,184014,184412,184501,184610,184738,184803,184888,184950,184994,185046,185092,185150,185227,185318,185388,185454,185523,185598,185665,185740,185814,185919,185975,186055,186118,186194,186322" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/68e97725e1781378fe335998c8e500ec/transformed/core-common-2.0.4/res/values/values.xml", + "from": { + "startLines": "-1", + "startColumns": "-1", + "startOffsets": "-1" + }, + "to": { + "startLines": "7000", + "startColumns": "4", + "startOffsets": "496229", + "endLines": "7007", + "endColumns": "8", + "endOffsets": "496634" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/6be8cab6745c75787fdf6101b92e71af/transformed/drawerlayout-1.1.1/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1", + "startColumns": "-1,-1,-1", + "startOffsets": "-1,-1,-1" + }, + "to": { + "startLines": "138,141,1074", + "startColumns": "4,4,4", + "startOffsets": "6996,7160,64193", + "endColumns": "55,47,51", + "endOffsets": "7047,7203,64240" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/eb0c45dedd1b15a9e37e22fcf0bd537e/transformed/constraintlayout-2.2.0/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "2,9,11,17,18,26,28,29,36,42,44,45,46,47,48,105,106,107,108,110,114,115,116,119,129,139,167,168,173,174,179,184,185,186,191,192,197,198,203,204,205,211,212,213,218,224,225,239,240,246,247,248,249,252,255,258,259,262,265,266,267,268,269,272,275,276,277,278,284,289,292,295,296,297,302,303,304,307,310,311,314,317,320,323,324,325,328,331,332,337,338,344,349,352,355,356,357,358,359,360,361,362,363,364,365,366,382,463,464,465,466,471,478,486,487,488,491,496,498,506,507,528,535,572,573,577,578,589,590,591,597,600,606,610,611,612,613,614,623,1836,1898", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,434,546,781,842,1133,1240,1290,1692,1999,2119,2174,2234,2299,2358,5544,5596,5657,5719,5826,5959,6011,6061,6222,6629,7052,8994,9053,9250,9307,9502,9683,9737,9794,9986,10044,10240,10296,10490,10547,10598,10820,10872,10927,11117,11333,11383,12132,12188,12394,12455,12515,12585,12718,12849,12977,13045,13174,13300,13362,13425,13493,13560,13683,13808,13875,13940,14005,14294,14475,14596,14717,14783,14850,15060,15129,15195,15320,15446,15513,15639,15766,15891,16018,16074,16139,16265,16388,16453,16661,16728,17016,17196,17316,17436,17501,17563,17625,17689,17751,17810,17870,17931,17992,18051,18111,18771,23714,23765,23814,23862,24149,24441,24749,24796,24856,24962,25142,25254,25589,25643,26808,27155,29485,29536,29745,29797,30233,30292,30346,30584,30762,30964,31103,31149,31204,31249,31293,31641,122345,125598", + "endLines": "8,9,15,17,25,26,28,29,36,42,44,45,46,47,48,105,106,107,108,113,114,115,116,128,136,139,167,172,173,178,183,184,185,190,191,196,197,202,203,204,210,211,212,217,223,224,225,239,245,246,247,248,251,254,257,258,261,264,265,266,267,268,271,274,275,276,277,283,288,291,294,295,296,301,302,303,306,309,310,313,316,319,322,323,324,327,330,331,336,337,343,348,351,354,355,356,357,358,359,360,361,362,363,364,365,381,387,463,464,465,466,477,485,486,487,490,495,496,505,506,507,528,535,572,573,577,586,589,590,596,597,605,609,610,611,612,613,622,626,1836,1898", + "endColumns": "11,55,11,60,11,51,49,52,47,50,54,59,64,58,61,51,60,61,45,11,51,49,50,11,11,44,58,11,56,11,11,53,56,11,57,11,55,11,56,50,11,51,54,11,11,49,51,55,11,60,59,69,11,11,11,67,11,11,61,62,67,66,11,11,66,64,64,11,11,11,11,65,66,11,68,65,11,11,66,11,11,11,11,55,64,11,11,64,11,66,11,11,11,11,64,61,61,63,61,58,59,60,60,58,59,11,11,50,48,47,57,11,11,46,59,11,11,53,11,53,55,45,46,50,58,51,11,58,53,11,54,11,11,45,54,44,43,11,11,40,44", + "endOffsets": "429,485,727,837,1128,1180,1285,1338,1735,2045,2169,2229,2294,2353,2415,5591,5652,5714,5760,5954,6006,6056,6107,6624,6936,7092,9048,9245,9302,9497,9678,9732,9789,9981,10039,10235,10291,10485,10542,10593,10815,10867,10922,11112,11328,11378,11430,12183,12389,12450,12510,12580,12713,12844,12972,13040,13169,13295,13357,13420,13488,13555,13678,13803,13870,13935,14000,14289,14470,14591,14712,14778,14845,15055,15124,15190,15315,15441,15508,15634,15761,15886,16013,16069,16134,16260,16383,16448,16656,16723,17011,17191,17311,17431,17496,17558,17620,17684,17746,17805,17865,17926,17987,18046,18106,18766,19017,23760,23809,23857,23915,24436,24744,24791,24851,24957,25137,25191,25584,25638,25694,26849,27197,29531,29590,29792,30122,30287,30341,30579,30634,30959,31098,31144,31199,31244,31288,31636,31773,122381,125638" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/e38dc42c74688090728264f3b8aa0abf/transformed/play-services-cronet-18.1.0/res/values/values.xml", + "from": { + "startLines": "-1", + "startColumns": "-1", + "startOffsets": "-1" + }, + "to": { + "startLines": "1977", + "startColumns": "4", + "startOffsets": "130818", + "endColumns": "126", + "endOffsets": "130940" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "470,637,638,651,652,952,953,1067,1068,1069,1070,1071,1072,1073,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1831,1832,1862,1863,1864,1865,1866,1867,1868,1869,1873,1874,1875,1876,1877,1878,1879,1887,1972,2031,2032,2033,2034,2035,2036,2037,2523,6479,6480,6484,6485,6489,7655,7656", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "24089,32458,32530,33578,33643,55981,56050,63705,63775,63843,63915,63985,64046,64120,117792,117853,117914,117976,118040,118102,118163,118231,118331,118391,118457,118530,118599,118656,118708,119500,119572,119648,119713,119772,119831,119891,119951,120011,120071,120131,120191,120251,120311,120371,120431,120490,120550,120610,120670,120730,120790,120850,120910,120970,121030,121090,121149,121209,121269,121328,121387,121446,121505,121564,122126,122161,123747,123802,123865,123920,123978,124036,124097,124160,124363,124414,124464,124525,124582,124648,124682,125064,130428,135463,135530,135602,135671,135740,135814,135886,184506,461227,461344,461545,461655,461856,545085,545157", + "endLines": "470,637,638,651,652,952,953,1067,1068,1069,1070,1071,1072,1073,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1831,1832,1862,1863,1864,1865,1866,1867,1868,1869,1873,1874,1875,1876,1877,1878,1879,1887,1972,2031,2032,2033,2034,2035,2036,2037,2523,6479,6483,6484,6488,6489,7655,7656", + "endColumns": "59,71,87,64,65,68,62,69,67,71,69,60,73,72,60,60,61,63,61,60,67,99,59,65,72,68,56,51,61,71,75,64,58,58,59,59,59,59,59,59,59,59,59,59,58,59,59,59,59,59,59,59,59,59,59,58,59,59,58,58,58,58,58,58,34,34,54,62,54,57,57,60,62,56,50,49,60,56,65,33,34,34,69,66,71,68,68,73,71,87,70,116,12,109,12,128,71,66", + "endOffsets": "24144,32525,32613,33638,33704,56045,56108,63770,63838,63910,63980,64041,64115,64188,117848,117909,117971,118035,118097,118158,118226,118326,118386,118452,118525,118594,118651,118703,118765,119567,119643,119708,119767,119826,119886,119946,120006,120066,120126,120186,120246,120306,120366,120426,120485,120545,120605,120665,120725,120785,120845,120905,120965,121025,121085,121144,121204,121264,121323,121382,121441,121500,121559,121618,122156,122191,123797,123860,123915,123973,124031,124092,124155,124212,124409,124459,124520,124577,124643,124677,124712,125094,130493,135525,135597,135666,135735,135809,135881,135969,184572,461339,461540,461650,461851,461980,545152,545219" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/2e296852593701edd20e274ff098f368/transformed/savedstate-1.2.1/res/values/values.xml", + "from": { + "startLines": "-1", + "startColumns": "-1", + "startOffsets": "-1" + }, + "to": { + "startLines": "1901", + "startColumns": "4", + "startOffsets": "125746", + "endColumns": "53", + "endOffsets": "125795" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values/ids.xml", + "from": { + "startLines": "-1,-1,-1", + "startColumns": "-1,-1,-1", + "startOffsets": "-1,-1,-1" + }, + "to": { + "startLines": "1870,1871,1872", + "startColumns": "4,4,4", + "startOffsets": "124217,124263,124315", + "endColumns": "45,51,47", + "endOffsets": "124258,124310,124358" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/6c0e8749c44e3843f0401e2e78787c36/transformed/customview-poolingcontainer-1.0.0/res/values/values.xml", + "from": { + "startLines": "-1,-1", + "startColumns": "-1,-1", + "startOffsets": "-1,-1" + }, + "to": { + "startLines": "1829,1850", + "startColumns": "4,4", + "startOffsets": "122006,123154", + "endColumns": "53,66", + "endOffsets": "122055,123216" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "10,16,27,30,31,32,33,34,37,38,39,40,41,43,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,117,118,140,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,226,228,229,231,232,233,234,235,236,237,238,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,467,468,469,497,509,510,511,512,513,514,515,516,517,518,519,520,524,525,526,527,529,530,531,532,533,534,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,575,576,587,588,598,599,629,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,1062,1066,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1784,1785,1833,1834,1835,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1854,1857,1858,1859,1880,1881,1882,1883,1884,1885,1886,1897,1906,1907,1910,1911,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1973,2010,2022,2023,2024,2025,2026,2027,2059,2060,2061,2062,2216,2220,2225,2226,2227,2230,2231,2232,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2321,2324,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2409,2410,2411,2412,2413,2489,2493,2494,2519,2520,2553,2557,2561,2565,2569,2570,2621,2629,2636,2806,2809,2819,2828,2837,2906,2907,2908,2909,2915,2916,2917,2918,2919,2920,2926,2927,2928,2929,2930,2935,2936,2940,2941,2947,2951,2952,2953,2954,2964,2965,2966,2970,2971,2977,2981,3051,3054,3055,3060,3061,3064,3065,3066,3067,3331,3338,3599,3605,3869,3876,4137,4143,4206,4288,4340,4422,4484,4566,4630,4682,4764,4772,4778,4789,4793,4797,4810,5585,5601,5608,5614,5631,5644,5664,5681,5690,5695,5702,5722,5735,5752,5758,5764,5771,5775,5781,5795,5798,5808,5809,5810,5858,5862,5866,5870,5871,5872,5875,5891,5898,5912,5957,5966,5972,5976,5980,5985,5992,5998,5999,6002,6006,6011,6024,6028,6033,6038,6043,6046,6049,6052,6056,6199,6200,6201,6202,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6301,6305,6309,6313,6317,6321,6325,6326,6327,6328,6329,6330,6331,6332,6336,6340,6341,6345,6346,6349,6353,6356,6359,6362,6366,6369,6372,6376,6380,6384,6388,6391,6392,6393,6394,6397,6401,6404,6407,6410,6413,6416,6419,6490,6493,6494,6497,6500,6501,6504,6505,6506,6510,6511,6516,6523,6530,6537,6544,6551,6558,6565,6572,6579,6588,6597,6606,6613,6622,6631,6634,6637,6638,6639,6640,6641,6642,6643,6644,6645,6646,6647,6648,6649,6653,6658,6663,6666,6667,6668,6669,6670,6678,6686,6687,6695,6699,6707,6715,6723,6731,6739,6740,6748,6756,6757,6760,6833,6835,6840,6842,6847,6851,6855,6856,6857,6858,6862,6866,6867,6871,6872,6873,6874,6875,6876,6877,6878,6879,6880,6881,6885,6886,6887,6888,6892,6893,6894,6895,6899,6903,6904,6908,6909,6910,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6939,6940,6941,6947,6948,6952,6954,6955,6960,6961,6962,6963,6964,6965,6969,6970,6971,6977,6978,6982,6984,6988,6992,6996,7020,7021,7022,7023,7026,7029,7032,7035,7038,7043,7047,7050,7051,7056,7060,7065,7071,7077,7082,7086,7091,7095,7099,7140,7141,7142,7143,7144,7148,7149,7150,7151,7155,7159,7163,7167,7171,7175,7179,7183,7189,7190,7231,7245,7250,7276,7283,7286,7297,7302,7305,7308,7363,7369,7370,7373,7376,7379,7382,7385,7388,7391,7395,7398,7399,7400,7408,7416,7419,7424,7429,7434,7439,7443,7447,7448,7456,7457,7458,7459,7460,7468,7473,7478,7479,7480,7481,7506,7512,7517,7520,7524,7527,7531,7541,7544,7549,7552,7556,7657,7665,7679,7692,7696,7711,7722,7725,7736,7741,7745,7780,7781,7782,7794,7802,7810,7818,7826,7846,7849,7876,7881,7901,7904,7907,7914,7927,7936,7939,7959,7969,7973,7977,7990,7994,7998,8002,8008,8012,8029,8037,8041,8045,8049,8052,8056,8060,8064,8074,8081,8088,8092,8118,8128,8153,8162,8182,8192,8196,8206,8231,8241,8244,8251,8258,8265,8266,8267,8268,8269,8276,8280,8286,8292,8293,8306,8307,8308,8311,8314,8317,8320,8323,8326,8329,8332,8335,8338,8341,8344,8347,8350,8353,8356,8359,8362,8365,8368,8371,8372,8380,8388,8389,8402,8412,8416,8421,8426,8430,8433,8437,8441,8444,8448,8451,8455,8460,8465,8468,8475,8479,8483,8492,8497,8502,8503,8507,8510,8514,8527,8532,8540,8544,8548,8565,8569,8574,8592,8599,8603,8633,8636,8639,8642,8645,8648,8651,8670,8676,8684,8691,8703,8711,8716,8724,8728,8746,8753,8769,8773,8781,8784,8789,8790,8791,8792,8796,8800,8804,8808,8843,8846,8850,8854,8888,8891,8895,8899,8908,8914,8917,8927,8931,8932,8939,8943,8950,8951,8952,8955,8960,8965,8966,8970,8985,9004,9008,9009,9021,9031,9032,9044,9049,9073,9076,9082,9085,9094,9102,9106,9109,9112,9115,9119,9122,9139,9143,9146,9161,9164,9172,9177,9184,9189,9190,9195,9196,9202,9208,9214,9246,9257,9274,9281,9285,9288,9301,9310,9314,9319,9323,9327,9331,9335,9339,9343,9347,9352,9355,9367,9372,9381,9384,9391,9392,9396,9405,9411,9415,9416,9420,9441,9447,9451,9455,9456,9474,9475,9476,9477,9478,9483,9486,9487,9493,9494,9506,9518,9525,9526,9531,9536,9537,9541,9555,9560,9566,9572,9578,9583,9589,9595,9596,9602,9617,9622,9631,9640,9643,9657,9662,9673,9677,9686,9695,9696,9703,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "490,732,1185,1343,1399,1459,1520,1585,1740,1790,1840,1893,1951,2050,2420,2468,2539,2611,2683,2756,2823,2872,2926,2963,3014,3074,3121,3177,3226,3284,3338,3399,3455,3506,3566,3622,3685,3734,3790,3846,3896,3955,4010,4072,4119,4173,4229,4281,4336,4390,4444,4498,4547,4605,4659,4716,4772,4819,4872,4928,4988,5051,5110,5172,5222,5276,5330,5378,5435,5488,6112,6166,7097,7208,7270,7326,7386,7439,7500,7579,7660,7732,7811,7891,7967,8045,8114,8190,8267,8338,8411,8487,8565,8634,8710,8787,8851,8922,11435,11531,11584,11688,11755,11808,11860,11910,11968,12033,12081,19022,19089,19155,19213,19282,19340,19409,19479,19552,19626,19694,19761,19831,19897,19970,20030,20106,20166,20226,20301,20369,20435,20503,20563,20622,20679,20745,20807,20864,20932,21005,21075,21137,21198,21266,21328,21398,21467,21523,21582,21644,21706,21773,21830,21891,21952,22013,22074,22130,22186,22242,22298,22356,22414,22472,22530,22587,22644,22701,22758,22817,22876,22934,23017,23100,23173,23227,23296,23352,23433,23514,23585,23920,23973,24031,25196,25755,25801,25861,25915,25985,26055,26120,26186,26251,26319,26388,26456,26586,26639,26698,26756,26854,26904,26956,27002,27052,27108,27202,27260,27318,27380,27443,27505,27564,27624,27689,27755,27820,27882,27944,28006,28068,28130,28192,28258,28325,28391,28454,28518,28581,28649,28710,28772,28834,28897,28961,29024,29088,29166,29225,29291,29371,29432,29636,29694,30127,30172,30639,30703,31895,34629,34703,34774,34840,34914,34983,35054,35127,35198,35266,35339,35415,35485,35563,35631,35697,35758,35827,35891,35957,36025,36091,36154,36222,36293,36358,36431,36494,36575,36639,36705,36775,36845,36915,36985,38010,38067,38125,38184,38244,38303,38362,38421,38480,38539,38598,38657,38716,38775,38834,38894,38955,39017,39078,39139,39200,39261,39322,39383,39443,39504,39565,39625,39686,39747,39808,39869,39930,39991,40052,40113,40174,40235,40296,40364,40433,40503,40572,40641,40710,40779,40848,40917,40986,41055,41124,41193,41253,41314,41376,41437,41498,41559,41620,41681,41742,41803,41864,41925,41986,42048,42111,42175,42238,42301,42364,42427,42490,42553,42616,42679,42742,42805,42866,42928,42991,43053,43115,43177,43239,43301,43363,43425,43487,43549,43611,43668,43754,43834,43924,44019,44111,44203,44293,44376,44469,44556,44653,44744,44845,44932,45035,45124,45223,45315,45415,45499,45593,45681,45779,45862,45953,46047,46146,46248,46346,46446,46533,46633,46719,46815,46903,46984,47075,47171,47264,47357,47448,47533,47627,47716,47814,47907,48009,48097,48201,48292,48392,48485,48586,48671,48766,48855,48954,49039,49131,49226,49326,49429,49528,49631,49720,49821,49908,50005,50093,50189,50281,50381,50471,50569,50654,50743,50832,50925,51012,51775,51841,51917,51986,52065,52138,52218,52298,52375,52443,52521,52597,52668,52749,52822,52905,52980,53065,53138,53219,53300,53374,53458,53528,53606,53676,53756,53834,53906,53988,54058,54135,54215,54300,54388,54472,54559,54633,54711,54789,54860,54941,55032,55115,55211,55309,55416,55481,55547,55600,55676,55742,55829,55905,63415,63650,64245,64299,64378,64456,64529,64594,64657,64723,64794,64865,64935,64997,65066,65132,65192,65259,65326,65382,65433,65486,65538,65592,65663,65726,65785,65847,65906,65979,66046,66116,66176,66239,66314,66386,66482,66553,66609,66680,66737,66794,66860,66924,66995,67052,67105,67168,67220,67278,68515,68584,68650,68709,68792,68851,68908,68975,69045,69119,69181,69250,69320,69419,69516,69615,69701,69787,69868,69943,70032,70123,70207,70266,70312,70378,70435,70502,70559,70641,70706,70772,70895,70979,71100,71165,71227,71325,71399,71482,71571,71635,71714,71788,71850,71946,72011,72070,72126,72182,72242,72349,72396,72456,72517,72581,72642,72702,72760,72803,72852,72904,72955,73007,73056,73105,73170,73236,73296,73357,73413,73472,73521,73569,73627,73684,73786,73843,73918,73966,74017,74079,74144,74196,74270,74333,74396,74464,74514,74576,74636,74693,74753,74802,74870,74976,75078,75147,75218,75274,75323,75423,75494,75604,75695,75777,75875,75931,76032,76142,76241,76304,76410,76487,76599,76726,76838,76965,77035,77149,77280,77377,77445,77563,77666,77784,77845,77919,77986,78091,78213,78287,78354,78464,78563,78636,78733,78855,78973,79091,79152,79274,79391,79459,79565,79667,79747,79818,79914,79981,80055,80129,80215,80305,80383,80460,80560,80631,80752,80873,80937,81062,81136,81260,81384,81451,81560,81688,81800,81879,81957,82058,82129,82251,82373,82438,82564,82676,82782,82850,82949,83053,83116,83182,83266,83379,83492,83610,83688,83760,83896,84032,84117,84257,84395,84533,84675,84757,84843,84920,84993,85102,85213,85341,85469,85601,85731,85861,85995,86084,86146,86242,86309,86426,86547,86644,86726,86813,86900,87031,87162,87297,87374,87451,87562,87676,87750,87859,87971,88038,88111,88176,88278,88374,88478,88546,88611,88705,88777,88887,88993,89066,89157,89259,89362,89457,89564,89669,89791,89913,90039,90098,90156,90280,90404,90532,90650,90768,90890,90976,91073,91207,91341,91421,91559,91691,91823,91959,92034,92110,92213,92287,92400,92481,92538,92599,92658,92718,92776,92837,92895,92945,92994,93061,93120,93179,93228,93299,93383,93453,93524,93604,93673,93736,93804,93870,93938,94003,94069,94146,94224,94330,94436,94532,94661,94750,94877,94943,95013,95099,95165,95248,95322,95420,95516,95612,95710,95819,95914,96003,96065,96125,96190,96247,96328,96382,96439,96536,96646,96707,96822,96943,97038,97130,97223,97279,97338,97387,97479,97528,97582,97636,97690,97744,97798,97853,97963,98073,98181,98291,98401,98511,98621,98729,98835,98939,99043,99147,99242,99337,99430,99523,99627,99733,99837,99941,100034,100127,100220,100313,100421,100527,100633,100739,100836,100931,101026,101121,101227,101333,101439,101545,101643,101738,101834,101931,101996,102100,102158,102222,102283,102345,102405,102470,102532,102600,102658,102721,102784,102851,102926,102999,103065,103117,103170,103222,103279,103363,103458,103543,103624,103704,103781,103860,103937,104011,104085,104156,104236,104308,104383,104448,104509,104569,104644,104718,104791,104861,104933,105003,105076,105140,105210,105256,105325,105377,105462,105545,105602,105668,105735,105801,105882,105957,106013,106066,106127,106185,106235,106284,106333,106382,106444,106496,106541,106622,106673,106727,106780,106834,106885,106934,107000,107051,107112,107173,107235,107285,107326,107403,107462,107521,107580,107641,107697,107753,107820,107881,107946,108001,108066,108135,108203,108281,108350,108410,108481,108555,108620,108692,108762,108829,108913,108982,109049,109119,109182,109249,109317,109400,109479,109569,109646,109714,109781,109859,109916,109973,110041,110107,110163,110223,110282,110336,110386,110436,110484,110546,110597,110670,110750,110830,110894,110961,111032,111090,111151,111217,111276,111343,111403,111463,111526,111594,111655,111722,111800,111870,111919,111976,112045,112106,112194,112282,112370,112458,112545,112632,112719,112806,112864,112938,113008,113064,113135,113200,113262,113337,113410,113500,113566,113632,113693,113757,113819,113877,113948,114031,114090,114161,114227,114292,114353,114412,114483,114549,114614,114697,114773,114848,114929,114989,115058,115128,115197,115252,115308,115364,115425,115483,115539,115598,115652,115707,115769,115826,115920,115989,116090,116141,116211,116274,116330,116388,116447,116501,116587,116671,116741,116810,116880,116995,117116,117183,117250,117325,117392,117451,117505,117559,117613,117666,117718,119223,119360,122196,122245,122295,122386,122434,122490,122548,122610,122665,122723,122794,122858,122917,122979,123045,123359,123504,123548,123593,124717,124768,124815,124860,124911,124962,125013,125550,126040,126106,126285,126348,126488,126545,126599,126654,126712,126767,126826,126882,126951,127020,127089,127159,127222,127285,127348,127411,127476,127541,127606,127671,127734,127798,127862,127926,127977,128055,128133,128204,128276,128349,128421,128487,128553,128621,128689,128755,128822,128896,128959,129016,129076,129141,129208,129273,129330,129391,129449,129553,129663,129772,129876,129954,130019,130086,130152,130222,130269,130321,130371,130498,133158,134213,134344,134528,134706,134944,135133,137683,137781,137896,137981,152746,152986,153433,153522,153679,153984,154137,154291,156502,156689,156785,156875,156971,157061,157227,157350,157473,157643,157749,157864,157979,158081,158187,158304,158834,158916,159089,159257,159405,159564,159719,159892,160009,160126,160294,160406,160520,160692,160868,161026,161159,161271,161417,161569,161701,161844,161966,162144,162280,162376,162512,162607,162774,162867,162959,163146,163302,163480,163644,163826,164143,164325,164507,164697,164929,165119,165296,165458,165615,165725,165908,166045,166249,166433,166617,166777,166935,167119,167346,167549,167720,167940,168162,168317,168517,168701,168804,168994,169135,169300,169471,169671,169875,170077,170242,170447,170646,170845,171042,171133,171282,171432,171516,171665,171810,171962,172103,172269,174804,174882,175183,175349,175504,181562,181783,181947,184019,184242,186769,187046,187318,187596,187841,187903,191031,191482,191938,203075,203223,203737,204174,204608,208948,209033,209154,209253,209658,209755,209872,209959,210082,210183,210589,210688,210807,210900,211007,211350,211457,211702,211823,212232,212480,212580,212685,212804,213313,213460,213579,213830,213963,214378,214632,219847,220094,220219,220627,220748,220976,221097,221230,221377,242099,242591,263062,263486,284253,284747,305263,305689,310530,315947,320038,325469,330211,335588,339572,343564,348955,349502,349935,350691,350921,351164,352331,400501,401405,401989,402462,403892,404636,405829,406883,407361,407654,408037,409552,410317,411460,411901,412342,412938,413212,413623,414639,414817,415570,415707,415798,417992,418258,418580,418790,418899,419018,419202,420320,420790,421541,424124,424537,424913,425141,425397,425656,426232,426586,426708,426847,427139,427399,428327,428613,429016,429418,429761,429973,430174,430387,430676,441563,441636,441723,441808,446477,446589,446695,446818,446950,447073,447203,447327,447460,447591,447716,447833,447953,448085,448213,448327,448445,448558,448679,448867,449054,449235,449418,449602,449767,449949,450069,450189,450297,450407,450519,450627,450737,450902,451068,451220,451385,451486,451606,451777,451938,452101,452262,452429,452548,452665,452845,453027,453208,453391,453546,453691,453813,453948,454111,454304,454430,454582,454724,454894,455050,455222,461985,462180,462272,462445,462607,462702,462871,462965,463054,463297,463386,463679,464095,464515,464936,465362,465779,466195,466612,467030,467444,467914,468387,468859,469270,469741,470213,470403,470609,470715,470823,470929,471041,471155,471267,471381,471497,471611,471719,471829,471937,472199,472578,472982,473129,473237,473347,473455,473569,473978,474392,474508,474926,475167,475597,476032,476442,476864,477274,477396,477805,478221,478343,478561,483311,483379,483723,483803,484159,484309,484453,484529,484641,484731,484993,485258,485366,485518,485626,485702,485814,485904,486006,486114,486222,486322,486430,486515,486681,486785,486913,487000,487167,487245,487359,487451,487715,487982,488092,488245,488355,488439,488828,488926,489034,489128,489258,489366,489488,489624,489732,489852,489986,490108,490236,490378,490504,490644,490770,490888,491020,491118,491228,491528,491640,491758,492222,492338,492641,492767,492863,493264,493374,493498,493636,493746,493868,494180,494304,494434,494910,495038,495353,495491,495653,495869,496025,497642,497710,497794,497898,498101,498290,498491,498684,498889,499202,499414,499580,499696,499942,500158,500471,500897,501359,501596,501748,502008,502152,502294,505526,505640,505760,505876,505970,506291,506390,506508,506609,506888,507173,507452,507734,507987,508246,508499,508755,509179,509255,512505,513860,514304,516158,516733,516941,517951,518331,518497,518638,523658,524084,524196,524331,524484,524681,524852,525035,525210,525397,525669,525827,525911,526015,526502,527058,527216,527435,527666,527889,528124,528346,528612,528750,529349,529463,529601,529713,529837,530408,530903,531449,531594,531687,531779,533706,534276,534574,534763,534969,535162,535372,536256,536401,536793,536951,537168,545224,545656,546531,547151,547348,548296,549061,549184,549957,550178,550378,552355,552455,552545,553231,553984,554749,555512,556287,557500,557665,559278,559599,560662,560872,561042,561612,562507,563140,563306,564792,565408,565644,565865,566823,567088,567353,567600,568014,568250,569535,569984,570171,570420,570662,570838,571079,571312,571537,572132,572607,573131,573392,574743,575218,576444,576914,577962,578414,578658,579115,580360,580843,580993,581548,582000,582400,582553,582698,582841,582911,583339,583627,584131,584640,584756,585658,585780,585892,586069,586335,586605,586871,587139,587395,587655,587911,588169,588421,588677,588929,589183,589415,589651,589903,590159,590411,590665,590897,591131,591243,591895,592350,592474,593566,594381,594577,594901,595290,595642,595883,596097,596396,596588,596903,597110,597456,597756,598157,598376,598789,599026,599396,600120,600475,600744,600884,601138,601282,601559,602551,602960,603592,603938,604306,605380,605743,606143,607651,608236,608554,611089,611283,611501,611727,611939,612138,612345,613549,613844,614401,614791,615423,615900,616145,616632,616878,618074,618471,619477,619699,620122,620313,620692,620780,620888,620996,621309,621634,621953,622284,624987,625175,625436,625685,628269,628461,628726,628979,629511,629919,630118,630702,630937,631061,631473,631687,632089,632192,632322,632497,632749,632945,633085,633279,634290,635359,635647,635777,636554,637211,637357,638063,638301,639841,639991,640408,640573,641259,641729,641925,642016,642100,642244,642478,642645,643573,643859,644019,644634,644793,645121,645348,645860,646222,646301,646640,646745,647110,647481,647842,649716,650345,651421,651845,652098,652250,653298,654035,654238,654484,654731,654949,655191,655512,655776,656081,656304,656615,656804,657519,657788,658282,658508,658948,659107,659391,660136,660501,660806,660964,661202,662521,662919,663147,663367,663509,664799,664905,665035,665173,665297,665585,665754,665854,666139,666253,667136,667891,668330,668454,668700,668893,669027,669218,669997,670215,670506,670785,671102,671324,671619,671902,672006,672347,673163,673479,674040,674546,674751,675537,675942,676603,676792,677343,677909,678029,678431,814468,814563,814656,814719,814801,814894,814987,815074,815172,815263,815354,815442,815526,815622,815722,815828,815931,816032,816136,816242,816341,816447,816549,816656,816765,816876,817007,817127,817243,817361,817460,817567,817683,817802,817930,818019,818114,818191,818280,818371,818464,818538,818635,818730,818828,818927,819031,819127,819229,819332,819432,819535,819620,819721,819819,819909,820004,820091,820197,820299,820393,820484,820578,820654,820746,820835,820938,821049,821132,821218,821313,821410,821506,821594,821695,821796,821899,822005,822103,822200,822295,822393,822496,822596,822699,822804,822922,823038,823133,823226,823311,823407,823501,823593,823676,823780,823885,823985,824086,824191,824291,824392,824491,824593,824687,824794,824896,824999,825092,825188,825290,825393,825489,825591,825694,825791,825894,825992,826096,826201,826298,826406,826520,826635,826743,826857,826972,827074,827179,827287,827397,827513,827630,827725,827822,827921,828026,828132,828231,828336,828442,828542,828648,828749,828856,828975,829074,829179,829281,829383,829483,829586,829681,829785,829870,829974,830078,830176,830280,830386,830484,830589,830687,830800,830894,830983,831072,831155,831246,831329,831427,831517,831613,831702,831796,831884,831980,832065,832173,832274,832375,832473,832579,832670,832769,832866,832964,833060,833153,833263,833361,833456,833566,833658,833758,833857,833944,834048,834153,834252,834359,834466,834565,834674,834766,834877,834988,835099,835203,835318,835434,835561,835681,835776,835871,835968,836067,836159,836258,836350,836449,836535,836629,836732,836828,836931,837027,837130,837227,837325,837428,837521,837611,837712,837795,837886,837971,838063,838166,838261,838357,838450,838544,838623,838730,838821,838920,839013,839116,839220,839321,839422,839526,839620,839724,839828,839941,840047,840153,840261,840378,840479,840587,840687,840790,840895,841002,841098,841177,841267,841351,841443,841516,841608,841697,841789,841874,841971,842064,842159,842258,842355,842446,842537,842629,842724,842831,842939,843041,843138,843235,843328,843415,843499,843596,843693,843786,843873,843964,844063,844162,844257,844346,844427,844526,844630,844727,844832,844929,845013,845112,845216,845313,845418,845515,845613,845714,845820,845919,846026,846125,846224,846315,846404,846493,846575,846668,846759,846870,846971,847071,847183,847296,847394,847502,847596,847696,847785,847877,847988,848098,848193,848309,848435,848561,848680,848808,848933,849058,849176,849303,849412,849521,849634,849757,849880,849996,850121,850218,850326,850448,850564,850680,850789,850877,850978,851067,851168,851255,851343,851440,851532,851638,851738,851814", + "endLines": "10,16,27,30,31,32,33,34,37,38,39,40,41,43,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,117,118,140,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,226,228,229,231,232,233,234,235,236,237,238,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,462,467,468,469,497,509,510,511,512,513,514,515,516,517,518,519,523,524,525,526,527,529,530,531,532,533,534,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,575,576,587,588,598,599,629,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,1062,1066,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1784,1785,1833,1834,1835,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1854,1857,1858,1859,1880,1881,1882,1883,1884,1885,1886,1897,1906,1907,1910,1911,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1976,2010,2022,2023,2024,2025,2026,2027,2059,2060,2061,2062,2218,2220,2225,2226,2227,2230,2231,2232,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2320,2323,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2409,2410,2411,2412,2413,2491,2493,2494,2519,2520,2556,2560,2564,2568,2569,2573,2628,2635,2643,2808,2818,2827,2836,2845,2906,2907,2908,2914,2915,2916,2917,2918,2919,2925,2926,2927,2928,2929,2934,2935,2939,2940,2946,2950,2951,2952,2953,2963,2964,2965,2969,2970,2976,2980,2981,3053,3054,3059,3060,3063,3064,3065,3066,3330,3337,3598,3604,3868,3875,4136,4142,4205,4287,4339,4421,4483,4565,4629,4681,4763,4771,4777,4788,4792,4796,4809,4824,5600,5607,5613,5630,5643,5663,5680,5689,5694,5701,5721,5734,5751,5757,5763,5770,5774,5780,5794,5797,5807,5808,5809,5857,5861,5865,5869,5870,5871,5874,5890,5897,5911,5956,5957,5971,5975,5979,5984,5991,5997,5998,6001,6005,6010,6023,6027,6032,6037,6042,6045,6048,6051,6055,6059,6199,6200,6201,6202,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6300,6304,6308,6312,6316,6320,6324,6325,6326,6327,6328,6329,6330,6331,6335,6339,6340,6344,6345,6348,6352,6355,6358,6361,6365,6368,6371,6375,6379,6383,6387,6390,6391,6392,6393,6396,6400,6403,6406,6409,6412,6415,6418,6422,6492,6493,6496,6499,6500,6503,6504,6505,6509,6510,6515,6522,6529,6536,6543,6550,6557,6564,6571,6578,6587,6596,6605,6612,6621,6630,6633,6636,6637,6638,6639,6640,6641,6642,6643,6644,6645,6646,6647,6648,6652,6657,6662,6665,6666,6667,6668,6669,6677,6685,6686,6694,6698,6706,6714,6722,6730,6738,6739,6747,6755,6756,6759,6762,6834,6839,6841,6846,6850,6854,6855,6856,6857,6861,6865,6866,6870,6871,6872,6873,6874,6875,6876,6877,6878,6879,6880,6884,6885,6886,6887,6891,6892,6893,6894,6898,6902,6903,6907,6908,6909,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6938,6939,6940,6946,6947,6951,6953,6954,6959,6960,6961,6962,6963,6964,6968,6969,6970,6976,6977,6981,6983,6987,6991,6995,6999,7020,7021,7022,7025,7028,7031,7034,7037,7042,7046,7049,7050,7055,7059,7064,7070,7076,7081,7085,7090,7094,7098,7139,7140,7141,7142,7143,7147,7148,7149,7150,7154,7158,7162,7166,7170,7174,7178,7182,7188,7189,7230,7244,7249,7275,7282,7285,7296,7301,7304,7307,7362,7368,7369,7372,7375,7378,7381,7384,7387,7390,7394,7397,7398,7399,7407,7415,7418,7423,7428,7433,7438,7442,7446,7447,7455,7456,7457,7458,7459,7467,7472,7477,7478,7479,7480,7505,7511,7516,7519,7523,7526,7530,7540,7543,7548,7551,7555,7559,7664,7678,7691,7695,7710,7721,7724,7735,7740,7744,7779,7780,7781,7793,7801,7809,7817,7825,7845,7848,7875,7880,7900,7903,7906,7913,7926,7935,7938,7958,7968,7972,7976,7989,7993,7997,8001,8007,8011,8028,8036,8040,8044,8048,8051,8055,8059,8063,8073,8080,8087,8091,8117,8127,8152,8161,8181,8191,8195,8205,8230,8240,8243,8250,8257,8264,8265,8266,8267,8268,8275,8279,8285,8291,8292,8305,8306,8307,8310,8313,8316,8319,8322,8325,8328,8331,8334,8337,8340,8343,8346,8349,8352,8355,8358,8361,8364,8367,8370,8371,8379,8387,8388,8401,8411,8415,8420,8425,8429,8432,8436,8440,8443,8447,8450,8454,8459,8464,8467,8474,8478,8482,8491,8496,8501,8502,8506,8509,8513,8526,8531,8539,8543,8547,8564,8568,8573,8591,8598,8602,8632,8635,8638,8641,8644,8647,8650,8669,8675,8683,8690,8702,8710,8715,8723,8727,8745,8752,8768,8772,8780,8783,8788,8789,8790,8791,8795,8799,8803,8807,8842,8845,8849,8853,8887,8890,8894,8898,8907,8913,8916,8926,8930,8931,8938,8942,8949,8950,8951,8954,8959,8964,8965,8969,8984,9003,9007,9008,9020,9030,9031,9043,9048,9072,9075,9081,9084,9093,9101,9105,9108,9111,9114,9118,9121,9138,9142,9145,9160,9163,9171,9176,9183,9188,9189,9194,9195,9201,9207,9213,9245,9256,9273,9280,9284,9287,9300,9309,9313,9318,9322,9326,9330,9334,9338,9342,9346,9351,9354,9366,9371,9380,9383,9390,9391,9395,9404,9410,9414,9415,9419,9440,9446,9450,9454,9455,9473,9474,9475,9476,9477,9482,9485,9486,9492,9493,9505,9517,9524,9525,9530,9535,9536,9540,9554,9559,9565,9571,9577,9582,9588,9594,9595,9601,9616,9621,9630,9639,9642,9656,9661,9672,9676,9685,9694,9695,9702,9710,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370", + "endColumns": "55,48,54,55,59,60,64,54,49,49,52,57,47,68,47,70,71,71,72,66,48,53,36,50,59,46,55,48,57,53,60,55,50,59,55,62,48,55,55,49,58,54,61,46,53,55,51,54,53,53,53,48,57,53,56,55,46,52,55,59,62,58,61,49,53,53,47,56,52,55,53,55,62,61,55,59,52,60,78,80,71,78,79,75,77,68,75,76,70,72,75,77,68,75,76,63,70,71,50,52,54,66,52,51,49,57,64,47,50,66,65,57,68,57,68,69,72,73,67,66,69,65,72,59,75,59,59,74,67,65,67,59,58,56,65,61,56,67,72,69,61,60,67,61,69,68,55,58,61,61,66,56,60,60,60,60,55,55,55,55,57,57,57,57,56,56,56,56,58,58,57,82,82,72,53,68,55,80,80,70,9,52,57,57,57,45,59,53,69,69,64,65,64,67,68,67,9,52,58,57,51,49,51,45,49,55,46,57,57,61,62,61,58,59,64,65,64,61,61,61,61,61,61,65,66,65,62,63,62,67,60,61,61,62,63,62,63,77,58,65,79,60,52,57,50,44,60,63,58,61,73,70,65,73,68,70,72,70,67,72,75,69,77,67,65,60,68,63,65,67,65,62,67,70,64,72,62,80,63,65,69,69,69,69,66,56,57,58,59,58,58,58,58,58,58,58,58,58,58,59,60,61,60,60,60,60,60,60,59,60,60,59,60,60,60,60,60,60,60,60,60,60,60,67,68,69,68,68,68,68,68,68,68,68,68,68,59,60,61,60,60,60,60,60,60,60,60,60,60,61,62,63,62,62,62,62,62,62,62,62,62,62,60,61,62,61,61,61,61,61,61,61,61,61,61,56,85,79,89,94,91,91,89,82,92,86,96,90,100,86,102,88,98,91,99,83,93,87,97,82,90,93,98,101,97,99,86,99,85,95,87,80,90,95,92,92,90,84,93,88,97,92,101,87,103,90,99,92,100,84,94,88,98,84,91,94,99,102,98,102,88,100,86,96,87,95,91,99,89,97,84,88,88,92,86,90,65,75,68,78,72,79,79,76,67,77,75,70,80,72,82,74,84,72,80,80,73,83,69,77,69,79,77,71,81,69,76,79,84,87,83,86,73,77,77,70,80,90,82,95,97,106,64,65,52,75,65,86,75,75,64,54,53,78,77,72,64,62,65,70,70,69,61,68,65,59,66,66,55,50,52,51,53,70,62,58,61,58,72,66,69,59,62,74,71,95,70,55,70,56,56,65,63,70,56,52,62,51,57,66,68,65,58,82,58,56,66,69,73,61,68,69,98,96,98,85,85,80,74,88,90,83,58,45,65,56,66,56,81,64,65,122,83,120,64,61,97,73,82,88,63,78,73,61,95,64,58,55,55,59,106,46,59,60,63,60,59,57,42,48,51,50,51,48,48,64,65,59,60,55,58,48,47,57,56,101,56,74,47,50,61,64,51,73,62,62,67,49,61,59,56,59,48,67,105,101,68,70,55,48,99,70,109,90,81,97,55,100,109,98,62,105,76,111,126,111,126,69,113,130,96,67,117,102,117,60,73,66,104,121,73,66,109,98,72,96,121,117,117,60,121,116,67,105,101,79,70,95,66,73,73,85,89,77,76,99,70,120,120,63,124,73,123,123,66,108,127,111,78,77,100,70,121,121,64,125,111,105,67,98,103,62,65,83,112,112,117,77,71,135,135,84,139,137,137,141,81,85,76,72,108,110,127,127,131,129,129,133,88,61,95,66,116,120,96,81,86,86,130,130,134,76,76,110,113,73,108,111,66,72,64,101,95,103,67,64,93,71,109,105,72,90,101,102,94,106,104,121,121,125,58,57,123,123,127,117,117,121,85,96,133,133,79,137,131,131,135,74,75,102,73,112,80,56,60,58,59,57,60,57,49,48,66,58,58,48,70,83,69,70,79,68,62,67,65,67,64,65,76,77,105,105,95,128,88,126,65,69,85,65,82,73,97,95,95,97,108,94,88,61,59,64,56,80,53,56,96,109,60,114,120,94,91,92,55,58,48,91,48,53,53,53,53,53,54,109,109,107,109,109,109,109,107,105,103,103,103,94,94,92,92,103,105,103,103,92,92,92,92,107,105,105,105,96,94,94,94,105,105,105,105,97,94,95,96,64,103,57,63,60,61,59,64,61,67,57,62,62,66,74,72,65,51,52,51,56,83,94,84,80,79,76,78,76,73,73,70,79,71,74,64,60,59,74,73,72,69,71,69,72,63,69,45,68,51,84,82,56,65,66,65,80,74,55,52,60,57,49,48,48,48,61,51,44,80,50,53,52,53,50,48,65,50,60,60,61,49,40,76,58,58,58,60,55,55,66,60,64,54,64,68,67,77,68,59,70,73,64,71,69,66,83,68,66,69,62,66,67,82,78,89,76,67,66,77,56,56,67,65,55,59,58,53,49,49,47,61,50,72,79,79,63,66,70,57,60,65,58,66,59,59,62,67,60,66,77,69,48,56,68,60,87,87,87,87,86,86,86,86,57,73,69,55,70,64,61,74,72,89,65,65,60,63,61,57,70,82,58,70,65,64,60,58,70,65,64,82,75,74,80,59,68,69,68,54,55,55,60,57,55,58,53,54,61,56,93,68,100,50,69,62,55,57,58,53,85,83,69,68,69,114,120,66,66,74,66,58,53,53,53,52,51,73,136,139,48,49,49,47,55,57,61,54,57,70,63,58,61,65,65,42,43,44,42,50,46,44,50,50,50,50,47,65,61,62,71,56,53,54,57,54,58,55,68,68,68,69,62,62,62,62,64,64,64,64,62,63,63,63,50,77,77,70,71,72,71,65,65,67,67,65,66,73,62,56,59,64,66,64,56,60,57,103,109,108,103,77,64,66,65,69,46,51,49,56,12,149,130,183,177,237,188,168,97,114,84,78,11,64,88,156,156,152,153,58,186,95,89,95,89,165,122,122,169,105,114,114,101,105,116,114,81,172,167,147,158,154,172,116,116,167,111,113,171,175,157,132,111,145,151,131,142,121,177,135,95,135,94,166,92,91,186,11,11,11,181,316,181,181,189,231,189,176,161,156,109,182,136,203,183,183,159,157,183,226,202,170,219,221,154,199,183,102,189,140,164,170,199,203,201,164,204,198,198,196,90,148,149,83,148,144,151,140,165,160,77,300,165,154,101,11,163,185,222,124,10,10,10,10,61,10,10,10,10,10,10,10,10,10,84,120,98,10,96,116,86,122,100,10,98,118,92,106,10,106,10,120,10,10,99,104,118,10,146,118,10,132,10,10,111,10,124,10,120,10,120,132,146,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,136,90,10,10,10,10,108,118,10,10,10,10,10,94,10,10,10,10,10,10,121,10,10,10,10,10,10,10,10,10,10,10,10,10,72,86,84,98,111,105,122,131,122,129,123,132,130,124,116,119,131,127,113,117,112,120,10,10,10,10,10,10,10,119,119,107,109,111,107,109,10,10,151,10,100,10,10,10,10,10,10,10,10,10,10,10,10,10,144,121,134,10,10,10,10,10,10,10,10,10,10,91,10,10,94,10,93,88,10,88,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,105,107,105,111,113,111,113,115,113,107,109,107,10,10,10,10,107,109,107,113,10,10,115,10,10,10,10,10,10,10,121,10,10,121,10,10,10,10,10,10,10,10,75,111,89,10,10,107,10,107,75,111,89,101,107,107,99,107,84,10,103,127,86,10,77,113,91,10,10,109,10,109,83,10,97,107,93,129,107,121,135,107,119,133,121,127,141,125,139,125,117,131,97,109,10,111,117,10,115,10,10,95,10,109,123,137,109,121,10,123,129,10,127,10,10,10,10,10,10,67,83,103,10,10,10,10,10,10,10,10,115,10,10,10,10,10,10,10,10,10,10,10,113,119,115,93,10,98,117,100,10,10,10,10,10,10,10,10,10,75,10,10,10,10,10,10,10,10,10,10,10,10,111,10,10,10,10,10,10,10,10,10,83,103,10,10,10,10,10,10,10,10,10,137,10,113,137,111,123,10,10,10,144,92,91,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,99,89,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,152,144,142,69,10,10,10,10,115,10,121,111,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,111,10,10,123,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,139,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,87,107,107,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,123,10,10,10,102,129,10,10,10,139,10,10,10,10,129,10,10,145,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,78,10,104,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,158,10,10,10,10,157,10,10,10,10,10,141,10,105,129,137,123,10,10,99,10,113,10,10,10,123,10,10,133,10,10,10,10,10,10,10,10,10,103,10,10,10,10,10,10,10,10,10,10,10,10,119,10,10,94,92,62,81,92,92,86,97,90,90,87,83,95,99,105,102,100,103,105,98,105,101,106,108,110,130,119,115,117,98,106,115,118,127,88,94,76,88,90,92,73,96,94,97,98,103,95,101,102,99,102,84,100,97,89,94,86,105,101,93,90,93,75,91,88,102,110,82,85,94,96,95,87,100,100,102,105,97,96,94,97,102,99,102,104,117,115,94,92,84,95,93,91,82,103,104,99,100,104,99,100,98,101,93,106,101,102,92,95,101,102,95,101,102,96,102,97,103,104,96,107,113,114,107,113,114,101,104,107,109,115,116,94,96,98,104,105,98,104,105,99,105,100,106,118,98,104,101,101,99,102,94,103,84,103,103,97,103,105,97,104,97,112,93,88,88,82,90,82,97,89,95,88,93,87,95,84,107,100,100,97,105,90,98,96,97,95,92,109,97,94,109,91,99,98,86,103,104,98,106,106,98,108,91,110,110,110,103,114,115,126,119,94,94,96,98,91,98,91,98,85,93,102,95,102,95,102,96,97,102,92,89,100,82,90,84,91,102,94,95,92,93,78,106,90,98,92,102,103,100,100,103,93,103,103,112,105,105,107,116,100,107,99,102,104,106,95,78,89,83,91,72,91,88,91,84,96,92,94,98,96,90,90,91,94,106,107,101,96,96,92,86,83,96,96,92,86,90,98,98,94,88,80,98,103,96,104,96,83,98,103,96,104,96,97,100,105,98,106,98,98,90,88,88,81,92,90,110,100,99,111,112,97,107,93,99,88,91,110,109,94,115,125,125,118,127,124,124,117,126,108,108,112,122,122,115,124,96,107,121,115,115,108,87,100,88,100,86,87,96,91,105,99,75,76", + "endOffsets": "541,776,1235,1394,1454,1515,1580,1635,1785,1835,1888,1946,1994,2114,2463,2534,2606,2678,2751,2818,2867,2921,2958,3009,3069,3116,3172,3221,3279,3333,3394,3450,3501,3561,3617,3680,3729,3785,3841,3891,3950,4005,4067,4114,4168,4224,4276,4331,4385,4439,4493,4542,4600,4654,4711,4767,4814,4867,4923,4983,5046,5105,5167,5217,5271,5325,5373,5430,5483,5539,6161,6217,7155,7265,7321,7381,7434,7495,7574,7655,7727,7806,7886,7962,8040,8109,8185,8262,8333,8406,8482,8560,8629,8705,8782,8846,8917,8989,11481,11579,11634,11750,11803,11855,11905,11963,12028,12076,12127,19084,19150,19208,19277,19335,19404,19474,19547,19621,19689,19756,19826,19892,19965,20025,20101,20161,20221,20296,20364,20430,20498,20558,20617,20674,20740,20802,20859,20927,21000,21070,21132,21193,21261,21323,21393,21462,21518,21577,21639,21701,21768,21825,21886,21947,22008,22069,22125,22181,22237,22293,22351,22409,22467,22525,22582,22639,22696,22753,22812,22871,22929,23012,23095,23168,23222,23291,23347,23428,23509,23580,23709,23968,24026,24084,25249,25796,25856,25910,25980,26050,26115,26181,26246,26314,26383,26451,26581,26634,26693,26751,26803,26899,26951,26997,27047,27103,27150,27255,27313,27375,27438,27500,27559,27619,27684,27750,27815,27877,27939,28001,28063,28125,28187,28253,28320,28386,28449,28513,28576,28644,28705,28767,28829,28892,28956,29019,29083,29161,29220,29286,29366,29427,29480,29689,29740,30167,30228,30698,30757,31952,34698,34769,34835,34909,34978,35049,35122,35193,35261,35334,35410,35480,35558,35626,35692,35753,35822,35886,35952,36020,36086,36149,36217,36288,36353,36426,36489,36570,36634,36700,36770,36840,36910,36980,37047,38062,38120,38179,38239,38298,38357,38416,38475,38534,38593,38652,38711,38770,38829,38889,38950,39012,39073,39134,39195,39256,39317,39378,39438,39499,39560,39620,39681,39742,39803,39864,39925,39986,40047,40108,40169,40230,40291,40359,40428,40498,40567,40636,40705,40774,40843,40912,40981,41050,41119,41188,41248,41309,41371,41432,41493,41554,41615,41676,41737,41798,41859,41920,41981,42043,42106,42170,42233,42296,42359,42422,42485,42548,42611,42674,42737,42800,42861,42923,42986,43048,43110,43172,43234,43296,43358,43420,43482,43544,43606,43663,43749,43829,43919,44014,44106,44198,44288,44371,44464,44551,44648,44739,44840,44927,45030,45119,45218,45310,45410,45494,45588,45676,45774,45857,45948,46042,46141,46243,46341,46441,46528,46628,46714,46810,46898,46979,47070,47166,47259,47352,47443,47528,47622,47711,47809,47902,48004,48092,48196,48287,48387,48480,48581,48666,48761,48850,48949,49034,49126,49221,49321,49424,49523,49626,49715,49816,49903,50000,50088,50184,50276,50376,50466,50564,50649,50738,50827,50920,51007,51098,51836,51912,51981,52060,52133,52213,52293,52370,52438,52516,52592,52663,52744,52817,52900,52975,53060,53133,53214,53295,53369,53453,53523,53601,53671,53751,53829,53901,53983,54053,54130,54210,54295,54383,54467,54554,54628,54706,54784,54855,54936,55027,55110,55206,55304,55411,55476,55542,55595,55671,55737,55824,55900,55976,63475,63700,64294,64373,64451,64524,64589,64652,64718,64789,64860,64930,64992,65061,65127,65187,65254,65321,65377,65428,65481,65533,65587,65658,65721,65780,65842,65901,65974,66041,66111,66171,66234,66309,66381,66477,66548,66604,66675,66732,66789,66855,66919,66990,67047,67100,67163,67215,67273,67340,68579,68645,68704,68787,68846,68903,68970,69040,69114,69176,69245,69315,69414,69511,69610,69696,69782,69863,69938,70027,70118,70202,70261,70307,70373,70430,70497,70554,70636,70701,70767,70890,70974,71095,71160,71222,71320,71394,71477,71566,71630,71709,71783,71845,71941,72006,72065,72121,72177,72237,72344,72391,72451,72512,72576,72637,72697,72755,72798,72847,72899,72950,73002,73051,73100,73165,73231,73291,73352,73408,73467,73516,73564,73622,73679,73781,73838,73913,73961,74012,74074,74139,74191,74265,74328,74391,74459,74509,74571,74631,74688,74748,74797,74865,74971,75073,75142,75213,75269,75318,75418,75489,75599,75690,75772,75870,75926,76027,76137,76236,76299,76405,76482,76594,76721,76833,76960,77030,77144,77275,77372,77440,77558,77661,77779,77840,77914,77981,78086,78208,78282,78349,78459,78558,78631,78728,78850,78968,79086,79147,79269,79386,79454,79560,79662,79742,79813,79909,79976,80050,80124,80210,80300,80378,80455,80555,80626,80747,80868,80932,81057,81131,81255,81379,81446,81555,81683,81795,81874,81952,82053,82124,82246,82368,82433,82559,82671,82777,82845,82944,83048,83111,83177,83261,83374,83487,83605,83683,83755,83891,84027,84112,84252,84390,84528,84670,84752,84838,84915,84988,85097,85208,85336,85464,85596,85726,85856,85990,86079,86141,86237,86304,86421,86542,86639,86721,86808,86895,87026,87157,87292,87369,87446,87557,87671,87745,87854,87966,88033,88106,88171,88273,88369,88473,88541,88606,88700,88772,88882,88988,89061,89152,89254,89357,89452,89559,89664,89786,89908,90034,90093,90151,90275,90399,90527,90645,90763,90885,90971,91068,91202,91336,91416,91554,91686,91818,91954,92029,92105,92208,92282,92395,92476,92533,92594,92653,92713,92771,92832,92890,92940,92989,93056,93115,93174,93223,93294,93378,93448,93519,93599,93668,93731,93799,93865,93933,93998,94064,94141,94219,94325,94431,94527,94656,94745,94872,94938,95008,95094,95160,95243,95317,95415,95511,95607,95705,95814,95909,95998,96060,96120,96185,96242,96323,96377,96434,96531,96641,96702,96817,96938,97033,97125,97218,97274,97333,97382,97474,97523,97577,97631,97685,97739,97793,97848,97958,98068,98176,98286,98396,98506,98616,98724,98830,98934,99038,99142,99237,99332,99425,99518,99622,99728,99832,99936,100029,100122,100215,100308,100416,100522,100628,100734,100831,100926,101021,101116,101222,101328,101434,101540,101638,101733,101829,101926,101991,102095,102153,102217,102278,102340,102400,102465,102527,102595,102653,102716,102779,102846,102921,102994,103060,103112,103165,103217,103274,103358,103453,103538,103619,103699,103776,103855,103932,104006,104080,104151,104231,104303,104378,104443,104504,104564,104639,104713,104786,104856,104928,104998,105071,105135,105205,105251,105320,105372,105457,105540,105597,105663,105730,105796,105877,105952,106008,106061,106122,106180,106230,106279,106328,106377,106439,106491,106536,106617,106668,106722,106775,106829,106880,106929,106995,107046,107107,107168,107230,107280,107321,107398,107457,107516,107575,107636,107692,107748,107815,107876,107941,107996,108061,108130,108198,108276,108345,108405,108476,108550,108615,108687,108757,108824,108908,108977,109044,109114,109177,109244,109312,109395,109474,109564,109641,109709,109776,109854,109911,109968,110036,110102,110158,110218,110277,110331,110381,110431,110479,110541,110592,110665,110745,110825,110889,110956,111027,111085,111146,111212,111271,111338,111398,111458,111521,111589,111650,111717,111795,111865,111914,111971,112040,112101,112189,112277,112365,112453,112540,112627,112714,112801,112859,112933,113003,113059,113130,113195,113257,113332,113405,113495,113561,113627,113688,113752,113814,113872,113943,114026,114085,114156,114222,114287,114348,114407,114478,114544,114609,114692,114768,114843,114924,114984,115053,115123,115192,115247,115303,115359,115420,115478,115534,115593,115647,115702,115764,115821,115915,115984,116085,116136,116206,116269,116325,116383,116442,116496,116582,116666,116736,116805,116875,116990,117111,117178,117245,117320,117387,117446,117500,117554,117608,117661,117713,117787,119355,119495,122240,122290,122340,122429,122485,122543,122605,122660,122718,122789,122853,122912,122974,123040,123106,123397,123543,123588,123631,124763,124810,124855,124906,124957,125008,125059,125593,126101,126163,126343,126415,126540,126594,126649,126707,126762,126821,126877,126946,127015,127084,127154,127217,127280,127343,127406,127471,127536,127601,127666,127729,127793,127857,127921,127972,128050,128128,128199,128271,128344,128416,128482,128548,128616,128684,128750,128817,128891,128954,129011,129071,129136,129203,129268,129325,129386,129444,129548,129658,129767,129871,129949,130014,130081,130147,130217,130264,130316,130366,130423,130813,133303,134339,134523,134701,134939,135128,135297,137776,137891,137976,138055,152901,153046,153517,153674,153831,154132,154286,154345,156684,156780,156870,156966,157056,157222,157345,157468,157638,157744,157859,157974,158076,158182,158299,158414,158911,159084,159252,159400,159559,159714,159887,160004,160121,160289,160401,160515,160687,160863,161021,161154,161266,161412,161564,161696,161839,161961,162139,162275,162371,162507,162602,162769,162862,162954,163141,163297,163475,163639,163821,164138,164320,164502,164692,164924,165114,165291,165453,165610,165720,165903,166040,166244,166428,166612,166772,166930,167114,167341,167544,167715,167935,168157,168312,168512,168696,168799,168989,169130,169295,169466,169666,169870,170072,170237,170442,170641,170840,171037,171128,171277,171427,171511,171660,171805,171957,172098,172264,172425,174877,175178,175344,175499,175601,181715,181942,182128,184237,184362,187041,187313,187591,187836,187898,188183,191477,191933,192442,203218,203732,204169,204603,205046,209028,209149,209248,209653,209750,209867,209954,210077,210178,210584,210683,210802,210895,211002,211345,211452,211697,211818,212227,212475,212575,212680,212799,213308,213455,213574,213825,213958,214373,214627,214739,220089,220214,220622,220743,220971,221092,221225,221372,242094,242586,263057,263481,284248,284742,305258,305684,310525,315942,320033,325464,330206,335583,339567,343559,348950,349497,349930,350686,350916,351159,352326,353255,401400,401984,402457,403887,404631,405824,406878,407356,407649,408032,409547,410312,411455,411896,412337,412933,413207,413618,414634,414812,415565,415702,415793,417987,418253,418575,418785,418894,419013,419197,420315,420785,421536,424119,424214,424908,425136,425392,425651,426227,426581,426703,426842,427134,427394,428322,428608,429011,429413,429756,429968,430169,430382,430671,430956,441631,441718,441803,441902,446584,446690,446813,446945,447068,447198,447322,447455,447586,447711,447828,447948,448080,448208,448322,448440,448553,448674,448862,449049,449230,449413,449597,449762,449944,450064,450184,450292,450402,450514,450622,450732,450897,451063,451215,451380,451481,451601,451772,451933,452096,452257,452424,452543,452660,452840,453022,453203,453386,453541,453686,453808,453943,454106,454299,454425,454577,454719,454889,455045,455217,455508,462175,462267,462440,462602,462697,462866,462960,463049,463292,463381,463674,464090,464510,464931,465357,465774,466190,466607,467025,467439,467909,468382,468854,469265,469736,470208,470398,470604,470710,470818,470924,471036,471150,471262,471376,471492,471606,471714,471824,471932,472194,472573,472977,473124,473232,473342,473450,473564,473973,474387,474503,474921,475162,475592,476027,476437,476859,477269,477391,477800,478216,478338,478556,478740,483374,483718,483798,484154,484304,484448,484524,484636,484726,484988,485253,485361,485513,485621,485697,485809,485899,486001,486109,486217,486317,486425,486510,486676,486780,486908,486995,487162,487240,487354,487446,487710,487977,488087,488240,488350,488434,488823,488921,489029,489123,489253,489361,489483,489619,489727,489847,489981,490103,490231,490373,490499,490639,490765,490883,491015,491113,491223,491523,491635,491753,492217,492333,492636,492762,492858,493259,493369,493493,493631,493741,493863,494175,494299,494429,494905,495033,495348,495486,495648,495864,496020,496224,497705,497789,497893,498096,498285,498486,498679,498884,499197,499409,499575,499691,499937,500153,500466,500892,501354,501591,501743,502003,502147,502289,505521,505635,505755,505871,505965,506286,506385,506503,506604,506883,507168,507447,507729,507982,508241,508494,508750,509174,509250,512500,513855,514299,516153,516728,516936,517946,518326,518492,518633,523653,524079,524191,524326,524479,524676,524847,525030,525205,525392,525664,525822,525906,526010,526497,527053,527211,527430,527661,527884,528119,528341,528607,528745,529344,529458,529596,529708,529832,530403,530898,531444,531589,531682,531774,533701,534271,534569,534758,534964,535157,535367,536251,536396,536788,536946,537163,537424,545651,546526,547146,547343,548291,549056,549179,549952,550173,550373,552350,552450,552540,553226,553979,554744,555507,556282,557495,557660,559273,559594,560657,560867,561037,561607,562502,563135,563301,564787,565403,565639,565860,566818,567083,567348,567595,568009,568245,569530,569979,570166,570415,570657,570833,571074,571307,571532,572127,572602,573126,573387,574738,575213,576439,576909,577957,578409,578653,579110,580355,580838,580988,581543,581995,582395,582548,582693,582836,582906,583334,583622,584126,584635,584751,585653,585775,585887,586064,586330,586600,586866,587134,587390,587650,587906,588164,588416,588672,588924,589178,589410,589646,589898,590154,590406,590660,590892,591126,591238,591890,592345,592469,593561,594376,594572,594896,595285,595637,595878,596092,596391,596583,596898,597105,597451,597751,598152,598371,598784,599021,599391,600115,600470,600739,600879,601133,601277,601554,602546,602955,603587,603933,604301,605375,605738,606138,607646,608231,608549,611084,611278,611496,611722,611934,612133,612340,613544,613839,614396,614786,615418,615895,616140,616627,616873,618069,618466,619472,619694,620117,620308,620687,620775,620883,620991,621304,621629,621948,622279,624982,625170,625431,625680,628264,628456,628721,628974,629506,629914,630113,630697,630932,631056,631468,631682,632084,632187,632317,632492,632744,632940,633080,633274,634285,635354,635642,635772,636549,637206,637352,638058,638296,639836,639986,640403,640568,641254,641724,641920,642011,642095,642239,642473,642640,643568,643854,644014,644629,644788,645116,645343,645855,646217,646296,646635,646740,647105,647476,647837,649711,650340,651416,651840,652093,652245,653293,654030,654233,654479,654726,654944,655186,655507,655771,656076,656299,656610,656799,657514,657783,658277,658503,658943,659102,659386,660131,660496,660801,660959,661197,662516,662914,663142,663362,663504,664794,664900,665030,665168,665292,665580,665749,665849,666134,666248,667131,667886,668325,668449,668695,668888,669022,669213,669992,670210,670501,670780,671097,671319,671614,671897,672001,672342,673158,673474,674035,674541,674746,675532,675937,676598,676787,677338,677904,678024,678426,678960,814558,814651,814714,814796,814889,814982,815069,815167,815258,815349,815437,815521,815617,815717,815823,815926,816027,816131,816237,816336,816442,816544,816651,816760,816871,817002,817122,817238,817356,817455,817562,817678,817797,817925,818014,818109,818186,818275,818366,818459,818533,818630,818725,818823,818922,819026,819122,819224,819327,819427,819530,819615,819716,819814,819904,819999,820086,820192,820294,820388,820479,820573,820649,820741,820830,820933,821044,821127,821213,821308,821405,821501,821589,821690,821791,821894,822000,822098,822195,822290,822388,822491,822591,822694,822799,822917,823033,823128,823221,823306,823402,823496,823588,823671,823775,823880,823980,824081,824186,824286,824387,824486,824588,824682,824789,824891,824994,825087,825183,825285,825388,825484,825586,825689,825786,825889,825987,826091,826196,826293,826401,826515,826630,826738,826852,826967,827069,827174,827282,827392,827508,827625,827720,827817,827916,828021,828127,828226,828331,828437,828537,828643,828744,828851,828970,829069,829174,829276,829378,829478,829581,829676,829780,829865,829969,830073,830171,830275,830381,830479,830584,830682,830795,830889,830978,831067,831150,831241,831324,831422,831512,831608,831697,831791,831879,831975,832060,832168,832269,832370,832468,832574,832665,832764,832861,832959,833055,833148,833258,833356,833451,833561,833653,833753,833852,833939,834043,834148,834247,834354,834461,834560,834669,834761,834872,834983,835094,835198,835313,835429,835556,835676,835771,835866,835963,836062,836154,836253,836345,836444,836530,836624,836727,836823,836926,837022,837125,837222,837320,837423,837516,837606,837707,837790,837881,837966,838058,838161,838256,838352,838445,838539,838618,838725,838816,838915,839008,839111,839215,839316,839417,839521,839615,839719,839823,839936,840042,840148,840256,840373,840474,840582,840682,840785,840890,840997,841093,841172,841262,841346,841438,841511,841603,841692,841784,841869,841966,842059,842154,842253,842350,842441,842532,842624,842719,842826,842934,843036,843133,843230,843323,843410,843494,843591,843688,843781,843868,843959,844058,844157,844252,844341,844422,844521,844625,844722,844827,844924,845008,845107,845211,845308,845413,845510,845608,845709,845815,845914,846021,846120,846219,846310,846399,846488,846570,846663,846754,846865,846966,847066,847178,847291,847389,847497,847591,847691,847780,847872,847983,848093,848188,848304,848430,848556,848675,848803,848928,849053,849171,849298,849407,849516,849629,849752,849875,849991,850116,850213,850321,850443,850559,850675,850784,850872,850973,851062,851163,851250,851338,851435,851527,851633,851733,851809,851886" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/876d8563d3a0673414de11fb9eb4d2a1/transformed/activity-1.8.0/res/values/values.xml", + "from": { + "startLines": "-1,-1", + "startColumns": "-1,-1", + "startOffsets": "-1,-1" + }, + "to": { + "startLines": "1853,1900", + "startColumns": "4,4", + "startOffsets": "123317,125686", + "endColumns": "41,59", + "endOffsets": "123354,125741" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/30d4e98469639d69ad240eb0afa9d087/transformed/cardview-1.0.0/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "35,653,654,655,656,1063,1064,1065,2603,5958,5960,5963", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "1640,33709,33770,33832,33894,63480,63539,63596,189939,424219,424283,424409", + "endLines": "35,653,654,655,656,1063,1064,1065,2609,5959,5962,5965", + "endColumns": "51,60,61,61,63,58,56,53,12,12,12,12", + "endOffsets": "1687,33765,33827,33889,33953,63534,63591,63645,190348,424278,424404,424532" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values/values.xml", + "from": { + "startLines": "-1,-1", + "startColumns": "-1,-1", + "startOffsets": "-1,-1" + }, + "to": { + "startLines": "1912,2085", + "startColumns": "4,4", + "startOffsets": "126420,140027", + "endColumns": "67,166", + "endOffsets": "126483,140189" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/9a42c6bba20e3615051551280bf9b220/transformed/startup-runtime-1.1.1/res/values/values.xml", + "from": { + "startLines": "-1", + "startColumns": "-1", + "startOffsets": "-1" + }, + "to": { + "startLines": "2008", + "startColumns": "4", + "startOffsets": "133025", + "endColumns": "82", + "endOffsets": "133103" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/347545d553f2245dd1a387759374950f/transformed/coordinatorlayout-1.1.0/res/values/values.xml", + "from": { + "startLines": "-1,-1", + "startColumns": "-1,-1", + "startOffsets": "-1,-1" + }, + "to": { + "startLines": "109,9711", + "startColumns": "4,4", + "startOffsets": "5765,678965", + "endLines": "109,9713", + "endColumns": "60,12", + "endOffsets": "5821,679105" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/a8b802474834ad934ab806f5360c513e/transformed/transition-1.5.0/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "1826,1827,1849,1855,1856,1888,1889,1890,1891,1892,1893,1894,1895", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "121885,121925,123111,123402,123457,125099,125144,125198,125254,125306,125358,125407,125468", + "endColumns": "39,46,42,54,46,44,53,55,51,51,48,60,49", + "endOffsets": "121920,121967,123149,123452,123499,125139,125193,125249,125301,125353,125402,125463,125513" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values/colors.xml", + "from": { + "startLines": "-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,169,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "endColumns": "-1,54,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "endOffsets": "-1,219,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "700,701,712,713,714,968,969,970,971,972,973,974", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "37052,37109,37845,37902,37955,57112,57174,57239,57306,57365,57422,57494", + "endColumns": "56,54,56,52,54,61,64,66,58,56,71,64", + "endOffsets": "37104,37159,37897,37950,38005,57169,57234,57301,57360,57417,57489,57554" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values/themes.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "2574,2578,6769,6775,6781,6785,6790,6797", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "188188,188334,479173,479487,479806,480060,480371,480786", + "endLines": "2577,2581,6774,6780,6784,6789,6796,6802", + "endColumns": "12,12,12,12,12,12,12,12", + "endOffsets": "188329,188483,479482,479801,480055,480366,480781,481098" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "657,658,659,660,661,662,663,664,2077,2078,2079,2080,2081,2082,2083,2084,2086,2087,2088,2089,2090,2091,2092,2093,2094", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "33958,34048,34128,34218,34308,34388,34469,34549,138987,139092,139273,139398,139505,139685,139808,139924,140194,140382,140487,140668,140793,140968,141116,141179,141241", + "endColumns": "89,79,89,89,79,80,79,79,104,180,124,106,179,122,115,102,187,104,180,124,174,147,62,61,78", + "endOffsets": "34043,34123,34213,34303,34383,34464,34544,34624,139087,139268,139393,139500,139680,139803,139919,140022,140377,140482,140663,140788,140963,141111,141174,141236,141315" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-ldltr-v21_values-ldltr-v21.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ldltr-v21/values-ldltr-v21.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "112", + "endOffsets": "163" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-ta_values-ta.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ta/values-ta.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,272,360,446,530,633,727,836,954,1038,1097,1161,1269,1337,1398,1506,1573,1659,1717,1801,1868,1922,2045,2107,2170,2224,2312,2440,2526,2618,2721,2813,2895,3027,3107,3188,3344,3433,3517,3574,3626,3692,3777,3865,3936,4016,4085,4162,4242,4310,4425,4524,4607,4699,4793,4867,4953,5047,5097,5180,5246,5331,5418,5481,5546,5609,5678,5786,5884,5982,6079,6140,6196,6282,6374,6457", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,87,85,83,102,93,108,117,83,58,63,107,67,60,107,66,85,57,83,66,53,122,61,62,53,87,127,85,91,102,91,81,131,79,80,155,88,83,56,51,65,84,87,70,79,68,76,79,67,114,98,82,91,93,73,85,93,49,82,65,84,86,62,64,62,68,107,97,97,96,60,55,85,91,82,81", + "endOffsets": "267,355,441,525,628,722,831,949,1033,1092,1156,1264,1332,1393,1501,1568,1654,1712,1796,1863,1917,2040,2102,2165,2219,2307,2435,2521,2613,2716,2808,2890,3022,3102,3183,3339,3428,3512,3569,3621,3687,3772,3860,3931,4011,4080,4157,4237,4305,4420,4519,4602,4694,4788,4862,4948,5042,5092,5175,5241,5326,5413,5476,5541,5604,5673,5781,5879,5977,6074,6135,6191,6277,6369,6452,6534" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3088,3176,3262,3346,3449,4289,4398,4516,6836,6895,6959,7067,7135,7196,7304,7371,7457,7515,7599,7666,7720,7843,7905,7968,8022,8110,8238,8324,8416,8519,8611,8693,8825,8905,8986,9142,9231,9315,9372,9424,9490,9575,9663,9734,9814,9883,9960,10040,10108,10223,10322,10405,10497,10591,10665,10751,10845,10895,10978,11044,11129,11216,11279,11344,11407,11476,11584,11682,11780,11877,11938,11994,12162,12254,12337", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,87,85,83,102,93,108,117,83,58,63,107,67,60,107,66,85,57,83,66,53,122,61,62,53,87,127,85,91,102,91,81,131,79,80,155,88,83,56,51,65,84,87,70,79,68,76,79,67,114,98,82,91,93,73,85,93,49,82,65,84,86,62,64,62,68,107,97,97,96,60,55,85,91,82,81", + "endOffsets": "317,3171,3257,3341,3444,3538,4393,4511,4595,6890,6954,7062,7130,7191,7299,7366,7452,7510,7594,7661,7715,7838,7900,7963,8017,8105,8233,8319,8411,8514,8606,8688,8820,8900,8981,9137,9226,9310,9367,9419,9485,9570,9658,9729,9809,9878,9955,10035,10103,10218,10317,10400,10492,10586,10660,10746,10840,10890,10973,11039,11124,11211,11274,11339,11402,11471,11579,11677,11775,11872,11933,11989,12075,12249,12332,12414" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ta/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,294,442,565,667,815,939,1048,1145,1321,1424,1573,1704,1854,2006,2064,2123", + "endColumns": "100,147,122,101,147,123,108,96,175,102,148,130,149,151,57,58,76", + "endOffsets": "293,441,564,666,814,938,1047,1144,1320,1423,1572,1703,1853,2005,2063,2122,2199" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4600,4705,4857,4984,5090,5242,5370,5483,5745,5925,6032,6185,6320,6474,6630,6692,6755", + "endColumns": "104,151,126,105,151,127,112,100,179,106,152,134,153,155,61,62,80", + "endOffsets": "4700,4852,4979,5085,5237,5365,5478,5579,5920,6027,6180,6315,6469,6625,6687,6750,6831" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ta/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "156", + "endOffsets": "351" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5584", + "endColumns": "160", + "endOffsets": "5740" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ta/values-ta.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,254,353,451,558,673,801", + "endColumns": "95,102,98,97,106,114,127,100", + "endOffsets": "146,249,348,446,553,668,796,897" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3543,3639,3742,3841,3939,4046,4161,12419", + "endColumns": "95,102,98,97,106,114,127,100", + "endOffsets": "3634,3737,3836,3934,4041,4156,4284,12515" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ta/values-ta.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,218,320,435,524,635,756,835,911,1009,1109,1204,1298,1405,1505,1607,1701,1799,1897,1978,2086,2189,2288,2404,2507,2612,2769,2871", + "endColumns": "112,101,114,88,110,120,78,75,97,99,94,93,106,99,101,93,97,97,80,107,102,98,115,102,104,156,101,81", + "endOffsets": "213,315,430,519,630,751,830,906,1004,1104,1199,1293,1400,1500,1602,1696,1794,1892,1973,2081,2184,2283,2399,2502,2607,2764,2866,2948" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "322,435,537,652,741,852,973,1052,1128,1226,1326,1421,1515,1622,1722,1824,1918,2016,2114,2195,2303,2406,2505,2621,2724,2829,2986,12080", + "endColumns": "112,101,114,88,110,120,78,75,97,99,94,93,106,99,101,93,97,97,80,107,102,98,115,102,104,156,101,81", + "endOffsets": "430,532,647,736,847,968,1047,1123,1221,1321,1416,1510,1617,1717,1819,1913,2011,2109,2190,2298,2401,2500,2616,2719,2824,2981,3083,12157" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-hr_values-hr.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-hr/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "127", + "endOffsets": "322" + }, + "to": { + "startLines": "57", + "startColumns": "4", + "startOffsets": "5560", + "endColumns": "131", + "endOffsets": "5687" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-hr/values-hr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,260,357,456,560,664,781", + "endColumns": "97,106,96,98,103,103,116,100", + "endOffsets": "148,255,352,451,555,659,776,877" + }, + "to": { + "startLines": "39,40,41,42,43,44,45,135", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3512,3610,3717,3814,3913,4017,4121,12191", + "endColumns": "97,106,96,98,103,103,116,100", + "endOffsets": "3605,3712,3809,3908,4012,4116,4233,12287" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-hr/values-hr.xml", + "from": { + "startLines": "2,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,320,398,476,561,658,751,847,977,1061,1128,1196,1292,1360,1423,1531,1591,1657,1713,1784,1844,1898,2024,2081,2143,2197,2272,2406,2491,2569,2664,2749,2830,2967,3051,3137,3270,3361,3439,3495,3550,3616,3690,3768,3839,3921,3993,4070,4150,4224,4331,4424,4497,4589,4685,4759,4835,4931,4983,5065,5132,5219,5306,5368,5432,5495,5565,5671,5787,5884,5998,6058,6117,6197,6280,6357", + "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "endColumns": "12,77,77,84,96,92,95,129,83,66,67,95,67,62,107,59,65,55,70,59,53,125,56,61,53,74,133,84,77,94,84,80,136,83,85,132,90,77,55,54,65,73,77,70,81,71,76,79,73,106,92,72,91,95,73,75,95,51,81,66,86,86,61,63,62,69,105,115,96,113,59,58,79,82,76,74", + "endOffsets": "315,393,471,556,653,746,842,972,1056,1123,1191,1287,1355,1418,1526,1586,1652,1708,1779,1839,1893,2019,2076,2138,2192,2267,2401,2486,2564,2659,2744,2825,2962,3046,3132,3265,3356,3434,3490,3545,3611,3685,3763,3834,3916,3988,4065,4145,4219,4326,4419,4492,4584,4680,4754,4830,4926,4978,5060,5127,5214,5301,5363,5427,5490,5560,5666,5782,5879,5993,6053,6112,6192,6275,6352,6427" + }, + "to": { + "startLines": "2,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3081,3159,3237,3322,3419,4238,4334,4464,6735,6802,6870,6966,7034,7097,7205,7265,7331,7387,7458,7518,7572,7698,7755,7817,7871,7946,8080,8165,8243,8338,8423,8504,8641,8725,8811,8944,9035,9113,9169,9224,9290,9364,9442,9513,9595,9667,9744,9824,9898,10005,10098,10171,10263,10359,10433,10509,10605,10657,10739,10806,10893,10980,11042,11106,11169,11239,11345,11461,11558,11672,11732,11791,11956,12039,12116", + "endLines": "6,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "endColumns": "12,77,77,84,96,92,95,129,83,66,67,95,67,62,107,59,65,55,70,59,53,125,56,61,53,74,133,84,77,94,84,80,136,83,85,132,90,77,55,54,65,73,77,70,81,71,76,79,73,106,92,72,91,95,73,75,95,51,81,66,86,86,61,63,62,69,105,115,96,113,59,58,79,82,76,74", + "endOffsets": "365,3154,3232,3317,3414,3507,4329,4459,4543,6797,6865,6961,7029,7092,7200,7260,7326,7382,7453,7513,7567,7693,7750,7812,7866,7941,8075,8160,8238,8333,8418,8499,8636,8720,8806,8939,9030,9108,9164,9219,9285,9359,9437,9508,9590,9662,9739,9819,9893,10000,10093,10166,10258,10354,10428,10504,10600,10652,10734,10801,10888,10975,11037,11101,11164,11234,11340,11456,11553,11667,11727,11786,11866,12034,12111,12186" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-hr/values-hr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,210,305,412,498,602,721,806,888,979,1072,1167,1261,1361,1454,1549,1644,1735,1826,1912,2016,2128,2229,2334,2448,2550,2719,2816", + "endColumns": "104,94,106,85,103,118,84,81,90,92,94,93,99,92,94,94,90,90,85,103,111,100,104,113,101,168,96,84", + "endOffsets": "205,300,407,493,597,716,801,883,974,1067,1162,1256,1356,1449,1544,1639,1730,1821,1907,2011,2123,2224,2329,2443,2545,2714,2811,2896" + }, + "to": { + "startLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,131", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "370,475,570,677,763,867,986,1071,1153,1244,1337,1432,1526,1626,1719,1814,1909,2000,2091,2177,2281,2393,2494,2599,2713,2815,2984,11871", + "endColumns": "104,94,106,85,103,118,84,81,90,92,94,93,99,92,94,94,90,90,85,103,111,100,104,113,101,168,96,84", + "endOffsets": "470,565,672,758,862,981,1066,1148,1239,1332,1427,1521,1621,1714,1809,1904,1995,2086,2172,2276,2388,2489,2594,2708,2810,2979,3076,11951" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-hr/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,448,574,680,833,959,1070,1173,1319,1422,1575,1699,1842,1981,2045,2103", + "endColumns": "101,152,125,105,152,125,110,102,145,102,152,123,142,138,63,57,76", + "endOffsets": "294,447,573,679,832,958,1069,1172,1318,1421,1574,1698,1841,1980,2044,2102,2179" + }, + "to": { + "startLines": "49,50,51,52,53,54,55,56,58,59,60,61,62,63,64,65,66", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4548,4654,4811,4941,5051,5208,5338,5453,5692,5842,5949,6106,6234,6381,6524,6592,6654", + "endColumns": "105,156,129,109,156,129,114,106,149,106,156,127,146,142,67,61,80", + "endOffsets": "4649,4806,4936,5046,5203,5333,5448,5555,5837,5944,6101,6229,6376,6519,6587,6649,6730" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-tl_values-tl.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-tl/values-tl.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,280,364,444,530,627,717,822,958,1043,1103,1168,1267,1335,1394,1483,1551,1618,1681,1756,1824,1878,1998,2056,2118,2172,2247,2389,2479,2557,2651,2734,2819,2964,3048,3131,3277,3373,3450,3508,3559,3625,3699,3777,3848,3934,4008,4087,4160,4232,4348,4452,4525,4624,4724,4798,4873,4980,5032,5121,5188,5279,5373,5435,5499,5562,5632,5751,5856,5965,6065,6127,6182,6267,6354,6432", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,83,79,85,96,89,104,135,84,59,64,98,67,58,88,67,66,62,74,67,53,119,57,61,53,74,141,89,77,93,82,84,144,83,82,145,95,76,57,50,65,73,77,70,85,73,78,72,71,115,103,72,98,99,73,74,106,51,88,66,90,93,61,63,62,69,118,104,108,99,61,54,84,86,77,74", + "endOffsets": "275,359,439,525,622,712,817,953,1038,1098,1163,1262,1330,1389,1478,1546,1613,1676,1751,1819,1873,1993,2051,2113,2167,2242,2384,2474,2552,2646,2729,2814,2959,3043,3126,3272,3368,3445,3503,3554,3620,3694,3772,3843,3929,4003,4082,4155,4227,4343,4447,4520,4619,4719,4793,4868,4975,5027,5116,5183,5274,5368,5430,5494,5557,5627,5746,5851,5960,6060,6122,6177,6262,6349,6427,6502" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3070,3154,3234,3320,3417,4241,4346,4482,6929,6989,7054,7153,7221,7280,7369,7437,7504,7567,7642,7710,7764,7884,7942,8004,8058,8133,8275,8365,8443,8537,8620,8705,8850,8934,9017,9163,9259,9336,9394,9445,9511,9585,9663,9734,9820,9894,9973,10046,10118,10234,10338,10411,10510,10610,10684,10759,10866,10918,11007,11074,11165,11259,11321,11385,11448,11518,11637,11742,11851,11951,12013,12068,12238,12325,12403", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,83,79,85,96,89,104,135,84,59,64,98,67,58,88,67,66,62,74,67,53,119,57,61,53,74,141,89,77,93,82,84,144,83,82,145,95,76,57,50,65,73,77,70,85,73,78,72,71,115,103,72,98,99,73,74,106,51,88,66,90,93,61,63,62,69,118,104,108,99,61,54,84,86,77,74", + "endOffsets": "325,3149,3229,3315,3412,3502,4341,4477,4562,6984,7049,7148,7216,7275,7364,7432,7499,7562,7637,7705,7759,7879,7937,7999,8053,8128,8270,8360,8438,8532,8615,8700,8845,8929,9012,9158,9254,9331,9389,9440,9506,9580,9658,9729,9815,9889,9968,10041,10113,10229,10333,10406,10505,10605,10679,10754,10861,10913,11002,11069,11160,11254,11316,11380,11443,11513,11632,11737,11846,11946,12008,12063,12148,12320,12398,12473" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-tl/values-tl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,355,452,559,667,789", + "endColumns": "96,101,100,96,106,107,121,100", + "endOffsets": "147,249,350,447,554,662,784,885" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3507,3604,3706,3807,3904,4011,4119,12478", + "endColumns": "96,101,100,96,106,107,121,100", + "endOffsets": "3599,3701,3802,3899,4006,4114,4236,12574" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-tl/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "140", + "endOffsets": "335" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5626", + "endColumns": "144", + "endOffsets": "5766" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-tl/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,468,602,707,861,993,1111,1220,1395,1498,1672,1806,1964,2139,2203,2265", + "endColumns": "102,171,133,104,153,131,117,108,174,102,173,133,157,174,63,61,76", + "endOffsets": "295,467,601,706,860,992,1110,1219,1394,1497,1671,1805,1963,2138,2202,2264,2341" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4567,4674,4850,4988,5097,5255,5391,5513,5771,5950,6057,6235,6373,6535,6714,6782,6848", + "endColumns": "106,175,137,108,157,135,121,112,178,106,177,137,161,178,67,65,80", + "endOffsets": "4669,4845,4983,5092,5250,5386,5508,5621,5945,6052,6230,6368,6530,6709,6777,6843,6924" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-tl/values-tl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,216,324,437,525,631,746,826,903,994,1087,1182,1276,1376,1469,1564,1658,1749,1840,1924,2033,2143,2244,2354,2472,2580,2743,2845", + "endColumns": "110,107,112,87,105,114,79,76,90,92,94,93,99,92,94,93,90,90,83,108,109,100,109,117,107,162,101,84", + "endOffsets": "211,319,432,520,626,741,821,898,989,1082,1177,1271,1371,1464,1559,1653,1744,1835,1919,2028,2138,2239,2349,2467,2575,2738,2840,2925" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "330,441,549,662,750,856,971,1051,1128,1219,1312,1407,1501,1601,1694,1789,1883,1974,2065,2149,2258,2368,2469,2579,2697,2805,2968,12153", + "endColumns": "110,107,112,87,105,114,79,76,90,92,94,93,99,92,94,93,90,90,83,108,109,100,109,117,107,162,101,84", + "endOffsets": "436,544,657,745,851,966,1046,1123,1214,1307,1402,1496,1596,1689,1784,1878,1969,2060,2144,2253,2363,2464,2574,2692,2800,2963,3065,12233" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-ka_values-ka.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ka/values-ka.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,273,351,425,509,602,696,795,920,1008,1071,1138,1235,1304,1367,1454,1518,1584,1644,1713,1774,1828,1943,2002,2062,2116,2188,2318,2406,2485,2583,2671,2755,2893,2971,3047,3186,3280,3360,3416,3470,3536,3609,3687,3758,3842,3915,3993,4066,4141,4251,4341,4416,4510,4608,4682,4759,4859,4912,4996,5064,5153,5242,5304,5369,5432,5502,5609,5709,5809,5905,5965,6023,6103,6193,6268", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,77,73,83,92,93,98,124,87,62,66,96,68,62,86,63,65,59,68,60,53,114,58,59,53,71,129,87,78,97,87,83,137,77,75,138,93,79,55,53,65,72,77,70,83,72,77,72,74,109,89,74,93,97,73,76,99,52,83,67,88,88,61,64,62,69,106,99,99,95,59,57,79,89,74,80", + "endOffsets": "268,346,420,504,597,691,790,915,1003,1066,1133,1230,1299,1362,1449,1513,1579,1639,1708,1769,1823,1938,1997,2057,2111,2183,2313,2401,2480,2578,2666,2750,2888,2966,3042,3181,3275,3355,3411,3465,3531,3604,3682,3753,3837,3910,3988,4061,4136,4246,4336,4411,4505,4603,4677,4754,4854,4907,4991,5059,5148,5237,5299,5364,5427,5497,5604,5704,5804,5900,5960,6018,6098,6188,6263,6344" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3026,3104,3178,3262,3355,4173,4272,4397,6705,6768,6835,6932,7001,7064,7151,7215,7281,7341,7410,7471,7525,7640,7699,7759,7813,7885,8015,8103,8182,8280,8368,8452,8590,8668,8744,8883,8977,9057,9113,9167,9233,9306,9384,9455,9539,9612,9690,9763,9838,9948,10038,10113,10207,10305,10379,10456,10556,10609,10693,10761,10850,10939,11001,11066,11129,11199,11306,11406,11506,11602,11662,11720,11882,11972,12047", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,77,73,83,92,93,98,124,87,62,66,96,68,62,86,63,65,59,68,60,53,114,58,59,53,71,129,87,78,97,87,83,137,77,75,138,93,79,55,53,65,72,77,70,83,72,77,72,74,109,89,74,93,97,73,76,99,52,83,67,88,88,61,64,62,69,106,99,99,95,59,57,79,89,74,80", + "endOffsets": "318,3099,3173,3257,3350,3444,4267,4392,4480,6763,6830,6927,6996,7059,7146,7210,7276,7336,7405,7466,7520,7635,7694,7754,7808,7880,8010,8098,8177,8275,8363,8447,8585,8663,8739,8878,8972,9052,9108,9162,9228,9301,9379,9450,9534,9607,9685,9758,9833,9943,10033,10108,10202,10300,10374,10451,10551,10604,10688,10756,10845,10934,10996,11061,11124,11194,11301,11401,11501,11597,11657,11715,11795,11967,12042,12123" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ka/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "138", + "endOffsets": "333" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5495", + "endColumns": "142", + "endOffsets": "5633" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ka/values-ka.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,316,427,513,618,731,814,893,984,1077,1172,1266,1366,1459,1554,1649,1740,1831,1912,2025,2131,2229,2342,2447,2551,2709,2808", + "endColumns": "107,102,110,85,104,112,82,78,90,92,94,93,99,92,94,94,90,90,80,112,105,97,112,104,103,157,98,81", + "endOffsets": "208,311,422,508,613,726,809,888,979,1072,1167,1261,1361,1454,1549,1644,1735,1826,1907,2020,2126,2224,2337,2442,2546,2704,2803,2885" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "323,431,534,645,731,836,949,1032,1111,1202,1295,1390,1484,1584,1677,1772,1867,1958,2049,2130,2243,2349,2447,2560,2665,2769,2927,11800", + "endColumns": "107,102,110,85,104,112,82,78,90,92,94,93,99,92,94,94,90,90,80,112,105,97,112,104,103,157,98,81", + "endOffsets": "426,529,640,726,831,944,1027,1106,1197,1290,1385,1479,1579,1672,1767,1862,1953,2044,2125,2238,2344,2442,2555,2660,2764,2922,3021,11877" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ka/values-ka.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,352,451,557,661,779", + "endColumns": "95,101,98,98,105,103,117,100", + "endOffsets": "146,248,347,446,552,656,774,875" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3449,3545,3647,3746,3845,3951,4055,12128", + "endColumns": "95,101,98,98,105,103,117,100", + "endOffsets": "3540,3642,3741,3840,3946,4050,4168,12224" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ka/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,294,439,563,669,819,949,1067,1171,1340,1444,1595,1719,1876,2011,2073,2130", + "endColumns": "100,144,123,105,149,129,117,103,168,103,150,123,156,134,61,56,71", + "endOffsets": "293,438,562,668,818,948,1066,1170,1339,1443,1594,1718,1875,2010,2072,2129,2201" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4485,4590,4739,4867,4977,5131,5265,5387,5638,5811,5919,6074,6202,6363,6502,6568,6629", + "endColumns": "104,148,127,109,153,133,121,107,172,107,154,127,160,138,65,60,75", + "endOffsets": "4585,4734,4862,4972,5126,5260,5382,5490,5806,5914,6069,6197,6358,6497,6563,6624,6700" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-sl_values-sl.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-sl/values-sl.xml", + "from": { + "startLines": "2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,367,456,545,633,731,822,928,1054,1138,1202,1268,1362,1438,1501,1613,1673,1738,1792,1862,1922,1978,2090,2147,2209,2265,2338,2472,2557,2634,2723,2804,2889,3032,3116,3199,3333,3422,3499,3555,3610,3676,3749,3826,3897,3976,4050,4126,4201,4274,4379,4467,4540,4630,4721,4793,4867,4958,5010,5092,5159,5243,5330,5392,5456,5519,5588,5691,5799,5897,6001,6061,6120,6197,6284,6360", + "endLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "endColumns": "12,88,88,87,97,90,105,125,83,63,65,93,75,62,111,59,64,53,69,59,55,111,56,61,55,72,133,84,76,88,80,84,142,83,82,133,88,76,55,54,65,72,76,70,78,73,75,74,72,104,87,72,89,90,71,73,90,51,81,66,83,86,61,63,62,68,102,107,97,103,59,58,76,86,75,77", + "endOffsets": "362,451,540,628,726,817,923,1049,1133,1197,1263,1357,1433,1496,1608,1668,1733,1787,1857,1917,1973,2085,2142,2204,2260,2333,2467,2552,2629,2718,2799,2884,3027,3111,3194,3328,3417,3494,3550,3605,3671,3744,3821,3892,3971,4045,4121,4196,4269,4374,4462,4535,4625,4716,4788,4862,4953,5005,5087,5154,5238,5325,5387,5451,5514,5583,5686,5794,5892,5996,6056,6115,6192,6279,6355,6433" + }, + "to": { + "startLines": "2,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3157,3246,3335,3423,3521,4335,4441,4567,6875,6939,7005,7099,7175,7238,7350,7410,7475,7529,7599,7659,7715,7827,7884,7946,8002,8075,8209,8294,8371,8460,8541,8626,8769,8853,8936,9070,9159,9236,9292,9347,9413,9486,9563,9634,9713,9787,9863,9938,10011,10116,10204,10277,10367,10458,10530,10604,10695,10747,10829,10896,10980,11067,11129,11193,11256,11325,11428,11536,11634,11738,11798,11857,12018,12105,12181", + "endLines": "7,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "endColumns": "12,88,88,87,97,90,105,125,83,63,65,93,75,62,111,59,64,53,69,59,55,111,56,61,55,72,133,84,76,88,80,84,142,83,82,133,88,76,55,54,65,72,76,70,78,73,75,74,72,104,87,72,89,90,71,73,90,51,81,66,83,86,61,63,62,68,102,107,97,103,59,58,76,86,75,77", + "endOffsets": "412,3241,3330,3418,3516,3607,4436,4562,4646,6934,7000,7094,7170,7233,7345,7405,7470,7524,7594,7654,7710,7822,7879,7941,7997,8070,8204,8289,8366,8455,8536,8621,8764,8848,8931,9065,9154,9231,9287,9342,9408,9481,9558,9629,9708,9782,9858,9933,10006,10111,10199,10272,10362,10453,10525,10599,10690,10742,10824,10891,10975,11062,11124,11188,11251,11320,11423,11531,11629,11733,11793,11852,11929,12100,12176,12254" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-sl/values-sl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,352,456,559,661,778", + "endColumns": "96,101,97,103,102,101,116,100", + "endOffsets": "147,249,347,451,554,656,773,874" + }, + "to": { + "startLines": "40,41,42,43,44,45,46,136", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3612,3709,3811,3909,4013,4116,4218,12259", + "endColumns": "96,101,97,103,102,101,116,100", + "endOffsets": "3704,3806,3904,4008,4111,4213,4330,12355" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-sl/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "135", + "endOffsets": "330" + }, + "to": { + "startLines": "58", + "startColumns": "4", + "startOffsets": "5653", + "endColumns": "139", + "endOffsets": "5788" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-sl/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,456,581,684,827,953,1063,1163,1317,1420,1583,1709,1857,2005,2071,2129", + "endColumns": "101,160,124,102,142,125,109,99,153,102,162,125,147,147,65,57,79", + "endOffsets": "294,455,580,683,826,952,1062,1162,1316,1419,1582,1708,1856,2004,2070,2128,2208" + }, + "to": { + "startLines": "50,51,52,53,54,55,56,57,59,60,61,62,63,64,65,66,67", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4651,4757,4922,5051,5158,5305,5435,5549,5793,5951,6058,6225,6355,6507,6659,6729,6791", + "endColumns": "105,164,128,106,146,129,113,103,157,106,166,129,151,151,69,61,83", + "endOffsets": "4752,4917,5046,5153,5300,5430,5544,5648,5946,6053,6220,6350,6502,6654,6724,6786,6870" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-sl/values-sl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,217,319,427,514,617,736,817,895,987,1081,1176,1270,1365,1459,1555,1655,1747,1839,1923,2031,2139,2239,2352,2460,2565,2745,2845", + "endColumns": "111,101,107,86,102,118,80,77,91,93,94,93,94,93,95,99,91,91,83,107,107,99,112,107,104,179,99,83", + "endOffsets": "212,314,422,509,612,731,812,890,982,1076,1171,1265,1360,1454,1550,1650,1742,1834,1918,2026,2134,2234,2347,2455,2560,2740,2840,2924" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,132", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "417,529,631,739,826,929,1048,1129,1207,1299,1393,1488,1582,1677,1771,1867,1967,2059,2151,2235,2343,2451,2551,2664,2772,2877,3057,11934", + "endColumns": "111,101,107,86,102,118,80,77,91,93,94,93,94,93,95,99,91,91,83,107,107,99,112,107,104,179,99,83", + "endOffsets": "524,626,734,821,924,1043,1124,1202,1294,1388,1483,1577,1672,1766,1862,1962,2054,2146,2230,2338,2446,2546,2659,2767,2872,3052,3152,12013" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-pt_values-pt.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-pt/values-pt.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,353,453,560,670,790", + "endColumns": "96,101,98,99,106,109,119,100", + "endOffsets": "147,249,348,448,555,665,785,886" + }, + "to": { + "startLines": "29,30,31,32,33,34,35,37", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "2843,2940,3042,3141,3241,3348,3458,3664", + "endColumns": "96,101,98,99,106,109,119,100", + "endOffsets": "2935,3037,3136,3236,3343,3453,3573,3760" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-pt/values-pt.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,225,331,438,527,628,747,832,912,1003,1096,1191,1285,1385,1478,1573,1668,1759,1850,1935,2042,2153,2255,2363,2471,2581,2743,2843", + "endColumns": "119,105,106,88,100,118,84,79,90,92,94,93,99,92,94,94,90,90,84,106,110,101,107,107,109,161,99,85", + "endOffsets": "220,326,433,522,623,742,827,907,998,1091,1186,1280,1380,1473,1568,1663,1754,1845,1930,2037,2148,2250,2358,2466,2576,2738,2838,2924" + }, + "to": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,225,331,438,527,628,747,832,912,1003,1096,1191,1285,1385,1478,1573,1668,1759,1850,1935,2042,2153,2255,2363,2471,2581,2743,3578", + "endColumns": "119,105,106,88,100,118,84,79,90,92,94,93,99,92,94,94,90,90,84,106,110,101,107,107,109,161,99,85", + "endOffsets": "220,326,433,522,623,742,827,907,998,1091,1186,1280,1380,1473,1568,1663,1754,1845,1930,2037,2148,2250,2358,2466,2576,2738,2838,3659" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-hi_values-hi.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-hi/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "141", + "endOffsets": "336" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5515", + "endColumns": "145", + "endOffsets": "5656" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-hi/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,453,575,683,830,956,1064,1172,1325,1430,1592,1718,1855,2004,2063,2126", + "endColumns": "103,155,121,107,146,125,107,107,152,104,161,125,136,148,58,62,83", + "endOffsets": "296,452,574,682,829,955,1063,1171,1324,1429,1591,1717,1854,2003,2062,2125,2209" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4504,4612,4772,4898,5010,5161,5291,5403,5661,5818,5927,6093,6223,6364,6517,6580,6647", + "endColumns": "107,159,125,111,150,129,111,111,156,108,165,129,140,152,62,66,87", + "endOffsets": "4607,4767,4893,5005,5156,5286,5398,5510,5813,5922,6088,6218,6359,6512,6575,6642,6730" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-hi/values-hi.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,211,309,419,505,607,728,806,883,974,1067,1162,1256,1356,1449,1544,1638,1729,1820,1901,2006,2108,2206,2316,2419,2528,2686,2787", + "endColumns": "105,97,109,85,101,120,77,76,90,92,94,93,99,92,94,93,90,90,80,104,101,97,109,102,108,157,100,81", + "endOffsets": "206,304,414,500,602,723,801,878,969,1062,1157,1251,1351,1444,1539,1633,1724,1815,1896,2001,2103,2201,2311,2414,2523,2681,2782,2864" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "309,415,513,623,709,811,932,1010,1087,1178,1271,1366,1460,1560,1653,1748,1842,1933,2024,2105,2210,2312,2410,2520,2623,2732,2890,11841", + "endColumns": "105,97,109,85,101,120,77,76,90,92,94,93,99,92,94,93,90,90,80,104,101,97,109,102,108,157,100,81", + "endOffsets": "410,508,618,704,806,927,1005,1082,1173,1266,1361,1455,1555,1648,1743,1837,1928,2019,2100,2205,2307,2405,2515,2618,2727,2885,2986,11918" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-hi/values-hi.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,256,361,462,575,681,808", + "endColumns": "97,102,104,100,112,105,126,100", + "endOffsets": "148,251,356,457,570,676,803,904" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3429,3527,3630,3735,3836,3949,4055,12161", + "endColumns": "97,102,104,100,112,105,126,100", + "endOffsets": "3522,3625,3730,3831,3944,4050,4177,12257" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-hi/values-hi.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,259,337,413,494,601,697,804,936,1019,1086,1151,1245,1314,1373,1458,1521,1584,1642,1707,1768,1829,1935,1993,2053,2112,2182,2298,2377,2468,2561,2659,2739,2873,2948,3024,3161,3258,3356,3413,3468,3534,3604,3681,3752,3837,3905,3981,4062,4140,4241,4327,4414,4511,4610,4684,4754,4858,4912,4999,5066,5156,5248,5310,5374,5437,5503,5608,5718,5819,5926,5987,6046,6125,6210,6290", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,77,75,80,106,95,106,131,82,66,64,93,68,58,84,62,62,57,64,60,60,105,57,59,58,69,115,78,90,92,97,79,133,74,75,136,96,97,56,54,65,69,76,70,84,67,75,80,77,100,85,86,96,98,73,69,103,53,86,66,89,91,61,63,62,65,104,109,100,106,60,58,78,84,79,72", + "endOffsets": "254,332,408,489,596,692,799,931,1014,1081,1146,1240,1309,1368,1453,1516,1579,1637,1702,1763,1824,1930,1988,2048,2107,2177,2293,2372,2463,2556,2654,2734,2868,2943,3019,3156,3253,3351,3408,3463,3529,3599,3676,3747,3832,3900,3976,4057,4135,4236,4322,4409,4506,4605,4679,4749,4853,4907,4994,5061,5151,5243,5305,5369,5432,5498,5603,5713,5814,5921,5982,6041,6120,6205,6285,6358" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2991,3069,3145,3226,3333,4182,4289,4421,6735,6802,6867,6961,7030,7089,7174,7237,7300,7358,7423,7484,7545,7651,7709,7769,7828,7898,8014,8093,8184,8277,8375,8455,8589,8664,8740,8877,8974,9072,9129,9184,9250,9320,9397,9468,9553,9621,9697,9778,9856,9957,10043,10130,10227,10326,10400,10470,10574,10628,10715,10782,10872,10964,11026,11090,11153,11219,11324,11434,11535,11642,11703,11762,11923,12008,12088", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,77,75,80,106,95,106,131,82,66,64,93,68,58,84,62,62,57,64,60,60,105,57,59,58,69,115,78,90,92,97,79,133,74,75,136,96,97,56,54,65,69,76,70,84,67,75,80,77,100,85,86,96,98,73,69,103,53,86,66,89,91,61,63,62,65,104,109,100,106,60,58,78,84,79,72", + "endOffsets": "304,3064,3140,3221,3328,3424,4284,4416,4499,6797,6862,6956,7025,7084,7169,7232,7295,7353,7418,7479,7540,7646,7704,7764,7823,7893,8009,8088,8179,8272,8370,8450,8584,8659,8735,8872,8969,9067,9124,9179,9245,9315,9392,9463,9548,9616,9692,9773,9851,9952,10038,10125,10222,10321,10395,10465,10569,10623,10710,10777,10867,10959,11021,11085,11148,11214,11319,11429,11530,11637,11698,11757,11836,12003,12083,12156" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-in_values-in.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-in/values-in.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,150,252,349,446,552,670,785", + "endColumns": "94,101,96,96,105,117,114,100", + "endOffsets": "145,247,344,441,547,665,780,881" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3435,3530,3632,3729,3826,3932,4050,12007", + "endColumns": "94,101,96,96,105,117,114,100", + "endOffsets": "3525,3627,3724,3821,3927,4045,4160,12103" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-in/values-in.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,220,324,432,519,623,739,822,900,991,1084,1179,1273,1373,1466,1561,1655,1746,1837,1923,2026,2131,2232,2336,2445,2553,2713,2812", + "endColumns": "114,103,107,86,103,115,82,77,90,92,94,93,99,92,94,93,90,90,85,102,104,100,103,108,107,159,98,84", + "endOffsets": "215,319,427,514,618,734,817,895,986,1079,1174,1268,1368,1461,1556,1650,1741,1832,1918,2021,2126,2227,2331,2440,2548,2708,2807,2892" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "319,434,538,646,733,837,953,1036,1114,1205,1298,1393,1487,1587,1680,1775,1869,1960,2051,2137,2240,2345,2446,2550,2659,2767,2927,11685", + "endColumns": "114,103,107,86,103,115,82,77,90,92,94,93,99,92,94,93,90,90,85,102,104,100,103,108,107,159,98,84", + "endOffsets": "429,533,641,728,832,948,1031,1109,1200,1293,1388,1482,1582,1675,1770,1864,1955,2046,2132,2235,2340,2441,2545,2654,2762,2922,3021,11765" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-in/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,456,578,680,831,954,1065,1167,1329,1430,1590,1712,1863,2003,2063,2119", + "endColumns": "102,159,121,101,150,122,110,101,161,100,159,121,150,139,59,55,74", + "endOffsets": "295,455,577,679,830,953,1064,1166,1328,1429,1589,1711,1862,2002,2062,2118,2193" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4470,4577,4741,4867,4973,5128,5255,5370,5608,5774,5879,6043,6169,6324,6468,6532,6592", + "endColumns": "106,163,125,105,154,126,114,105,165,104,163,125,154,143,63,59,78", + "endOffsets": "4572,4736,4862,4968,5123,5250,5365,5471,5769,5874,6038,6164,6319,6463,6527,6587,6666" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-in/values-in.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,269,348,424,503,593,678,784,900,983,1047,1112,1206,1271,1330,1417,1479,1541,1601,1667,1729,1783,1895,1952,2013,2067,2139,2265,2351,2429,2522,2608,2692,2831,2912,2993,3128,3218,3300,3353,3405,3471,3543,3627,3698,3778,3853,3929,4002,4077,4175,4260,4335,4427,4521,4595,4668,4762,4814,4896,4965,5050,5137,5199,5263,5326,5398,5501,5606,5701,5804,5861,5917,5997,6078,6156", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,78,75,78,89,84,105,115,82,63,64,93,64,58,86,61,61,59,65,61,53,111,56,60,53,71,125,85,77,92,85,83,138,80,80,134,89,81,52,51,65,71,83,70,79,74,75,72,74,97,84,74,91,93,73,72,93,51,81,68,84,86,61,63,62,71,102,104,94,102,56,55,79,80,77,77", + "endOffsets": "264,343,419,498,588,673,779,895,978,1042,1107,1201,1266,1325,1412,1474,1536,1596,1662,1724,1778,1890,1947,2008,2062,2134,2260,2346,2424,2517,2603,2687,2826,2907,2988,3123,3213,3295,3348,3400,3466,3538,3622,3693,3773,3848,3924,3997,4072,4170,4255,4330,4422,4516,4590,4663,4757,4809,4891,4960,5045,5132,5194,5258,5321,5393,5496,5601,5696,5799,5856,5912,5992,6073,6151,6229" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3026,3105,3181,3260,3350,4165,4271,4387,6671,6735,6800,6894,6959,7018,7105,7167,7229,7289,7355,7417,7471,7583,7640,7701,7755,7827,7953,8039,8117,8210,8296,8380,8519,8600,8681,8816,8906,8988,9041,9093,9159,9231,9315,9386,9466,9541,9617,9690,9765,9863,9948,10023,10115,10209,10283,10356,10450,10502,10584,10653,10738,10825,10887,10951,11014,11086,11189,11294,11389,11492,11549,11605,11770,11851,11929", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,78,75,78,89,84,105,115,82,63,64,93,64,58,86,61,61,59,65,61,53,111,56,60,53,71,125,85,77,92,85,83,138,80,80,134,89,81,52,51,65,71,83,70,79,74,75,72,74,97,84,74,91,93,73,72,93,51,81,68,84,86,61,63,62,71,102,104,94,102,56,55,79,80,77,77", + "endOffsets": "314,3100,3176,3255,3345,3430,4266,4382,4465,6730,6795,6889,6954,7013,7100,7162,7224,7284,7350,7412,7466,7578,7635,7696,7750,7822,7948,8034,8112,8205,8291,8375,8514,8595,8676,8811,8901,8983,9036,9088,9154,9226,9310,9381,9461,9536,9612,9685,9760,9858,9943,10018,10110,10204,10278,10351,10445,10497,10579,10648,10733,10820,10882,10946,11009,11081,11184,11289,11384,11487,11544,11600,11680,11846,11924,12002" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-in/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "127", + "endOffsets": "322" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5476", + "endColumns": "131", + "endOffsets": "5603" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-ja_values-ja.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ja/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,293,423,539,641,769,885,986,1081,1211,1308,1437,1552,1668,1784,1840,1895", + "endColumns": "99,129,115,101,127,115,100,94,129,96,128,114,115,115,55,54,66", + "endOffsets": "292,422,538,640,768,884,985,1080,1210,1307,1436,1551,1667,1783,1839,1894,1961" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4186,4290,4424,4544,4650,4782,4902,5007,5228,5362,5463,5596,5715,5835,5955,6015,6074", + "endColumns": "103,133,119,105,131,119,104,98,133,100,132,118,119,119,59,58,70", + "endOffsets": "4285,4419,4539,4645,4777,4897,5002,5101,5357,5458,5591,5710,5830,5950,6010,6069,6140" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ja/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "117", + "endOffsets": "312" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5106", + "endColumns": "121", + "endOffsets": "5223" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ja/values-ja.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,202,295,400,482,580,688,766,841,932,1025,1120,1214,1314,1407,1502,1596,1687,1778,1856,1958,2056,2151,2254,2350,2446,2594,2691", + "endColumns": "96,92,104,81,97,107,77,74,90,92,94,93,99,92,94,93,90,90,77,101,97,94,102,95,95,147,96,78", + "endOffsets": "197,290,395,477,575,683,761,836,927,1020,1115,1209,1309,1402,1497,1591,1682,1773,1851,1953,2051,2146,2249,2345,2441,2589,2686,2765" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "303,400,493,598,680,778,886,964,1039,1130,1223,1318,1412,1512,1605,1700,1794,1885,1976,2054,2156,2254,2349,2452,2548,2644,2792,10645", + "endColumns": "96,92,104,81,97,107,77,74,90,92,94,93,99,92,94,93,90,90,77,101,97,94,102,95,95,147,96,78", + "endOffsets": "395,488,593,675,773,881,959,1034,1125,1218,1313,1407,1507,1600,1695,1789,1880,1971,2049,2151,2249,2344,2447,2543,2639,2787,2884,10719" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ja/values-ja.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,253,320,384,453,534,616,701,805,881,934,997,1081,1145,1203,1284,1345,1409,1464,1523,1580,1634,1727,1783,1840,1894,1960,2060,2136,2207,2286,2359,2440,2562,2624,2686,2787,2866,2941,2994,3045,3111,3181,3251,3322,3392,3456,3527,3595,3658,3749,3828,3891,3971,4053,4125,4196,4268,4316,4388,4452,4527,4604,4666,4730,4793,4860,4946,5032,5113,5196,5253,5308,5381,5459,5532", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,66,63,68,80,81,84,103,75,52,62,83,63,57,80,60,63,54,58,56,53,92,55,56,53,65,99,75,70,78,72,80,121,61,61,100,78,74,52,50,65,69,69,70,69,63,70,67,62,90,78,62,79,81,71,70,71,47,71,63,74,76,61,63,62,66,85,85,80,82,56,54,72,77,72,70", + "endOffsets": "248,315,379,448,529,611,696,800,876,929,992,1076,1140,1198,1279,1340,1404,1459,1518,1575,1629,1722,1778,1835,1889,1955,2055,2131,2202,2281,2354,2435,2557,2619,2681,2782,2861,2936,2989,3040,3106,3176,3246,3317,3387,3451,3522,3590,3653,3744,3823,3886,3966,4048,4120,4191,4263,4311,4383,4447,4522,4599,4661,4725,4788,4855,4941,5027,5108,5191,5248,5303,5376,5454,5527,5598" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2889,2956,3020,3089,3170,3921,4006,4110,6145,6198,6261,6345,6409,6467,6548,6609,6673,6728,6787,6844,6898,6991,7047,7104,7158,7224,7324,7400,7471,7550,7623,7704,7826,7888,7950,8051,8130,8205,8258,8309,8375,8445,8515,8586,8656,8720,8791,8859,8922,9013,9092,9155,9235,9317,9389,9460,9532,9580,9652,9716,9791,9868,9930,9994,10057,10124,10210,10296,10377,10460,10517,10572,10724,10802,10875", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,66,63,68,80,81,84,103,75,52,62,83,63,57,80,60,63,54,58,56,53,92,55,56,53,65,99,75,70,78,72,80,121,61,61,100,78,74,52,50,65,69,69,70,69,63,70,67,62,90,78,62,79,81,71,70,71,47,71,63,74,76,61,63,62,66,85,85,80,82,56,54,72,77,72,70", + "endOffsets": "298,2951,3015,3084,3165,3247,4001,4105,4181,6193,6256,6340,6404,6462,6543,6604,6668,6723,6782,6839,6893,6986,7042,7099,7153,7219,7319,7395,7466,7545,7618,7699,7821,7883,7945,8046,8125,8200,8253,8304,8370,8440,8510,8581,8651,8715,8786,8854,8917,9008,9087,9150,9230,9312,9384,9455,9527,9575,9647,9711,9786,9863,9925,9989,10052,10119,10205,10291,10372,10455,10512,10567,10640,10797,10870,10941" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ja/values-ja.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,147,247,341,437,530,623,724", + "endColumns": "91,99,93,95,92,92,100,100", + "endOffsets": "142,242,336,432,525,618,719,820" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3252,3344,3444,3538,3634,3727,3820,10946", + "endColumns": "91,99,93,95,92,92,100,100", + "endOffsets": "3339,3439,3533,3629,3722,3815,3916,11042" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-land_values-land.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-land/values-land.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,26,35,40", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,130,204,277,347,419,489,554,621,691,763,832,901,983,1073,1149,1217,1284,1362,1427,1494,1666,2235,2504", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,25,34,39,42", + "endColumns": "74,73,72,69,71,69,64,66,69,71,68,68,81,89,75,67,66,77,64,66,10,10,10,10", + "endOffsets": "125,199,272,342,414,484,549,616,686,758,827,896,978,1068,1144,1212,1279,1357,1422,1489,1661,2230,2499,2727" + }, + "to": { + "startLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,29,38,43", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "264,339,413,486,556,628,698,763,830,900,972,1041,1110,1192,1282,1358,1426,1493,1571,1636,1703,1875,2444,2713", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,28,37,42,45", + "endColumns": "74,73,72,69,71,69,64,66,69,71,68,68,81,89,75,67,66,77,64,66,10,10,10,10", + "endOffsets": "334,408,481,551,623,693,758,825,895,967,1036,1105,1187,1277,1353,1421,1488,1566,1631,1698,1870,2439,2708,2936" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-land/values-land.xml", + "from": { + "startLines": "2,3,4", + "startColumns": "4,4,4", + "startOffsets": "55,125,196", + "endColumns": "69,70,67", + "endOffsets": "120,191,259" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-zh-rCN_values-zh-rCN.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-zh-rCN/values-zh-rCN.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,200,295,395,477,574,680,757,832,923,1016,1113,1209,1303,1396,1491,1583,1674,1765,1843,1939,2034,2129,2226,2322,2420,2568,2662", + "endColumns": "94,94,99,81,96,105,76,74,90,92,96,95,93,92,94,91,90,90,77,95,94,94,96,95,97,147,93,78", + "endOffsets": "195,290,390,472,569,675,752,827,918,1011,1108,1204,1298,1391,1486,1578,1669,1760,1838,1934,2029,2124,2221,2317,2415,2563,2657,2736" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "297,392,487,587,669,766,872,949,1024,1115,1208,1305,1401,1495,1588,1683,1775,1866,1957,2035,2131,2226,2321,2418,2514,2612,2760,10356", + "endColumns": "94,94,99,81,96,105,76,74,90,92,96,95,93,92,94,91,90,90,77,95,94,94,96,95,97,147,93,78", + "endOffsets": "387,482,582,664,761,867,944,1019,1110,1203,1300,1396,1490,1583,1678,1770,1861,1952,2030,2126,2221,2316,2413,2509,2607,2755,2849,10430" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-zh-rCN/values-zh-rCN.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,247,311,373,443,513,590,681,787,860,911,973,1050,1109,1168,1246,1307,1364,1420,1479,1537,1591,1676,1732,1790,1844,1909,2001,2075,2147,2226,2300,2376,2498,2560,2622,2721,2800,2874,2924,2975,3041,3105,3174,3245,3316,3377,3448,3515,3575,3661,3740,3807,3890,3975,4049,4114,4190,4238,4311,4375,4451,4529,4591,4655,4718,4783,4863,4939,5017,5093,5147,5202,5271,5346,5419", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,63,61,69,69,76,90,105,72,50,61,76,58,58,77,60,56,55,58,57,53,84,55,57,53,64,91,73,71,78,73,75,121,61,61,98,78,73,49,50,65,63,68,70,70,60,70,66,59,85,78,66,82,84,73,64,75,47,72,63,75,77,61,63,62,64,79,75,77,75,53,54,68,74,72,69", + "endOffsets": "242,306,368,438,508,585,676,782,855,906,968,1045,1104,1163,1241,1302,1359,1415,1474,1532,1586,1671,1727,1785,1839,1904,1996,2070,2142,2221,2295,2371,2493,2555,2617,2716,2795,2869,2919,2970,3036,3100,3169,3240,3311,3372,3443,3510,3570,3656,3735,3802,3885,3970,4044,4109,4185,4233,4306,4370,4446,4524,4586,4650,4713,4778,4858,4934,5012,5088,5142,5197,5266,5341,5414,5484" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2854,2918,2980,3050,3120,3861,3952,4058,5945,5996,6058,6135,6194,6253,6331,6392,6449,6505,6564,6622,6676,6761,6817,6875,6929,6994,7086,7160,7232,7311,7385,7461,7583,7645,7707,7806,7885,7959,8009,8060,8126,8190,8259,8330,8401,8462,8533,8600,8660,8746,8825,8892,8975,9060,9134,9199,9275,9323,9396,9460,9536,9614,9676,9740,9803,9868,9948,10024,10102,10178,10232,10287,10435,10510,10583", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,63,61,69,69,76,90,105,72,50,61,76,58,58,77,60,56,55,58,57,53,84,55,57,53,64,91,73,71,78,73,75,121,61,61,98,78,73,49,50,65,63,68,70,70,60,70,66,59,85,78,66,82,84,73,64,75,47,72,63,75,77,61,63,62,64,79,75,77,75,53,54,68,74,72,69", + "endOffsets": "292,2913,2975,3045,3115,3192,3947,4053,4126,5991,6053,6130,6189,6248,6326,6387,6444,6500,6559,6617,6671,6756,6812,6870,6924,6989,7081,7155,7227,7306,7380,7456,7578,7640,7702,7801,7880,7954,8004,8055,8121,8185,8254,8325,8396,8457,8528,8595,8655,8741,8820,8887,8970,9055,9129,9194,9270,9318,9391,9455,9531,9609,9671,9735,9798,9863,9943,10019,10097,10173,10227,10282,10351,10505,10578,10648" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-zh-rCN/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "199", + "endColumns": "94", + "endOffsets": "293" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "4993", + "endColumns": "98", + "endOffsets": "5087" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-zh-rCN/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "197,294,419,530,628,729,841,939,1027,1131,1228,1354,1465,1565,1669,1721,1774", + "endColumns": "96,124,110,97,100,111,97,87,103,96,125,110,99,103,51,52,69", + "endOffsets": "293,418,529,627,728,840,938,1026,1130,1227,1353,1464,1564,1668,1720,1773,1843" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4131,4232,4361,4476,4578,4683,4799,4901,5092,5200,5301,5431,5546,5650,5758,5814,5871", + "endColumns": "100,128,114,101,104,115,101,91,107,100,129,114,103,107,55,56,73", + "endOffsets": "4227,4356,4471,4573,4678,4794,4896,4988,5195,5296,5426,5541,5645,5753,5809,5866,5940" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-zh-rCN/values-zh-rCN.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,147,248,342,436,529,623,719", + "endColumns": "91,100,93,93,92,93,95,100", + "endOffsets": "142,243,337,431,524,618,714,815" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3197,3289,3390,3484,3578,3671,3765,10653", + "endColumns": "91,100,93,93,92,93,95,100", + "endOffsets": "3284,3385,3479,3573,3666,3760,3856,10749" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-v18_values-v18.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v18/values-v18.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "48", + "endOffsets": "99" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-v17_values-v17.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v17/values-v17.xml", + "from": { + "startLines": "2,5,9,12,15,18,22,25,29,33,37,40,43,46,50,53,57", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,228,456,614,764,936,1161,1331,1559,1783,2025,2196,2370,2539,2812,3012,3216", + "endLines": "4,8,11,14,17,21,24,28,32,36,39,42,45,49,52,56,60", + "endColumns": "12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12", + "endOffsets": "223,451,609,759,931,1156,1326,1554,1778,2020,2191,2365,2534,2807,3007,3211,3540" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-lo_values-lo.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-lo/values-lo.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,254,353,451,552,650,761", + "endColumns": "95,102,98,97,100,97,110,100", + "endOffsets": "146,249,348,446,547,645,756,857" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3381,3477,3580,3679,3777,3878,3976,11936", + "endColumns": "95,102,98,97,100,97,110,100", + "endOffsets": "3472,3575,3674,3772,3873,3971,4082,12032" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-lo/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,463,589,692,840,961,1065,1177,1325,1426,1588,1713,1880,2037,2101,2166", + "endColumns": "103,165,125,102,147,120,103,111,147,100,161,124,166,156,63,64,80", + "endOffsets": "296,462,588,691,839,960,1064,1176,1324,1425,1587,1712,1879,2036,2100,2165,2246" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4404,4512,4682,4812,4919,5071,5196,5304,5552,5704,5809,5975,6104,6275,6436,6504,6573", + "endColumns": "107,169,129,106,151,124,107,115,151,104,165,128,170,160,67,68,84", + "endOffsets": "4507,4677,4807,4914,5066,5191,5299,5415,5699,5804,5970,6099,6270,6431,6499,6568,6653" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-lo/values-lo.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,269,343,414,495,581,664,779,898,981,1048,1114,1203,1272,1331,1426,1492,1557,1615,1680,1741,1801,1907,1968,2028,2086,2157,2276,2362,2439,2529,2614,2696,2839,2914,2990,3121,3211,3289,3344,3399,3465,3534,3608,3679,3758,3831,3908,3977,4047,4144,4229,4304,4397,4490,4564,4633,4727,4779,4862,4929,5013,5097,5159,5223,5286,5356,5455,5553,5648,5742,5801,5860,5939,6024,6101", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,73,70,80,85,82,114,118,82,66,65,88,68,58,94,65,64,57,64,60,59,105,60,59,57,70,118,85,76,89,84,81,142,74,75,130,89,77,54,54,65,68,73,70,78,72,76,68,69,96,84,74,92,92,73,68,93,51,82,66,83,83,61,63,62,69,98,97,94,93,58,58,78,84,76,75", + "endOffsets": "264,338,409,490,576,659,774,893,976,1043,1109,1198,1267,1326,1421,1487,1552,1610,1675,1736,1796,1902,1963,2023,2081,2152,2271,2357,2434,2524,2609,2691,2834,2909,2985,3116,3206,3284,3339,3394,3460,3529,3603,3674,3753,3826,3903,3972,4042,4139,4224,4299,4392,4485,4559,4628,4722,4774,4857,4924,5008,5092,5154,5218,5281,5351,5450,5548,5643,5737,5796,5855,5934,6019,6096,6172" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2986,3060,3131,3212,3298,4087,4202,4321,6658,6725,6791,6880,6949,7008,7103,7169,7234,7292,7357,7418,7478,7584,7645,7705,7763,7834,7953,8039,8116,8206,8291,8373,8516,8591,8667,8798,8888,8966,9021,9076,9142,9211,9285,9356,9435,9508,9585,9654,9724,9821,9906,9981,10074,10167,10241,10310,10404,10456,10539,10606,10690,10774,10836,10900,10963,11033,11132,11230,11325,11419,11478,11537,11698,11783,11860", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,73,70,80,85,82,114,118,82,66,65,88,68,58,94,65,64,57,64,60,59,105,60,59,57,70,118,85,76,89,84,81,142,74,75,130,89,77,54,54,65,68,73,70,78,72,76,68,69,96,84,74,92,92,73,68,93,51,82,66,83,83,61,63,62,69,98,97,94,93,58,58,78,84,76,75", + "endOffsets": "314,3055,3126,3207,3293,3376,4197,4316,4399,6720,6786,6875,6944,7003,7098,7164,7229,7287,7352,7413,7473,7579,7640,7700,7758,7829,7948,8034,8111,8201,8286,8368,8511,8586,8662,8793,8883,8961,9016,9071,9137,9206,9280,9351,9430,9503,9580,9649,9719,9816,9901,9976,10069,10162,10236,10305,10399,10451,10534,10601,10685,10769,10831,10895,10958,11028,11127,11225,11320,11414,11473,11532,11611,11778,11855,11931" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-lo/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "127", + "endOffsets": "322" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5420", + "endColumns": "131", + "endOffsets": "5547" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-lo/values-lo.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,208,311,424,509,613,724,802,879,970,1063,1155,1249,1349,1442,1537,1633,1724,1815,1896,2003,2107,2205,2308,2412,2516,2673,2772", + "endColumns": "102,102,112,84,103,110,77,76,90,92,91,93,99,92,94,95,90,90,80,106,103,97,102,103,103,156,98,81", + "endOffsets": "203,306,419,504,608,719,797,874,965,1058,1150,1244,1344,1437,1532,1628,1719,1810,1891,1998,2102,2200,2303,2407,2511,2668,2767,2849" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "319,422,525,638,723,827,938,1016,1093,1184,1277,1369,1463,1563,1656,1751,1847,1938,2029,2110,2217,2321,2419,2522,2626,2730,2887,11616", + "endColumns": "102,102,112,84,103,110,77,76,90,92,91,93,99,92,94,95,90,90,80,106,103,97,102,103,103,156,98,81", + "endOffsets": "417,520,633,718,822,933,1011,1088,1179,1272,1364,1458,1558,1651,1746,1842,1933,2024,2105,2212,2316,2414,2517,2621,2725,2882,2981,11693" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-uz_values-uz.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-uz/values-uz.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,157,259,360,460,568,672,791", + "endColumns": "101,101,100,99,107,103,118,100", + "endOffsets": "152,254,355,455,563,667,786,887" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3425,3527,3629,3730,3830,3938,4042,12142", + "endColumns": "101,101,100,99,107,103,118,100", + "endOffsets": "3522,3624,3725,3825,3933,4037,4156,12238" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-uz/values-uz.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,210,305,405,487,587,704,789,867,958,1051,1146,1240,1334,1427,1522,1617,1708,1800,1884,1994,2100,2200,2308,2414,2516,2677,2776", + "endColumns": "104,94,99,81,99,116,84,77,90,92,94,93,93,92,94,94,90,91,83,109,105,99,107,105,101,160,98,83", + "endOffsets": "205,300,400,482,582,699,784,862,953,1046,1141,1235,1329,1422,1517,1612,1703,1795,1879,1989,2095,2195,2303,2409,2511,2672,2771,2855" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "333,438,533,633,715,815,932,1017,1095,1186,1279,1374,1468,1562,1655,1750,1845,1936,2028,2112,2222,2328,2428,2536,2642,2744,2905,11821", + "endColumns": "104,94,99,81,99,116,84,77,90,92,94,93,93,92,94,94,90,91,83,109,105,99,107,105,101,160,98,83", + "endOffsets": "433,528,628,710,810,927,1012,1090,1181,1274,1369,1463,1557,1650,1745,1840,1931,2023,2107,2217,2323,2423,2531,2637,2739,2900,2999,11900" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-uz/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "145", + "endOffsets": "340" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5464", + "endColumns": "149", + "endOffsets": "5609" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-uz/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,294,440,565,670,811,940,1056,1158,1326,1430,1585,1713,1863,2021,2083,2140", + "endColumns": "100,145,124,104,140,128,115,101,167,103,154,127,149,157,61,56,75", + "endOffsets": "293,439,564,669,810,939,1055,1157,1325,1429,1584,1712,1862,2020,2082,2139,2215" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4467,4572,4722,4851,4960,5105,5238,5358,5614,5786,5894,6053,6185,6339,6501,6567,6628", + "endColumns": "104,149,128,108,144,132,119,105,171,107,158,131,153,161,65,60,79", + "endOffsets": "4567,4717,4846,4955,5100,5233,5353,5459,5781,5889,6048,6180,6334,6496,6562,6623,6703" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-uz/values-uz.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,283,360,440,523,617,704,799,926,1010,1070,1134,1237,1307,1374,1483,1546,1613,1672,1746,1809,1863,1978,2036,2098,2152,2227,2356,2446,2526,2619,2703,2792,2933,3015,3097,3236,3322,3406,3466,3517,3583,3656,3734,3805,3886,3958,4035,4110,4181,4282,4376,4455,4551,4645,4719,4795,4881,4934,5021,5087,5172,5263,5325,5389,5452,5521,5623,5724,5820,5921,5985,6040,6123,6209,6286", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,76,79,82,93,86,94,126,83,59,63,102,69,66,108,62,66,58,73,62,53,114,57,61,53,74,128,89,79,92,83,88,140,81,81,138,85,83,59,50,65,72,77,70,80,71,76,74,70,100,93,78,95,93,73,75,85,52,86,65,84,90,61,63,62,68,101,100,95,100,63,54,82,85,76,73", + "endOffsets": "278,355,435,518,612,699,794,921,1005,1065,1129,1232,1302,1369,1478,1541,1608,1667,1741,1804,1858,1973,2031,2093,2147,2222,2351,2441,2521,2614,2698,2787,2928,3010,3092,3231,3317,3401,3461,3512,3578,3651,3729,3800,3881,3953,4030,4105,4176,4277,4371,4450,4546,4640,4714,4790,4876,4929,5016,5082,5167,5258,5320,5384,5447,5516,5618,5719,5815,5916,5980,6035,6118,6204,6281,6355" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3004,3081,3161,3244,3338,4161,4256,4383,6708,6768,6832,6935,7005,7072,7181,7244,7311,7370,7444,7507,7561,7676,7734,7796,7850,7925,8054,8144,8224,8317,8401,8490,8631,8713,8795,8934,9020,9104,9164,9215,9281,9354,9432,9503,9584,9656,9733,9808,9879,9980,10074,10153,10249,10343,10417,10493,10579,10632,10719,10785,10870,10961,11023,11087,11150,11219,11321,11422,11518,11619,11683,11738,11905,11991,12068", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,76,79,82,93,86,94,126,83,59,63,102,69,66,108,62,66,58,73,62,53,114,57,61,53,74,128,89,79,92,83,88,140,81,81,138,85,83,59,50,65,72,77,70,80,71,76,74,70,100,93,78,95,93,73,75,85,52,86,65,84,90,61,63,62,68,101,100,95,100,63,54,82,85,76,73", + "endOffsets": "328,3076,3156,3239,3333,3420,4251,4378,4462,6763,6827,6930,7000,7067,7176,7239,7306,7365,7439,7502,7556,7671,7729,7791,7845,7920,8049,8139,8219,8312,8396,8485,8626,8708,8790,8929,9015,9099,9159,9210,9276,9349,9427,9498,9579,9651,9728,9803,9874,9975,10069,10148,10244,10338,10412,10488,10574,10627,10714,10780,10865,10956,11018,11082,11145,11214,11316,11417,11513,11614,11678,11733,11816,11986,12063,12137" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-fi_values-fi.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-fi/values-fi.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,268,344,418,501,590,672,768,876,960,1022,1087,1180,1255,1320,1408,1473,1539,1597,1668,1734,1788,1898,1958,2022,2076,2149,2265,2349,2425,2516,2597,2678,2811,2896,2981,3114,3204,3278,3330,3381,3447,3524,3606,3677,3751,3825,3904,3981,4053,4160,4249,4325,4416,4511,4585,4658,4752,4806,4880,4952,5038,5124,5186,5250,5313,5384,5485,5588,5683,5783,5839,5894,5973,6059,6138", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,75,73,82,88,81,95,107,83,61,64,92,74,64,87,64,65,57,70,65,53,109,59,63,53,72,115,83,75,90,80,80,132,84,84,132,89,73,51,50,65,76,81,70,73,73,78,76,71,106,88,75,90,94,73,72,93,53,73,71,85,85,61,63,62,70,100,102,94,99,55,54,78,85,78,74", + "endOffsets": "263,339,413,496,585,667,763,871,955,1017,1082,1175,1250,1315,1403,1468,1534,1592,1663,1729,1783,1893,1953,2017,2071,2144,2260,2344,2420,2511,2592,2673,2806,2891,2976,3109,3199,3273,3325,3376,3442,3519,3601,3672,3746,3820,3899,3976,4048,4155,4244,4320,4411,4506,4580,4653,4747,4801,4875,4947,5033,5119,5181,5245,5308,5379,5480,5583,5678,5778,5834,5889,5968,6054,6133,6208" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2988,3064,3138,3221,3310,4126,4222,4330,6585,6647,6712,6805,6880,6945,7033,7098,7164,7222,7293,7359,7413,7523,7583,7647,7701,7774,7890,7974,8050,8141,8222,8303,8436,8521,8606,8739,8829,8903,8955,9006,9072,9149,9231,9302,9376,9450,9529,9606,9678,9785,9874,9950,10041,10136,10210,10283,10377,10431,10505,10577,10663,10749,10811,10875,10938,11009,11110,11213,11308,11408,11464,11519,11679,11765,11844", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,75,73,82,88,81,95,107,83,61,64,92,74,64,87,64,65,57,70,65,53,109,59,63,53,72,115,83,75,90,80,80,132,84,84,132,89,73,51,50,65,76,81,70,73,73,78,76,71,106,88,75,90,94,73,72,93,53,73,71,85,85,61,63,62,70,100,102,94,99,55,54,78,85,78,74", + "endOffsets": "313,3059,3133,3216,3305,3387,4217,4325,4409,6642,6707,6800,6875,6940,7028,7093,7159,7217,7288,7354,7408,7518,7578,7642,7696,7769,7885,7969,8045,8136,8217,8298,8431,8516,8601,8734,8824,8898,8950,9001,9067,9144,9226,9297,9371,9445,9524,9601,9673,9780,9869,9945,10036,10131,10205,10278,10372,10426,10500,10572,10658,10744,10806,10870,10933,11004,11105,11208,11303,11403,11459,11514,11593,11760,11839,11914" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-fi/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,300,449,576,678,817,939,1051,1154,1291,1393,1538,1660,1804,1939,2001,2067", + "endColumns": "106,148,126,101,138,121,111,102,136,101,144,121,143,134,61,65,78", + "endOffsets": "299,448,575,677,816,938,1050,1153,1290,1392,1537,1659,1803,1938,2000,2066,2145" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4414,4525,4678,4809,4915,5058,5184,5300,5557,5698,5804,5953,6079,6227,6366,6432,6502", + "endColumns": "110,152,130,105,142,125,115,106,140,105,148,125,147,138,65,69,82", + "endOffsets": "4520,4673,4804,4910,5053,5179,5295,5402,5693,5799,5948,6074,6222,6361,6427,6497,6580" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-fi/values-fi.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,313,422,508,613,731,817,896,987,1080,1175,1269,1363,1456,1552,1651,1742,1836,1916,2023,2124,2221,2327,2427,2525,2675,2775", + "endColumns": "107,99,108,85,104,117,85,78,90,92,94,93,93,92,95,98,90,93,79,106,100,96,105,99,97,149,99,80", + "endOffsets": "208,308,417,503,608,726,812,891,982,1075,1170,1264,1358,1451,1547,1646,1737,1831,1911,2018,2119,2216,2322,2422,2520,2670,2770,2851" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "318,426,526,635,721,826,944,1030,1109,1200,1293,1388,1482,1576,1669,1765,1864,1955,2049,2129,2236,2337,2434,2540,2640,2738,2888,11598", + "endColumns": "107,99,108,85,104,117,85,78,90,92,94,93,93,92,95,98,90,93,79,106,100,96,105,99,97,149,99,80", + "endOffsets": "421,521,630,716,821,939,1025,1104,1195,1288,1383,1477,1571,1664,1760,1859,1950,2044,2124,2231,2332,2429,2535,2635,2733,2883,2983,11674" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-fi/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "145", + "endOffsets": "340" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5407", + "endColumns": "149", + "endOffsets": "5552" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-fi/values-fi.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,351,456,561,673,789", + "endColumns": "95,101,97,104,104,111,115,100", + "endOffsets": "146,248,346,451,556,668,784,885" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3392,3488,3590,3688,3793,3898,4010,11919", + "endColumns": "95,101,97,104,104,111,115,100", + "endOffsets": "3483,3585,3683,3788,3893,4005,4121,12015" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-small-v4_values-small-v4.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-small-v4/values-small-v4.xml", + "from": { + "startLines": "2,3,4,5", + "startColumns": "4,4,4,4", + "startOffsets": "55,128,198,270", + "endColumns": "72,69,71,69", + "endOffsets": "123,193,265,335" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-eu_values-eu.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-eu/values-eu.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,256,356,459,564,667,786", + "endColumns": "97,102,99,102,104,102,118,100", + "endOffsets": "148,251,351,454,559,662,781,882" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3569,3667,3770,3870,3973,4078,4181,12270", + "endColumns": "97,102,99,102,104,102,118,100", + "endOffsets": "3662,3765,3865,3968,4073,4176,4295,12366" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-eu/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "138", + "endOffsets": "333" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5614", + "endColumns": "142", + "endOffsets": "5752" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-eu/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,293,461,581,686,834,955,1075,1179,1353,1457,1616,1740,1890,2046,2108,2169", + "endColumns": "99,167,119,104,147,120,119,103,173,103,158,123,149,155,61,60,87", + "endOffsets": "292,460,580,685,833,954,1074,1178,1352,1456,1615,1739,1889,2045,2107,2168,2256" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4596,4700,4872,4996,5105,5257,5382,5506,5757,5935,6043,6206,6334,6488,6648,6714,6779", + "endColumns": "103,171,123,108,151,124,123,107,177,107,162,127,153,159,65,64,91", + "endOffsets": "4695,4867,4991,5100,5252,5377,5501,5609,5930,6038,6201,6329,6483,6643,6709,6774,6866" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-eu/values-eu.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,275,382,487,567,674,774,872,987,1070,1136,1203,1302,1370,1431,1519,1582,1648,1712,1783,1846,1900,2009,2068,2131,2185,2259,2384,2474,2552,2641,2724,2804,2949,3032,3114,3252,3343,3426,3478,3531,3597,3668,3748,3819,3899,3977,4055,4128,4203,4310,4397,4484,4575,4668,4740,4816,4908,4959,5041,5107,5191,5277,5339,5403,5466,5534,5641,5750,5846,5951,6007,6064,6147,6232,6309", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,106,104,79,106,99,97,114,82,65,66,98,67,60,87,62,65,63,70,62,53,108,58,62,53,73,124,89,77,88,82,79,144,82,81,137,90,82,51,52,65,70,79,70,79,77,77,72,74,106,86,86,90,92,71,75,91,50,81,65,83,85,61,63,62,67,106,108,95,104,55,56,82,84,76,76", + "endOffsets": "270,377,482,562,669,769,867,982,1065,1131,1198,1297,1365,1426,1514,1577,1643,1707,1778,1841,1895,2004,2063,2126,2180,2254,2379,2469,2547,2636,2719,2799,2944,3027,3109,3247,3338,3421,3473,3526,3592,3663,3743,3814,3894,3972,4050,4123,4198,4305,4392,4479,4570,4663,4735,4811,4903,4954,5036,5102,5186,5272,5334,5398,5461,5529,5636,5745,5841,5946,6002,6059,6142,6227,6304,6381" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3070,3177,3282,3362,3469,4300,4398,4513,6871,6937,7004,7103,7171,7232,7320,7383,7449,7513,7584,7647,7701,7810,7869,7932,7986,8060,8185,8275,8353,8442,8525,8605,8750,8833,8915,9053,9144,9227,9279,9332,9398,9469,9549,9620,9700,9778,9856,9929,10004,10111,10198,10285,10376,10469,10541,10617,10709,10760,10842,10908,10992,11078,11140,11204,11267,11335,11442,11551,11647,11752,11808,11865,12031,12116,12193", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,106,104,79,106,99,97,114,82,65,66,98,67,60,87,62,65,63,70,62,53,108,58,62,53,73,124,89,77,88,82,79,144,82,81,137,90,82,51,52,65,70,79,70,79,77,77,72,74,106,86,86,90,92,71,75,91,50,81,65,83,85,61,63,62,67,106,108,95,104,55,56,82,84,76,76", + "endOffsets": "320,3172,3277,3357,3464,3564,4393,4508,4591,6932,6999,7098,7166,7227,7315,7378,7444,7508,7579,7642,7696,7805,7864,7927,7981,8055,8180,8270,8348,8437,8520,8600,8745,8828,8910,9048,9139,9222,9274,9327,9393,9464,9544,9615,9695,9773,9851,9924,9999,10106,10193,10280,10371,10464,10536,10612,10704,10755,10837,10903,10987,11073,11135,11199,11262,11330,11437,11546,11642,11747,11803,11860,11943,12111,12188,12265" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-eu/values-eu.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,214,312,422,508,614,738,824,905,997,1091,1187,1281,1382,1476,1572,1669,1761,1854,1936,2045,2154,2253,2362,2469,2580,2751,2850", + "endColumns": "108,97,109,85,105,123,85,80,91,93,95,93,100,93,95,96,91,92,81,108,108,98,108,106,110,170,98,82", + "endOffsets": "209,307,417,503,609,733,819,900,992,1086,1182,1276,1377,1471,1567,1664,1756,1849,1931,2040,2149,2248,2357,2464,2575,2746,2845,2928" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "325,434,532,642,728,834,958,1044,1125,1217,1311,1407,1501,1602,1696,1792,1889,1981,2074,2156,2265,2374,2473,2582,2689,2800,2971,11948", + "endColumns": "108,97,109,85,105,123,85,80,91,93,95,93,100,93,95,96,91,92,81,108,108,98,108,106,110,170,98,82", + "endOffsets": "429,527,637,723,829,953,1039,1120,1212,1306,1402,1496,1597,1691,1787,1884,1976,2069,2151,2260,2369,2468,2577,2684,2795,2966,3065,12026" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-b+es+419_values-b+es+419.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-b+es+419/values-b+es+419.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,278,360,440,526,631,727,829,957,1038,1100,1165,1260,1330,1393,1486,1550,1622,1685,1759,1823,1879,1997,2055,2117,2173,2253,2387,2476,2552,2650,2731,2812,2953,3034,3114,3265,3355,3432,3488,3544,3610,3689,3771,3842,3931,4004,4081,4151,4228,4334,4423,4497,4591,4693,4765,4846,4950,5003,5088,5155,5248,5337,5399,5463,5526,5594,5705,5816,5918,6023,6083,6143,6226,6309,6385", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,81,79,85,104,95,101,127,80,61,64,94,69,62,92,63,71,62,73,63,55,117,57,61,55,79,133,88,75,97,80,80,140,80,79,150,89,76,55,55,65,78,81,70,88,72,76,69,76,105,88,73,93,101,71,80,103,52,84,66,92,88,61,63,62,67,110,110,101,104,59,59,82,82,75,76", + "endOffsets": "273,355,435,521,626,722,824,952,1033,1095,1160,1255,1325,1388,1481,1545,1617,1680,1754,1818,1874,1992,2050,2112,2168,2248,2382,2471,2547,2645,2726,2807,2948,3029,3109,3260,3350,3427,3483,3539,3605,3684,3766,3837,3926,3999,4076,4146,4223,4329,4418,4492,4586,4688,4760,4841,4945,4998,5083,5150,5243,5332,5394,5458,5521,5589,5700,5811,5913,6018,6078,6138,6221,6304,6380,6457" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-ru_values-ru.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ru/values-ru.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,220,322,421,507,612,733,812,888,980,1074,1169,1262,1357,1451,1547,1642,1734,1826,1915,2021,2128,2226,2335,2442,2556,2722,2822", + "endColumns": "114,101,98,85,104,120,78,75,91,93,94,92,94,93,95,94,91,91,88,105,106,97,108,106,113,165,99,81", + "endOffsets": "215,317,416,502,607,728,807,883,975,1069,1164,1257,1352,1446,1542,1637,1729,1821,1910,2016,2123,2221,2330,2437,2551,2717,2817,2899" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,340", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "431,546,648,747,833,938,1059,1138,1214,1306,1400,1495,1588,1683,1777,1873,1968,2060,2152,2241,2347,2454,2552,2661,2768,2882,3048,27486", + "endColumns": "114,101,98,85,104,120,78,75,91,93,94,92,94,93,95,94,91,91,88,105,106,97,108,106,113,165,99,81", + "endOffsets": "541,643,742,828,933,1054,1133,1209,1301,1395,1490,1583,1678,1772,1868,1963,2055,2147,2236,2342,2449,2547,2656,2763,2877,3043,3143,27563" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ru/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,458,580,686,824,949,1060,1160,1337,1440,1599,1721,1884,2038,2103,2159", + "endColumns": "102,161,121,105,137,124,110,99,176,102,158,121,162,153,64,55,81", + "endOffsets": "295,457,579,685,823,948,1059,1159,1336,1439,1598,1720,1883,2037,2102,2158,2240" + }, + "to": { + "startLines": "102,103,104,105,106,107,108,109,111,112,113,114,115,116,117,118,119", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "8566,8673,8839,8965,9075,9217,9346,9461,9722,9903,10010,10173,10299,10466,10624,10693,10753", + "endColumns": "106,165,125,109,141,128,114,103,180,106,162,125,166,157,68,59,85", + "endOffsets": "8668,8834,8960,9070,9212,9341,9456,9560,9898,10005,10168,10294,10461,10619,10688,10748,10834" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ru/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "152", + "endOffsets": "347" + }, + "to": { + "startLines": "110", + "startColumns": "4", + "startOffsets": "9565", + "endColumns": "156", + "endOffsets": "9717" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values-ru/strings.xml", + "from": { + "startLines": "85,84,83,2,124,126,123,125,76,127,128,26,25,110,151,197,193,194,32,33,156,37,36,155,35,34,75,20,21,22,168,132,111,38,39,80,81,129,77,233,237,236,68,69,154,231,232,235,70,71,229,234,108,109,27,222,214,211,210,209,213,208,203,212,205,206,204,207,226,227,228,219,220,218,216,215,217,225,224,202,201,221,200,120,121,246,74,116,113,114,112,115,78,88,57,192,191,190,189,188,23,230,24,58,18,19,175,157,59,16,93,139,244,17,137,142,174,15,136,56,179,177,178,176,199,198,5,89,90,86,87,150,149,131,60,65,67,61,153,152,64,62,66,63,243,103,102,101,138,8,165,164,166,241,240,238,242,239,97,95,96,118,119,99,98,91,100,162,161,160,158,159,185,144,147,145,146,148,42,40,41,4,141,140,105,245,79,104,7,163,9,10,82,195,196,46,44,49,55,54,47,48,43,45,52,51,53,50,12,73,3,117,6,186,167,187,133,135,134,14,11,94,92,143,107,173,184,181,183,182,180,122,72,30,29,28,223,31,169,170,172,171,130,13,106", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "6038,5966,5893,55,9032,9197,8962,9133,5382,9255,9325,1718,1653,7851,10969,14165,13852,13902,2271,2337,11293,2741,2614,11232,2486,2397,5300,1208,1267,1360,12200,9599,7904,2854,2932,5704,5764,9399,5503,17041,17253,17173,4810,4861,11114,16925,16983,17129,4913,4985,16803,17083,7737,7789,1910,16111,15309,15099,15037,14971,15232,14896,14526,15176,14726,14781,14667,14839,16472,16561,16638,15756,15869,15673,15485,15394,15567,16371,16268,14466,14411,16035,14340,8741,8812,18091,5253,8418,8078,8176,7981,8247,5567,6265,4128,13800,13748,13695,13638,13584,1468,16867,1561,4205,1045,1117,12780,11357,4260,922,6573,10089,17853,989,9927,10288,12729,868,9880,4070,13001,12895,12948,12828,14264,14212,223,6340,6396,6129,6194,10898,10791,9547,4326,4611,4752,4386,11070,11028,4532,4430,4670,4482,17763,7390,7334,7252,10011,487,11967,11903,12081,17536,17475,17303,17638,17367,6895,6754,6831,8594,8678,7057,6974,6471,7159,11732,11667,11576,11401,11506,13347,10498,10666,10552,10617,10725,3155,3005,3072,156,10210,10151,7538,17915,5636,7464,427,11803,528,573,5844,13971,14074,3386,3278,3589,3986,3909,3454,3523,3223,3331,3797,3741,3853,3677,692,5184,105,8499,375,13445,12137,13519,9670,9809,9738,808,635,6668,6535,10371,7673,12630,13278,13130,13219,13174,13066,8882,5080,2125,2054,1984,16195,2193,12301,12389,12525,12469,9472,748,7598", + "endColumns": "90,71,72,49,100,57,69,63,120,69,73,191,64,52,58,46,49,68,65,59,63,112,126,60,127,88,81,58,92,107,100,70,76,77,72,59,79,72,63,41,49,79,50,51,117,57,57,43,71,94,63,45,51,61,73,83,84,76,61,65,76,74,140,55,54,57,58,56,88,76,164,112,165,82,81,90,105,100,102,59,54,75,70,70,69,59,46,80,97,70,96,170,68,74,76,51,51,52,56,53,92,57,91,54,71,90,47,43,65,66,94,61,61,55,83,82,50,53,46,57,64,52,52,66,75,51,151,55,74,64,70,70,106,51,59,58,57,43,43,41,78,51,81,49,89,73,55,81,77,40,113,63,55,101,60,63,124,107,78,76,63,83,62,101,82,63,92,70,64,90,104,69,97,53,58,64,48,65,67,66,82,66,77,58,59,175,67,73,59,99,44,61,48,102,90,67,52,87,83,76,68,65,54,54,55,55,55,63,55,68,50,94,51,73,62,64,67,70,70,59,56,85,37,126,63,98,68,43,58,44,63,79,103,67,70,69,72,77,87,79,104,55,74,59,74", + "endOffsets": "6124,6033,5961,100,9128,9250,9027,9192,5498,9320,9394,1905,1713,7899,11023,14207,13897,13966,2332,2392,11352,2849,2736,11288,2609,2481,5377,1262,1355,1463,12296,9665,7976,2927,3000,5759,5839,9467,5562,17078,17298,17248,4856,4908,11227,16978,17036,17168,4980,5075,16862,17124,7784,7846,1979,16190,15389,15171,15094,15032,15304,14966,14662,15227,14776,14834,14721,14891,16556,16633,16798,15864,16030,15751,15562,15480,15668,16467,16366,14521,14461,16106,14406,8807,8877,18146,5295,8494,8171,8242,8073,8413,5631,6335,4200,13847,13795,13743,13690,13633,1556,16920,1648,4255,1112,1203,12823,11396,4321,984,6663,10146,17910,1040,10006,10366,12775,917,9922,4123,13061,12943,12996,12890,14335,14259,370,6391,6466,6189,6260,10964,10893,9594,4381,4665,4805,4425,11109,11065,4606,4477,4747,4527,17848,7459,7385,7329,10084,523,12076,11962,12132,17633,17531,17362,17758,17470,6969,6826,6890,8673,8736,7154,7052,6530,7247,11798,11727,11662,11501,11571,13440,10547,10720,10612,10661,10786,3218,3067,3150,218,10283,10205,7593,18086,5699,7533,482,11898,568,630,5888,14069,14160,3449,3326,3672,4065,3981,3518,3584,3273,3381,3848,3792,3904,3736,743,5248,151,8589,422,13514,12195,13579,9733,9875,9804,863,687,6749,6568,10493,7732,12724,13342,13169,13273,13214,13125,8957,5179,2188,2120,2049,16263,2266,12384,12464,12625,12520,9542,803,7668" + }, + "to": { + "startLines": "35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,55,56,57,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,89,90,91,92,93,94,95,96,97,98,99,100,101,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,156,158,159,160,161,163,164,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,262,263,264,265,266,267,268,269,270,271,272,273,274,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,341,344,345,346,347,348,349,350,351,352,353,354,356,357,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "3148,3239,3311,3384,3434,3535,3593,3663,3727,3848,3918,3992,4184,4249,4302,4790,4837,4887,5683,5749,5809,5873,5986,6113,6174,6302,6391,6473,6532,6625,6733,6834,6905,6982,7060,7133,7193,7273,7346,7736,7778,7828,7908,7959,8011,8129,8187,8245,8289,8361,8456,8520,10839,10891,10953,11027,11111,11196,11273,11335,11401,11478,11553,11694,11750,11805,11863,11922,11979,12068,12145,12310,12423,12589,12672,12754,12845,12951,13052,13155,13215,13270,13346,13417,13488,13558,13618,13740,13887,13985,14056,14153,14423,14492,14707,14784,14836,14888,14941,14998,15052,15145,15203,15295,15350,15422,15513,15561,15605,15671,15738,15833,15895,15957,16013,16097,16180,16231,16285,16332,16390,16455,16508,16561,16628,16704,16756,16908,16964,17039,17104,21832,21903,22010,22062,22122,22181,22239,22283,22327,22369,22448,22500,22582,22712,22802,22876,22932,23014,23092,23133,23247,23311,23367,23469,23530,23594,23719,23827,23906,23983,24047,24131,24194,24296,24379,24443,24536,24607,24672,24763,24868,24938,25036,25090,25149,25214,25263,25329,25397,25464,25547,25614,25692,25751,25811,25987,26055,26129,26189,26289,26334,26396,26445,26548,26639,26707,26760,26848,26932,27009,27078,27144,27199,27254,27310,27366,27422,27568,27794,27863,27914,28009,28061,28135,28198,28263,28331,28402,28473,28612,28669,28856,28894,29021,29085,29184,29253,29297,29356,29401,29465,29545,29649,29717,29788,29858,29931,30009,30097,30177,30282,30338,30413,30473", + "endColumns": "90,71,72,49,100,57,69,63,120,69,73,191,64,52,58,46,49,68,65,59,63,112,126,60,127,88,81,58,92,107,100,70,76,77,72,59,79,72,63,41,49,79,50,51,117,57,57,43,71,94,63,45,51,61,73,83,84,76,61,65,76,74,140,55,54,57,58,56,88,76,164,112,165,82,81,90,105,100,102,59,54,75,70,70,69,59,46,80,97,70,96,170,68,74,76,51,51,52,56,53,92,57,91,54,71,90,47,43,65,66,94,61,61,55,83,82,50,53,46,57,64,52,52,66,75,51,151,55,74,64,70,70,106,51,59,58,57,43,43,41,78,51,81,49,89,73,55,81,77,40,113,63,55,101,60,63,124,107,78,76,63,83,62,101,82,63,92,70,64,90,104,69,97,53,58,64,48,65,67,66,82,66,77,58,59,175,67,73,59,99,44,61,48,102,90,67,52,87,83,76,68,65,54,54,55,55,55,63,55,68,50,94,51,73,62,64,67,70,70,59,56,85,37,126,63,98,68,43,58,44,63,79,103,67,70,69,72,77,87,79,104,55,74,59,74", + "endOffsets": "3234,3306,3379,3429,3530,3588,3658,3722,3843,3913,3987,4179,4244,4297,4356,4832,4882,4951,5744,5804,5868,5981,6108,6169,6297,6386,6468,6527,6620,6728,6829,6900,6977,7055,7128,7188,7268,7341,7405,7773,7823,7903,7954,8006,8124,8182,8240,8284,8356,8451,8515,8561,10886,10948,11022,11106,11191,11268,11330,11396,11473,11548,11689,11745,11800,11858,11917,11974,12063,12140,12305,12418,12584,12667,12749,12840,12946,13047,13150,13210,13265,13341,13412,13483,13553,13613,13660,13816,13980,14051,14148,14319,14487,14562,14779,14831,14883,14936,14993,15047,15140,15198,15290,15345,15417,15508,15556,15600,15666,15733,15828,15890,15952,16008,16092,16175,16226,16280,16327,16385,16450,16503,16556,16623,16699,16751,16903,16959,17034,17099,17170,21898,22005,22057,22117,22176,22234,22278,22322,22364,22443,22495,22577,22627,22797,22871,22927,23009,23087,23128,23242,23306,23362,23464,23525,23589,23714,23822,23901,23978,24042,24126,24189,24291,24374,24438,24531,24602,24667,24758,24863,24933,25031,25085,25144,25209,25258,25324,25392,25459,25542,25609,25687,25746,25806,25982,26050,26124,26184,26284,26329,26391,26440,26543,26634,26702,26755,26843,26927,27004,27073,27139,27194,27249,27305,27361,27417,27481,27619,27858,27909,28004,28056,28130,28193,28258,28326,28397,28468,28528,28664,28750,28889,29016,29080,29179,29248,29292,29351,29396,29460,29540,29644,29712,29783,29853,29926,30004,30092,30172,30277,30333,30408,30468,30543" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ru/values-ru.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,356,457,562,665,782", + "endColumns": "97,101,100,100,104,102,116,100", + "endOffsets": "148,250,351,452,557,660,777,878" + }, + "to": { + "startLines": "58,59,60,61,62,63,64,358", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "4956,5054,5156,5257,5358,5463,5566,28755", + "endColumns": "97,101,100,100,104,102,116,100", + "endOffsets": "5049,5151,5252,5353,5458,5561,5678,28851" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ru/values-ru.xml", + "from": { + "startLines": "2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,381,459,537,621,719,810,907,1044,1136,1211,1277,1376,1453,1516,1634,1695,1760,1817,1887,1948,2002,2118,2175,2237,2291,2365,2493,2581,2668,2771,2863,2949,3086,3170,3255,3389,3480,3556,3610,3661,3727,3799,3877,3948,4030,4110,4186,4263,4340,4447,4536,4609,4699,4794,4868,4949,5042,5097,5178,5244,5330,5415,5477,5541,5604,5676,5774,5873,5968,6060,6118,6173,6253,6347,6423", + "endLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "endColumns": "12,77,77,83,97,90,96,136,91,74,65,98,76,62,117,60,64,56,69,60,53,115,56,61,53,73,127,87,86,102,91,85,136,83,84,133,90,75,53,50,65,71,77,70,81,79,75,76,76,106,88,72,89,94,73,80,92,54,80,65,85,84,61,63,62,71,97,98,94,91,57,54,79,93,75,78", + "endOffsets": "376,454,532,616,714,805,902,1039,1131,1206,1272,1371,1448,1511,1629,1690,1755,1812,1882,1943,1997,2113,2170,2232,2286,2360,2488,2576,2663,2766,2858,2944,3081,3165,3250,3384,3475,3551,3605,3656,3722,3794,3872,3943,4025,4105,4181,4258,4335,4442,4531,4604,4694,4789,4863,4944,5037,5092,5173,5239,5325,5410,5472,5536,5599,5671,5769,5868,5963,6055,6113,6168,6248,6342,6418,6497" + }, + "to": { + "startLines": "2,50,51,52,53,54,86,87,88,155,157,162,165,166,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,275,342,343,355", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,4361,4439,4517,4601,4699,7410,7507,7644,13665,13821,14324,14567,14644,17175,17293,17354,17419,17476,17546,17607,17661,17777,17834,17896,17950,18024,18152,18240,18327,18430,18522,18608,18745,18829,18914,19048,19139,19215,19269,19320,19386,19458,19536,19607,19689,19769,19845,19922,19999,20106,20195,20268,20358,20453,20527,20608,20701,20756,20837,20903,20989,21074,21136,21200,21263,21335,21433,21532,21627,21719,21777,22632,27624,27718,28533", + "endLines": "7,50,51,52,53,54,86,87,88,155,157,162,165,166,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,275,342,343,355", + "endColumns": "12,77,77,83,97,90,96,136,91,74,65,98,76,62,117,60,64,56,69,60,53,115,56,61,53,73,127,87,86,102,91,85,136,83,84,133,90,75,53,50,65,71,77,70,81,79,75,76,76,106,88,72,89,94,73,80,92,54,80,65,85,84,61,63,62,71,97,98,94,91,57,54,79,93,75,78", + "endOffsets": "426,4434,4512,4596,4694,4785,7502,7639,7731,13735,13882,14418,14639,14702,17288,17349,17414,17471,17541,17602,17656,17772,17829,17891,17945,18019,18147,18235,18322,18425,18517,18603,18740,18824,18909,19043,19134,19210,19264,19315,19381,19453,19531,19602,19684,19764,19840,19917,19994,20101,20190,20263,20353,20448,20522,20603,20696,20751,20832,20898,20984,21069,21131,21195,21258,21330,21428,21527,21622,21714,21772,21827,22707,27713,27789,28607" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-ko_values-ko.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ko/values-ko.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,147,247,341,438,534,632,732", + "endColumns": "91,99,93,96,95,97,99,100", + "endOffsets": "142,242,336,433,529,627,727,828" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3230,3322,3422,3516,3613,3709,3807,10922", + "endColumns": "91,99,93,96,95,97,99,100", + "endOffsets": "3317,3417,3511,3608,3704,3802,3902,11018" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ko/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,293,428,540,638,749,862,965,1056,1197,1296,1428,1542,1656,1771,1826,1880", + "endColumns": "99,134,111,97,110,112,102,90,140,98,131,113,113,114,54,53,70", + "endOffsets": "292,427,539,637,748,861,964,1055,1196,1295,1427,1541,1655,1770,1825,1879,1950" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4171,4275,4414,4530,4632,4747,4864,4971,5187,5332,5435,5571,5689,5807,5926,5985,6043", + "endColumns": "103,138,115,101,114,116,106,94,144,102,135,117,117,118,58,57,74", + "endOffsets": "4270,4409,4525,4627,4742,4859,4966,5061,5327,5430,5566,5684,5802,5921,5980,6038,6113" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ko/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "116", + "endOffsets": "311" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5066", + "endColumns": "120", + "endOffsets": "5182" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ko/values-ko.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,249,314,378,447,521,600,683,789,864,917,979,1060,1122,1179,1266,1326,1384,1442,1501,1558,1612,1707,1763,1820,1874,1940,2044,2119,2191,2272,2350,2427,2548,2613,2678,2778,2857,2932,2982,3033,3099,3163,3233,3304,3375,3443,3514,3586,3656,3749,3829,3903,3983,4065,4137,4202,4274,4322,4395,4459,4534,4611,4673,4737,4800,4867,4951,5029,5109,5187,5241,5296,5368,5445,5518", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,64,63,68,73,78,82,105,74,52,61,80,61,56,86,59,57,57,58,56,53,94,55,56,53,65,103,74,71,80,77,76,120,64,64,99,78,74,49,50,65,63,69,70,70,67,70,71,69,92,79,73,79,81,71,64,71,47,72,63,74,76,61,63,62,66,83,77,79,77,53,54,71,76,72,70", + "endOffsets": "244,309,373,442,516,595,678,784,859,912,974,1055,1117,1174,1261,1321,1379,1437,1496,1553,1607,1702,1758,1815,1869,1935,2039,2114,2186,2267,2345,2422,2543,2608,2673,2773,2852,2927,2977,3028,3094,3158,3228,3299,3370,3438,3509,3581,3651,3744,3824,3898,3978,4060,4132,4197,4269,4317,4390,4454,4529,4606,4668,4732,4795,4862,4946,5024,5104,5182,5236,5291,5363,5440,5513,5584" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2879,2944,3008,3077,3151,3907,3990,4096,6118,6171,6233,6314,6376,6433,6520,6580,6638,6696,6755,6812,6866,6961,7017,7074,7128,7194,7298,7373,7445,7526,7604,7681,7802,7867,7932,8032,8111,8186,8236,8287,8353,8417,8487,8558,8629,8697,8768,8840,8910,9003,9083,9157,9237,9319,9391,9456,9528,9576,9649,9713,9788,9865,9927,9991,10054,10121,10205,10283,10363,10441,10495,10550,10701,10778,10851", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,64,63,68,73,78,82,105,74,52,61,80,61,56,86,59,57,57,58,56,53,94,55,56,53,65,103,74,71,80,77,76,120,64,64,99,78,74,49,50,65,63,69,70,70,67,70,71,69,92,79,73,79,81,71,64,71,47,72,63,74,76,61,63,62,66,83,77,79,77,53,54,71,76,72,70", + "endOffsets": "294,2939,3003,3072,3146,3225,3985,4091,4166,6166,6228,6309,6371,6428,6515,6575,6633,6691,6750,6807,6861,6956,7012,7069,7123,7189,7293,7368,7440,7521,7599,7676,7797,7862,7927,8027,8106,8181,8231,8282,8348,8412,8482,8553,8624,8692,8763,8835,8905,8998,9078,9152,9232,9314,9386,9451,9523,9571,9644,9708,9783,9860,9922,9986,10049,10116,10200,10278,10358,10436,10490,10545,10617,10773,10846,10917" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ko/values-ko.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,202,296,397,479,577,683,763,838,929,1022,1117,1211,1311,1404,1499,1593,1684,1775,1855,1953,2047,2142,2242,2339,2439,2591,2685", + "endColumns": "96,93,100,81,97,105,79,74,90,92,94,93,99,92,94,93,90,90,79,97,93,94,99,96,99,151,93,78", + "endOffsets": "197,291,392,474,572,678,758,833,924,1017,1112,1206,1306,1399,1494,1588,1679,1770,1850,1948,2042,2137,2237,2334,2434,2586,2680,2759" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "299,396,490,591,673,771,877,957,1032,1123,1216,1311,1405,1505,1598,1693,1787,1878,1969,2049,2147,2241,2336,2436,2533,2633,2785,10622", + "endColumns": "96,93,100,81,97,105,79,74,90,92,94,93,99,92,94,93,90,90,79,97,93,94,99,96,99,151,93,78", + "endOffsets": "391,485,586,668,766,872,952,1027,1118,1211,1306,1400,1500,1593,1688,1782,1873,1964,2044,2142,2236,2331,2431,2528,2628,2780,2874,10696" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-lt_values-lt.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-lt/values-lt.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,221,325,438,525,627,749,832,912,1006,1102,1199,1295,1398,1494,1592,1688,1782,1876,1959,2068,2176,2276,2386,2491,2597,2773,2874", + "endColumns": "115,103,112,86,101,121,82,79,93,95,96,95,102,95,97,95,93,93,82,108,107,99,109,104,105,175,100,83", + "endOffsets": "216,320,433,520,622,744,827,907,1001,1097,1194,1290,1393,1489,1587,1683,1777,1871,1954,2063,2171,2271,2381,2486,2592,2768,2869,2953" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,132", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "425,541,645,758,845,947,1069,1152,1232,1326,1422,1519,1615,1718,1814,1912,2008,2102,2196,2279,2388,2496,2596,2706,2811,2917,3093,12114", + "endColumns": "115,103,112,86,101,121,82,79,93,95,96,95,102,95,97,95,93,93,82,108,107,99,109,104,105,175,100,83", + "endOffsets": "536,640,753,840,942,1064,1147,1227,1321,1417,1514,1610,1713,1809,1907,2003,2097,2191,2274,2383,2491,2591,2701,2806,2912,3088,3189,12193" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-lt/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,444,572,675,824,950,1065,1167,1329,1434,1595,1725,1874,2020,2084,2146", + "endColumns": "102,147,127,102,148,125,114,101,161,104,160,129,148,145,63,61,85", + "endOffsets": "295,443,571,674,823,949,1064,1166,1328,1433,1594,1724,1873,2019,2083,2145,2231" + }, + "to": { + "startLines": "50,51,52,53,54,55,56,57,59,60,61,62,63,64,65,66,67", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4667,4774,4926,5058,5165,5318,5448,5567,5832,5998,6107,6272,6406,6559,6709,6777,6843", + "endColumns": "106,151,131,106,152,129,118,105,165,108,164,133,152,149,67,65,89", + "endOffsets": "4769,4921,5053,5160,5313,5443,5562,5668,5993,6102,6267,6401,6554,6704,6772,6838,6928" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-lt/values-lt.xml", + "from": { + "startLines": "2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,375,454,532,615,709,799,895,1013,1097,1160,1226,1325,1403,1468,1578,1641,1713,1772,1846,1907,1961,2085,2146,2208,2262,2340,2474,2562,2639,2732,2813,2897,3038,3117,3201,3344,3441,3518,3574,3628,3694,3769,3848,3919,3999,4075,4153,4226,4303,4410,4497,4578,4668,4760,4832,4913,5005,5060,5142,5208,5293,5380,5442,5506,5569,5641,5752,5868,5969,6078,6138,6196,6278,6364,6440", + "endLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "endColumns": "12,78,77,82,93,89,95,117,83,62,65,98,77,64,109,62,71,58,73,60,53,123,60,61,53,77,133,87,76,92,80,83,140,78,83,142,96,76,55,53,65,74,78,70,79,75,77,72,76,106,86,80,89,91,71,80,91,54,81,65,84,86,61,63,62,71,110,115,100,108,59,57,81,85,75,77", + "endOffsets": "370,449,527,610,704,794,890,1008,1092,1155,1221,1320,1398,1463,1573,1636,1708,1767,1841,1902,1956,2080,2141,2203,2257,2335,2469,2557,2634,2727,2808,2892,3033,3112,3196,3339,3436,3513,3569,3623,3689,3764,3843,3914,3994,4070,4148,4221,4298,4405,4492,4573,4663,4755,4827,4908,5000,5055,5137,5203,5288,5375,5437,5501,5564,5636,5747,5863,5964,6073,6133,6191,6273,6359,6435,6513" + }, + "to": { + "startLines": "2,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3194,3273,3351,3434,3528,4369,4465,4583,6933,6996,7062,7161,7239,7304,7414,7477,7549,7608,7682,7743,7797,7921,7982,8044,8098,8176,8310,8398,8475,8568,8649,8733,8874,8953,9037,9180,9277,9354,9410,9464,9530,9605,9684,9755,9835,9911,9989,10062,10139,10246,10333,10414,10504,10596,10668,10749,10841,10896,10978,11044,11129,11216,11278,11342,11405,11477,11588,11704,11805,11914,11974,12032,12198,12284,12360", + "endLines": "7,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "endColumns": "12,78,77,82,93,89,95,117,83,62,65,98,77,64,109,62,71,58,73,60,53,123,60,61,53,77,133,87,76,92,80,83,140,78,83,142,96,76,55,53,65,74,78,70,79,75,77,72,76,106,86,80,89,91,71,80,91,54,81,65,84,86,61,63,62,71,110,115,100,108,59,57,81,85,75,77", + "endOffsets": "420,3268,3346,3429,3523,3613,4460,4578,4662,6991,7057,7156,7234,7299,7409,7472,7544,7603,7677,7738,7792,7916,7977,8039,8093,8171,8305,8393,8470,8563,8644,8728,8869,8948,9032,9175,9272,9349,9405,9459,9525,9600,9679,9750,9830,9906,9984,10057,10134,10241,10328,10409,10499,10591,10663,10744,10836,10891,10973,11039,11124,11211,11273,11337,11400,11472,11583,11699,11800,11909,11969,12027,12109,12279,12355,12433" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-lt/values-lt.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,263,362,465,576,686,806", + "endColumns": "97,109,98,102,110,109,119,100", + "endOffsets": "148,258,357,460,571,681,801,902" + }, + "to": { + "startLines": "40,41,42,43,44,45,46,136", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3618,3716,3826,3925,4028,4139,4249,12438", + "endColumns": "97,109,98,102,110,109,119,100", + "endOffsets": "3711,3821,3920,4023,4134,4244,4364,12534" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-lt/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "154", + "endOffsets": "349" + }, + "to": { + "startLines": "58", + "startColumns": "4", + "startOffsets": "5673", + "endColumns": "158", + "endOffsets": "5827" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-uk_values-uk.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-uk/values-uk.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,214,316,424,510,615,733,816,898,989,1082,1177,1271,1371,1464,1559,1654,1745,1836,1935,2041,2147,2245,2352,2459,2564,2734,2834", + "endColumns": "108,101,107,85,104,117,82,81,90,92,94,93,99,92,94,94,90,90,98,105,105,97,106,106,104,169,99,81", + "endOffsets": "209,311,419,505,610,728,811,893,984,1077,1172,1266,1366,1459,1554,1649,1740,1831,1930,2036,2142,2240,2347,2454,2559,2729,2829,2911" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,132", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "424,533,635,743,829,934,1052,1135,1217,1308,1401,1496,1590,1690,1783,1878,1973,2064,2155,2254,2360,2466,2564,2671,2778,2883,3053,11925", + "endColumns": "108,101,107,85,104,117,82,81,90,92,94,93,99,92,94,94,90,90,98,105,105,97,106,106,104,169,99,81", + "endOffsets": "528,630,738,824,929,1047,1130,1212,1303,1396,1491,1585,1685,1778,1873,1968,2059,2150,2249,2355,2461,2559,2666,2773,2878,3048,3148,12002" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-uk/values-uk.xml", + "from": { + "startLines": "2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,374,452,530,618,726,817,913,1029,1112,1184,1251,1342,1408,1471,1559,1621,1688,1746,1817,1876,1930,2044,2104,2167,2221,2294,2413,2499,2575,2666,2747,2830,2969,3054,3141,3274,3362,3440,3497,3548,3614,3686,3762,3833,3916,3989,4066,4148,4222,4331,4421,4500,4591,4687,4761,4842,4937,4991,5073,5139,5226,5312,5374,5438,5501,5574,5681,5791,5889,5995,6056,6111,6193,6278,6354", + "endLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "endColumns": "12,77,77,87,107,90,95,115,82,71,66,90,65,62,87,61,66,57,70,58,53,113,59,62,53,72,118,85,75,90,80,82,138,84,86,132,87,77,56,50,65,71,75,70,82,72,76,81,73,108,89,78,90,95,73,80,94,53,81,65,86,85,61,63,62,72,106,109,97,105,60,54,81,84,75,76", + "endOffsets": "369,447,525,613,721,812,908,1024,1107,1179,1246,1337,1403,1466,1554,1616,1683,1741,1812,1871,1925,2039,2099,2162,2216,2289,2408,2494,2570,2661,2742,2825,2964,3049,3136,3269,3357,3435,3492,3543,3609,3681,3757,3828,3911,3984,4061,4143,4217,4326,4416,4495,4586,4682,4756,4837,4932,4986,5068,5134,5221,5307,5369,5433,5496,5569,5676,5786,5884,5990,6051,6106,6188,6273,6349,6426" + }, + "to": { + "startLines": "2,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3153,3231,3309,3397,3505,4323,4419,4535,6844,6916,6983,7074,7140,7203,7291,7353,7420,7478,7549,7608,7662,7776,7836,7899,7953,8026,8145,8231,8307,8398,8479,8562,8701,8786,8873,9006,9094,9172,9229,9280,9346,9418,9494,9565,9648,9721,9798,9880,9954,10063,10153,10232,10323,10419,10493,10574,10669,10723,10805,10871,10958,11044,11106,11170,11233,11306,11413,11523,11621,11727,11788,11843,12007,12092,12168", + "endLines": "7,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "endColumns": "12,77,77,87,107,90,95,115,82,71,66,90,65,62,87,61,66,57,70,58,53,113,59,62,53,72,118,85,75,90,80,82,138,84,86,132,87,77,56,50,65,71,75,70,82,72,76,81,73,108,89,78,90,95,73,80,94,53,81,65,86,85,61,63,62,72,106,109,97,105,60,54,81,84,75,76", + "endOffsets": "419,3226,3304,3392,3500,3591,4414,4530,4613,6911,6978,7069,7135,7198,7286,7348,7415,7473,7544,7603,7657,7771,7831,7894,7948,8021,8140,8226,8302,8393,8474,8557,8696,8781,8868,9001,9089,9167,9224,9275,9341,9413,9489,9560,9643,9716,9793,9875,9949,10058,10148,10227,10318,10414,10488,10569,10664,10718,10800,10866,10953,11039,11101,11165,11228,11301,11408,11518,11616,11722,11783,11838,11920,12087,12163,12240" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-uk/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,456,579,685,835,960,1071,1172,1336,1438,1596,1717,1860,1998,2064,2121", + "endColumns": "103,158,122,105,149,124,110,100,163,101,157,120,142,137,65,56,83", + "endOffsets": "296,455,578,684,834,959,1070,1171,1335,1437,1595,1716,1859,1997,2063,2120,2204" + }, + "to": { + "startLines": "50,51,52,53,54,55,56,57,59,60,61,62,63,64,65,66,67", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4618,4726,4889,5016,5126,5280,5409,5524,5775,5943,6049,6211,6336,6483,6625,6695,6756", + "endColumns": "107,162,126,109,153,128,114,104,167,105,161,124,146,141,69,60,87", + "endOffsets": "4721,4884,5011,5121,5275,5404,5519,5624,5938,6044,6206,6331,6478,6620,6690,6751,6839" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-uk/values-uk.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,155,257,358,459,564,669,782", + "endColumns": "99,101,100,100,104,104,112,100", + "endOffsets": "150,252,353,454,559,664,777,878" + }, + "to": { + "startLines": "40,41,42,43,44,45,46,136", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3596,3696,3798,3899,4000,4105,4210,12245", + "endColumns": "99,101,100,100,104,104,112,100", + "endOffsets": "3691,3793,3894,3995,4100,4205,4318,12341" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-uk/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "141", + "endOffsets": "336" + }, + "to": { + "startLines": "58", + "startColumns": "4", + "startOffsets": "5629", + "endColumns": "145", + "endOffsets": "5770" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-en-rAU_values-en-rAU.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-en-rAU/values-en-rAU.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,209,309,417,501,601,716,794,869,960,1053,1148,1242,1342,1435,1530,1624,1715,1806,1888,1991,2094,2193,2298,2402,2506,2662,2762", + "endColumns": "103,99,107,83,99,114,77,74,90,92,94,93,99,92,94,93,90,90,81,102,102,98,104,103,103,155,99,82", + "endOffsets": "204,304,412,496,596,711,789,864,955,1048,1143,1237,1337,1430,1525,1619,1710,1801,1883,1986,2089,2188,2293,2397,2501,2657,2757,2840" + }, + "to": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,209,309,417,501,601,716,794,869,960,1053,1148,1242,1342,1435,1530,1624,1715,1806,1888,1991,2094,2193,2298,2402,2506,2662,3481", + "endColumns": "103,99,107,83,99,114,77,74,90,92,94,93,99,92,94,93,90,90,81,102,102,98,104,103,103,155,99,82", + "endOffsets": "204,304,412,496,596,711,789,864,955,1048,1143,1237,1337,1430,1525,1619,1710,1801,1883,1986,2089,2188,2293,2397,2501,2657,2757,3559" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-en-rAU/values-en-rAU.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,352,451,555,658,774", + "endColumns": "95,101,98,98,103,102,115,100", + "endOffsets": "146,248,347,446,550,653,769,870" + }, + "to": { + "startLines": "29,30,31,32,33,34,35,37", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "2762,2858,2960,3059,3158,3262,3365,3564", + "endColumns": "95,101,98,98,103,102,115,100", + "endOffsets": "2853,2955,3054,3153,3257,3360,3476,3660" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-vi_values-vi.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-vi/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "123", + "endOffsets": "318" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5441", + "endColumns": "127", + "endOffsets": "5564" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-vi/values-vi.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,212,314,423,507,610,729,807,883,974,1067,1162,1256,1356,1449,1544,1638,1729,1820,1904,2008,2116,2217,2322,2437,2542,2699,2798", + "endColumns": "106,101,108,83,102,118,77,75,90,92,94,93,99,92,94,93,90,90,83,103,107,100,104,114,104,156,98,84", + "endOffsets": "207,309,418,502,605,724,802,878,969,1062,1157,1251,1351,1444,1539,1633,1724,1815,1899,2003,2111,2212,2317,2432,2537,2694,2793,2878" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "315,422,524,633,717,820,939,1017,1093,1184,1277,1372,1466,1566,1659,1754,1848,1939,2030,2114,2218,2326,2427,2532,2647,2752,2909,11649", + "endColumns": "106,101,108,83,102,118,77,75,90,92,94,93,99,92,94,93,90,90,83,103,107,100,104,114,104,156,98,84", + "endOffsets": "417,519,628,712,815,934,1012,1088,1179,1272,1367,1461,1561,1654,1749,1843,1934,2025,2109,2213,2321,2422,2527,2642,2747,2904,3003,11729" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-vi/values-vi.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,353,453,556,669,785", + "endColumns": "96,101,98,99,102,112,115,100", + "endOffsets": "147,249,348,448,551,664,780,881" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3402,3499,3601,3700,3800,3903,4016,11969", + "endColumns": "96,101,98,99,102,112,115,100", + "endOffsets": "3494,3596,3695,3795,3898,4011,4127,12065" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-vi/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,291,449,570,675,836,962,1077,1177,1346,1449,1602,1728,1883,2028,2092,2152", + "endColumns": "97,157,120,104,160,125,114,99,168,102,152,125,154,144,63,59,78", + "endOffsets": "290,448,569,674,835,961,1076,1176,1345,1448,1601,1727,1882,2027,2091,2151,2230" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4425,4527,4689,4814,4923,5088,5218,5337,5569,5742,5849,6006,6136,6295,6444,6512,6576", + "endColumns": "101,161,124,108,164,129,118,103,172,106,156,129,158,148,67,63,82", + "endOffsets": "4522,4684,4809,4918,5083,5213,5332,5436,5737,5844,6001,6131,6290,6439,6507,6571,6654" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-vi/values-vi.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,265,344,421,499,579,659,758,872,952,1015,1078,1172,1246,1305,1391,1453,1514,1572,1636,1697,1751,1868,1925,1985,2039,2114,2241,2325,2405,2500,2584,2662,2792,2876,2954,3088,3179,3260,3311,3362,3428,3496,3572,3643,3723,3802,3877,3950,4026,4132,4221,4298,4389,4483,4557,4627,4720,4769,4850,4916,5001,5087,5149,5213,5276,5347,5446,5551,5649,5754,5809,5864,5942,6024,6103", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,78,76,77,79,79,98,113,79,62,62,93,73,58,85,61,60,57,63,60,53,116,56,59,53,74,126,83,79,94,83,77,129,83,77,133,90,80,50,50,65,67,75,70,79,78,74,72,75,105,88,76,90,93,73,69,92,48,80,65,84,85,61,63,62,70,98,104,97,104,54,54,77,81,78,73", + "endOffsets": "260,339,416,494,574,654,753,867,947,1010,1073,1167,1241,1300,1386,1448,1509,1567,1631,1692,1746,1863,1920,1980,2034,2109,2236,2320,2400,2495,2579,2657,2787,2871,2949,3083,3174,3255,3306,3357,3423,3491,3567,3638,3718,3797,3872,3945,4021,4127,4216,4293,4384,4478,4552,4622,4715,4764,4845,4911,4996,5082,5144,5208,5271,5342,5441,5546,5644,5749,5804,5859,5937,6019,6098,6172" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3008,3087,3164,3242,3322,4132,4231,4345,6659,6722,6785,6879,6953,7012,7098,7160,7221,7279,7343,7404,7458,7575,7632,7692,7746,7821,7948,8032,8112,8207,8291,8369,8499,8583,8661,8795,8886,8967,9018,9069,9135,9203,9279,9350,9430,9509,9584,9657,9733,9839,9928,10005,10096,10190,10264,10334,10427,10476,10557,10623,10708,10794,10856,10920,10983,11054,11153,11258,11356,11461,11516,11571,11734,11816,11895", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,78,76,77,79,79,98,113,79,62,62,93,73,58,85,61,60,57,63,60,53,116,56,59,53,74,126,83,79,94,83,77,129,83,77,133,90,80,50,50,65,67,75,70,79,78,74,72,75,105,88,76,90,93,73,69,92,48,80,65,84,85,61,63,62,70,98,104,97,104,54,54,77,81,78,73", + "endOffsets": "310,3082,3159,3237,3317,3397,4226,4340,4420,6717,6780,6874,6948,7007,7093,7155,7216,7274,7338,7399,7453,7570,7627,7687,7741,7816,7943,8027,8107,8202,8286,8364,8494,8578,8656,8790,8881,8962,9013,9064,9130,9198,9274,9345,9425,9504,9579,9652,9728,9834,9923,10000,10091,10185,10259,10329,10422,10471,10552,10618,10703,10789,10851,10915,10978,11049,11148,11253,11351,11456,11511,11566,11644,11811,11890,11964" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-de_values-de.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-de/values-de.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,283,374,463,547,637,719,820,942,1023,1085,1151,1245,1315,1374,1482,1548,1617,1675,1747,1811,1865,1993,2053,2115,2169,2247,2384,2476,2554,2648,2734,2818,2963,3047,3133,3266,3356,3435,3492,3543,3609,3683,3765,3836,3911,3985,4063,4135,4209,4319,4411,4493,4582,4671,4745,4823,4909,4964,5043,5110,5190,5274,5336,5400,5463,5532,5639,5746,5845,5951,6012,6067,6149,6232,6309", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,90,88,83,89,81,100,121,80,61,65,93,69,58,107,65,68,57,71,63,53,127,59,61,53,77,136,91,77,93,85,83,144,83,85,132,89,78,56,50,65,73,81,70,74,73,77,71,73,109,91,81,88,88,73,77,85,54,78,66,79,83,61,63,62,68,106,106,98,105,60,54,81,82,76,75", + "endOffsets": "278,369,458,542,632,714,815,937,1018,1080,1146,1240,1310,1369,1477,1543,1612,1670,1742,1806,1860,1988,2048,2110,2164,2242,2379,2471,2549,2643,2729,2813,2958,3042,3128,3261,3351,3430,3487,3538,3604,3678,3760,3831,3906,3980,4058,4130,4204,4314,4406,4488,4577,4666,4740,4818,4904,4959,5038,5105,5185,5269,5331,5395,5458,5527,5634,5741,5840,5946,6007,6062,6144,6227,6304,6380" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3060,3151,3240,3324,3414,4227,4328,4450,6882,6944,7010,7104,7174,7233,7341,7407,7476,7534,7606,7670,7724,7852,7912,7974,8028,8106,8243,8335,8413,8507,8593,8677,8822,8906,8992,9125,9215,9294,9351,9402,9468,9542,9624,9695,9770,9844,9922,9994,10068,10178,10270,10352,10441,10530,10604,10682,10768,10823,10902,10969,11049,11133,11195,11259,11322,11391,11498,11605,11704,11810,11871,11926,12090,12173,12250", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,90,88,83,89,81,100,121,80,61,65,93,69,58,107,65,68,57,71,63,53,127,59,61,53,77,136,91,77,93,85,83,144,83,85,132,89,78,56,50,65,73,81,70,74,73,77,71,73,109,91,81,88,88,73,77,85,54,78,66,79,83,61,63,62,68,106,106,98,105,60,54,81,82,76,75", + "endOffsets": "328,3146,3235,3319,3409,3491,4323,4445,4526,6939,7005,7099,7169,7228,7336,7402,7471,7529,7601,7665,7719,7847,7907,7969,8023,8101,8238,8330,8408,8502,8588,8672,8817,8901,8987,9120,9210,9289,9346,9397,9463,9537,9619,9690,9765,9839,9917,9989,10063,10173,10265,10347,10436,10525,10599,10677,10763,10818,10897,10964,11044,11128,11190,11254,11317,11386,11493,11600,11699,11805,11866,11921,12003,12168,12245,12321" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-de/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "140", + "endOffsets": "335" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5593", + "endColumns": "144", + "endOffsets": "5733" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-de/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,298,458,582,690,864,991,1108,1223,1399,1507,1672,1799,1957,2129,2196,2255", + "endColumns": "104,159,123,107,173,126,116,114,175,107,164,126,157,171,66,58,75", + "endOffsets": "297,457,581,689,863,990,1107,1222,1398,1506,1671,1798,1956,2128,2195,2254,2330" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4531,4640,4804,4932,5044,5222,5353,5474,5738,5918,6030,6199,6330,6492,6668,6739,6802", + "endColumns": "108,163,127,111,177,130,120,118,179,111,168,130,161,175,70,62,79", + "endOffsets": "4635,4799,4927,5039,5217,5348,5469,5588,5913,6025,6194,6325,6487,6663,6734,6797,6877" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-de/values-de.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,355,455,563,668,786", + "endColumns": "97,101,99,99,107,104,117,100", + "endOffsets": "148,250,350,450,558,663,781,882" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3496,3594,3696,3796,3896,4004,4109,12326", + "endColumns": "97,101,99,99,107,104,117,100", + "endOffsets": "3589,3691,3791,3891,3999,4104,4222,12422" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-de/values-de.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,210,308,420,506,612,727,805,880,972,1066,1162,1263,1370,1470,1574,1672,1770,1867,1949,2060,2162,2260,2367,2470,2574,2730,2832", + "endColumns": "104,97,111,85,105,114,77,74,91,93,95,100,106,99,103,97,97,96,81,110,101,97,106,102,103,155,101,81", + "endOffsets": "205,303,415,501,607,722,800,875,967,1061,1157,1258,1365,1465,1569,1667,1765,1862,1944,2055,2157,2255,2362,2465,2569,2725,2827,2909" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "333,438,536,648,734,840,955,1033,1108,1200,1294,1390,1491,1598,1698,1802,1900,1998,2095,2177,2288,2390,2488,2595,2698,2802,2958,12008", + "endColumns": "104,97,111,85,105,114,77,74,91,93,95,100,106,99,103,97,97,96,81,110,101,97,106,102,103,155,101,81", + "endOffsets": "433,531,643,729,835,950,1028,1103,1195,1289,1385,1486,1593,1693,1797,1895,1993,2090,2172,2283,2385,2483,2590,2693,2797,2953,3055,12085" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-km_values-km.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-km/values-km.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,150,253,351,451,552,664,776", + "endColumns": "94,102,97,99,100,111,111,100", + "endOffsets": "145,248,346,446,547,659,771,872" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3399,3494,3597,3695,3795,3896,4008,12062", + "endColumns": "94,102,97,99,100,111,111,100", + "endOffsets": "3489,3592,3690,3790,3891,4003,4115,12158" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-km/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "144", + "endOffsets": "339" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5411", + "endColumns": "148", + "endOffsets": "5555" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-km/values-km.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,269,347,423,503,582,661,761,873,953,1019,1084,1178,1248,1310,1397,1460,1525,1584,1649,1710,1767,1886,1944,2005,2062,2133,2263,2349,2425,2510,2592,2670,2808,2883,2954,3104,3201,3279,3334,3390,3456,3536,3626,3697,3782,3861,3938,4008,4083,4195,4283,4356,4456,4555,4629,4705,4812,4866,4956,5029,5120,5216,5278,5342,5405,5476,5575,5673,5765,5861,5919,5979,6062,6144,6222", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,77,75,79,78,78,99,111,79,65,64,93,69,61,86,62,64,58,64,60,56,118,57,60,56,70,129,85,75,84,81,77,137,74,70,149,96,77,54,55,65,79,89,70,84,78,76,69,74,111,87,72,99,98,73,75,106,53,89,72,90,95,61,63,62,70,98,97,91,95,57,59,82,81,77,75", + "endOffsets": "264,342,418,498,577,656,756,868,948,1014,1079,1173,1243,1305,1392,1455,1520,1579,1644,1705,1762,1881,1939,2000,2057,2128,2258,2344,2420,2505,2587,2665,2803,2878,2949,3099,3196,3274,3329,3385,3451,3531,3621,3692,3777,3856,3933,4003,4078,4190,4278,4351,4451,4550,4624,4700,4807,4861,4951,5024,5115,5211,5273,5337,5400,5471,5570,5668,5760,5856,5914,5974,6057,6139,6217,6293" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3007,3085,3161,3241,3320,4120,4220,4332,6633,6699,6764,6858,6928,6990,7077,7140,7205,7264,7329,7390,7447,7566,7624,7685,7742,7813,7943,8029,8105,8190,8272,8350,8488,8563,8634,8784,8881,8959,9014,9070,9136,9216,9306,9377,9462,9541,9618,9688,9763,9875,9963,10036,10136,10235,10309,10385,10492,10546,10636,10709,10800,10896,10958,11022,11085,11156,11255,11353,11445,11541,11599,11659,11826,11908,11986", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,77,75,79,78,78,99,111,79,65,64,93,69,61,86,62,64,58,64,60,56,118,57,60,56,70,129,85,75,84,81,77,137,74,70,149,96,77,54,55,65,79,89,70,84,78,76,69,74,111,87,72,99,98,73,75,106,53,89,72,90,95,61,63,62,70,98,97,91,95,57,59,82,81,77,75", + "endOffsets": "314,3080,3156,3236,3315,3394,4215,4327,4407,6694,6759,6853,6923,6985,7072,7135,7200,7259,7324,7385,7442,7561,7619,7680,7737,7808,7938,8024,8100,8185,8267,8345,8483,8558,8629,8779,8876,8954,9009,9065,9131,9211,9301,9372,9457,9536,9613,9683,9758,9870,9958,10031,10131,10230,10304,10380,10487,10541,10631,10704,10795,10891,10953,11017,11080,11151,11250,11348,11440,11536,11594,11654,11737,11903,11981,12057" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-km/values-km.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,207,306,416,503,606,727,805,881,972,1065,1157,1251,1351,1444,1539,1633,1724,1815,1898,2002,2106,2206,2315,2424,2533,2695,2793", + "endColumns": "101,98,109,86,102,120,77,75,90,92,91,93,99,92,94,93,90,90,82,103,103,99,108,108,108,161,97,83", + "endOffsets": "202,301,411,498,601,722,800,876,967,1060,1152,1246,1346,1439,1534,1628,1719,1810,1893,1997,2101,2201,2310,2419,2528,2690,2788,2872" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "319,421,520,630,717,820,941,1019,1095,1186,1279,1371,1465,1565,1658,1753,1847,1938,2029,2112,2216,2320,2420,2529,2638,2747,2909,11742", + "endColumns": "101,98,109,86,102,120,77,75,90,92,91,93,99,92,94,93,90,90,82,103,103,99,108,108,108,161,97,83", + "endOffsets": "416,515,625,712,815,936,1014,1090,1181,1274,1366,1460,1560,1653,1748,1842,1933,2024,2107,2211,2315,2415,2524,2633,2742,2904,3002,11821" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-km/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,291,442,559,660,818,938,1055,1160,1314,1427,1594,1715,1856,2010,2070,2124", + "endColumns": "97,150,116,100,157,119,116,104,153,112,166,120,140,153,59,53,72", + "endOffsets": "290,441,558,659,817,937,1054,1159,1313,1426,1593,1714,1855,2009,2069,2123,2196" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4412,4514,4669,4790,4895,5057,5181,5302,5560,5718,5835,6006,6131,6276,6434,6498,6556", + "endColumns": "101,154,120,104,161,123,120,108,157,116,170,124,144,157,63,57,76", + "endOffsets": "4509,4664,4785,4890,5052,5176,5297,5406,5713,5830,6001,6126,6271,6429,6493,6551,6628" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-mr_values-mr.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-mr/values-mr.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,259,344,431,514,607,691,791,907,989,1046,1109,1200,1265,1324,1412,1474,1536,1596,1663,1726,1780,1894,1951,2012,2066,2136,2255,2336,2413,2502,2584,2669,2804,2881,2958,3099,3185,3269,3325,3377,3443,3513,3591,3662,3744,3814,3890,3961,4030,4144,4240,4314,4412,4508,4582,4652,4754,4809,4897,4964,5051,5144,5207,5271,5334,5400,5500,5609,5703,5810,5870,5926,6004,6088,6166", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,84,86,82,92,83,99,115,81,56,62,90,64,58,87,61,61,59,66,62,53,113,56,60,53,69,118,80,76,88,81,84,134,76,76,140,85,83,55,51,65,69,77,70,81,69,75,70,68,113,95,73,97,95,73,69,101,54,87,66,86,92,62,63,62,65,99,108,93,106,59,55,77,83,77,72", + "endOffsets": "254,339,426,509,602,686,786,902,984,1041,1104,1195,1260,1319,1407,1469,1531,1591,1658,1721,1775,1889,1946,2007,2061,2131,2250,2331,2408,2497,2579,2664,2799,2876,2953,3094,3180,3264,3320,3372,3438,3508,3586,3657,3739,3809,3885,3956,4025,4139,4235,4309,4407,4503,4577,4647,4749,4804,4892,4959,5046,5139,5202,5266,5329,5395,5495,5604,5698,5805,5865,5921,5999,6083,6161,6234" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2999,3084,3171,3254,3347,4163,4263,4379,6620,6677,6740,6831,6896,6955,7043,7105,7167,7227,7294,7357,7411,7525,7582,7643,7697,7767,7886,7967,8044,8133,8215,8300,8435,8512,8589,8730,8816,8900,8956,9008,9074,9144,9222,9293,9375,9445,9521,9592,9661,9775,9871,9945,10043,10139,10213,10283,10385,10440,10528,10595,10682,10775,10838,10902,10965,11031,11131,11240,11334,11441,11501,11557,11715,11799,11877", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,84,86,82,92,83,99,115,81,56,62,90,64,58,87,61,61,59,66,62,53,113,56,60,53,69,118,80,76,88,81,84,134,76,76,140,85,83,55,51,65,69,77,70,81,69,75,70,68,113,95,73,97,95,73,69,101,54,87,66,86,92,62,63,62,65,99,108,93,106,59,55,77,83,77,72", + "endOffsets": "304,3079,3166,3249,3342,3426,4258,4374,4456,6672,6735,6826,6891,6950,7038,7100,7162,7222,7289,7352,7406,7520,7577,7638,7692,7762,7881,7962,8039,8128,8210,8295,8430,8507,8584,8725,8811,8895,8951,9003,9069,9139,9217,9288,9370,9440,9516,9587,9656,9770,9866,9940,10038,10134,10208,10278,10380,10435,10523,10590,10677,10770,10833,10897,10960,11026,11126,11235,11329,11436,11496,11552,11630,11794,11872,11945" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-mr/values-mr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,155,259,360,463,565,670,787", + "endColumns": "99,103,100,102,101,104,116,100", + "endOffsets": "150,254,355,458,560,665,782,883" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3431,3531,3635,3736,3839,3941,4046,11950", + "endColumns": "99,103,100,102,101,104,116,100", + "endOffsets": "3526,3630,3731,3834,3936,4041,4158,12046" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-mr/values-mr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,216,322,429,519,620,732,810,887,978,1071,1164,1261,1361,1454,1549,1643,1734,1825,1905,2012,2113,2210,2319,2421,2535,2692,2795", + "endColumns": "110,105,106,89,100,111,77,76,90,92,92,96,99,92,94,93,90,90,79,106,100,96,108,101,113,156,102,79", + "endOffsets": "211,317,424,514,615,727,805,882,973,1066,1159,1256,1356,1449,1544,1638,1729,1820,1900,2007,2108,2205,2314,2416,2530,2687,2790,2870" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "309,420,526,633,723,824,936,1014,1091,1182,1275,1368,1465,1565,1658,1753,1847,1938,2029,2109,2216,2317,2414,2523,2625,2739,2896,11635", + "endColumns": "110,105,106,89,100,111,77,76,90,92,92,96,99,92,94,93,90,90,79,106,100,96,108,101,113,156,102,79", + "endOffsets": "415,521,628,718,819,931,1009,1086,1177,1270,1363,1460,1560,1653,1748,1842,1933,2024,2104,2211,2312,2409,2518,2620,2734,2891,2994,11710" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-mr/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,460,579,687,828,945,1049,1142,1288,1392,1542,1662,1797,1946,2002,2064", + "endColumns": "102,163,118,107,140,116,103,92,145,103,149,119,134,148,55,61,76", + "endOffsets": "295,459,578,686,827,944,1048,1141,1287,1391,1541,1661,1796,1945,2001,2063,2140" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4461,4568,4736,4859,4971,5116,5237,5345,5585,5735,5843,5997,6121,6260,6413,6473,6539", + "endColumns": "106,167,122,111,144,120,107,96,149,107,153,123,138,152,59,65,80", + "endOffsets": "4563,4731,4854,4966,5111,5232,5340,5437,5730,5838,5992,6116,6255,6408,6468,6534,6615" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-mr/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "138", + "endOffsets": "333" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5442", + "endColumns": "142", + "endOffsets": "5580" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-am_values-am.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-am/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,291,426,544,642,765,884,988,1086,1210,1309,1450,1569,1700,1823,1879,1932", + "endColumns": "97,134,117,97,122,118,103,97,123,98,140,118,130,122,55,52,66", + "endOffsets": "290,425,543,641,764,883,987,1085,1209,1308,1449,1568,1699,1822,1878,1931,1998" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4261,4363,4502,4624,4726,4853,4976,5084,5318,5446,5549,5694,5817,5952,6079,6139,6196", + "endColumns": "101,138,121,101,126,122,107,101,127,102,144,122,134,126,59,56,70", + "endOffsets": "4358,4497,4619,4721,4848,4971,5079,5181,5441,5544,5689,5812,5947,6074,6134,6191,6262" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-am/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "127", + "endOffsets": "322" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5186", + "endColumns": "131", + "endOffsets": "5313" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-am/values-am.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,261,332,400,475,557,638,727,829,906,965,1029,1114,1176,1234,1319,1382,1444,1502,1568,1630,1685,1781,1838,1897,1953,2020,2125,2205,2286,2378,2463,2544,2673,2746,2817,2931,3013,3089,3140,3191,3257,3323,3396,3467,3542,3610,3683,3754,3821,3919,4004,4071,4158,4246,4320,4388,4473,4524,4602,4666,4746,4828,4890,4954,5017,5083,5178,5273,5358,5449,5504,5559,5635,5714,5789", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,70,67,74,81,80,88,101,76,58,63,84,61,57,84,62,61,57,65,61,54,95,56,58,55,66,104,79,80,91,84,80,128,72,70,113,81,75,50,50,65,65,72,70,74,67,72,70,66,97,84,66,86,87,73,67,84,50,77,63,79,81,61,63,62,65,94,94,84,90,54,54,75,78,74,70", + "endOffsets": "256,327,395,470,552,633,722,824,901,960,1024,1109,1171,1229,1314,1377,1439,1497,1563,1625,1680,1776,1833,1892,1948,2015,2120,2200,2281,2373,2458,2539,2668,2741,2812,2926,3008,3084,3135,3186,3252,3318,3391,3462,3537,3605,3678,3749,3816,3914,3999,4066,4153,4241,4315,4383,4468,4519,4597,4661,4741,4823,4885,4949,5012,5078,5173,5268,5353,5444,5499,5554,5630,5709,5784,5855" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2929,3000,3068,3143,3225,3993,4082,4184,6267,6326,6390,6475,6537,6595,6680,6743,6805,6863,6929,6991,7046,7142,7199,7258,7314,7381,7486,7566,7647,7739,7824,7905,8034,8107,8178,8292,8374,8450,8501,8552,8618,8684,8757,8828,8903,8971,9044,9115,9182,9280,9365,9432,9519,9607,9681,9749,9834,9885,9963,10027,10107,10189,10251,10315,10378,10444,10539,10634,10719,10810,10865,10920,11076,11155,11230", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,70,67,74,81,80,88,101,76,58,63,84,61,57,84,62,61,57,65,61,54,95,56,58,55,66,104,79,80,91,84,80,128,72,70,113,81,75,50,50,65,65,72,70,74,67,72,70,66,97,84,66,86,87,73,67,84,50,77,63,79,81,61,63,62,65,94,94,84,90,54,54,75,78,74,70", + "endOffsets": "306,2995,3063,3138,3220,3301,4077,4179,4256,6321,6385,6470,6532,6590,6675,6738,6800,6858,6924,6986,7041,7137,7194,7253,7309,7376,7481,7561,7642,7734,7819,7900,8029,8102,8173,8287,8369,8445,8496,8547,8613,8679,8752,8823,8898,8966,9039,9110,9177,9275,9360,9427,9514,9602,9676,9744,9829,9880,9958,10022,10102,10184,10246,10310,10373,10439,10534,10629,10714,10805,10860,10915,10991,11150,11225,11296" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-am/values-am.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,148,248,345,444,540,642,742", + "endColumns": "92,99,96,98,95,101,99,100", + "endOffsets": "143,243,340,439,535,637,737,838" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3306,3399,3499,3596,3695,3791,3893,11301", + "endColumns": "92,99,96,98,95,101,99,100", + "endOffsets": "3394,3494,3591,3690,3786,3888,3988,11397" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-am/values-am.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,203,301,407,493,596,713,791,867,958,1051,1143,1237,1337,1430,1525,1618,1709,1800,1880,1980,2080,2176,2278,2378,2477,2627,2723", + "endColumns": "97,97,105,85,102,116,77,75,90,92,91,93,99,92,94,92,90,90,79,99,99,95,101,99,98,149,95,79", + "endOffsets": "198,296,402,488,591,708,786,862,953,1046,1138,1232,1332,1425,1520,1613,1704,1795,1875,1975,2075,2171,2273,2373,2472,2622,2718,2798" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "311,409,507,613,699,802,919,997,1073,1164,1257,1349,1443,1543,1636,1731,1824,1915,2006,2086,2186,2286,2382,2484,2584,2683,2833,10996", + "endColumns": "97,97,105,85,102,116,77,75,90,92,91,93,99,92,94,92,90,90,79,99,99,95,101,99,98,149,95,79", + "endOffsets": "404,502,608,694,797,914,992,1068,1159,1252,1344,1438,1538,1631,1726,1819,1910,2001,2081,2181,2281,2377,2479,2579,2678,2828,2924,11071" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-es-rUS_values-es-rUS.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-es-rUS/values-es-rUS.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,154,256,356,454,561,667,787", + "endColumns": "98,101,99,97,106,105,119,100", + "endOffsets": "149,251,351,449,556,662,782,883" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3493,3592,3694,3794,3892,3999,4105,12372", + "endColumns": "98,101,99,97,106,105,119,100", + "endOffsets": "3587,3689,3789,3887,3994,4100,4220,12468" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-es-rUS/values-es-rUS.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,278,360,440,526,631,727,829,957,1038,1100,1165,1260,1330,1393,1486,1550,1622,1685,1759,1823,1879,1997,2055,2117,2173,2253,2387,2476,2552,2650,2731,2812,2953,3034,3114,3265,3355,3432,3488,3544,3610,3689,3771,3842,3931,4004,4081,4151,4228,4334,4423,4497,4591,4693,4765,4846,4950,5003,5088,5155,5248,5337,5399,5463,5526,5594,5705,5816,5918,6023,6083,6143,6226,6309,6385", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,81,79,85,104,95,101,127,80,61,64,94,69,62,92,63,71,62,73,63,55,117,57,61,55,79,133,88,75,97,80,80,140,80,79,150,89,76,55,55,65,78,81,70,88,72,76,69,76,105,88,73,93,101,71,80,103,52,84,66,92,88,61,63,62,67,110,110,101,104,59,59,82,82,75,76", + "endOffsets": "273,355,435,521,626,722,824,952,1033,1095,1160,1255,1325,1388,1481,1545,1617,1680,1754,1818,1874,1992,2050,2112,2168,2248,2382,2471,2547,2645,2726,2807,2948,3029,3109,3260,3350,3427,3483,3539,3605,3684,3766,3837,3926,3999,4076,4146,4223,4329,4418,4492,4586,4688,4760,4841,4945,4998,5083,5150,5243,5332,5394,5458,5521,5589,5700,5811,5913,6018,6078,6138,6221,6304,6380,6457" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3044,3126,3206,3292,3397,4225,4327,4455,6865,6927,6992,7087,7157,7220,7313,7377,7449,7512,7586,7650,7706,7824,7882,7944,8000,8080,8214,8303,8379,8477,8558,8639,8780,8861,8941,9092,9182,9259,9315,9371,9437,9516,9598,9669,9758,9831,9908,9978,10055,10161,10250,10324,10418,10520,10592,10673,10777,10830,10915,10982,11075,11164,11226,11290,11353,11421,11532,11643,11745,11850,11910,11970,12136,12219,12295", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,81,79,85,104,95,101,127,80,61,64,94,69,62,92,63,71,62,73,63,55,117,57,61,55,79,133,88,75,97,80,80,140,80,79,150,89,76,55,55,65,78,81,70,88,72,76,69,76,105,88,73,93,101,71,80,103,52,84,66,92,88,61,63,62,67,110,110,101,104,59,59,82,82,75,76", + "endOffsets": "323,3121,3201,3287,3392,3488,4322,4450,4531,6922,6987,7082,7152,7215,7308,7372,7444,7507,7581,7645,7701,7819,7877,7939,7995,8075,8209,8298,8374,8472,8553,8634,8775,8856,8936,9087,9177,9254,9310,9366,9432,9511,9593,9664,9753,9826,9903,9973,10050,10156,10245,10319,10413,10515,10587,10668,10772,10825,10910,10977,11070,11159,11221,11285,11348,11416,11527,11638,11740,11845,11905,11965,12048,12214,12290,12367" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-es-rUS/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "197,301,463,591,695,852,979,1098,1200,1367,1472,1638,1767,1940,2114,2180,2238", + "endColumns": "103,161,127,103,156,126,118,101,166,104,165,128,172,173,65,57,73", + "endOffsets": "300,462,590,694,851,978,1097,1199,1366,1471,1637,1766,1939,2113,2179,2237,2311" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4536,4644,4810,4942,5050,5211,5342,5465,5717,5888,5997,6167,6300,6477,6655,6725,6787", + "endColumns": "107,165,131,107,160,130,122,105,170,108,169,132,176,177,69,61,77", + "endOffsets": "4639,4805,4937,5045,5206,5337,5460,5566,5883,5992,6162,6295,6472,6650,6720,6782,6860" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-es-rUS/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "199", + "endColumns": "141", + "endOffsets": "340" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5571", + "endColumns": "145", + "endOffsets": "5712" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-es-rUS/values-es-rUS.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,225,334,442,527,629,745,830,910,1001,1094,1189,1283,1382,1475,1574,1670,1761,1852,1934,2041,2140,2239,2347,2455,2562,2721,2821", + "endColumns": "119,108,107,84,101,115,84,79,90,92,94,93,98,92,98,95,90,90,81,106,98,98,107,107,106,158,99,82", + "endOffsets": "220,329,437,522,624,740,825,905,996,1089,1184,1278,1377,1470,1569,1665,1756,1847,1929,2036,2135,2234,2342,2450,2557,2716,2816,2899" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "328,448,557,665,750,852,968,1053,1133,1224,1317,1412,1506,1605,1698,1797,1893,1984,2075,2157,2264,2363,2462,2570,2678,2785,2944,12053", + "endColumns": "119,108,107,84,101,115,84,79,90,92,94,93,98,92,98,95,90,90,81,106,98,98,107,107,106,158,99,82", + "endOffsets": "443,552,660,745,847,963,1048,1128,1219,1312,1407,1501,1600,1693,1792,1888,1979,2070,2152,2259,2358,2457,2565,2673,2780,2939,3039,12131" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-pl_values-pl.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-pl/values-pl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,220,322,430,516,623,742,821,897,988,1081,1176,1270,1371,1464,1559,1654,1745,1836,1918,2027,2127,2226,2335,2447,2558,2721,2817", + "endColumns": "114,101,107,85,106,118,78,75,90,92,94,93,100,92,94,94,90,90,81,108,99,98,108,111,110,162,95,82", + "endOffsets": "215,317,425,511,618,737,816,892,983,1076,1171,1265,1366,1459,1554,1649,1740,1831,1913,2022,2122,2221,2330,2442,2553,2716,2812,2895" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,132", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "436,551,653,761,847,954,1073,1152,1228,1319,1412,1507,1601,1702,1795,1890,1985,2076,2167,2249,2358,2458,2557,2666,2778,2889,3052,11945", + "endColumns": "114,101,107,85,106,118,78,75,90,92,94,93,100,92,94,94,90,90,81,108,99,98,108,111,110,162,95,82", + "endOffsets": "546,648,756,842,949,1068,1147,1223,1314,1407,1502,1596,1697,1790,1885,1980,2071,2162,2244,2353,2453,2552,2661,2773,2884,3047,3143,12023" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-pl/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,293,457,575,681,828,949,1056,1151,1318,1423,1594,1718,1873,2030,2095,2157", + "endColumns": "99,163,117,105,146,120,106,94,166,104,170,123,154,156,64,61,79", + "endOffsets": "292,456,574,680,827,948,1055,1150,1317,1422,1593,1717,1872,2029,2094,2156,2236" + }, + "to": { + "startLines": "50,51,52,53,54,55,56,57,59,60,61,62,63,64,65,66,67", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4597,4701,4869,4991,5101,5252,5377,5488,5727,5898,6007,6182,6310,6469,6630,6699,6765", + "endColumns": "103,167,121,109,150,124,110,98,170,108,174,127,158,160,68,65,83", + "endOffsets": "4696,4864,4986,5096,5247,5372,5483,5582,5893,6002,6177,6305,6464,6625,6694,6760,6844" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-pl/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "135", + "endOffsets": "330" + }, + "to": { + "startLines": "58", + "startColumns": "4", + "startOffsets": "5587", + "endColumns": "139", + "endOffsets": "5722" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-pl/values-pl.xml", + "from": { + "startLines": "2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,386,461,536,615,719,814,899,1016,1098,1163,1227,1308,1372,1433,1544,1608,1676,1730,1799,1861,1915,2026,2087,2149,2203,2275,2404,2493,2572,2667,2752,2834,2983,3065,3148,3285,3372,3449,3503,3554,3620,3691,3767,3838,3921,3998,4076,4154,4230,4338,4428,4501,4596,4693,4765,4839,4939,4991,5076,5142,5230,5320,5382,5446,5509,5580,5687,5799,5898,6005,6063,6118,6194,6278,6355", + "endLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "endColumns": "12,74,74,78,103,94,84,116,81,64,63,80,63,60,110,63,67,53,68,61,53,110,60,61,53,71,128,88,78,94,84,81,148,81,82,136,86,76,53,50,65,70,75,70,82,76,77,77,75,107,89,72,94,96,71,73,99,51,84,65,87,89,61,63,62,70,106,111,98,106,57,54,75,83,76,77", + "endOffsets": "381,456,531,610,714,809,894,1011,1093,1158,1222,1303,1367,1428,1539,1603,1671,1725,1794,1856,1910,2021,2082,2144,2198,2270,2399,2488,2567,2662,2747,2829,2978,3060,3143,3280,3367,3444,3498,3549,3615,3686,3762,3833,3916,3993,4071,4149,4225,4333,4423,4496,4591,4688,4760,4834,4934,4986,5071,5137,5225,5315,5377,5441,5504,5575,5682,5794,5893,6000,6058,6113,6189,6273,6350,6428" + }, + "to": { + "startLines": "2,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3148,3223,3298,3377,3481,4313,4398,4515,6849,6914,6978,7059,7123,7184,7295,7359,7427,7481,7550,7612,7666,7777,7838,7900,7954,8026,8155,8244,8323,8418,8503,8585,8734,8816,8899,9036,9123,9200,9254,9305,9371,9442,9518,9589,9672,9749,9827,9905,9981,10089,10179,10252,10347,10444,10516,10590,10690,10742,10827,10893,10981,11071,11133,11197,11260,11331,11438,11550,11649,11756,11814,11869,12028,12112,12189", + "endLines": "7,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "endColumns": "12,74,74,78,103,94,84,116,81,64,63,80,63,60,110,63,67,53,68,61,53,110,60,61,53,71,128,88,78,94,84,81,148,81,82,136,86,76,53,50,65,70,75,70,82,76,77,77,75,107,89,72,94,96,71,73,99,51,84,65,87,89,61,63,62,70,106,111,98,106,57,54,75,83,76,77", + "endOffsets": "431,3218,3293,3372,3476,3571,4393,4510,4592,6909,6973,7054,7118,7179,7290,7354,7422,7476,7545,7607,7661,7772,7833,7895,7949,8021,8150,8239,8318,8413,8498,8580,8729,8811,8894,9031,9118,9195,9249,9300,9366,9437,9513,9584,9667,9744,9822,9900,9976,10084,10174,10247,10342,10439,10511,10585,10685,10737,10822,10888,10976,11066,11128,11192,11255,11326,11433,11545,11644,11751,11809,11864,11940,12107,12184,12262" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-pl/values-pl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,352,451,565,670,792", + "endColumns": "96,101,97,98,113,104,121,100", + "endOffsets": "147,249,347,446,560,665,787,888" + }, + "to": { + "startLines": "40,41,42,43,44,45,46,136", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3576,3673,3775,3873,3972,4086,4191,12267", + "endColumns": "96,101,97,98,113,104,121,100", + "endOffsets": "3668,3770,3868,3967,4081,4186,4308,12363" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-lv_values-lv.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-lv/values-lv.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,355,456,563,671,786", + "endColumns": "97,101,99,100,106,107,114,100", + "endOffsets": "148,250,350,451,558,666,781,882" + }, + "to": { + "startLines": "39,40,41,42,43,44,45,135", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3704,3802,3904,4004,4105,4212,4320,12503", + "endColumns": "97,101,99,100,106,107,114,100", + "endOffsets": "3797,3899,3999,4100,4207,4315,4430,12599" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-lv/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "161", + "endOffsets": "356" + }, + "to": { + "startLines": "57", + "startColumns": "4", + "startOffsets": "5758", + "endColumns": "165", + "endOffsets": "5919" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-lv/values-lv.xml", + "from": { + "startLines": "2,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,324,411,496,577,682,770,871,1005,1088,1149,1214,1308,1381,1442,1567,1633,1701,1762,1834,1894,1948,2068,2128,2190,2244,2321,2451,2538,2615,2705,2788,2870,3011,3091,3176,3303,3394,3470,3524,3577,3643,3717,3798,3869,3949,4022,4099,4176,4250,4360,4453,4528,4618,4709,4781,4859,4950,5004,5087,5155,5239,5326,5388,5452,5515,5587,5697,5810,5913,6022,6080,6137,6214,6299,6377", + "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "endColumns": "12,86,84,80,104,87,100,133,82,60,64,93,72,60,124,65,67,60,71,59,53,119,59,61,53,76,129,86,76,89,82,81,140,79,84,126,90,75,53,52,65,73,80,70,79,72,76,76,73,109,92,74,89,90,71,77,90,53,82,67,83,86,61,63,62,71,109,112,102,108,57,56,76,84,77,73", + "endOffsets": "319,406,491,572,677,765,866,1000,1083,1144,1209,1303,1376,1437,1562,1628,1696,1757,1829,1889,1943,2063,2123,2185,2239,2316,2446,2533,2610,2700,2783,2865,3006,3086,3171,3298,3389,3465,3519,3572,3638,3712,3793,3864,3944,4017,4094,4171,4245,4355,4448,4523,4613,4704,4776,4854,4945,4999,5082,5150,5234,5321,5383,5447,5510,5582,5692,5805,5908,6017,6075,6132,6209,6294,6372,6446" + }, + "to": { + "startLines": "2,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3258,3345,3430,3511,3616,4435,4536,4670,7057,7118,7183,7277,7350,7411,7536,7602,7670,7731,7803,7863,7917,8037,8097,8159,8213,8290,8420,8507,8584,8674,8757,8839,8980,9060,9145,9272,9363,9439,9493,9546,9612,9686,9767,9838,9918,9991,10068,10145,10219,10329,10422,10497,10587,10678,10750,10828,10919,10973,11056,11124,11208,11295,11357,11421,11484,11556,11666,11779,11882,11991,12049,12106,12266,12351,12429", + "endLines": "6,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "endColumns": "12,86,84,80,104,87,100,133,82,60,64,93,72,60,124,65,67,60,71,59,53,119,59,61,53,76,129,86,76,89,82,81,140,79,84,126,90,75,53,52,65,73,80,70,79,72,76,76,73,109,92,74,89,90,71,77,90,53,82,67,83,86,61,63,62,71,109,112,102,108,57,56,76,84,77,73", + "endOffsets": "369,3340,3425,3506,3611,3699,4531,4665,4748,7113,7178,7272,7345,7406,7531,7597,7665,7726,7798,7858,7912,8032,8092,8154,8208,8285,8415,8502,8579,8669,8752,8834,8975,9055,9140,9267,9358,9434,9488,9541,9607,9681,9762,9833,9913,9986,10063,10140,10214,10324,10417,10492,10582,10673,10745,10823,10914,10968,11051,11119,11203,11290,11352,11416,11479,11551,11661,11774,11877,11986,12044,12101,12178,12346,12424,12498" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-lv/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,453,582,686,824,951,1064,1166,1337,1442,1607,1738,1903,2054,2114,2178", + "endColumns": "102,156,128,103,137,126,112,101,170,104,164,130,164,150,59,63,84", + "endOffsets": "295,452,581,685,823,950,1063,1165,1336,1441,1606,1737,1902,2053,2113,2177,2262" + }, + "to": { + "startLines": "49,50,51,52,53,54,55,56,58,59,60,61,62,63,64,65,66", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4753,4860,5021,5154,5262,5404,5535,5652,5924,6099,6208,6377,6512,6681,6836,6900,6968", + "endColumns": "106,160,132,107,141,130,116,105,174,108,168,134,168,154,63,67,88", + "endOffsets": "4855,5016,5149,5257,5399,5530,5647,5753,6094,6203,6372,6507,6676,6831,6895,6963,7052" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-lv/values-lv.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,225,335,444,530,634,756,838,918,1028,1136,1242,1351,1462,1565,1677,1784,1889,1989,2074,2183,2294,2393,2504,2611,2716,2890,2989", + "endColumns": "119,109,108,85,103,121,81,79,109,107,105,108,110,102,111,106,104,99,84,108,110,98,110,106,104,173,98,82", + "endOffsets": "220,330,439,525,629,751,833,913,1023,1131,1237,1346,1457,1560,1672,1779,1884,1984,2069,2178,2289,2388,2499,2606,2711,2885,2984,3067" + }, + "to": { + "startLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,131", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "374,494,604,713,799,903,1025,1107,1187,1297,1405,1511,1620,1731,1834,1946,2053,2158,2258,2343,2452,2563,2662,2773,2880,2985,3159,12183", + "endColumns": "119,109,108,85,103,121,81,79,109,107,105,108,110,102,111,106,104,99,84,108,110,98,110,106,104,173,98,82", + "endOffsets": "489,599,708,794,898,1020,1102,1182,1292,1400,1506,1615,1726,1829,1941,2048,2153,2253,2338,2447,2558,2657,2768,2875,2980,3154,3253,12261" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-el_values-el.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-el/values-el.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,256,356,459,567,673,790", + "endColumns": "97,102,99,102,107,105,116,100", + "endOffsets": "148,251,351,454,562,668,785,886" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3543,3641,3744,3844,3947,4055,4161,12510", + "endColumns": "97,102,99,102,107,105,116,100", + "endOffsets": "3636,3739,3839,3942,4050,4156,4273,12606" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-el/values-el.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,270,358,444,529,625,712,814,931,1017,1080,1146,1246,1328,1391,1482,1545,1610,1672,1741,1803,1857,1995,2052,2113,2167,2240,2393,2478,2557,2653,2737,2821,2960,3041,3126,3267,3357,3443,3498,3549,3615,3693,3778,3849,3932,4004,4084,4164,4235,4342,4434,4506,4603,4700,4774,4848,4950,5006,5093,5165,5253,5345,5407,5471,5534,5604,5720,5829,5938,6043,6102,6157,6248,6336,6411", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,87,85,84,95,86,101,116,85,62,65,99,81,62,90,62,64,61,68,61,53,137,56,60,53,72,152,84,78,95,83,83,138,80,84,140,89,85,54,50,65,77,84,70,82,71,79,79,70,106,91,71,96,96,73,73,101,55,86,71,87,91,61,63,62,69,115,108,108,104,58,54,90,87,74,80", + "endOffsets": "265,353,439,524,620,707,809,926,1012,1075,1141,1241,1323,1386,1477,1540,1605,1667,1736,1798,1852,1990,2047,2108,2162,2235,2388,2473,2552,2648,2732,2816,2955,3036,3121,3262,3352,3438,3493,3544,3610,3688,3773,3844,3927,3999,4079,4159,4230,4337,4429,4501,4598,4695,4769,4843,4945,5001,5088,5160,5248,5340,5402,5466,5529,5599,5715,5824,5933,6038,6097,6152,6243,6331,6406,6487" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3101,3189,3275,3360,3456,4278,4380,4497,6949,7012,7078,7178,7260,7323,7414,7477,7542,7604,7673,7735,7789,7927,7984,8045,8099,8172,8325,8410,8489,8585,8669,8753,8892,8973,9058,9199,9289,9375,9430,9481,9547,9625,9710,9781,9864,9936,10016,10096,10167,10274,10366,10438,10535,10632,10706,10780,10882,10938,11025,11097,11185,11277,11339,11403,11466,11536,11652,11761,11870,11975,12034,12089,12266,12354,12429", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,87,85,84,95,86,101,116,85,62,65,99,81,62,90,62,64,61,68,61,53,137,56,60,53,72,152,84,78,95,83,83,138,80,84,140,89,85,54,50,65,77,84,70,82,71,79,79,70,106,91,71,96,96,73,73,101,55,86,71,87,91,61,63,62,69,115,108,108,104,58,54,90,87,74,80", + "endOffsets": "315,3184,3270,3355,3451,3538,4375,4492,4578,7007,7073,7173,7255,7318,7409,7472,7537,7599,7668,7730,7784,7922,7979,8040,8094,8167,8320,8405,8484,8580,8664,8748,8887,8968,9053,9194,9284,9370,9425,9476,9542,9620,9705,9776,9859,9931,10011,10091,10162,10269,10361,10433,10530,10627,10701,10775,10877,10933,11020,11092,11180,11272,11334,11398,11461,11531,11647,11756,11865,11970,12029,12084,12175,12349,12424,12505" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-el/values-el.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,223,334,451,536,642,765,854,939,1030,1123,1218,1312,1412,1505,1600,1697,1788,1879,1964,2075,2184,2286,2397,2507,2615,2786,2886", + "endColumns": "117,110,116,84,105,122,88,84,90,92,94,93,99,92,94,96,90,90,84,110,108,101,110,109,107,170,99,85", + "endOffsets": "218,329,446,531,637,760,849,934,1025,1118,1213,1307,1407,1500,1595,1692,1783,1874,1959,2070,2179,2281,2392,2502,2610,2781,2881,2967" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "320,438,549,666,751,857,980,1069,1154,1245,1338,1433,1527,1627,1720,1815,1912,2003,2094,2179,2290,2399,2501,2612,2722,2830,3001,12180", + "endColumns": "117,110,116,84,105,122,88,84,90,92,94,93,99,92,94,96,90,90,84,110,108,101,110,109,107,170,99,85", + "endOffsets": "433,544,661,746,852,975,1064,1149,1240,1333,1428,1522,1622,1715,1810,1907,1998,2089,2174,2285,2394,2496,2607,2717,2825,2996,3096,12261" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-el/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,300,482,610,717,894,1015,1129,1230,1415,1519,1685,1810,1984,2125,2190,2248", + "endColumns": "106,181,127,106,176,120,113,100,184,103,165,124,173,140,64,57,78", + "endOffsets": "299,481,609,716,893,1014,1128,1229,1414,1518,1684,1809,1983,2124,2189,2247,2326" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4583,4694,4880,5012,5123,5304,5429,5547,5816,6005,6113,6283,6412,6590,6735,6804,6866", + "endColumns": "110,185,131,110,180,124,117,104,188,107,169,128,177,144,68,61,82", + "endOffsets": "4689,4875,5007,5118,5299,5424,5542,5647,6000,6108,6278,6407,6585,6730,6799,6861,6944" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-el/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "159", + "endOffsets": "354" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5652", + "endColumns": "163", + "endOffsets": "5811" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-is_values-is.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-is/values-is.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,270,344,416,495,577,657,754,869,951,1009,1074,1162,1226,1287,1377,1441,1504,1566,1634,1698,1754,1877,1942,2004,2060,2131,2258,2342,2416,2513,2594,2678,2814,2891,2968,3084,3171,3250,3307,3362,3428,3504,3584,3655,3731,3798,3872,3942,4008,4110,4196,4266,4357,4447,4521,4594,4683,4734,4815,4887,4968,5054,5116,5180,5243,5312,5426,5532,5640,5742,5803,5862,5942,6026,6105", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,73,71,78,81,79,96,114,81,57,64,87,63,60,89,63,62,61,67,63,55,122,64,61,55,70,126,83,73,96,80,83,135,76,76,115,86,78,56,54,65,75,79,70,75,66,73,69,65,101,85,69,90,89,73,72,88,50,80,71,80,85,61,63,62,68,113,105,107,101,60,58,79,83,78,74", + "endOffsets": "265,339,411,490,572,652,749,864,946,1004,1069,1157,1221,1282,1372,1436,1499,1561,1629,1693,1749,1872,1937,1999,2055,2126,2253,2337,2411,2508,2589,2673,2809,2886,2963,3079,3166,3245,3302,3357,3423,3499,3579,3650,3726,3793,3867,3937,4003,4105,4191,4261,4352,4442,4516,4589,4678,4729,4810,4882,4963,5049,5111,5175,5238,5307,5421,5527,5635,5737,5798,5857,5937,6021,6100,6175" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2994,3068,3140,3219,3301,4098,4195,4310,6540,6598,6663,6751,6815,6876,6966,7030,7093,7155,7223,7287,7343,7466,7531,7593,7649,7720,7847,7931,8005,8102,8183,8267,8403,8480,8557,8673,8760,8839,8896,8951,9017,9093,9173,9244,9320,9387,9461,9531,9597,9699,9785,9855,9946,10036,10110,10183,10272,10323,10404,10476,10557,10643,10705,10769,10832,10901,11015,11121,11229,11331,11392,11451,11612,11696,11775", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,73,71,78,81,79,96,114,81,57,64,87,63,60,89,63,62,61,67,63,55,122,64,61,55,70,126,83,73,96,80,83,135,76,76,115,86,78,56,54,65,75,79,70,75,66,73,69,65,101,85,69,90,89,73,72,88,50,80,71,80,85,61,63,62,68,113,105,107,101,60,58,79,83,78,74", + "endOffsets": "315,3063,3135,3214,3296,3376,4190,4305,4387,6593,6658,6746,6810,6871,6961,7025,7088,7150,7218,7282,7338,7461,7526,7588,7644,7715,7842,7926,8000,8097,8178,8262,8398,8475,8552,8668,8755,8834,8891,8946,9012,9088,9168,9239,9315,9382,9456,9526,9592,9694,9780,9850,9941,10031,10105,10178,10267,10318,10399,10471,10552,10638,10700,10764,10827,10896,11010,11116,11224,11326,11387,11446,11526,11691,11770,11845" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-is/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "124", + "endOffsets": "319" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5366", + "endColumns": "128", + "endOffsets": "5490" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-is/values-is.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,205,302,414,499,600,714,795,874,965,1058,1151,1245,1351,1444,1539,1634,1725,1819,1900,2010,2117,2214,2323,2423,2526,2681,2779", + "endColumns": "99,96,111,84,100,113,80,78,90,92,92,93,105,92,94,94,90,93,80,109,106,96,108,99,102,154,97,80", + "endOffsets": "200,297,409,494,595,709,790,869,960,1053,1146,1240,1346,1439,1534,1629,1720,1814,1895,2005,2112,2209,2318,2418,2521,2676,2774,2855" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "320,420,517,629,714,815,929,1010,1089,1180,1273,1366,1460,1566,1659,1754,1849,1940,2034,2115,2225,2332,2429,2538,2638,2741,2896,11531", + "endColumns": "99,96,111,84,100,113,80,78,90,92,92,93,105,92,94,94,90,93,80,109,106,96,108,99,102,154,97,80", + "endOffsets": "415,512,624,709,810,924,1005,1084,1175,1268,1361,1455,1561,1654,1749,1844,1935,2029,2110,2220,2327,2424,2533,2633,2736,2891,2989,11607" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-is/values-is.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,150,257,354,454,557,661,772", + "endColumns": "94,106,96,99,102,103,110,100", + "endOffsets": "145,252,349,449,552,656,767,868" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3381,3476,3583,3680,3780,3883,3987,11850", + "endColumns": "94,106,96,99,102,103,110,100", + "endOffsets": "3471,3578,3675,3775,3878,3982,4093,11946" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-is/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,445,566,671,808,929,1034,1135,1285,1387,1540,1662,1800,1950,2010,2069", + "endColumns": "101,149,120,104,136,120,104,100,149,101,152,121,137,149,59,58,74", + "endOffsets": "294,444,565,670,807,928,1033,1134,1284,1386,1539,1661,1799,1949,2009,2068,2143" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4392,4498,4652,4777,4886,5027,5152,5261,5495,5649,5755,5912,6038,6180,6334,6398,6461", + "endColumns": "105,153,124,108,140,124,108,104,153,105,156,125,141,153,63,62,78", + "endOffsets": "4493,4647,4772,4881,5022,5147,5256,5361,5644,5750,5907,6033,6175,6329,6393,6456,6535" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values_values.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/6562528685bcf4f32771c81c31bdb251/transformed/recyclerview-1.3.2/res/values/values.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10", + "startColumns": "4,4,4,4,4,4,4,4,4", + "startOffsets": "55,111,170,218,274,349,425,497,563", + "endLines": "2,3,4,5,6,7,8,9,30", + "endColumns": "55,58,47,55,74,75,71,65,24", + "endOffsets": "106,165,213,269,344,420,492,558,1398" + }, + "to": { + "startLines": "508,1124,1125,1126,1134,1135,1136,1829,13177", + "startColumns": "4,4,4,4,4,4,4,4,4", + "startOffsets": "25699,67463,67522,67570,68237,68312,68388,122005,806977", + "endLines": "508,1124,1125,1126,1134,1135,1136,1829,13197", + "endColumns": "55,58,47,55,74,75,71,65,24", + "endOffsets": "25750,67517,67565,67621,68307,68383,68455,122066,807812" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/451be4cb7f62a323593f851d2cb28156/transformed/fragment-1.5.4/res/values/values.xml", + "from": { + "startLines": "2,3,4,5,10", + "startColumns": "4,4,4,4,4", + "startOffsets": "55,112,177,241,411", + "endLines": "2,3,4,9,13", + "endColumns": "56,64,63,24,24", + "endOffsets": "107,172,236,406,555" + }, + "to": { + "startLines": "1824,1859,1902,11941,11946", + "startColumns": "4,4,4,4,4", + "startOffsets": "121773,123581,125795,761513,761683", + "endLines": "1824,1859,1902,11945,11949", + "endColumns": "56,64,63,24,24", + "endOffsets": "121825,123641,125854,761678,761827" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/8c994b5da60099950ae0b0677f9a0925/transformed/lifecycle-viewmodel-2.6.2/res/values/values.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "49", + "endOffsets": "100" + }, + "to": { + "startLines": "1901", + "startColumns": "4", + "startOffsets": "125745", + "endColumns": "49", + "endOffsets": "125790" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values/strings.xml", + "from": { + "startLines": "85,84,83,2,124,126,123,125,76,127,128,26,25,110,162,208,204,205,32,33,167,37,36,166,35,34,75,20,21,22,179,132,111,38,39,80,81,129,77,364,368,367,68,69,165,362,363,366,70,71,360,365,261,108,109,27,246,242,247,240,248,249,252,250,251,241,239,245,244,243,337,336,339,340,338,329,330,331,332,327,333,335,334,328,279,280,265,267,266,254,263,262,260,255,256,253,225,222,221,220,224,219,214,223,216,278,273,275,274,277,276,217,215,218,235,270,264,308,306,309,307,310,305,257,259,326,324,325,297,282,286,281,299,302,301,303,300,284,296,285,292,294,291,293,298,289,290,288,287,295,283,258,230,231,229,227,226,228,269,268,271,272,213,304,212,236,234,233,232,211,120,121,377,74,116,113,114,112,115,78,88,57,203,202,201,200,199,23,361,24,58,18,19,186,168,59,16,93,140,375,17,138,137,143,185,15,136,56,190,188,189,187,210,209,5,89,90,86,87,161,160,131,60,65,67,61,164,163,64,62,66,63,348,345,344,350,358,354,356,357,346,355,343,353,347,359,342,341,349,352,351,374,103,102,101,139,8,176,175,177,372,371,369,373,370,97,95,96,118,119,99,98,91,100,173,172,171,169,170,196,155,158,156,157,149,153,152,151,148,147,154,146,145,150,159,42,40,41,4,142,141,105,376,79,104,7,174,9,10,82,206,207,46,44,49,55,54,47,48,43,45,52,51,53,50,12,73,3,117,6,323,318,317,316,320,322,321,313,314,315,319,312,311,197,178,198,133,135,134,14,11,94,92,144,107,184,195,192,194,193,191,122,72,30,29,28,238,31,180,181,183,182,130,13,106,237", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "6023,5955,5883,55,8919,9081,8854,9024,5359,9137,9203,1754,1691,7810,12059,15108,14824,14874,2271,2349,12365,2780,2641,12303,2506,2414,5283,1255,1317,1400,13244,9471,7869,2888,2963,5687,5746,9272,5493,29590,29800,29722,4808,4859,12199,29474,29532,29678,4911,4977,29352,29632,19960,7697,7748,1929,18379,18036,18451,17868,18785,18864,19146,18986,19062,17958,17796,18267,18197,18104,27451,27380,27575,27652,27514,26729,26790,26852,26939,26581,27169,27316,27240,26668,21696,21776,20353,20540,20438,19309,20178,20075,19793,19388,19474,19222,16244,16027,15964,15899,16169,15823,15469,16110,15662,21555,21127,21296,21207,21468,21380,15716,15609,15770,17382,20838,20274,24883,24535,24953,24816,25037,24446,19558,19717,26482,26245,26315,23754,22114,22423,22031,23938,24186,24104,24282,24019,22244,23654,22314,23168,23331,23082,23253,23828,22795,22887,22704,22614,23536,22178,19638,16686,16793,16600,16414,16325,16495,20740,20649,20918,21004,15409,24374,15355,17479,17154,17047,16968,15283,8636,8708,30681,5235,8323,8032,8112,7941,8171,5553,6228,4165,14771,14720,14667,14610,14555,1512,29416,1598,4240,1084,1161,13777,12429,4295,954,6537,10049,30412,1020,9885,9805,10262,13731,900,9753,4107,13996,13890,13943,13829,15206,15154,243,6309,6363,6097,6162,11991,11888,9420,4363,4631,4753,4418,12156,12115,4561,4463,4684,4514,28437,28171,28071,28576,29212,28967,29085,29151,28235,29039,27988,28900,28308,29282,27793,27729,28508,28741,28679,30326,7351,7299,7226,9971,520,13005,12945,13129,30077,30002,29850,30204,29907,6878,6715,6793,8501,8575,7052,6960,6434,7135,12772,12714,12638,12473,12573,14326,11602,11770,11656,11721,10746,11335,11165,11006,10677,10610,11489,10536,10466,10835,11829,3174,3028,3092,174,10184,10111,7490,30496,5620,7417,460,12845,561,605,5818,14939,15027,3402,3296,3638,4026,3951,3477,3559,3239,3348,3839,3783,3895,3719,716,5167,105,8403,402,26105,25744,25627,25517,25915,26041,25980,25328,25400,25458,25831,25180,25113,14422,13186,14492,9541,9681,9613,842,666,6626,6499,10338,7632,13646,14264,14122,14212,14166,14064,8777,5076,2134,2068,1999,17721,2204,13336,13411,13541,13485,9340,779,7556,17593", + "endColumns": "73,67,71,49,104,55,64,56,133,65,68,174,62,58,55,45,49,64,77,64,63,107,138,61,134,91,75,61,82,111,91,69,71,74,64,58,71,67,59,41,49,77,50,51,103,57,57,43,65,98,63,45,114,50,61,69,71,67,333,89,78,121,75,75,83,77,71,111,69,92,62,70,76,76,60,60,61,86,229,86,70,63,75,60,79,254,84,108,101,78,95,102,166,85,83,86,80,82,62,64,74,75,139,58,53,140,79,83,88,86,87,53,52,52,96,79,78,69,280,83,66,75,88,79,75,98,69,166,73,63,190,82,80,95,81,91,84,69,99,108,84,204,85,77,109,91,194,90,89,117,65,78,106,174,85,80,88,104,97,90,85,122,59,71,53,113,227,106,78,71,71,68,57,47,79,79,58,90,151,66,80,74,52,50,52,56,54,85,57,92,54,76,93,51,43,67,65,88,61,83,63,85,79,75,45,53,51,57,67,52,52,60,76,51,158,53,70,64,65,67,102,50,54,52,54,44,42,40,69,50,68,46,70,63,99,102,69,71,65,60,72,45,82,66,128,69,194,63,67,158,61,85,65,51,72,77,40,123,59,56,126,74,56,121,94,81,77,84,73,60,82,91,64,90,72,57,75,99,64,95,53,58,64,48,88,153,169,158,68,66,112,73,69,170,58,64,63,81,68,77,72,65,184,66,72,59,99,43,60,64,87,80,74,51,80,80,74,81,78,56,53,55,55,55,63,62,67,68,97,57,139,86,116,109,64,63,60,71,57,58,83,147,66,69,57,62,71,71,67,57,49,88,37,127,64,84,61,43,51,45,57,76,90,69,65,68,74,66,74,73,104,55,79,62,75,127", + "endOffsets": "6092,6018,5950,100,9019,9132,8914,9076,5488,9198,9267,1924,1749,7864,12110,15149,14869,14934,2344,2409,12424,2883,2775,12360,2636,2501,5354,1312,1395,1507,13331,9536,7936,2958,3023,5741,5813,9335,5548,29627,29845,29795,4854,4906,12298,29527,29585,29717,4972,5071,29411,29673,20070,7743,7805,1994,18446,18099,18780,17953,18859,18981,19217,19057,19141,18031,17863,18374,18262,18192,27509,27446,27647,27724,27570,26785,26847,26934,27164,26663,27235,27375,27311,26724,21771,22026,20433,20644,20535,19383,20269,20173,19955,19469,19553,19304,16320,16105,16022,15959,16239,15894,15604,16164,15711,21691,21202,21375,21291,21550,21463,15765,15657,15818,17474,20913,20348,24948,24811,25032,24878,25108,24530,19633,19788,26576,26310,26477,23823,22173,22609,22109,24014,24277,24181,24369,24099,22309,23749,22418,23248,23531,23163,23326,23933,22882,23077,22790,22699,23649,22239,19712,16788,16963,16681,16490,16409,16595,20833,20735,20999,21122,15464,24441,15404,17588,17377,17149,17042,15350,8703,8772,30734,5278,8398,8107,8166,8027,8318,5615,6304,4235,14819,14766,14715,14662,14605,1593,29469,1686,4290,1156,1250,13824,12468,4358,1015,6621,10106,30491,1079,9966,9880,10333,13772,949,9800,4160,14059,13938,13991,13885,15278,15201,397,6358,6429,6157,6223,12054,11986,9466,4413,4679,4803,4458,12194,12151,4626,4509,4748,4556,28503,28230,28166,28674,29277,29034,29146,29207,28303,29080,28066,28962,28432,29347,27983,27788,28571,28895,28736,30407,7412,7346,7294,10044,556,13124,13000,13181,30199,30072,29902,30321,29997,6955,6788,6873,8570,8631,7130,7047,6494,7221,12840,12767,12709,12568,12633,14417,11651,11824,11716,11765,10830,11484,11330,11160,10741,10672,11597,10605,10531,11001,11883,3234,3087,3169,238,10257,10179,7551,30676,5682,7485,515,12940,600,661,5878,15022,15103,3472,3343,3714,4102,4021,3554,3633,3291,3397,3890,3834,3946,3778,774,5230,169,8496,455,26240,25826,25739,25622,25975,26100,26036,25395,25453,25512,25910,25323,25175,14487,13239,14550,9608,9748,9676,895,711,6710,6532,10461,7692,13726,14321,14161,14259,14207,14117,8849,5162,2199,2129,2063,17791,2266,13406,13480,13641,13536,9415,837,7627,17716" + }, + "to": { + "startLines": "2004,2005,2006,2008,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2027,2028,2029,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2218,2220,2221,2222,2223,2227,2228,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2281,2282,2283,2284,2285,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2491,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2520,2521,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "132756,132830,132898,133053,133253,133358,133414,133479,133536,133670,133736,133805,133980,134043,134102,135247,135293,135343,135919,135997,136062,136126,136234,136373,136435,136570,136662,136738,136800,136883,136995,137087,137157,137229,137304,137369,137428,137500,137568,138005,138047,138097,138175,138226,138278,138382,138440,138498,138542,138608,138707,138771,138817,141265,141316,141378,141448,141520,141588,141922,142012,142091,142213,142289,142365,142449,142527,142599,142711,142781,142874,142937,143008,143085,143162,143223,143284,143346,143433,143663,143750,143821,143885,143961,144022,144102,144357,144442,144551,144653,144732,144828,144931,145098,145184,145268,145355,145436,145519,145582,145647,145722,145798,145938,145997,146051,146192,146272,146356,146445,146532,146620,146674,146727,146780,146877,146957,147036,147106,147387,147471,147538,147614,147703,147783,147859,147958,148028,148195,148269,148333,148524,148607,148688,148784,148866,148958,149043,149113,149213,149322,149407,149612,149698,149776,149886,149978,150173,150264,150354,150472,150538,150617,150724,150899,150985,151066,151155,151260,151358,151449,151535,151658,151718,151790,151844,151958,152186,152293,152372,152444,152516,152585,152643,152851,152996,153076,153135,153226,153781,153848,154295,154370,154423,154474,154527,154584,154639,154725,154783,154876,154931,155008,155102,155154,155198,155266,155332,155421,155483,155567,155631,155717,155797,155873,155919,155973,156025,156083,156151,156204,156257,156318,156395,158364,158523,158577,158648,158713,172375,172443,172546,172597,172652,172705,172760,172805,172848,172889,172959,173010,173079,173126,173197,173261,173361,173464,173534,173606,173672,173733,173806,173852,173935,174002,174131,174201,174396,174460,174528,174687,175551,175637,175703,175755,175828,175906,175947,176071,176131,176188,176315,176390,176447,176569,176664,176746,176824,176909,176983,177044,177127,177219,177284,177375,177448,177506,177582,177682,177747,177843,177897,177956,178021,178070,178159,178313,178483,178642,178711,178778,178891,178965,179035,179206,179265,179330,179394,179476,179545,179623,179696,179762,179947,180014,180087,180147,180247,180291,180352,180417,180505,180586,180661,180713,180794,180875,180950,181032,181111,181168,181222,181278,181334,181390,181665,182078,182146,182215,182313,182371,182511,182598,182715,182825,182890,182954,183015,183087,183145,183204,183288,183436,183503,183573,183631,183694,183766,183838,183906,184312,184362,184522,184560,184688,184753,184838,184900,184944,184996,185042,185100,185177,185268,185338,185404,185473,185548,185615,185690,185764,185869,185925,186005,186068,186144", + "endColumns": "73,67,71,49,104,55,64,56,133,65,68,174,62,58,55,45,49,64,77,64,63,107,138,61,134,91,75,61,82,111,91,69,71,74,64,58,71,67,59,41,49,77,50,51,103,57,57,43,65,98,63,45,114,50,61,69,71,67,333,89,78,121,75,75,83,77,71,111,69,92,62,70,76,76,60,60,61,86,229,86,70,63,75,60,79,254,84,108,101,78,95,102,166,85,83,86,80,82,62,64,74,75,139,58,53,140,79,83,88,86,87,53,52,52,96,79,78,69,280,83,66,75,88,79,75,98,69,166,73,63,190,82,80,95,81,91,84,69,99,108,84,204,85,77,109,91,194,90,89,117,65,78,106,174,85,80,88,104,97,90,85,122,59,71,53,113,227,106,78,71,71,68,57,47,79,79,58,90,151,66,80,74,52,50,52,56,54,85,57,92,54,76,93,51,43,67,65,88,61,83,63,85,79,75,45,53,51,57,67,52,52,60,76,51,158,53,70,64,65,67,102,50,54,52,54,44,42,40,69,50,68,46,70,63,99,102,69,71,65,60,72,45,82,66,128,69,194,63,67,158,61,85,65,51,72,77,40,123,59,56,126,74,56,121,94,81,77,84,73,60,82,91,64,90,72,57,75,99,64,95,53,58,64,48,88,153,169,158,68,66,112,73,69,170,58,64,63,81,68,77,72,65,184,66,72,59,99,43,60,64,87,80,74,51,80,80,74,81,78,56,53,55,55,55,63,62,67,68,97,57,139,86,116,109,64,63,60,71,57,58,83,147,66,69,57,62,71,71,67,57,49,88,37,127,64,84,61,43,51,45,57,76,90,69,65,68,74,66,74,73,104,55,79,62,75,127", + "endOffsets": "132825,132893,132965,133098,133353,133409,133474,133531,133665,133731,133800,133975,134038,134097,134153,135288,135338,135403,135992,136057,136121,136229,136368,136430,136565,136657,136733,136795,136878,136990,137082,137152,137224,137299,137364,137423,137495,137563,137623,138042,138092,138170,138221,138273,138377,138435,138493,138537,138603,138702,138766,138812,138927,141311,141373,141443,141515,141583,141917,142007,142086,142208,142284,142360,142444,142522,142594,142706,142776,142869,142932,143003,143080,143157,143218,143279,143341,143428,143658,143745,143816,143880,143956,144017,144097,144352,144437,144546,144648,144727,144823,144926,145093,145179,145263,145350,145431,145514,145577,145642,145717,145793,145933,145992,146046,146187,146267,146351,146440,146527,146615,146669,146722,146775,146872,146952,147031,147101,147382,147466,147533,147609,147698,147778,147854,147953,148023,148190,148264,148328,148519,148602,148683,148779,148861,148953,149038,149108,149208,149317,149402,149607,149693,149771,149881,149973,150168,150259,150349,150467,150533,150612,150719,150894,150980,151061,151150,151255,151353,151444,151530,151653,151713,151785,151839,151953,152181,152288,152367,152439,152511,152580,152638,152686,152926,153071,153130,153221,153373,153843,153924,154365,154418,154469,154522,154579,154634,154720,154778,154871,154926,155003,155097,155149,155193,155261,155327,155416,155478,155562,155626,155712,155792,155868,155914,155968,156020,156078,156146,156199,156252,156313,156390,156442,158518,158572,158643,158708,158774,172438,172541,172592,172647,172700,172755,172800,172843,172884,172954,173005,173074,173121,173192,173256,173356,173459,173529,173601,173667,173728,173801,173847,173930,173997,174126,174196,174391,174455,174523,174682,174744,175632,175698,175750,175823,175901,175942,176066,176126,176183,176310,176385,176442,176564,176659,176741,176819,176904,176978,177039,177122,177214,177279,177370,177443,177501,177577,177677,177742,177838,177892,177951,178016,178065,178154,178308,178478,178637,178706,178773,178886,178960,179030,179201,179260,179325,179389,179471,179540,179618,179691,179757,179942,180009,180082,180142,180242,180286,180347,180412,180500,180581,180656,180708,180789,180870,180945,181027,181106,181163,181217,181273,181329,181385,181449,181723,182141,182210,182308,182366,182506,182593,182710,182820,182885,182949,183010,183082,183140,183199,183283,183431,183498,183568,183626,183689,183761,183833,183901,183959,184357,184446,184555,184683,184748,184833,184895,184939,184991,185037,185095,185172,185263,185333,185399,185468,185543,185610,185685,185759,185864,185920,186000,186063,186139,186267" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/68e97725e1781378fe335998c8e500ec/transformed/core-common-2.0.4/res/values/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "166", + "endLines": "11", + "endColumns": "8", + "endOffsets": "571" + }, + "to": { + "startLines": "6999", + "startColumns": "4", + "startOffsets": "496174", + "endLines": "7006", + "endColumns": "8", + "endOffsets": "496579" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/6be8cab6745c75787fdf6101b92e71af/transformed/drawerlayout-1.1.1/res/values/values.xml", + "from": { + "startLines": "2,3,4,5", + "startColumns": "4,4,4,4", + "startOffsets": "55,111,159,211", + "endLines": "2,3,4,8", + "endColumns": "55,47,51,24", + "endOffsets": "106,154,206,426" + }, + "to": { + "startLines": "138,141,1073,11794", + "startColumns": "4,4,4,4", + "startOffsets": "6996,7160,64138,756375", + "endLines": "138,141,1073,11797", + "endColumns": "55,47,51,24", + "endOffsets": "7047,7203,64185,756481" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values/values.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,98,99,103,104,105,106,112,122,155,176,209", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,115,187,275,340,406,475,538,608,676,748,818,879,953,1026,1087,1148,1210,1274,1336,1397,1465,1565,1625,1691,1764,1833,1890,1942,2004,2076,2152,2217,2276,2335,2395,2455,2515,2575,2635,2695,2755,2815,2875,2935,2994,3054,3114,3174,3234,3294,3354,3414,3474,3534,3594,3653,3713,3773,3832,3891,3950,4009,4068,4127,4162,4197,4252,4315,4370,4428,4486,4547,4610,4667,4718,4768,4829,4886,4952,4986,5021,5056,5126,5193,5265,5334,5403,5477,5549,5637,5708,5825,6026,6136,6337,6466,6538,6605,6808,7109,8840,9521,10203", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,97,98,102,103,104,105,111,121,154,175,208,214", + "endColumns": "59,71,87,64,65,68,62,69,67,71,69,60,73,72,60,60,61,63,61,60,67,99,59,65,72,68,56,51,61,71,75,64,58,58,59,59,59,59,59,59,59,59,59,59,58,59,59,59,59,59,59,59,59,59,59,58,59,59,58,58,58,58,58,58,34,34,54,62,54,57,57,60,62,56,50,49,60,56,65,33,34,34,69,66,71,68,68,73,71,87,70,116,12,109,12,128,71,66,24,24,24,24,24,24", + "endOffsets": "110,182,270,335,401,470,533,603,671,743,813,874,948,1021,1082,1143,1205,1269,1331,1392,1460,1560,1620,1686,1759,1828,1885,1937,1999,2071,2147,2212,2271,2330,2390,2450,2510,2570,2630,2690,2750,2810,2870,2930,2989,3049,3109,3169,3229,3289,3349,3409,3469,3529,3589,3648,3708,3768,3827,3886,3945,4004,4063,4122,4157,4192,4247,4310,4365,4423,4481,4542,4605,4662,4713,4763,4824,4881,4947,4981,5016,5051,5121,5188,5260,5329,5398,5472,5544,5632,5703,5820,6021,6131,6332,6461,6533,6600,6803,7104,8835,9516,10198,10365" + }, + "to": { + "startLines": "470,637,638,651,652,951,952,1066,1067,1068,1069,1070,1071,1072,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1830,1831,1861,1862,1863,1864,1865,1866,1867,1868,1872,1873,1874,1875,1876,1877,1878,1886,1971,2030,2031,2032,2033,2034,2035,2036,2522,6478,6479,6483,6484,6488,7654,7655,10679,11037,11881,11914,11950,11983", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "24089,32458,32530,33578,33643,55926,55995,63650,63720,63788,63860,63930,63991,64065,117737,117798,117859,117921,117985,118047,118108,118176,118276,118336,118402,118475,118544,118601,118653,119445,119517,119593,119658,119717,119776,119836,119896,119956,120016,120076,120136,120196,120256,120316,120376,120435,120495,120555,120615,120675,120735,120795,120855,120915,120975,121035,121094,121154,121214,121273,121332,121391,121450,121509,122071,122106,123692,123747,123810,123865,123923,123981,124042,124105,124308,124359,124409,124470,124527,124593,124627,125009,130373,135408,135475,135547,135616,135685,135759,135831,184451,461172,461289,461490,461600,461801,545030,545102,712404,724989,758876,760607,761832,762514", + "endLines": "470,637,638,651,652,951,952,1066,1067,1068,1069,1070,1071,1072,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1830,1831,1861,1862,1863,1864,1865,1866,1867,1868,1872,1873,1874,1875,1876,1877,1878,1886,1971,2030,2031,2032,2033,2034,2035,2036,2522,6478,6482,6483,6487,6488,7654,7655,10684,11046,11913,11934,11982,11988", + "endColumns": "59,71,87,64,65,68,62,69,67,71,69,60,73,72,60,60,61,63,61,60,67,99,59,65,72,68,56,51,61,71,75,64,58,58,59,59,59,59,59,59,59,59,59,59,58,59,59,59,59,59,59,59,59,59,59,58,59,59,58,58,58,58,58,58,34,34,54,62,54,57,57,60,62,56,50,49,60,56,65,33,34,34,69,66,71,68,68,73,71,87,70,116,12,109,12,128,71,66,24,24,24,24,24,24", + "endOffsets": "24144,32525,32613,33638,33704,55990,56053,63715,63783,63855,63925,63986,64060,64133,117793,117854,117916,117980,118042,118103,118171,118271,118331,118397,118470,118539,118596,118648,118710,119512,119588,119653,119712,119771,119831,119891,119951,120011,120071,120131,120191,120251,120311,120371,120430,120490,120550,120610,120670,120730,120790,120850,120910,120970,121030,121089,121149,121209,121268,121327,121386,121445,121504,121563,122101,122136,123742,123805,123860,123918,123976,124037,124100,124157,124354,124404,124465,124522,124588,124622,124657,125039,130438,135470,135542,135611,135680,135754,135826,135914,184517,461284,461485,461595,461796,461925,545097,545164,712602,725285,760602,761283,762509,762676" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/6c0e8749c44e3843f0401e2e78787c36/transformed/customview-poolingcontainer-1.0.0/res/values/values.xml", + "from": { + "startLines": "2,3", + "startColumns": "4,4", + "startOffsets": "55,109", + "endColumns": "53,66", + "endOffsets": "104,171" + }, + "to": { + "startLines": "1828,1849", + "startColumns": "4,4", + "startOffsets": "121951,123099", + "endColumns": "53,66", + "endOffsets": "122000,123161" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/30d4e98469639d69ad240eb0afa9d087/transformed/cardview-1.0.0/res/values/values.xml", + "from": { + "startLines": "2,3,4,5,6,35,36,37,38,45,47,50,7", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,107,168,230,292,2179,2238,2295,2349,2763,2827,2953,356", + "endLines": "2,3,4,5,6,35,36,37,44,46,49,52,34", + "endColumns": "51,60,61,61,63,58,56,53,12,12,12,12,24", + "endOffsets": "102,163,225,287,351,2233,2290,2344,2758,2822,2948,3076,2174" + }, + "to": { + "startLines": "35,653,654,655,656,1062,1063,1064,2602,5957,5959,5962,10685", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "1640,33709,33770,33832,33894,63425,63484,63541,189884,424164,424228,424354,712607", + "endLines": "35,653,654,655,656,1062,1063,1064,2608,5958,5961,5964,10712", + "endColumns": "51,60,61,61,63,58,56,53,12,12,12,12,24", + "endOffsets": "1687,33765,33827,33889,33953,63479,63536,63590,190293,424223,424349,424477,713526" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values/values.xml", + "from": { + "startLines": "4,7", + "startColumns": "0,0", + "startOffsets": "243,406", + "endColumns": "63,166", + "endOffsets": "306,572" + }, + "to": { + "startLines": "1911,2084", + "startColumns": "4,4", + "startOffsets": "126365,139972", + "endColumns": "67,166", + "endOffsets": "126428,140134" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/a8b802474834ad934ab806f5360c513e/transformed/transition-1.5.0/res/values/values.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,95,142,185,240,287,332,386,442,494,546,595,656", + "endColumns": "39,46,42,54,46,44,53,55,51,51,48,60,49", + "endOffsets": "90,137,180,235,282,327,381,437,489,541,590,651,701" + }, + "to": { + "startLines": "1825,1826,1848,1854,1855,1887,1888,1889,1890,1891,1892,1893,1894", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "121830,121870,123056,123347,123402,125044,125089,125143,125199,125251,125303,125352,125413", + "endColumns": "39,46,42,54,46,44,53,55,51,51,48,60,49", + "endOffsets": "121865,121912,123094,123397,123444,125084,125138,125194,125246,125298,125347,125408,125458" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values/colors.xml", + "from": { + "startLines": "3,2,10,9,13,6,5,8,7,12,11", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "112,55,529,474,719,293,226,415,358,647,582", + "endColumns": "56,56,52,54,61,64,66,58,56,71,64", + "endOffsets": "164,107,577,524,776,353,288,469,410,714,642" + }, + "to": { + "startLines": "700,711,712,713,967,968,969,970,971,972,973", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "37052,37790,37847,37900,57057,57119,57184,57251,57310,57367,57439", + "endColumns": "56,56,52,54,61,64,66,58,56,71,64", + "endOffsets": "37104,37842,37895,37950,57114,57179,57246,57305,57362,57434,57499" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values/themes.xml", + "from": { + "startLines": "42,47,2,27,15,9,34,20", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "1991,2138,55,1255,682,370,1575,937", + "endLines": "45,50,7,32,18,13,40,25", + "endColumns": "12,12,12,12,12,12,12,12", + "endOffsets": "2132,2287,364,1569,931,676,1985,1249" + }, + "to": { + "startLines": "2573,2577,6768,6774,6780,6784,6789,6796", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "188133,188279,479118,479432,479751,480005,480316,480731", + "endLines": "2576,2580,6773,6779,6783,6788,6795,6801", + "endColumns": "12,12,12,12,12,12,12,12", + "endOffsets": "188274,188428,479427,479746,480000,480311,480726,481043" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/cc91afd01cb4f955b418c94caa09925e/transformed/lifecycle-runtime-2.6.2/res/values/values.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "42", + "endOffsets": "93" + }, + "to": { + "startLines": "1898", + "startColumns": "4", + "startOffsets": "125588", + "endColumns": "42", + "endOffsets": "125626" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values/values.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,221,222,226,230,234,239,245,252,256,260,265,269,273,277,281,285,289,295,299,305,309,315,319,324,328,331,335,341,345,351,355,361,364,368,372,376,380,384,385,386,387,390,393,396,399,403,404,405,406,407,410,412,414,416,421,422,426,432,436,437,439,451,452,456,462,466,467,468,472,499,503,504,508,536,708,734,905,931,962,970,976,992,1014,1019,1024,1034,1043,1052,1056,1063,1082,1089,1090,1099,1102,1105,1109,1113,1117,1120,1121,1126,1131,1141,1146,1153,1159,1160,1163,1167,1172,1174,1176,1179,1182,1184,1188,1191,1198,1201,1204,1208,1210,1214,1216,1218,1220,1224,1232,1240,1252,1258,1267,1270,1281,1284,1285,1290,1291,1296,1365,1435,1436,1446,1455,1456,1458,1462,1465,1468,1471,1474,1477,1480,1483,1487,1490,1493,1496,1500,1503,1507,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1533,1535,1536,1537,1538,1539,1540,1541,1542,1544,1545,1547,1548,1550,1552,1553,1555,1556,1557,1558,1559,1560,1562,1563,1564,1565,1566,1567,1569,1571,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1587,1588,1589,1590,1591,1592,1593,1595,1599,1603,1604,1605,1606,1607,1608,1612,1613,1614,1615,1617,1619,1621,1623,1625,1626,1627,1628,1630,1632,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1648,1649,1650,1651,1653,1655,1656,1658,1659,1661,1663,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1678,1679,1680,1681,1683,1684,1685,1686,1687,1689,1691,1693,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1785,1788,1791,1794,1808,1814,1824,1827,1856,1883,1892,1956,2319,2323,2351,2379,2397,2421,2427,2433,2454,2578,2598,2604,2608,2649,2661,2727,2747,2802,2814,2840", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,160,205,254,295,350,412,476,546,607,682,758,835,913,998,1080,1156,1232,1309,1387,1493,1599,1678,1758,1815,1873,1947,2022,2087,2153,2213,2274,2346,2419,2486,2554,2613,2672,2731,2790,2849,2903,2957,3010,3064,3118,3172,3226,3300,3379,3452,3526,3597,3669,3741,3814,3871,3929,4002,4076,4150,4225,4297,4370,4440,4511,4571,4632,4701,4770,4840,4914,4990,5054,5131,5207,5284,5349,5418,5495,5570,5639,5707,5784,5850,5911,6008,6073,6142,6241,6312,6371,6429,6486,6545,6609,6680,6752,6824,6896,6968,7035,7103,7171,7230,7293,7357,7447,7538,7598,7664,7731,7797,7867,7931,7984,8051,8112,8179,8292,8350,8413,8478,8543,8618,8691,8763,8807,8854,8900,8949,9010,9071,9132,9194,9258,9322,9386,9451,9514,9574,9635,9701,9760,9820,9882,9953,10013,10081,10167,10254,10344,10431,10519,10601,10684,10774,10865,10917,10975,11020,11086,11150,11207,11264,11318,11375,11423,11472,11523,11557,11604,11653,11699,11731,11795,11857,11917,11974,12048,12118,12196,12250,12320,12405,12453,12499,12560,12623,12689,12753,12824,12887,12952,13016,13077,13138,13190,13263,13337,13406,13481,13555,13629,13770,13840,13893,13971,14061,14149,14245,14335,14917,15006,15253,15534,15786,16071,16464,16941,17163,17385,17661,17888,18118,18348,18578,18808,19035,19454,19680,20105,20335,20763,20982,21265,21473,21604,21831,22257,22482,22909,23130,23555,23675,23951,24252,24576,24867,25181,25318,25449,25554,25796,25963,26167,26375,26646,26758,26870,26975,27092,27306,27452,27592,27678,28026,28114,28360,28778,29027,29109,29207,29864,29964,30216,30640,30895,30989,31078,31315,33339,33581,33683,33936,36092,46773,48289,58984,60512,62269,62895,63315,64576,65841,66097,66333,66880,67374,67979,68177,68757,70125,70500,70618,71156,71313,71509,71782,72038,72208,72349,72413,72778,73145,73821,74085,74423,74776,74870,75056,75362,75624,75749,75876,76115,76326,76445,76638,76815,77270,77451,77573,77832,77945,78132,78234,78341,78470,78745,79253,79749,80626,80920,81490,81639,82371,82543,82627,82963,83055,83333,88564,93935,93997,94575,95159,95250,95363,95592,95752,95904,96075,96241,96410,96577,96740,96983,97153,97326,97497,97771,97970,98175,98505,98589,98685,98781,98879,98979,99081,99183,99285,99387,99489,99589,99685,99797,99926,100049,100180,100311,100409,100523,100617,100757,100891,100987,101099,101199,101315,101411,101523,101623,101763,101899,102063,102193,102351,102501,102642,102786,102921,103033,103183,103311,103439,103575,103707,103837,103967,104079,104219,104365,104509,104647,104713,104803,104879,104983,105073,105175,105283,105391,105491,105571,105663,105761,105871,105923,106001,106107,106199,106303,106413,106535,106698,106855,106935,107035,107125,107235,107325,107566,107660,107766,107858,107958,108070,108184,108300,108416,108510,108624,108736,108838,108958,109080,109162,109266,109386,109512,109610,109704,109792,109904,110020,110142,110254,110429,110545,110631,110723,110835,110959,111026,111152,111220,111348,111492,111620,111689,111784,111899,112012,112111,112220,112331,112442,112543,112648,112748,112878,112969,113092,113186,113298,113384,113488,113584,113672,113790,113894,113998,114124,114212,114320,114420,114510,114620,114704,114806,114890,114944,115008,115114,115200,115310,115394,115514,118130,118248,118363,118443,118804,119037,119554,119632,120976,122337,122725,125568,135621,135756,137126,138483,139055,139806,140068,140268,140647,144925,145531,145760,145911,147209,147521,150547,151291,153422,153762,155073", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,220,221,225,229,233,238,244,251,255,259,264,268,272,276,280,284,288,294,298,304,308,314,318,323,327,330,334,340,344,350,354,360,363,367,371,375,379,383,384,385,386,389,392,395,398,402,403,404,405,406,409,411,413,415,420,421,425,431,435,436,438,450,451,455,461,465,466,467,471,498,502,503,507,535,707,733,904,930,961,969,975,991,1013,1018,1023,1033,1042,1051,1055,1062,1081,1088,1089,1098,1101,1104,1108,1112,1116,1119,1120,1125,1130,1140,1145,1152,1158,1159,1162,1166,1171,1173,1175,1178,1181,1183,1187,1190,1197,1200,1203,1207,1209,1213,1215,1217,1219,1223,1231,1239,1251,1257,1266,1269,1280,1283,1284,1289,1290,1295,1364,1434,1435,1445,1454,1455,1457,1461,1464,1467,1470,1473,1476,1479,1482,1486,1489,1492,1495,1499,1502,1506,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1532,1534,1535,1536,1537,1538,1539,1540,1541,1543,1544,1546,1547,1549,1551,1552,1554,1555,1556,1557,1558,1559,1561,1562,1563,1564,1565,1566,1568,1570,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1586,1587,1588,1589,1590,1591,1592,1594,1598,1602,1603,1604,1605,1606,1607,1611,1612,1613,1614,1616,1618,1620,1622,1624,1625,1626,1627,1629,1631,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1647,1648,1649,1650,1652,1654,1655,1657,1658,1660,1662,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1677,1678,1679,1680,1682,1683,1684,1685,1686,1688,1690,1692,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1784,1787,1790,1793,1807,1813,1823,1826,1855,1882,1891,1955,2318,2322,2350,2378,2396,2420,2426,2432,2453,2577,2597,2603,2607,2613,2660,2726,2746,2801,2813,2839,2846", + "endColumns": "54,44,48,40,54,61,63,69,60,74,75,76,77,84,81,75,75,76,77,105,105,78,79,56,57,73,74,64,65,59,60,71,72,66,67,58,58,58,58,58,53,53,52,53,53,53,53,73,78,72,73,70,71,71,72,56,57,72,73,73,74,71,72,69,70,59,60,68,68,69,73,75,63,76,75,76,64,68,76,74,68,67,76,65,60,96,64,68,98,70,58,57,56,58,63,70,71,71,71,71,66,67,67,58,62,63,89,90,59,65,66,65,69,63,52,66,60,66,112,57,62,64,64,74,72,71,43,46,45,48,60,60,60,61,63,63,63,64,62,59,60,65,58,59,61,70,59,67,85,86,89,86,87,81,82,89,90,51,57,44,65,63,56,56,53,56,47,48,50,33,46,48,45,31,63,61,59,56,73,69,77,53,69,84,47,45,60,62,65,63,70,62,64,63,60,60,51,72,73,68,74,73,73,140,69,52,77,89,87,95,89,12,88,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,136,130,104,12,12,12,12,12,111,111,104,116,12,12,12,12,12,87,12,12,12,81,12,12,99,12,12,12,93,88,12,12,12,101,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,117,12,12,12,12,12,12,12,63,12,12,12,12,12,12,93,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,12,91,12,12,12,61,12,12,90,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,95,95,97,99,101,101,101,101,101,99,95,111,128,122,130,130,97,113,93,12,12,95,111,99,115,95,111,99,12,135,12,129,12,12,140,12,134,111,149,127,127,12,131,129,129,111,139,12,12,12,65,89,75,103,89,101,107,107,99,79,91,97,12,51,77,105,91,103,109,12,12,12,79,99,89,109,89,12,93,105,91,12,12,12,12,12,93,113,111,12,12,12,81,103,119,125,97,93,87,111,115,121,111,12,115,85,91,12,12,66,12,67,12,12,12,68,94,114,112,98,108,110,110,100,104,99,12,90,122,93,12,85,103,95,87,12,12,12,12,87,107,99,89,109,83,101,83,53,63,105,85,109,83,119,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24", + "endOffsets": "155,200,249,290,345,407,471,541,602,677,753,830,908,993,1075,1151,1227,1304,1382,1488,1594,1673,1753,1810,1868,1942,2017,2082,2148,2208,2269,2341,2414,2481,2549,2608,2667,2726,2785,2844,2898,2952,3005,3059,3113,3167,3221,3295,3374,3447,3521,3592,3664,3736,3809,3866,3924,3997,4071,4145,4220,4292,4365,4435,4506,4566,4627,4696,4765,4835,4909,4985,5049,5126,5202,5279,5344,5413,5490,5565,5634,5702,5779,5845,5906,6003,6068,6137,6236,6307,6366,6424,6481,6540,6604,6675,6747,6819,6891,6963,7030,7098,7166,7225,7288,7352,7442,7533,7593,7659,7726,7792,7862,7926,7979,8046,8107,8174,8287,8345,8408,8473,8538,8613,8686,8758,8802,8849,8895,8944,9005,9066,9127,9189,9253,9317,9381,9446,9509,9569,9630,9696,9755,9815,9877,9948,10008,10076,10162,10249,10339,10426,10514,10596,10679,10769,10860,10912,10970,11015,11081,11145,11202,11259,11313,11370,11418,11467,11518,11552,11599,11648,11694,11726,11790,11852,11912,11969,12043,12113,12191,12245,12315,12400,12448,12494,12555,12618,12684,12748,12819,12882,12947,13011,13072,13133,13185,13258,13332,13401,13476,13550,13624,13765,13835,13888,13966,14056,14144,14240,14330,14912,15001,15248,15529,15781,16066,16459,16936,17158,17380,17656,17883,18113,18343,18573,18803,19030,19449,19675,20100,20330,20758,20977,21260,21468,21599,21826,22252,22477,22904,23125,23550,23670,23946,24247,24571,24862,25176,25313,25444,25549,25791,25958,26162,26370,26641,26753,26865,26970,27087,27301,27447,27587,27673,28021,28109,28355,28773,29022,29104,29202,29859,29959,30211,30635,30890,30984,31073,31310,33334,33576,33678,33931,36087,46768,48284,58979,60507,62264,62890,63310,64571,65836,66092,66328,66875,67369,67974,68172,68752,70120,70495,70613,71151,71308,71504,71777,72033,72203,72344,72408,72773,73140,73816,74080,74418,74771,74865,75051,75357,75619,75744,75871,76110,76321,76440,76633,76810,77265,77446,77568,77827,77940,78127,78229,78336,78465,78740,79248,79744,80621,80915,81485,81634,82366,82538,82622,82958,83050,83328,88559,93930,93992,94570,95154,95245,95358,95587,95747,95899,96070,96236,96405,96572,96735,96978,97148,97321,97492,97766,97965,98170,98500,98584,98680,98776,98874,98974,99076,99178,99280,99382,99484,99584,99680,99792,99921,100044,100175,100306,100404,100518,100612,100752,100886,100982,101094,101194,101310,101406,101518,101618,101758,101894,102058,102188,102346,102496,102637,102781,102916,103028,103178,103306,103434,103570,103702,103832,103962,104074,104214,104360,104504,104642,104708,104798,104874,104978,105068,105170,105278,105386,105486,105566,105658,105756,105866,105918,105996,106102,106194,106298,106408,106530,106693,106850,106930,107030,107120,107230,107320,107561,107655,107761,107853,107953,108065,108179,108295,108411,108505,108619,108731,108833,108953,109075,109157,109261,109381,109507,109605,109699,109787,109899,110015,110137,110249,110424,110540,110626,110718,110830,110954,111021,111147,111215,111343,111487,111615,111684,111779,111894,112007,112106,112215,112326,112437,112538,112643,112743,112873,112964,113087,113181,113293,113379,113483,113579,113667,113785,113889,113993,114119,114207,114315,114415,114505,114615,114699,114801,114885,114939,115003,115109,115195,115305,115389,115509,118125,118243,118358,118438,118799,119032,119549,119627,120971,122332,122720,125563,135616,135751,137121,138478,139050,139801,140063,140263,140642,144920,145526,145755,145906,146121,147516,150542,151286,153417,153757,155068,155271" + }, + "to": { + "startLines": "137,227,230,574,627,628,630,631,632,633,634,635,636,639,640,641,642,643,644,645,646,647,648,649,650,701,702,703,704,705,706,707,708,709,710,885,886,887,888,889,890,891,892,893,894,895,896,953,954,955,956,957,958,959,960,961,962,963,964,965,966,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1122,1123,1127,1128,1129,1130,1131,1132,1133,1775,1776,1777,1778,1779,1780,1781,1782,1820,1821,1822,1823,1827,1850,1851,1860,1895,1903,1904,1907,1908,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2487,2547,2548,2549,2550,2551,2581,2589,2590,2594,2598,2609,2614,2643,2650,2654,2658,2663,2667,2671,2675,2679,2683,2687,2693,2697,2703,2707,2713,2717,2722,2726,2729,2733,2739,2743,2749,2753,2759,2762,2766,2770,2774,2778,2782,2783,2784,2785,2788,2791,2794,2797,2801,2802,2803,2804,2845,2848,2850,2852,2854,2859,2860,2864,2870,2874,2875,2877,2889,2890,2894,2900,2904,2981,2982,2986,3013,3017,3018,3022,4824,4996,5022,5193,5219,5250,5258,5264,5280,5302,5307,5312,5322,5331,5340,5344,5351,5370,5377,5378,5387,5390,5393,5397,5401,5405,5408,5409,5414,5419,5429,5434,5441,5447,5448,5451,5455,5460,5462,5464,5467,5470,5472,5476,5479,5486,5489,5492,5496,5498,5502,5504,5506,5508,5512,5520,5528,5540,5546,5555,5558,5569,5572,5573,5578,5579,6059,6128,6202,6203,6213,6222,6223,6225,6229,6232,6235,6238,6241,6244,6247,6250,6254,6257,6260,6263,6267,6270,6274,6422,6423,6424,6425,6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6444,6446,6447,6448,6449,6450,6451,6452,6453,6455,6456,6458,6459,6461,6463,6464,6466,6467,6468,6469,6470,6471,6473,6474,6475,6476,6477,6762,6764,6766,6802,6803,6804,6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6816,6817,6818,6819,6820,6821,6822,6824,6828,7007,7008,7009,7010,7011,7012,7016,7017,7018,7559,7561,7563,7565,7567,7569,7570,7571,7572,7574,7576,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7592,7593,7594,7595,7597,7599,7600,7602,7603,7605,7607,7609,7610,7611,7612,7613,7614,7615,7616,7617,7618,7619,7620,7622,7623,7624,7625,7627,7628,7629,7630,7631,7633,7635,7637,7639,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,9713,9788,9791,9794,9797,9811,9817,9933,9936,9965,9992,10001,10065,10675,10725,11047,11776,12247,12271,12311,12671,12692,12816,13138,13144,13171,13426,13465,13636,13963,14108,14120,14149", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "6941,11486,11639,29595,31778,31833,31957,32021,32091,32152,32227,32303,32380,32618,32703,32785,32861,32937,33014,33092,33198,33304,33383,33463,33520,37109,37183,37258,37323,37389,37449,37510,37582,37655,37722,51048,51107,51166,51225,51284,51343,51397,51451,51504,51558,51612,51666,56058,56132,56211,56284,56358,56429,56501,56573,56646,56703,56761,56834,56908,56982,57504,57576,57649,57719,57790,57850,57911,57980,58049,58119,58193,58269,58333,58410,58486,58563,58628,58697,58774,58849,58918,58986,59063,59129,59190,59287,59352,59421,59520,59591,59650,59708,59765,59824,59888,59959,60031,60103,60175,60247,60314,60382,60450,60509,60572,60636,60726,60817,60877,60943,61010,61076,61146,61210,61263,61330,61391,61458,61571,61629,61692,61757,61822,61897,61970,62042,62086,62133,62179,62228,62289,62350,62411,62473,62537,62601,62665,62730,62793,62853,62914,62980,63039,63099,63161,63232,63292,67290,67376,67626,67716,67803,67891,67973,68056,68146,118715,118767,118825,118870,118936,119000,119057,119114,121568,121625,121673,121722,121917,123166,123213,123646,125463,125859,125923,126113,126173,130890,130964,131034,131112,131166,131236,131321,131369,131415,131476,131539,131605,131669,131740,131803,131868,131932,131993,132054,132106,132179,132253,132322,132397,132471,132545,132686,181454,186272,186350,186440,186528,186624,188433,189015,189104,189351,189632,190298,190583,192392,192869,193091,193313,193589,193816,194046,194276,194506,194736,194963,195382,195608,196033,196263,196691,196910,197193,197401,197532,197759,198185,198410,198837,199058,199483,199603,199879,200180,200504,200795,201109,201246,201377,201482,201724,201891,202095,202303,202574,202686,202798,202903,204996,205210,205356,205496,205582,205930,206018,206264,206682,206931,207013,207111,207768,207868,208120,208544,208799,214689,214778,215015,217039,217281,217383,217636,353205,363886,365402,376097,377625,379382,380008,380428,381689,382954,383210,383446,383993,384487,385092,385290,385870,387238,387613,387731,388269,388426,388622,388895,389151,389321,389462,389526,389891,390258,390934,391198,391536,391889,391983,392169,392475,392737,392862,392989,393228,393439,393558,393751,393928,394383,394564,394686,394945,395058,395245,395347,395454,395583,395858,396366,396862,397739,398033,398603,398752,399484,399656,399740,400076,400168,430906,436137,441852,441914,442492,443076,443167,443280,443509,443669,443821,443992,444158,444327,444494,444657,444900,445070,445243,445414,445688,445887,446092,455458,455542,455638,455734,455832,455932,456034,456136,456238,456340,456442,456542,456638,456750,456879,457002,457133,457264,457362,457476,457570,457710,457844,457940,458052,458152,458268,458364,458476,458576,458716,458852,459016,459146,459304,459454,459595,459739,459874,459986,460136,460264,460392,460528,460660,460790,460920,461032,478690,478836,478980,481048,481114,481204,481280,481384,481474,481576,481684,481792,481892,481972,482064,482162,482272,482324,482402,482508,482600,482704,482814,482936,483099,496584,496664,496764,496854,496964,497054,497295,497389,497495,537374,537474,537586,537700,537816,537932,538026,538140,538252,538354,538474,538596,538678,538782,538902,539028,539126,539220,539308,539420,539536,539658,539770,539945,540061,540147,540239,540351,540475,540542,540668,540736,540864,541008,541136,541205,541300,541415,541528,541627,541736,541847,541958,542059,542164,542264,542394,542485,542608,542702,542814,542900,543004,543100,543188,543306,543410,543514,543640,543728,543836,543936,544026,544136,544220,544322,544406,544460,544524,544630,544716,544826,544910,679055,681671,681789,681904,681984,682345,682578,687156,687234,688578,689939,690327,693170,712269,714496,725290,755803,773225,773976,775537,789124,789503,793781,805801,806030,806762,815592,816712,823244,835897,840963,841303,842724", + "endLines": "137,227,230,574,627,628,630,631,632,633,634,635,636,639,640,641,642,643,644,645,646,647,648,649,650,701,702,703,704,705,706,707,708,709,710,885,886,887,888,889,890,891,892,893,894,895,896,953,954,955,956,957,958,959,960,961,962,963,964,965,966,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1122,1123,1127,1128,1129,1130,1131,1132,1133,1775,1776,1777,1778,1779,1780,1781,1782,1820,1821,1822,1823,1827,1850,1851,1860,1895,1903,1904,1907,1908,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2487,2547,2548,2549,2550,2551,2588,2589,2593,2597,2601,2613,2619,2649,2653,2657,2662,2666,2670,2674,2678,2682,2686,2692,2696,2702,2706,2712,2716,2721,2725,2728,2732,2738,2742,2748,2752,2758,2761,2765,2769,2773,2777,2781,2782,2783,2784,2787,2790,2793,2796,2800,2801,2802,2803,2804,2847,2849,2851,2853,2858,2859,2863,2869,2873,2874,2876,2888,2889,2893,2899,2903,2904,2981,2985,3012,3016,3017,3021,3049,4995,5021,5192,5218,5249,5257,5263,5279,5301,5306,5311,5321,5330,5339,5343,5350,5369,5376,5377,5386,5389,5392,5396,5400,5404,5407,5408,5413,5418,5428,5433,5440,5446,5447,5450,5454,5459,5461,5463,5466,5469,5471,5475,5478,5485,5488,5491,5495,5497,5501,5503,5505,5507,5511,5519,5527,5539,5545,5554,5557,5568,5571,5572,5577,5578,5583,6127,6197,6202,6212,6221,6222,6224,6228,6231,6234,6237,6240,6243,6246,6249,6253,6256,6259,6262,6266,6269,6273,6277,6422,6423,6424,6425,6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6443,6445,6446,6447,6448,6449,6450,6451,6452,6454,6455,6457,6458,6460,6462,6463,6465,6466,6467,6468,6469,6470,6472,6473,6474,6475,6476,6477,6763,6765,6767,6802,6803,6804,6805,6806,6807,6808,6809,6810,6811,6812,6813,6815,6816,6817,6818,6819,6820,6821,6823,6827,6831,7007,7008,7009,7010,7011,7015,7016,7017,7018,7560,7562,7564,7566,7568,7569,7570,7571,7573,7575,7577,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7591,7592,7593,7594,7596,7598,7599,7601,7602,7604,7606,7608,7609,7610,7611,7612,7613,7614,7615,7616,7617,7618,7619,7621,7622,7623,7624,7626,7627,7628,7629,7630,7632,7634,7636,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,9787,9790,9793,9796,9810,9816,9826,9935,9964,9991,10000,10064,10427,10678,10752,11074,11793,12270,12276,12316,12691,12815,12835,13143,13147,13176,13437,13530,13655,14017,14119,14145,14155", + "endColumns": "54,44,48,40,54,61,63,69,60,74,75,76,77,84,81,75,75,76,77,105,105,78,79,56,57,73,74,64,65,59,60,71,72,66,67,58,58,58,58,58,53,53,52,53,53,53,53,73,78,72,73,70,71,71,72,56,57,72,73,73,74,71,72,69,70,59,60,68,68,69,73,75,63,76,75,76,64,68,76,74,68,67,76,65,60,96,64,68,98,70,58,57,56,58,63,70,71,71,71,71,66,67,67,58,62,63,89,90,59,65,66,65,69,63,52,66,60,66,112,57,62,64,64,74,72,71,43,46,45,48,60,60,60,61,63,63,63,64,62,59,60,65,58,59,61,70,59,67,85,86,89,86,87,81,82,89,90,51,57,44,65,63,56,56,53,56,47,48,50,33,46,48,45,31,63,61,59,56,73,69,77,53,69,84,47,45,60,62,65,63,70,62,64,63,60,60,51,72,73,68,74,73,73,140,69,52,77,89,87,95,89,12,88,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,136,130,104,12,12,12,12,12,111,111,104,116,12,12,12,12,12,87,12,12,12,81,12,12,99,12,12,12,93,88,12,12,12,101,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,117,12,12,12,12,12,12,12,63,12,12,12,12,12,12,93,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,12,91,12,12,12,61,12,12,90,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,95,95,97,99,101,101,101,101,101,99,95,111,128,122,130,130,97,113,93,12,12,95,111,99,115,95,111,99,12,135,12,129,12,12,140,12,134,111,149,127,127,12,131,129,129,111,139,12,12,12,65,89,75,103,89,101,107,107,99,79,91,97,12,51,77,105,91,103,109,12,12,12,79,99,89,109,89,12,93,105,91,12,12,12,12,12,93,113,111,12,12,12,81,103,119,125,97,93,87,111,115,121,111,12,115,85,91,12,12,66,12,67,12,12,12,68,94,114,112,98,108,110,110,100,104,99,12,90,122,93,12,85,103,95,87,12,12,12,12,87,107,99,89,109,83,101,83,53,63,105,85,109,83,119,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24", + "endOffsets": "6991,11526,11683,29631,31828,31890,32016,32086,32147,32222,32298,32375,32453,32698,32780,32856,32932,33009,33087,33193,33299,33378,33458,33515,33573,37178,37253,37318,37384,37444,37505,37577,37650,37717,37785,51102,51161,51220,51279,51338,51392,51446,51499,51553,51607,51661,51715,56127,56206,56279,56353,56424,56496,56568,56641,56698,56756,56829,56903,56977,57052,57571,57644,57714,57785,57845,57906,57975,58044,58114,58188,58264,58328,58405,58481,58558,58623,58692,58769,58844,58913,58981,59058,59124,59185,59282,59347,59416,59515,59586,59645,59703,59760,59819,59883,59954,60026,60098,60170,60242,60309,60377,60445,60504,60567,60631,60721,60812,60872,60938,61005,61071,61141,61205,61258,61325,61386,61453,61566,61624,61687,61752,61817,61892,61965,62037,62081,62128,62174,62223,62284,62345,62406,62468,62532,62596,62660,62725,62788,62848,62909,62975,63034,63094,63156,63227,63287,63355,67371,67458,67711,67798,67886,67968,68051,68141,68232,118762,118820,118865,118931,118995,119052,119109,119163,121620,121668,121717,121768,121946,123208,123257,123687,125490,125918,125980,126168,126225,130959,131029,131107,131161,131231,131316,131364,131410,131471,131534,131600,131664,131735,131798,131863,131927,131988,132049,132101,132174,132248,132317,132392,132466,132540,132681,132751,181502,186345,186435,186523,186619,186709,189010,189099,189346,189627,189879,190578,190971,192864,193086,193308,193584,193811,194041,194271,194501,194731,194958,195377,195603,196028,196258,196686,196905,197188,197396,197527,197754,198180,198405,198832,199053,199478,199598,199874,200175,200499,200790,201104,201241,201372,201477,201719,201886,202090,202298,202569,202681,202793,202898,203015,205205,205351,205491,205577,205925,206013,206259,206677,206926,207008,207106,207763,207863,208115,208539,208794,208888,214773,215010,217034,217276,217378,217631,219787,363881,365397,376092,377620,379377,380003,380423,381684,382949,383205,383441,383988,384482,385087,385285,385865,387233,387608,387726,388264,388421,388617,388890,389146,389316,389457,389521,389886,390253,390929,391193,391531,391884,391978,392164,392470,392732,392857,392984,393223,393434,393553,393746,393923,394378,394559,394681,394940,395053,395240,395342,395449,395578,395853,396361,396857,397734,398028,398598,398747,399479,399651,399735,400071,400163,400441,436132,441503,441909,442487,443071,443162,443275,443504,443664,443816,443987,444153,444322,444489,444652,444895,445065,445238,445409,445683,445882,446087,446417,455537,455633,455729,455827,455927,456029,456131,456233,456335,456437,456537,456633,456745,456874,456997,457128,457259,457357,457471,457565,457705,457839,457935,458047,458147,458263,458359,458471,458571,458711,458847,459011,459141,459299,459449,459590,459734,459869,459981,460131,460259,460387,460523,460655,460785,460915,461027,461167,478831,478975,479113,481109,481199,481275,481379,481469,481571,481679,481787,481887,481967,482059,482157,482267,482319,482397,482503,482595,482699,482809,482931,483094,483251,496659,496759,496849,496959,497049,497290,497384,497490,497582,537469,537581,537695,537811,537927,538021,538135,538247,538349,538469,538591,538673,538777,538897,539023,539121,539215,539303,539415,539531,539653,539765,539940,540056,540142,540234,540346,540470,540537,540663,540731,540859,541003,541131,541200,541295,541410,541523,541622,541731,541842,541953,542054,542159,542259,542389,542480,542603,542697,542809,542895,542999,543095,543183,543301,543405,543509,543635,543723,543831,543931,544021,544131,544215,544317,544401,544455,544519,544625,544711,544821,544905,545025,681666,681784,681899,681979,682340,682573,683090,687229,688573,689934,690322,693165,703218,712399,715861,726642,756370,773971,774233,775732,789498,793776,794382,806025,806176,806972,815899,819733,823983,838023,841298,842609,842922" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/eb0c45dedd1b15a9e37e22fcf0bd537e/transformed/constraintlayout-2.2.0/res/values/values.xml", + "from": { + "startLines": "2,9,10,15,16,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,42,43,44,45,55,63,64,65,70,71,76,81,82,83,88,89,94,95,100,101,102,108,109,110,115,121,122,123,124,130,131,132,133,136,139,142,143,146,149,150,151,152,153,156,159,160,161,162,168,173,176,179,180,181,186,187,188,191,194,195,198,201,204,207,208,209,212,215,216,221,222,228,233,236,239,240,241,242,243,244,245,246,247,248,249,250,266,272,273,274,275,276,283,291,292,293,296,301,302,310,311,312,313,314,315,316,317,326,327,328,334,335,341,345,346,347,348,349,358,362,363,382,547,675,681,685,834,980,993,1009,1025,1050,1073,1076,1079,1082,1110,1137,1154,1240,1248,1261,1277,1281,1311,1324,1328,1338,1348,1392,1404,1408,1411,1427,1464,1499,1506,1523", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,339,395,581,642,933,985,1035,1088,1136,1187,1242,1302,1367,1426,1488,1540,1601,1663,1709,1842,1894,1944,1995,2402,2714,2759,2818,3015,3072,3267,3448,3502,3559,3751,3809,4005,4061,4255,4312,4363,4585,4637,4692,4882,5098,5148,5200,5256,5462,5523,5583,5653,5786,5917,6045,6113,6242,6368,6430,6493,6561,6628,6751,6876,6943,7008,7073,7362,7543,7664,7785,7851,7918,8128,8197,8263,8388,8514,8581,8707,8834,8959,9086,9142,9207,9333,9456,9521,9729,9796,10084,10264,10384,10504,10569,10631,10693,10757,10819,10878,10938,10999,11060,11119,11179,11839,12090,12141,12190,12238,12296,12588,12896,12943,13003,13109,13289,13343,13678,13732,13788,13834,13881,13932,13991,14043,14373,14432,14486,14724,14779,14981,15120,15166,15221,15266,15310,15658,15795,15836,16818,22936,28601,28976,29143,34373,40550,41247,42021,42772,43626,44496,44562,44641,44716,45550,46441,47260,51197,51602,52073,52864,53027,54388,54952,55105,55564,55982,57995,58291,58441,58561,59208,59951,61372,61725,62467", + "endLines": "8,9,14,15,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,41,42,43,44,54,62,63,64,69,70,75,80,81,82,87,88,93,94,99,100,101,107,108,109,114,120,121,122,123,129,130,131,132,135,138,141,142,145,148,149,150,151,152,155,158,159,160,161,167,172,175,178,179,180,185,186,187,190,193,194,197,200,203,206,207,208,211,214,215,220,221,227,232,235,238,239,240,241,242,243,244,245,246,247,248,249,265,271,272,273,274,275,282,290,291,292,295,300,301,309,310,311,312,313,314,315,316,325,326,327,333,334,340,344,345,346,347,348,357,361,362,363,546,674,680,684,833,979,992,1008,1024,1049,1072,1075,1078,1081,1109,1136,1153,1239,1247,1260,1276,1280,1310,1323,1327,1337,1347,1391,1403,1407,1410,1426,1463,1498,1505,1522,1525", + "endColumns": "11,55,11,60,11,51,49,52,47,50,54,59,64,58,61,51,60,61,45,11,51,49,50,11,11,44,58,11,56,11,11,53,56,11,57,11,55,11,56,50,11,51,54,11,11,49,51,55,11,60,59,69,11,11,11,67,11,11,61,62,67,66,11,11,66,64,64,11,11,11,11,65,66,11,68,65,11,11,66,11,11,11,11,55,64,11,11,64,11,66,11,11,11,11,64,61,61,63,61,58,59,60,60,58,59,11,11,50,48,47,57,11,11,46,59,11,11,53,11,53,55,45,46,50,58,51,11,58,53,11,54,11,11,45,54,44,43,11,11,40,44,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24", + "endOffsets": "334,390,576,637,928,980,1030,1083,1131,1182,1237,1297,1362,1421,1483,1535,1596,1658,1704,1837,1889,1939,1990,2397,2709,2754,2813,3010,3067,3262,3443,3497,3554,3746,3804,4000,4056,4250,4307,4358,4580,4632,4687,4877,5093,5143,5195,5251,5457,5518,5578,5648,5781,5912,6040,6108,6237,6363,6425,6488,6556,6623,6746,6871,6938,7003,7068,7357,7538,7659,7780,7846,7913,8123,8192,8258,8383,8509,8576,8702,8829,8954,9081,9137,9202,9328,9451,9516,9724,9791,10079,10259,10379,10499,10564,10626,10688,10752,10814,10873,10933,10994,11055,11114,11174,11834,12085,12136,12185,12233,12291,12583,12891,12938,12998,13104,13284,13338,13673,13727,13783,13829,13876,13927,13986,14038,14368,14427,14481,14719,14774,14976,15115,15161,15216,15261,15305,15653,15790,15831,15876,22931,28596,28971,29138,34368,40545,41242,42016,42767,43621,44491,44557,44636,44711,45545,46436,47255,51192,51597,52068,52859,53022,54383,54947,55100,55559,55977,57990,58286,58436,58556,59203,59946,61367,61720,62462,62563" + }, + "to": { + "startLines": "2,9,11,17,18,26,28,29,36,42,44,45,46,47,48,105,106,107,108,110,114,115,116,119,129,139,167,168,173,174,179,184,185,186,191,192,197,198,203,204,205,211,212,213,218,224,225,239,240,246,247,248,249,252,255,258,259,262,265,266,267,268,269,272,275,276,277,278,284,289,292,295,296,297,302,303,304,307,310,311,314,317,320,323,324,325,328,331,332,337,338,344,349,352,355,356,357,358,359,360,361,362,363,364,365,366,382,463,464,465,466,471,478,486,487,488,491,496,498,506,507,528,535,572,573,577,578,589,590,591,597,600,606,610,611,612,613,614,623,1835,1897,11075,11240,11368,11374,11378,11527,11763,11989,12005,12032,12057,12080,12083,12086,12089,12117,12144,12161,12836,12844,12857,12873,12877,12907,12920,12924,13084,13094,13148,13438,13462,13656,14029,14066,14101,14156,14173", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,434,546,781,842,1133,1240,1290,1692,1999,2119,2174,2234,2299,2358,5544,5596,5657,5719,5826,5959,6011,6061,6222,6629,7052,8994,9053,9250,9307,9502,9683,9737,9794,9986,10044,10240,10296,10490,10547,10598,10820,10872,10927,11117,11333,11383,12132,12188,12394,12455,12515,12585,12718,12849,12977,13045,13174,13300,13362,13425,13493,13560,13683,13808,13875,13940,14005,14294,14475,14596,14717,14783,14850,15060,15129,15195,15320,15446,15513,15639,15766,15891,16018,16074,16139,16265,16388,16453,16661,16728,17016,17196,17316,17436,17501,17563,17625,17689,17751,17810,17870,17931,17992,18051,18111,18771,23714,23765,23814,23862,24149,24441,24749,24796,24856,24962,25142,25254,25589,25643,26808,27155,29485,29536,29745,29797,30233,30292,30346,30584,30762,30964,31103,31149,31204,31249,31293,31641,122290,125543,726647,732765,738430,738805,738972,744202,755106,762681,763455,764800,765654,766524,766590,766669,766744,767578,768469,769288,794387,794792,795263,796054,796217,797578,798142,798295,803370,803788,806181,815904,816592,823988,838446,839189,840610,842927,843669", + "endLines": "8,9,15,17,25,26,28,29,36,42,44,45,46,47,48,105,106,107,108,113,114,115,116,128,136,139,167,172,173,178,183,184,185,190,191,196,197,202,203,204,210,211,212,217,223,224,225,239,245,246,247,248,251,254,257,258,261,264,265,266,267,268,271,274,275,276,277,283,288,291,294,295,296,301,302,303,306,309,310,313,316,319,322,323,324,327,330,331,336,337,343,348,351,354,355,356,357,358,359,360,361,362,363,364,365,381,387,463,464,465,466,477,485,486,487,490,495,496,505,506,507,528,535,572,573,577,586,589,590,596,597,605,609,610,611,612,613,622,626,1835,1897,11239,11367,11373,11377,11526,11672,11775,12004,12020,12056,12079,12082,12085,12088,12116,12143,12160,12246,12843,12856,12872,12876,12906,12919,12923,12933,13093,13137,13159,13441,13464,13671,14065,14100,14107,14172,14175", + "endColumns": "11,55,11,60,11,51,49,52,47,50,54,59,64,58,61,51,60,61,45,11,51,49,50,11,11,44,58,11,56,11,11,53,56,11,57,11,55,11,56,50,11,51,54,11,11,49,51,55,11,60,59,69,11,11,11,67,11,11,61,62,67,66,11,11,66,64,64,11,11,11,11,65,66,11,68,65,11,11,66,11,11,11,11,55,64,11,11,64,11,66,11,11,11,11,64,61,61,63,61,58,59,60,60,58,59,11,11,50,48,47,57,11,11,46,59,11,11,53,11,53,55,45,46,50,58,51,11,58,53,11,54,11,11,45,54,44,43,11,11,40,44,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24", + "endOffsets": "429,485,727,837,1128,1180,1285,1338,1735,2045,2169,2229,2294,2353,2415,5591,5652,5714,5760,5954,6006,6056,6107,6624,6936,7092,9048,9245,9302,9497,9678,9732,9789,9981,10039,10235,10291,10485,10542,10593,10815,10867,10922,11112,11328,11378,11430,12183,12389,12450,12510,12580,12713,12844,12972,13040,13169,13295,13357,13420,13488,13555,13678,13803,13870,13935,14000,14289,14470,14591,14712,14778,14845,15055,15124,15190,15315,15441,15508,15634,15761,15886,16013,16069,16134,16260,16383,16448,16656,16723,17011,17191,17311,17431,17496,17558,17620,17684,17746,17805,17865,17926,17987,18046,18106,18766,19017,23760,23809,23857,23915,24436,24744,24791,24851,24957,25137,25191,25584,25638,25694,26849,27197,29531,29590,29792,30122,30287,30341,30579,30634,30959,31098,31144,31199,31244,31288,31636,31773,122326,125583,732760,738425,738800,738967,744197,750374,755798,763450,764201,765649,766519,766585,766664,766739,767573,768464,769283,773220,794787,795258,796049,796212,797573,798137,798290,798749,803783,805796,806472,816049,816707,824630,839184,840605,840958,843664,843765" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/e38dc42c74688090728264f3b8aa0abf/transformed/play-services-cronet-18.1.0/res/values/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "166", + "endColumns": "122", + "endOffsets": "288" + }, + "to": { + "startLines": "1976", + "startColumns": "4", + "startOffsets": "130763", + "endColumns": "126", + "endOffsets": "130885" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/58ee233a1856e9cf66919dc5d41e769c/transformed/appcompat-resources-1.7.0/res/values/values.xml", + "from": { + "startLines": "2,18,24,34,50", + "startColumns": "4,4,4,4,4", + "startOffsets": "55,480,658,942,1353", + "endLines": "17,23,33,49,53", + "endColumns": "24,24,24,24,24", + "endOffsets": "475,653,937,1348,1475" + }, + "to": { + "startLines": "9827,9843,9849,13442,13458", + "startColumns": "4,4,4,4,4", + "startOffsets": "683095,683520,683698,816054,816465", + "endLines": "9842,9848,9858,13457,13461", + "endColumns": "24,24,24,24,24", + "endOffsets": "683515,683693,683977,816460,816587" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/f172499cfa40099dc033c56c71b66ddf/transformed/viewpager2-1.1.0-beta02/res/values/values.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endLines": "4", + "endColumns": "24", + "endOffsets": "160" + }, + "to": { + "startLines": "14146", + "startColumns": "4", + "startOffsets": "842614", + "endLines": "14148", + "endColumns": "24", + "endOffsets": "842719" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/2e296852593701edd20e274ff098f368/transformed/savedstate-1.2.1/res/values/values.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "53", + "endOffsets": "104" + }, + "to": { + "startLines": "1900", + "startColumns": "4", + "startOffsets": "125691", + "endColumns": "53", + "endOffsets": "125740" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values/ids.xml", + "from": { + "startLines": "3,4,2", + "startColumns": "4,4,4", + "startOffsets": "104,151,55", + "endColumns": "46,52,48", + "endOffsets": "146,199,99" + }, + "to": { + "startLines": "1869,1870,1871", + "startColumns": "4,4,4", + "startOffsets": "124162,124208,124260", + "endColumns": "45,51,47", + "endOffsets": "124203,124255,124303" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values/values.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1358,1361,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1422,1423,1424,1425,1426,1430,1434,1438,1442,1443,1447,1455,1462,1470,1473,1483,1492,1501,1510,1511,1512,1513,1519,1520,1521,1522,1523,1524,1530,1531,1532,1533,1534,1539,1540,1544,1545,1551,1555,1556,1557,1558,1568,1569,1570,1574,1575,1581,1585,1586,1589,1590,1595,1596,1599,1600,1601,1602,1866,1873,2134,2140,2404,2411,2672,2678,2741,2823,2875,2957,3019,3101,3165,3217,3299,3307,3313,3324,3328,3332,3345,3360,3376,3383,3389,3406,3419,3439,3456,3465,3470,3477,3497,3510,3527,3533,3539,3546,3550,3556,3570,3573,3583,3584,3585,3633,3637,3641,3645,3646,3647,3650,3666,3673,3687,3732,3733,3739,3743,3747,3752,3759,3765,3766,3769,3773,3778,3791,3795,3800,3805,3810,3813,3816,3819,3823,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3853,3857,3861,3865,3869,3873,3877,3878,3879,3880,3881,3882,3883,3884,3888,3892,3893,3897,3898,3901,3905,3908,3911,3914,3918,3921,3924,3928,3932,3936,3940,3943,3944,3945,3946,3949,3953,3956,3959,3962,3965,3968,3971,3975,3978,3979,3982,3985,3986,3989,3990,3991,3995,3996,4001,4008,4015,4022,4029,4036,4043,4050,4057,4064,4073,4082,4091,4098,4107,4116,4119,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,4138,4143,4148,4151,4152,4153,4154,4155,4163,4171,4172,4180,4184,4192,4200,4208,4216,4224,4225,4233,4241,4242,4245,4248,4250,4255,4257,4262,4266,4270,4271,4272,4273,4277,4281,4282,4286,4287,4288,4289,4290,4291,4292,4293,4294,4295,4296,4300,4301,4302,4303,4307,4308,4309,4310,4314,4318,4319,4323,4324,4325,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4347,4348,4349,4350,4354,4355,4356,4362,4363,4367,4369,4370,4375,4376,4377,4378,4379,4380,4384,4385,4386,4392,4393,4397,4399,4403,4407,4411,4415,4416,4417,4418,4421,4424,4427,4430,4433,4438,4442,4445,4446,4451,4455,4460,4466,4472,4477,4481,4486,4490,4494,4535,4536,4537,4538,4539,4543,4544,4545,4546,4550,4554,4558,4562,4566,4570,4574,4578,4584,4585,4626,4640,4645,4671,4678,4681,4692,4697,4700,4703,4758,4764,4765,4768,4771,4774,4777,4780,4783,4786,4790,4793,4794,4795,4803,4811,4814,4819,4824,4829,4834,4838,4842,4843,4851,4852,4853,4854,4855,4863,4868,4873,4874,4875,4876,4901,4907,4912,4915,4919,4922,4926,4936,4939,4944,4947,4951,4955,4963,4977,4990,4994,5009,5020,5023,5034,5039,5043,5078,5079,5080,5092,5100,5108,5116,5124,5144,5147,5174,5179,5199,5202,5205,5212,5225,5234,5237,5257,5267,5271,5275,5288,5292,5296,5300,5306,5310,5327,5335,5339,5343,5347,5350,5354,5358,5362,5372,5379,5386,5390,5416,5426,5451,5460,5480,5490,5494,5504,5529,5539,5542,5549,5556,5563,5564,5565,5566,5567,5574,5578,5584,5590,5591,5604,5605,5606,5609,5612,5615,5618,5621,5624,5627,5630,5633,5636,5639,5642,5645,5648,5651,5654,5657,5660,5663,5666,5669,5670,5678,5686,5687,5700,5710,5714,5719,5724,5728,5731,5735,5739,5742,5746,5749,5753,5758,5763,5766,5773,5777,5781,5790,5795,5800,5801,5805,5808,5812,5825,5830,5838,5842,5846,5863,5867,5872,5890,5897,5901,5931,5934,5937,5940,5943,5946,5949,5968,5974,5982,5989,6001,6009,6014,6022,6026,6044,6051,6067,6071,6079,6082,6087,6088,6089,6090,6094,6098,6102,6106,6141,6144,6148,6152,6186,6189,6193,6197,6206,6212,6215,6225,6229,6230,6237,6241,6248,6249,6250,6253,6258,6263,6264,6268,6283,6302,6306,6307,6319,6329,6330,6342,6347,6371,6374,6380,6383,6392,6400,6404,6407,6410,6413,6417,6420,6437,6441,6444,6459,6462,6470,6475,6482,6487,6488,6493,6494,6500,6506,6512,6544,6555,6572,6579,6583,6586,6599,6608,6612,6617,6621,6625,6629,6633,6637,6641,6645,6650,6653,6665,6670,6679,6682,6689,6690,6694,6703,6709,6713,6714,6718,6739,6745,6749,6753,6754,6772,6773,6774,6775,6776,6781,6784,6785,6791,6792,6804,6816,6823,6824,6829,6834,6835,6839,6853,6858,6864,6870,6876,6881,6887,6893,6894,6900,6915,6920,6929,6938,6941,6955,6960,6971,6975,6984,6993,6994,7001,7009,7026,7036,7083,7150,7203,7260,7272,7339,7448,7468,7489,7495,7503,7609,7623,7646,7652,7696,7700,7706,7712,7723,7757,7764,7772,7787,7843,7854,7867,7879,7917,7964,7970,7982,7988,7994,8046,8051,8056,8063,8098,8110,8156,8185,8248,8253,8259,8262,8266,8320,8358,8376,8394,8461,8469,8493,8497,8505,8598,8602,8881,8889,8900,8901,8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917,8918,8919,8920,8921,8922,8923,8924,8925,8926,8927,8928,8929,8930,8931,8932,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,8944,8945,8946,8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962,8963,8964,8965,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977,8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022,9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039,9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055,9056,9057,9058,9059,9060,9061,9062,9063,9064,9065,9066,9067,9068,9069,9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085,9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101,9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117,9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133,9134,9135,9136,9137,9138,9139,9140,9141,9142,9143,9144,9145,9146,9147,9148,9149,9150,9151,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163,9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,9176,9177,9178,9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194,9195,9196,9197,9198,9199,9200,9201,9202,9203,9204,9205,9206,9207,9208,9209,9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,9263,9264,9265,9266,9267,9268,9269,9270,9271,9272,9273,9274", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,206,255,310,366,426,487,552,607,657,707,760,818,866,935,983,1054,1126,1198,1271,1338,1387,1441,1478,1529,1589,1636,1692,1741,1799,1853,1914,1970,2021,2081,2137,2200,2249,2305,2361,2411,2470,2525,2587,2634,2688,2744,2796,2851,2905,2959,3013,3062,3120,3174,3231,3287,3334,3387,3443,3503,3566,3625,3687,3737,3791,3845,3893,3950,4003,4059,4113,4169,4232,4294,4350,4410,4463,4524,4603,4684,4756,4835,4915,4991,5069,5138,5214,5291,5362,5435,5511,5589,5658,5734,5811,5875,5946,6018,6069,6122,6177,6244,6297,6349,6399,6457,6522,6570,6621,6688,6754,6812,6881,6939,7008,7078,7151,7225,7293,7360,7430,7496,7569,7629,7705,7765,7825,7900,7968,8034,8102,8162,8221,8278,8344,8406,8463,8531,8604,8674,8736,8797,8865,8927,8997,9066,9122,9181,9243,9305,9372,9429,9490,9551,9612,9673,9729,9785,9841,9897,9955,10013,10071,10129,10186,10243,10300,10357,10416,10475,10533,10616,10699,10772,10826,10895,10951,11032,11113,11184,11313,11366,11424,11482,11540,11586,11646,11700,11770,11840,11905,11971,12036,12104,12173,12241,12371,12424,12483,12541,12593,12643,12695,12741,12791,12847,12894,12952,13010,13072,13135,13197,13256,13316,13381,13447,13512,13574,13636,13698,13760,13822,13884,13950,14017,14083,14146,14210,14273,14341,14402,14464,14526,14589,14653,14716,14780,14858,14917,14983,15063,15124,15177,15235,15286,15331,15392,15456,15515,15577,15651,15722,15788,15862,15931,16002,16075,16146,16214,16287,16363,16433,16511,16579,16645,16706,16775,16839,16905,16973,17039,17102,17170,17241,17306,17379,17442,17523,17587,17653,17723,17793,17863,17933,18000,18057,18115,18174,18234,18293,18352,18411,18470,18529,18588,18647,18706,18765,18824,18884,18945,19007,19068,19129,19190,19251,19312,19373,19433,19494,19555,19615,19676,19737,19798,19859,19920,19981,20042,20103,20164,20225,20286,20354,20423,20493,20562,20631,20700,20769,20838,20907,20976,21045,21114,21183,21243,21304,21366,21427,21488,21549,21610,21671,21732,21793,21854,21915,21976,22038,22101,22165,22228,22291,22354,22417,22480,22543,22606,22669,22732,22795,22856,22918,22981,23043,23105,23167,23229,23291,23353,23415,23477,23539,23601,23658,23744,23824,23914,24009,24101,24193,24283,24366,24459,24546,24643,24734,24835,24922,25025,25114,25213,25305,25405,25489,25583,25671,25769,25852,25943,26037,26136,26238,26336,26436,26523,26623,26709,26805,26893,26974,27065,27161,27254,27347,27438,27523,27617,27706,27804,27897,27999,28087,28191,28282,28382,28475,28576,28661,28756,28845,28944,29029,29121,29216,29316,29419,29518,29621,29710,29811,29898,29995,30083,30179,30271,30371,30461,30559,30644,30733,30822,30915,31002,31093,31159,31235,31304,31383,31456,31536,31616,31693,31761,31839,31915,31986,32067,32140,32223,32298,32383,32456,32537,32618,32692,32776,32846,32924,32994,33074,33152,33224,33306,33376,33453,33533,33618,33706,33790,33877,33951,34029,34107,34178,34259,34350,34433,34529,34627,34734,34799,34865,34918,34994,35060,35147,35223,35299,35364,35419,35473,35552,35630,35703,35768,35831,35897,35968,36039,36109,36171,36240,36306,36366,36433,36500,36556,36607,36660,36712,36766,36837,36900,36959,37021,37080,37153,37220,37290,37350,37413,37488,37560,37656,37727,37783,37854,37911,37968,38034,38098,38169,38226,38279,38342,38394,38452,38519,38588,38654,38713,38796,38855,38912,38979,39049,39123,39185,39254,39324,39423,39520,39619,39705,39791,39872,39947,40036,40127,40211,40270,40316,40382,40439,40506,40563,40645,40710,40776,40899,40983,41104,41169,41231,41329,41403,41486,41575,41639,41718,41792,41854,41950,42015,42074,42130,42186,42246,42353,42400,42460,42521,42585,42646,42706,42764,42807,42856,42908,42959,43011,43060,43109,43174,43240,43300,43361,43417,43476,43525,43573,43631,43688,43790,43847,43922,43970,44021,44083,44148,44200,44274,44337,44400,44468,44518,44580,44640,44697,44757,44806,44874,44980,45082,45151,45222,45278,45327,45427,45498,45608,45699,45781,45879,45935,46036,46146,46245,46308,46414,46491,46603,46730,46842,46969,47039,47153,47284,47381,47449,47567,47670,47788,47849,47923,47990,48095,48217,48291,48358,48468,48567,48640,48737,48859,48977,49095,49156,49278,49395,49463,49569,49671,49751,49822,49918,49985,50059,50133,50219,50309,50387,50464,50564,50635,50756,50877,50941,51066,51140,51264,51388,51455,51564,51692,51804,51883,51961,52062,52133,52255,52377,52442,52568,52680,52786,52854,52953,53057,53120,53186,53270,53383,53496,53614,53692,53764,53900,54036,54121,54261,54399,54537,54679,54761,54847,54924,54997,55106,55217,55345,55473,55605,55735,55865,55999,56088,56150,56246,56313,56430,56551,56648,56730,56817,56904,57035,57166,57301,57378,57455,57566,57680,57754,57863,57975,58042,58115,58180,58282,58378,58482,58550,58615,58709,58781,58891,58997,59070,59161,59263,59366,59461,59568,59673,59795,59917,60043,60102,60160,60284,60408,60536,60654,60772,60894,60980,61077,61211,61345,61425,61563,61695,61827,61963,62038,62114,62217,62291,62404,62485,62542,62603,62662,62722,62780,62841,62899,62949,62998,63065,63124,63183,63232,63303,63387,63457,63528,63608,63677,63740,63808,63874,63942,64007,64073,64150,64228,64334,64440,64536,64665,64754,64881,64947,65017,65103,65169,65252,65326,65424,65520,65616,65714,65823,65918,66007,66069,66129,66194,66251,66332,66386,66443,66540,66650,66711,66826,66947,67042,67134,67227,67283,67342,67391,67483,67532,67586,67640,67694,67748,67802,67857,67967,68077,68185,68295,68405,68515,68625,68733,68839,68943,69047,69151,69246,69341,69434,69527,69631,69737,69841,69945,70038,70131,70224,70317,70425,70531,70637,70743,70840,70935,71030,71125,71231,71337,71443,71549,71647,71742,71838,71935,72000,72104,72162,72226,72287,72349,72409,72474,72536,72604,72662,72725,72788,72855,72930,73003,73069,73121,73174,73226,73283,73367,73462,73547,73628,73708,73785,73864,73941,74015,74089,74160,74240,74312,74387,74452,74513,74573,74648,74722,74795,74865,74937,75007,75080,75144,75214,75260,75329,75381,75466,75549,75606,75672,75739,75805,75886,75961,76017,76070,76131,76189,76239,76288,76337,76386,76448,76500,76545,76626,76677,76731,76784,76838,76889,76938,77004,77055,77116,77177,77239,77289,77330,77407,77466,77525,77584,77645,77701,77757,77824,77885,77950,78005,78070,78139,78207,78285,78354,78414,78485,78559,78624,78696,78766,78833,78917,78986,79053,79123,79186,79253,79321,79404,79483,79573,79650,79718,79785,79863,79920,79977,80045,80111,80167,80227,80286,80340,80390,80440,80488,80550,80601,80674,80754,80834,80898,80965,81036,81094,81155,81221,81280,81347,81407,81467,81530,81598,81659,81726,81804,81874,81923,81980,82049,82110,82198,82286,82374,82462,82549,82636,82723,82810,82868,82942,83012,83068,83139,83204,83266,83341,83414,83504,83570,83636,83697,83761,83823,83881,83952,84035,84094,84165,84231,84296,84357,84416,84487,84553,84618,84701,84777,84852,84933,84993,85062,85132,85201,85256,85312,85368,85429,85487,85543,85602,85656,85711,85773,85830,85924,85993,86094,86145,86215,86278,86334,86392,86451,86505,86591,86675,86745,86814,86884,86999,87120,87187,87254,87329,87396,87455,87509,87563,87617,87670,87722,87796,87933,88073,88122,88172,88222,88270,88326,88384,88446,88501,88559,88630,88694,88753,88815,88881,88947,88990,89034,89079,89122,89173,89220,89265,89316,89367,89418,89469,89517,89583,89645,89708,89780,89837,89891,89946,90004,90059,90118,90174,90243,90312,90381,90451,90514,90577,90640,90703,90768,90833,90898,90963,91026,91090,91154,91218,91269,91347,91425,91496,91568,91641,91713,91779,91845,91913,91981,92047,92114,92188,92251,92308,92368,92433,92500,92565,92622,92683,92741,92845,92955,93064,93168,93246,93311,93378,93444,93514,93561,93613,93663,93720,94040,94190,94321,94505,94683,94921,95110,95279,95377,95492,95577,95656,95816,95881,95970,96127,96284,96437,96591,96650,96837,96933,97023,97119,97209,97375,97498,97621,97791,97897,98012,98127,98229,98335,98452,98567,98649,98822,98990,99138,99297,99452,99625,99742,99859,100027,100139,100253,100425,100601,100759,100892,101004,101150,101302,101434,101577,101699,101877,102013,102109,102245,102340,102507,102600,102692,102879,103035,103213,103377,103559,103876,104058,104240,104430,104662,104852,105029,105191,105348,105458,105641,105778,105982,106166,106350,106510,106668,106852,107079,107282,107453,107673,107895,108050,108250,108434,108537,108727,108868,109033,109204,109404,109608,109810,109975,110180,110379,110578,110775,110866,111015,111165,111249,111398,111543,111695,111836,112002,112163,112241,112542,112708,112863,112965,113123,113287,113473,113696,113821,114098,114370,114648,114893,114955,115240,115691,116147,116656,116804,117318,117755,118189,118632,118717,118838,118937,119342,119439,119556,119643,119766,119867,120273,120372,120491,120584,120691,121034,121141,121386,121507,121916,122164,122264,122369,122488,122997,123144,123263,123514,123647,124062,124316,124428,124675,124800,125208,125329,125557,125678,125811,125958,146680,147172,167643,168067,188834,189328,209844,210270,215111,220528,224619,230050,234792,240169,244153,248145,253536,254083,254516,255272,255502,255745,256912,257841,258745,259329,259802,261232,261976,263169,264223,264701,264994,265377,266892,267657,268800,269241,269682,270278,270552,270963,271979,272157,272910,273047,273138,275332,275598,275920,276130,276239,276358,276542,277660,278130,278881,281464,281559,281935,282163,282419,282678,283254,283608,283730,283869,284161,284421,285349,285635,286038,286440,286783,286995,287196,287409,287698,287983,288056,288143,288228,288327,288439,288545,288668,288800,288923,289053,289177,289310,289441,289566,289683,289803,289935,290063,290177,290295,290408,290529,290717,290904,291085,291268,291452,291617,291799,291919,292039,292147,292257,292369,292477,292587,292752,292918,293070,293235,293336,293456,293627,293788,293951,294112,294279,294398,294515,294695,294877,295058,295241,295396,295541,295663,295798,295961,296154,296280,296432,296574,296744,296900,297072,297363,297558,297650,297823,297985,298080,298249,298343,298432,298675,298764,299057,299473,299893,300314,300740,301157,301573,301990,302408,302822,303292,303765,304237,304648,305119,305591,305781,305987,306093,306201,306307,306419,306533,306645,306759,306875,306989,307097,307207,307315,307577,307956,308360,308507,308615,308725,308833,308947,309356,309770,309886,310304,310545,310975,311410,311820,312242,312652,312774,313183,313599,313721,313939,314123,314191,314535,314615,314971,315121,315265,315341,315453,315543,315805,316070,316178,316330,316438,316514,316626,316716,316818,316926,317034,317134,317242,317327,317493,317597,317725,317812,317979,318057,318171,318263,318527,318794,318904,319057,319167,319251,319640,319738,319846,319940,320070,320178,320300,320436,320544,320664,320798,320920,321048,321190,321316,321456,321582,321700,321832,321930,322040,322340,322452,322570,323034,323150,323453,323579,323675,324076,324186,324310,324448,324558,324680,324992,325116,325246,325722,325850,326165,326303,326465,326681,326837,327041,327109,327193,327297,327500,327689,327890,328083,328288,328601,328813,328979,329095,329341,329557,329870,330296,330758,330995,331147,331407,331551,331693,334925,335039,335159,335275,335369,335690,335789,335907,336008,336287,336572,336851,337133,337386,337645,337898,338154,338578,338654,341904,343259,343703,345557,346132,346340,347350,347730,347896,348037,353057,353483,353595,353730,353883,354080,354251,354434,354609,354796,355068,355226,355310,355414,355901,356457,356615,356834,357065,357288,357523,357745,358011,358149,358748,358862,359000,359112,359236,359807,360302,360848,360993,361086,361178,363105,363675,363973,364162,364368,364561,364771,365655,365800,366192,366350,366567,366828,367260,368135,368755,368952,369900,370665,370788,371561,371782,371982,373959,374059,374149,374835,375588,376353,377116,377891,379104,379269,380882,381203,382266,382476,382646,383216,384111,384744,384910,386396,387012,387248,387469,388427,388692,388957,389204,389618,389854,391139,391588,391775,392024,392266,392442,392683,392916,393141,393736,394211,394735,394996,396347,396822,398048,398518,399566,400018,400262,400719,401964,402447,402597,403152,403604,404004,404157,404302,404445,404515,404943,405231,405735,406244,406360,407262,407384,407496,407673,407939,408209,408475,408743,408999,409259,409515,409773,410025,410281,410533,410787,411019,411255,411507,411763,412015,412269,412501,412735,412847,413499,413954,414078,415170,415985,416181,416505,416894,417246,417487,417701,418000,418192,418507,418714,419060,419360,419761,419980,420393,420630,421000,421724,422079,422348,422488,422742,422886,423163,424155,424564,425196,425542,425910,426984,427347,427747,429255,429840,430158,432693,432887,433105,433331,433543,433742,433949,435153,435448,436005,436395,437027,437504,437749,438236,438482,439678,440075,441081,441303,441726,441917,442296,442384,442492,442600,442913,443238,443557,443888,446591,446779,447040,447289,449873,450065,450330,450583,451115,451523,451722,452306,452541,452665,453077,453291,453693,453796,453926,454101,454353,454549,454689,454883,455894,456963,457251,457381,458158,458815,458961,459667,459905,461445,461595,462012,462177,462863,463333,463529,463620,463704,463848,464082,464249,465177,465463,465623,466238,466397,466725,466952,467464,467826,467905,468244,468349,468714,469085,469446,471320,471949,473025,473449,473702,473854,474902,475639,475842,476088,476335,476553,476795,477116,477380,477685,477908,478219,478408,479123,479392,479886,480112,480552,480711,480995,481740,482105,482410,482568,482806,484125,484523,484751,484971,485113,486403,486509,486639,486777,486901,487189,487358,487458,487743,487857,488740,489495,489934,490058,490304,490497,490631,490822,491601,491819,492110,492389,492706,492928,493223,493506,493610,493951,494767,495083,495644,496150,496355,497141,497546,498207,498396,498947,499513,499633,500035,500569,501099,501398,503743,506185,508010,510017,510356,513030,515325,515765,516517,516701,516912,521570,522153,522881,523083,524218,524368,524543,524768,525362,526661,527002,527510,528021,529815,530075,530691,531186,532223,534089,534280,534613,534769,534962,537354,537583,537791,537961,539733,540031,541374,542384,544349,544465,544634,544771,544917,546268,547406,547937,548363,550378,550626,551396,551512,551687,554902,555049,565921,566164,566582,566677,566770,566833,566915,567008,567101,567188,567286,567377,567468,567556,567640,567736,567836,567942,568045,568146,568250,568356,568455,568561,568663,568770,568879,568990,569121,569241,569357,569475,569574,569681,569797,569916,570044,570133,570228,570305,570394,570485,570578,570652,570749,570844,570942,571041,571145,571241,571343,571446,571546,571649,571734,571835,571933,572023,572118,572205,572311,572413,572507,572598,572692,572768,572860,572949,573052,573163,573246,573332,573427,573524,573620,573708,573809,573910,574013,574119,574217,574314,574409,574507,574610,574710,574813,574918,575036,575152,575247,575340,575425,575521,575615,575707,575790,575894,575999,576099,576200,576305,576405,576506,576605,576707,576801,576908,577010,577113,577206,577302,577404,577507,577603,577705,577808,577905,578008,578106,578210,578315,578412,578520,578634,578749,578857,578971,579086,579188,579293,579401,579511,579627,579744,579839,579936,580035,580140,580246,580345,580450,580556,580656,580762,580863,580970,581089,581188,581293,581395,581497,581597,581700,581795,581899,581984,582088,582192,582290,582394,582500,582598,582703,582801,582914,583008,583097,583186,583269,583360,583443,583541,583631,583727,583816,583910,583998,584094,584179,584287,584388,584489,584587,584693,584784,584883,584980,585078,585174,585267,585377,585475,585570,585680,585772,585872,585971,586058,586162,586267,586366,586473,586580,586679,586788,586880,586991,587102,587213,587317,587432,587548,587675,587795,587890,587985,588082,588181,588273,588372,588464,588563,588649,588743,588846,588942,589045,589141,589244,589341,589439,589542,589635,589725,589826,589909,590000,590085,590177,590280,590375,590471,590564,590658,590737,590844,590935,591034,591127,591230,591334,591435,591536,591640,591734,591838,591942,592055,592161,592267,592375,592492,592593,592701,592801,592904,593009,593116,593212,593291,593381,593465,593557,593630,593722,593811,593903,593988,594085,594178,594273,594372,594469,594560,594651,594743,594838,594945,595053,595155,595252,595349,595442,595529,595613,595710,595807,595900,595987,596078,596177,596276,596371,596460,596541,596640,596744,596841,596946,597043,597127,597226,597330,597427,597532,597629,597727,597828,597934,598033,598140,598239,598338,598429,598518,598607,598689,598782,598873,598984,599085,599185,599297,599410,599508,599616,599710,599810,599899,599991,600102,600212,600307,600423,600549,600675,600794,600922,601047,601172,601290,601417,601526,601635,601748,601871,601994,602110,602235,602332,602440,602562,602678,602794,602903,602991,603092,603181,603282,603369,603457,603554,603646,603752,603852,603928", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1357,1360,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1421,1422,1423,1424,1425,1429,1433,1437,1441,1442,1446,1454,1461,1469,1472,1482,1491,1500,1509,1510,1511,1512,1518,1519,1520,1521,1522,1523,1529,1530,1531,1532,1533,1538,1539,1543,1544,1550,1554,1555,1556,1557,1567,1568,1569,1573,1574,1580,1584,1585,1588,1589,1594,1595,1598,1599,1600,1601,1865,1872,2133,2139,2403,2410,2671,2677,2740,2822,2874,2956,3018,3100,3164,3216,3298,3306,3312,3323,3327,3331,3344,3359,3375,3382,3388,3405,3418,3438,3455,3464,3469,3476,3496,3509,3526,3532,3538,3545,3549,3555,3569,3572,3582,3583,3584,3632,3636,3640,3644,3645,3646,3649,3665,3672,3686,3731,3732,3738,3742,3746,3751,3758,3764,3765,3768,3772,3777,3790,3794,3799,3804,3809,3812,3815,3818,3822,3826,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3852,3856,3860,3864,3868,3872,3876,3877,3878,3879,3880,3881,3882,3883,3887,3891,3892,3896,3897,3900,3904,3907,3910,3913,3917,3920,3923,3927,3931,3935,3939,3942,3943,3944,3945,3948,3952,3955,3958,3961,3964,3967,3970,3974,3977,3978,3981,3984,3985,3988,3989,3990,3994,3995,4000,4007,4014,4021,4028,4035,4042,4049,4056,4063,4072,4081,4090,4097,4106,4115,4118,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4137,4142,4147,4150,4151,4152,4153,4154,4162,4170,4171,4179,4183,4191,4199,4207,4215,4223,4224,4232,4240,4241,4244,4247,4249,4254,4256,4261,4265,4269,4270,4271,4272,4276,4280,4281,4285,4286,4287,4288,4289,4290,4291,4292,4293,4294,4295,4299,4300,4301,4302,4306,4307,4308,4309,4313,4317,4318,4322,4323,4324,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4347,4348,4349,4353,4354,4355,4361,4362,4366,4368,4369,4374,4375,4376,4377,4378,4379,4383,4384,4385,4391,4392,4396,4398,4402,4406,4410,4414,4415,4416,4417,4420,4423,4426,4429,4432,4437,4441,4444,4445,4450,4454,4459,4465,4471,4476,4480,4485,4489,4493,4534,4535,4536,4537,4538,4542,4543,4544,4545,4549,4553,4557,4561,4565,4569,4573,4577,4583,4584,4625,4639,4644,4670,4677,4680,4691,4696,4699,4702,4757,4763,4764,4767,4770,4773,4776,4779,4782,4785,4789,4792,4793,4794,4802,4810,4813,4818,4823,4828,4833,4837,4841,4842,4850,4851,4852,4853,4854,4862,4867,4872,4873,4874,4875,4900,4906,4911,4914,4918,4921,4925,4935,4938,4943,4946,4950,4954,4962,4976,4989,4993,5008,5019,5022,5033,5038,5042,5077,5078,5079,5091,5099,5107,5115,5123,5143,5146,5173,5178,5198,5201,5204,5211,5224,5233,5236,5256,5266,5270,5274,5287,5291,5295,5299,5305,5309,5326,5334,5338,5342,5346,5349,5353,5357,5361,5371,5378,5385,5389,5415,5425,5450,5459,5479,5489,5493,5503,5528,5538,5541,5548,5555,5562,5563,5564,5565,5566,5573,5577,5583,5589,5590,5603,5604,5605,5608,5611,5614,5617,5620,5623,5626,5629,5632,5635,5638,5641,5644,5647,5650,5653,5656,5659,5662,5665,5668,5669,5677,5685,5686,5699,5709,5713,5718,5723,5727,5730,5734,5738,5741,5745,5748,5752,5757,5762,5765,5772,5776,5780,5789,5794,5799,5800,5804,5807,5811,5824,5829,5837,5841,5845,5862,5866,5871,5889,5896,5900,5930,5933,5936,5939,5942,5945,5948,5967,5973,5981,5988,6000,6008,6013,6021,6025,6043,6050,6066,6070,6078,6081,6086,6087,6088,6089,6093,6097,6101,6105,6140,6143,6147,6151,6185,6188,6192,6196,6205,6211,6214,6224,6228,6229,6236,6240,6247,6248,6249,6252,6257,6262,6263,6267,6282,6301,6305,6306,6318,6328,6329,6341,6346,6370,6373,6379,6382,6391,6399,6403,6406,6409,6412,6416,6419,6436,6440,6443,6458,6461,6469,6474,6481,6486,6487,6492,6493,6499,6505,6511,6543,6554,6571,6578,6582,6585,6598,6607,6611,6616,6620,6624,6628,6632,6636,6640,6644,6649,6652,6664,6669,6678,6681,6688,6689,6693,6702,6708,6712,6713,6717,6738,6744,6748,6752,6753,6771,6772,6773,6774,6775,6780,6783,6784,6790,6791,6803,6815,6822,6823,6828,6833,6834,6838,6852,6857,6863,6869,6875,6880,6886,6892,6893,6899,6914,6919,6928,6937,6940,6954,6959,6970,6974,6983,6992,6993,7000,7008,7025,7035,7082,7149,7202,7259,7271,7329,7447,7467,7488,7494,7502,7608,7622,7645,7651,7695,7699,7705,7711,7722,7756,7763,7771,7786,7842,7853,7866,7878,7916,7963,7969,7981,7987,7993,8045,8050,8055,8062,8097,8109,8155,8184,8247,8252,8258,8261,8265,8293,8357,8375,8393,8460,8468,8492,8496,8504,8597,8601,8880,8888,8899,8900,8901,8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917,8918,8919,8920,8921,8922,8923,8924,8925,8926,8927,8928,8929,8930,8931,8932,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,8944,8945,8946,8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962,8963,8964,8965,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977,8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022,9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039,9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055,9056,9057,9058,9059,9060,9061,9062,9063,9064,9065,9066,9067,9068,9069,9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085,9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101,9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117,9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133,9134,9135,9136,9137,9138,9139,9140,9141,9142,9143,9144,9145,9146,9147,9148,9149,9150,9151,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163,9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,9176,9177,9178,9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194,9195,9196,9197,9198,9199,9200,9201,9202,9203,9204,9205,9206,9207,9208,9209,9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,9263,9264,9265,9266,9267,9268,9269,9270,9271,9272,9273,9274", + "endColumns": "55,48,54,55,59,60,64,54,49,49,52,57,47,68,47,70,71,71,72,66,48,53,36,50,59,46,55,48,57,53,60,55,50,59,55,62,48,55,55,49,58,54,61,46,53,55,51,54,53,53,53,48,57,53,56,55,46,52,55,59,62,58,61,49,53,53,47,56,52,55,53,55,62,61,55,59,52,60,78,80,71,78,79,75,77,68,75,76,70,72,75,77,68,75,76,63,70,71,50,52,54,66,52,51,49,57,64,47,50,66,65,57,68,57,68,69,72,73,67,66,69,65,72,59,75,59,59,74,67,65,67,59,58,56,65,61,56,67,72,69,61,60,67,61,69,68,55,58,61,61,66,56,60,60,60,60,55,55,55,55,57,57,57,57,56,56,56,56,58,58,57,82,82,72,53,68,55,80,80,70,9,52,57,57,57,45,59,53,69,69,64,65,64,67,68,67,9,52,58,57,51,49,51,45,49,55,46,57,57,61,62,61,58,59,64,65,64,61,61,61,61,61,61,65,66,65,62,63,62,67,60,61,61,62,63,62,63,77,58,65,79,60,52,57,50,44,60,63,58,61,73,70,65,73,68,70,72,70,67,72,75,69,77,67,65,60,68,63,65,67,65,62,67,70,64,72,62,80,63,65,69,69,69,69,66,56,57,58,59,58,58,58,58,58,58,58,58,58,58,59,60,61,60,60,60,60,60,60,59,60,60,59,60,60,60,60,60,60,60,60,60,60,60,67,68,69,68,68,68,68,68,68,68,68,68,68,59,60,61,60,60,60,60,60,60,60,60,60,60,61,62,63,62,62,62,62,62,62,62,62,62,62,60,61,62,61,61,61,61,61,61,61,61,61,61,56,85,79,89,94,91,91,89,82,92,86,96,90,100,86,102,88,98,91,99,83,93,87,97,82,90,93,98,101,97,99,86,99,85,95,87,80,90,95,92,92,90,84,93,88,97,92,101,87,103,90,99,92,100,84,94,88,98,84,91,94,99,102,98,102,88,100,86,96,87,95,91,99,89,97,84,88,88,92,86,90,65,75,68,78,72,79,79,76,67,77,75,70,80,72,82,74,84,72,80,80,73,83,69,77,69,79,77,71,81,69,76,79,84,87,83,86,73,77,77,70,80,90,82,95,97,106,64,65,52,75,65,86,75,75,64,54,53,78,77,72,64,62,65,70,70,69,61,68,65,59,66,66,55,50,52,51,53,70,62,58,61,58,72,66,69,59,62,74,71,95,70,55,70,56,56,65,63,70,56,52,62,51,57,66,68,65,58,82,58,56,66,69,73,61,68,69,98,96,98,85,85,80,74,88,90,83,58,45,65,56,66,56,81,64,65,122,83,120,64,61,97,73,82,88,63,78,73,61,95,64,58,55,55,59,106,46,59,60,63,60,59,57,42,48,51,50,51,48,48,64,65,59,60,55,58,48,47,57,56,101,56,74,47,50,61,64,51,73,62,62,67,49,61,59,56,59,48,67,105,101,68,70,55,48,99,70,109,90,81,97,55,100,109,98,62,105,76,111,126,111,126,69,113,130,96,67,117,102,117,60,73,66,104,121,73,66,109,98,72,96,121,117,117,60,121,116,67,105,101,79,70,95,66,73,73,85,89,77,76,99,70,120,120,63,124,73,123,123,66,108,127,111,78,77,100,70,121,121,64,125,111,105,67,98,103,62,65,83,112,112,117,77,71,135,135,84,139,137,137,141,81,85,76,72,108,110,127,127,131,129,129,133,88,61,95,66,116,120,96,81,86,86,130,130,134,76,76,110,113,73,108,111,66,72,64,101,95,103,67,64,93,71,109,105,72,90,101,102,94,106,104,121,121,125,58,57,123,123,127,117,117,121,85,96,133,133,79,137,131,131,135,74,75,102,73,112,80,56,60,58,59,57,60,57,49,48,66,58,58,48,70,83,69,70,79,68,62,67,65,67,64,65,76,77,105,105,95,128,88,126,65,69,85,65,82,73,97,95,95,97,108,94,88,61,59,64,56,80,53,56,96,109,60,114,120,94,91,92,55,58,48,91,48,53,53,53,53,53,54,109,109,107,109,109,109,109,107,105,103,103,103,94,94,92,92,103,105,103,103,92,92,92,92,107,105,105,105,96,94,94,94,105,105,105,105,97,94,95,96,64,103,57,63,60,61,59,64,61,67,57,62,62,66,74,72,65,51,52,51,56,83,94,84,80,79,76,78,76,73,73,70,79,71,74,64,60,59,74,73,72,69,71,69,72,63,69,45,68,51,84,82,56,65,66,65,80,74,55,52,60,57,49,48,48,48,61,51,44,80,50,53,52,53,50,48,65,50,60,60,61,49,40,76,58,58,58,60,55,55,66,60,64,54,64,68,67,77,68,59,70,73,64,71,69,66,83,68,66,69,62,66,67,82,78,89,76,67,66,77,56,56,67,65,55,59,58,53,49,49,47,61,50,72,79,79,63,66,70,57,60,65,58,66,59,59,62,67,60,66,77,69,48,56,68,60,87,87,87,87,86,86,86,86,57,73,69,55,70,64,61,74,72,89,65,65,60,63,61,57,70,82,58,70,65,64,60,58,70,65,64,82,75,74,80,59,68,69,68,54,55,55,60,57,55,58,53,54,61,56,93,68,100,50,69,62,55,57,58,53,85,83,69,68,69,114,120,66,66,74,66,58,53,53,53,52,51,73,136,139,48,49,49,47,55,57,61,54,57,70,63,58,61,65,65,42,43,44,42,50,46,44,50,50,50,50,47,65,61,62,71,56,53,54,57,54,58,55,68,68,68,69,62,62,62,62,64,64,64,64,62,63,63,63,50,77,77,70,71,72,71,65,65,67,67,65,66,73,62,56,59,64,66,64,56,60,57,103,109,108,103,77,64,66,65,69,46,51,49,56,12,149,130,183,177,237,188,168,97,114,84,78,11,64,88,156,156,152,153,58,186,95,89,95,89,165,122,122,169,105,114,114,101,105,116,114,81,172,167,147,158,154,172,116,116,167,111,113,171,175,157,132,111,145,151,131,142,121,177,135,95,135,94,166,92,91,186,11,11,11,181,316,181,181,189,231,189,176,161,156,109,182,136,203,183,183,159,157,183,226,202,170,219,221,154,199,183,102,189,140,164,170,199,203,201,164,204,198,198,196,90,148,149,83,148,144,151,140,165,160,77,300,165,154,101,11,163,185,222,124,10,10,10,10,61,10,10,10,10,10,10,10,10,10,84,120,98,10,96,116,86,122,100,10,98,118,92,106,10,106,10,120,10,10,99,104,118,10,146,118,10,132,10,10,111,10,124,10,120,10,120,132,146,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,136,90,10,10,10,10,108,118,10,10,10,10,10,94,10,10,10,10,10,10,121,10,10,10,10,10,10,10,10,10,10,10,10,10,72,86,84,98,111,105,122,131,122,129,123,132,130,124,116,119,131,127,113,117,112,120,10,10,10,10,10,10,10,119,119,107,109,111,107,109,10,10,151,10,100,10,10,10,10,10,10,10,10,10,10,10,10,10,144,121,134,10,10,10,10,10,10,10,10,10,10,91,10,10,94,10,93,88,10,88,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,105,107,105,111,113,111,113,115,113,107,109,107,10,10,10,10,107,109,107,113,10,10,115,10,10,10,10,10,10,10,121,10,10,121,10,10,10,10,10,10,10,10,75,111,89,10,10,107,10,107,75,111,89,101,107,107,99,107,84,10,103,127,86,10,77,113,91,10,10,109,10,109,83,10,97,107,93,129,107,121,135,107,119,133,121,127,141,125,139,125,117,131,97,109,10,111,117,10,115,10,10,95,10,109,123,137,109,121,10,123,129,10,127,10,10,10,10,10,10,67,83,103,10,10,10,10,10,10,10,10,115,10,10,10,10,10,10,10,10,10,10,10,113,119,115,93,10,98,117,100,10,10,10,10,10,10,10,10,10,75,10,10,10,10,10,10,10,10,10,10,10,10,111,10,10,10,10,10,10,10,10,10,83,103,10,10,10,10,10,10,10,10,10,137,10,113,137,111,123,10,10,10,144,92,91,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,99,89,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,152,144,142,69,10,10,10,10,115,10,121,111,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,111,10,10,123,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,139,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,87,107,107,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,123,10,10,10,102,129,10,10,10,139,10,10,10,10,129,10,10,145,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,78,10,104,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,158,10,10,10,10,157,10,10,10,10,10,141,10,105,129,137,123,10,10,99,10,113,10,10,10,123,10,10,133,10,10,10,10,10,10,10,10,10,103,10,10,10,10,10,10,10,10,10,10,10,10,119,10,10,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,94,92,62,81,92,92,86,97,90,90,87,83,95,99,105,102,100,103,105,98,105,101,106,108,110,130,119,115,117,98,106,115,118,127,88,94,76,88,90,92,73,96,94,97,98,103,95,101,102,99,102,84,100,97,89,94,86,105,101,93,90,93,75,91,88,102,110,82,85,94,96,95,87,100,100,102,105,97,96,94,97,102,99,102,104,117,115,94,92,84,95,93,91,82,103,104,99,100,104,99,100,98,101,93,106,101,102,92,95,101,102,95,101,102,96,102,97,103,104,96,107,113,114,107,113,114,101,104,107,109,115,116,94,96,98,104,105,98,104,105,99,105,100,106,118,98,104,101,101,99,102,94,103,84,103,103,97,103,105,97,104,97,112,93,88,88,82,90,82,97,89,95,88,93,87,95,84,107,100,100,97,105,90,98,96,97,95,92,109,97,94,109,91,99,98,86,103,104,98,106,106,98,108,91,110,110,110,103,114,115,126,119,94,94,96,98,91,98,91,98,85,93,102,95,102,95,102,96,97,102,92,89,100,82,90,84,91,102,94,95,92,93,78,106,90,98,92,102,103,100,100,103,93,103,103,112,105,105,107,116,100,107,99,102,104,106,95,78,89,83,91,72,91,88,91,84,96,92,94,98,96,90,90,91,94,106,107,101,96,96,92,86,83,96,96,92,86,90,98,98,94,88,80,98,103,96,104,96,83,98,103,96,104,96,97,100,105,98,106,98,98,90,88,88,81,92,90,110,100,99,111,112,97,107,93,99,88,91,110,109,94,115,125,125,118,127,124,124,117,126,108,108,112,122,122,115,124,96,107,121,115,115,108,87,100,88,100,86,87,96,91,105,99,75,76", + "endOffsets": "201,250,305,361,421,482,547,602,652,702,755,813,861,930,978,1049,1121,1193,1266,1333,1382,1436,1473,1524,1584,1631,1687,1736,1794,1848,1909,1965,2016,2076,2132,2195,2244,2300,2356,2406,2465,2520,2582,2629,2683,2739,2791,2846,2900,2954,3008,3057,3115,3169,3226,3282,3329,3382,3438,3498,3561,3620,3682,3732,3786,3840,3888,3945,3998,4054,4108,4164,4227,4289,4345,4405,4458,4519,4598,4679,4751,4830,4910,4986,5064,5133,5209,5286,5357,5430,5506,5584,5653,5729,5806,5870,5941,6013,6064,6117,6172,6239,6292,6344,6394,6452,6517,6565,6616,6683,6749,6807,6876,6934,7003,7073,7146,7220,7288,7355,7425,7491,7564,7624,7700,7760,7820,7895,7963,8029,8097,8157,8216,8273,8339,8401,8458,8526,8599,8669,8731,8792,8860,8922,8992,9061,9117,9176,9238,9300,9367,9424,9485,9546,9607,9668,9724,9780,9836,9892,9950,10008,10066,10124,10181,10238,10295,10352,10411,10470,10528,10611,10694,10767,10821,10890,10946,11027,11108,11179,11308,11361,11419,11477,11535,11581,11641,11695,11765,11835,11900,11966,12031,12099,12168,12236,12366,12419,12478,12536,12588,12638,12690,12736,12786,12842,12889,12947,13005,13067,13130,13192,13251,13311,13376,13442,13507,13569,13631,13693,13755,13817,13879,13945,14012,14078,14141,14205,14268,14336,14397,14459,14521,14584,14648,14711,14775,14853,14912,14978,15058,15119,15172,15230,15281,15326,15387,15451,15510,15572,15646,15717,15783,15857,15926,15997,16070,16141,16209,16282,16358,16428,16506,16574,16640,16701,16770,16834,16900,16968,17034,17097,17165,17236,17301,17374,17437,17518,17582,17648,17718,17788,17858,17928,17995,18052,18110,18169,18229,18288,18347,18406,18465,18524,18583,18642,18701,18760,18819,18879,18940,19002,19063,19124,19185,19246,19307,19368,19428,19489,19550,19610,19671,19732,19793,19854,19915,19976,20037,20098,20159,20220,20281,20349,20418,20488,20557,20626,20695,20764,20833,20902,20971,21040,21109,21178,21238,21299,21361,21422,21483,21544,21605,21666,21727,21788,21849,21910,21971,22033,22096,22160,22223,22286,22349,22412,22475,22538,22601,22664,22727,22790,22851,22913,22976,23038,23100,23162,23224,23286,23348,23410,23472,23534,23596,23653,23739,23819,23909,24004,24096,24188,24278,24361,24454,24541,24638,24729,24830,24917,25020,25109,25208,25300,25400,25484,25578,25666,25764,25847,25938,26032,26131,26233,26331,26431,26518,26618,26704,26800,26888,26969,27060,27156,27249,27342,27433,27518,27612,27701,27799,27892,27994,28082,28186,28277,28377,28470,28571,28656,28751,28840,28939,29024,29116,29211,29311,29414,29513,29616,29705,29806,29893,29990,30078,30174,30266,30366,30456,30554,30639,30728,30817,30910,30997,31088,31154,31230,31299,31378,31451,31531,31611,31688,31756,31834,31910,31981,32062,32135,32218,32293,32378,32451,32532,32613,32687,32771,32841,32919,32989,33069,33147,33219,33301,33371,33448,33528,33613,33701,33785,33872,33946,34024,34102,34173,34254,34345,34428,34524,34622,34729,34794,34860,34913,34989,35055,35142,35218,35294,35359,35414,35468,35547,35625,35698,35763,35826,35892,35963,36034,36104,36166,36235,36301,36361,36428,36495,36551,36602,36655,36707,36761,36832,36895,36954,37016,37075,37148,37215,37285,37345,37408,37483,37555,37651,37722,37778,37849,37906,37963,38029,38093,38164,38221,38274,38337,38389,38447,38514,38583,38649,38708,38791,38850,38907,38974,39044,39118,39180,39249,39319,39418,39515,39614,39700,39786,39867,39942,40031,40122,40206,40265,40311,40377,40434,40501,40558,40640,40705,40771,40894,40978,41099,41164,41226,41324,41398,41481,41570,41634,41713,41787,41849,41945,42010,42069,42125,42181,42241,42348,42395,42455,42516,42580,42641,42701,42759,42802,42851,42903,42954,43006,43055,43104,43169,43235,43295,43356,43412,43471,43520,43568,43626,43683,43785,43842,43917,43965,44016,44078,44143,44195,44269,44332,44395,44463,44513,44575,44635,44692,44752,44801,44869,44975,45077,45146,45217,45273,45322,45422,45493,45603,45694,45776,45874,45930,46031,46141,46240,46303,46409,46486,46598,46725,46837,46964,47034,47148,47279,47376,47444,47562,47665,47783,47844,47918,47985,48090,48212,48286,48353,48463,48562,48635,48732,48854,48972,49090,49151,49273,49390,49458,49564,49666,49746,49817,49913,49980,50054,50128,50214,50304,50382,50459,50559,50630,50751,50872,50936,51061,51135,51259,51383,51450,51559,51687,51799,51878,51956,52057,52128,52250,52372,52437,52563,52675,52781,52849,52948,53052,53115,53181,53265,53378,53491,53609,53687,53759,53895,54031,54116,54256,54394,54532,54674,54756,54842,54919,54992,55101,55212,55340,55468,55600,55730,55860,55994,56083,56145,56241,56308,56425,56546,56643,56725,56812,56899,57030,57161,57296,57373,57450,57561,57675,57749,57858,57970,58037,58110,58175,58277,58373,58477,58545,58610,58704,58776,58886,58992,59065,59156,59258,59361,59456,59563,59668,59790,59912,60038,60097,60155,60279,60403,60531,60649,60767,60889,60975,61072,61206,61340,61420,61558,61690,61822,61958,62033,62109,62212,62286,62399,62480,62537,62598,62657,62717,62775,62836,62894,62944,62993,63060,63119,63178,63227,63298,63382,63452,63523,63603,63672,63735,63803,63869,63937,64002,64068,64145,64223,64329,64435,64531,64660,64749,64876,64942,65012,65098,65164,65247,65321,65419,65515,65611,65709,65818,65913,66002,66064,66124,66189,66246,66327,66381,66438,66535,66645,66706,66821,66942,67037,67129,67222,67278,67337,67386,67478,67527,67581,67635,67689,67743,67797,67852,67962,68072,68180,68290,68400,68510,68620,68728,68834,68938,69042,69146,69241,69336,69429,69522,69626,69732,69836,69940,70033,70126,70219,70312,70420,70526,70632,70738,70835,70930,71025,71120,71226,71332,71438,71544,71642,71737,71833,71930,71995,72099,72157,72221,72282,72344,72404,72469,72531,72599,72657,72720,72783,72850,72925,72998,73064,73116,73169,73221,73278,73362,73457,73542,73623,73703,73780,73859,73936,74010,74084,74155,74235,74307,74382,74447,74508,74568,74643,74717,74790,74860,74932,75002,75075,75139,75209,75255,75324,75376,75461,75544,75601,75667,75734,75800,75881,75956,76012,76065,76126,76184,76234,76283,76332,76381,76443,76495,76540,76621,76672,76726,76779,76833,76884,76933,76999,77050,77111,77172,77234,77284,77325,77402,77461,77520,77579,77640,77696,77752,77819,77880,77945,78000,78065,78134,78202,78280,78349,78409,78480,78554,78619,78691,78761,78828,78912,78981,79048,79118,79181,79248,79316,79399,79478,79568,79645,79713,79780,79858,79915,79972,80040,80106,80162,80222,80281,80335,80385,80435,80483,80545,80596,80669,80749,80829,80893,80960,81031,81089,81150,81216,81275,81342,81402,81462,81525,81593,81654,81721,81799,81869,81918,81975,82044,82105,82193,82281,82369,82457,82544,82631,82718,82805,82863,82937,83007,83063,83134,83199,83261,83336,83409,83499,83565,83631,83692,83756,83818,83876,83947,84030,84089,84160,84226,84291,84352,84411,84482,84548,84613,84696,84772,84847,84928,84988,85057,85127,85196,85251,85307,85363,85424,85482,85538,85597,85651,85706,85768,85825,85919,85988,86089,86140,86210,86273,86329,86387,86446,86500,86586,86670,86740,86809,86879,86994,87115,87182,87249,87324,87391,87450,87504,87558,87612,87665,87717,87791,87928,88068,88117,88167,88217,88265,88321,88379,88441,88496,88554,88625,88689,88748,88810,88876,88942,88985,89029,89074,89117,89168,89215,89260,89311,89362,89413,89464,89512,89578,89640,89703,89775,89832,89886,89941,89999,90054,90113,90169,90238,90307,90376,90446,90509,90572,90635,90698,90763,90828,90893,90958,91021,91085,91149,91213,91264,91342,91420,91491,91563,91636,91708,91774,91840,91908,91976,92042,92109,92183,92246,92303,92363,92428,92495,92560,92617,92678,92736,92840,92950,93059,93163,93241,93306,93373,93439,93509,93556,93608,93658,93715,94035,94185,94316,94500,94678,94916,95105,95274,95372,95487,95572,95651,95811,95876,95965,96122,96279,96432,96586,96645,96832,96928,97018,97114,97204,97370,97493,97616,97786,97892,98007,98122,98224,98330,98447,98562,98644,98817,98985,99133,99292,99447,99620,99737,99854,100022,100134,100248,100420,100596,100754,100887,100999,101145,101297,101429,101572,101694,101872,102008,102104,102240,102335,102502,102595,102687,102874,103030,103208,103372,103554,103871,104053,104235,104425,104657,104847,105024,105186,105343,105453,105636,105773,105977,106161,106345,106505,106663,106847,107074,107277,107448,107668,107890,108045,108245,108429,108532,108722,108863,109028,109199,109399,109603,109805,109970,110175,110374,110573,110770,110861,111010,111160,111244,111393,111538,111690,111831,111997,112158,112236,112537,112703,112858,112960,113118,113282,113468,113691,113816,114093,114365,114643,114888,114950,115235,115686,116142,116651,116799,117313,117750,118184,118627,118712,118833,118932,119337,119434,119551,119638,119761,119862,120268,120367,120486,120579,120686,121029,121136,121381,121502,121911,122159,122259,122364,122483,122992,123139,123258,123509,123642,124057,124311,124423,124670,124795,125203,125324,125552,125673,125806,125953,146675,147167,167638,168062,188829,189323,209839,210265,215106,220523,224614,230045,234787,240164,244148,248140,253531,254078,254511,255267,255497,255740,256907,257836,258740,259324,259797,261227,261971,263164,264218,264696,264989,265372,266887,267652,268795,269236,269677,270273,270547,270958,271974,272152,272905,273042,273133,275327,275593,275915,276125,276234,276353,276537,277655,278125,278876,281459,281554,281930,282158,282414,282673,283249,283603,283725,283864,284156,284416,285344,285630,286033,286435,286778,286990,287191,287404,287693,287978,288051,288138,288223,288322,288434,288540,288663,288795,288918,289048,289172,289305,289436,289561,289678,289798,289930,290058,290172,290290,290403,290524,290712,290899,291080,291263,291447,291612,291794,291914,292034,292142,292252,292364,292472,292582,292747,292913,293065,293230,293331,293451,293622,293783,293946,294107,294274,294393,294510,294690,294872,295053,295236,295391,295536,295658,295793,295956,296149,296275,296427,296569,296739,296895,297067,297358,297553,297645,297818,297980,298075,298244,298338,298427,298670,298759,299052,299468,299888,300309,300735,301152,301568,301985,302403,302817,303287,303760,304232,304643,305114,305586,305776,305982,306088,306196,306302,306414,306528,306640,306754,306870,306984,307092,307202,307310,307572,307951,308355,308502,308610,308720,308828,308942,309351,309765,309881,310299,310540,310970,311405,311815,312237,312647,312769,313178,313594,313716,313934,314118,314186,314530,314610,314966,315116,315260,315336,315448,315538,315800,316065,316173,316325,316433,316509,316621,316711,316813,316921,317029,317129,317237,317322,317488,317592,317720,317807,317974,318052,318166,318258,318522,318789,318899,319052,319162,319246,319635,319733,319841,319935,320065,320173,320295,320431,320539,320659,320793,320915,321043,321185,321311,321451,321577,321695,321827,321925,322035,322335,322447,322565,323029,323145,323448,323574,323670,324071,324181,324305,324443,324553,324675,324987,325111,325241,325717,325845,326160,326298,326460,326676,326832,327036,327104,327188,327292,327495,327684,327885,328078,328283,328596,328808,328974,329090,329336,329552,329865,330291,330753,330990,331142,331402,331546,331688,334920,335034,335154,335270,335364,335685,335784,335902,336003,336282,336567,336846,337128,337381,337640,337893,338149,338573,338649,341899,343254,343698,345552,346127,346335,347345,347725,347891,348032,353052,353478,353590,353725,353878,354075,354246,354429,354604,354791,355063,355221,355305,355409,355896,356452,356610,356829,357060,357283,357518,357740,358006,358144,358743,358857,358995,359107,359231,359802,360297,360843,360988,361081,361173,363100,363670,363968,364157,364363,364556,364766,365650,365795,366187,366345,366562,366823,367255,368130,368750,368947,369895,370660,370783,371556,371777,371977,373954,374054,374144,374830,375583,376348,377111,377886,379099,379264,380877,381198,382261,382471,382641,383211,384106,384739,384905,386391,387007,387243,387464,388422,388687,388952,389199,389613,389849,391134,391583,391770,392019,392261,392437,392678,392911,393136,393731,394206,394730,394991,396342,396817,398043,398513,399561,400013,400257,400714,401959,402442,402592,403147,403599,403999,404152,404297,404440,404510,404938,405226,405730,406239,406355,407257,407379,407491,407668,407934,408204,408470,408738,408994,409254,409510,409768,410020,410276,410528,410782,411014,411250,411502,411758,412010,412264,412496,412730,412842,413494,413949,414073,415165,415980,416176,416500,416889,417241,417482,417696,417995,418187,418502,418709,419055,419355,419756,419975,420388,420625,420995,421719,422074,422343,422483,422737,422881,423158,424150,424559,425191,425537,425905,426979,427342,427742,429250,429835,430153,432688,432882,433100,433326,433538,433737,433944,435148,435443,436000,436390,437022,437499,437744,438231,438477,439673,440070,441076,441298,441721,441912,442291,442379,442487,442595,442908,443233,443552,443883,446586,446774,447035,447284,449868,450060,450325,450578,451110,451518,451717,452301,452536,452660,453072,453286,453688,453791,453921,454096,454348,454544,454684,454878,455889,456958,457246,457376,458153,458810,458956,459662,459900,461440,461590,462007,462172,462858,463328,463524,463615,463699,463843,464077,464244,465172,465458,465618,466233,466392,466720,466947,467459,467821,467900,468239,468344,468709,469080,469441,471315,471944,473020,473444,473697,473849,474897,475634,475837,476083,476330,476548,476790,477111,477375,477680,477903,478214,478403,479118,479387,479881,480107,480547,480706,480990,481735,482100,482405,482563,482801,484120,484518,484746,484966,485108,486398,486504,486634,486772,486896,487184,487353,487453,487738,487852,488735,489490,489929,490053,490299,490492,490626,490817,491596,491814,492105,492384,492701,492923,493218,493501,493605,493946,494762,495078,495639,496145,496350,497136,497541,498202,498391,498942,499508,499628,500030,500564,501094,501393,503738,506180,508005,510012,510351,512784,515320,515760,516512,516696,516907,521565,522148,522876,523078,524213,524363,524538,524763,525357,526656,526997,527505,528016,529810,530070,530686,531181,532218,534084,534275,534608,534764,534957,537349,537578,537786,537956,539728,540026,541369,542379,544344,544460,544629,544766,544912,545597,547401,547932,548358,550373,550621,551391,551507,551682,554897,555044,565916,566159,566577,566672,566765,566828,566910,567003,567096,567183,567281,567372,567463,567551,567635,567731,567831,567937,568040,568141,568245,568351,568450,568556,568658,568765,568874,568985,569116,569236,569352,569470,569569,569676,569792,569911,570039,570128,570223,570300,570389,570480,570573,570647,570744,570839,570937,571036,571140,571236,571338,571441,571541,571644,571729,571830,571928,572018,572113,572200,572306,572408,572502,572593,572687,572763,572855,572944,573047,573158,573241,573327,573422,573519,573615,573703,573804,573905,574008,574114,574212,574309,574404,574502,574605,574705,574808,574913,575031,575147,575242,575335,575420,575516,575610,575702,575785,575889,575994,576094,576195,576300,576400,576501,576600,576702,576796,576903,577005,577108,577201,577297,577399,577502,577598,577700,577803,577900,578003,578101,578205,578310,578407,578515,578629,578744,578852,578966,579081,579183,579288,579396,579506,579622,579739,579834,579931,580030,580135,580241,580340,580445,580551,580651,580757,580858,580965,581084,581183,581288,581390,581492,581592,581695,581790,581894,581979,582083,582187,582285,582389,582495,582593,582698,582796,582909,583003,583092,583181,583264,583355,583438,583536,583626,583722,583811,583905,583993,584089,584174,584282,584383,584484,584582,584688,584779,584878,584975,585073,585169,585262,585372,585470,585565,585675,585767,585867,585966,586053,586157,586262,586361,586468,586575,586674,586783,586875,586986,587097,587208,587312,587427,587543,587670,587790,587885,587980,588077,588176,588268,588367,588459,588558,588644,588738,588841,588937,589040,589136,589239,589336,589434,589537,589630,589720,589821,589904,589995,590080,590172,590275,590370,590466,590559,590653,590732,590839,590930,591029,591122,591225,591329,591430,591531,591635,591729,591833,591937,592050,592156,592262,592370,592487,592588,592696,592796,592899,593004,593111,593207,593286,593376,593460,593552,593625,593717,593806,593898,593983,594080,594173,594268,594367,594464,594555,594646,594738,594833,594940,595048,595150,595247,595344,595437,595524,595608,595705,595802,595895,595982,596073,596172,596271,596366,596455,596536,596635,596739,596836,596941,597038,597122,597221,597325,597422,597527,597624,597722,597823,597929,598028,598135,598234,598333,598424,598513,598602,598684,598777,598868,598979,599080,599180,599292,599405,599503,599611,599705,599805,599894,599986,600097,600207,600302,600418,600544,600670,600789,600917,601042,601167,601285,601412,601521,601630,601743,601866,601989,602105,602230,602327,602435,602557,602673,602789,602898,602986,603087,603176,603277,603364,603452,603549,603641,603747,603847,603923,604000" + }, + "to": { + "startLines": "10,16,27,30,31,32,33,34,37,38,39,40,41,43,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,117,118,140,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,226,228,229,231,232,233,234,235,236,237,238,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,467,468,469,497,509,510,511,512,513,514,515,516,517,518,519,520,524,525,526,527,529,530,531,532,533,534,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,575,576,587,588,598,599,629,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,1061,1065,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1783,1784,1832,1833,1834,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1853,1856,1857,1858,1879,1880,1881,1882,1883,1884,1885,1896,1905,1906,1909,1910,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1972,2009,2021,2022,2023,2024,2025,2026,2058,2059,2060,2061,2215,2219,2224,2225,2226,2229,2230,2231,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2320,2323,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2408,2409,2410,2411,2412,2488,2492,2493,2518,2519,2552,2556,2560,2564,2568,2569,2620,2628,2635,2805,2808,2818,2827,2836,2905,2906,2907,2908,2914,2915,2916,2917,2918,2919,2925,2926,2927,2928,2929,2934,2935,2939,2940,2946,2950,2951,2952,2953,2963,2964,2965,2969,2970,2976,2980,3050,3053,3054,3059,3060,3063,3064,3065,3066,3330,3337,3598,3604,3868,3875,4136,4142,4205,4287,4339,4421,4483,4565,4629,4681,4763,4771,4777,4788,4792,4796,4809,5584,5600,5607,5613,5630,5643,5663,5680,5689,5694,5701,5721,5734,5751,5757,5763,5770,5774,5780,5794,5797,5807,5808,5809,5857,5861,5865,5869,5870,5871,5874,5890,5897,5911,5956,5965,5971,5975,5979,5984,5991,5997,5998,6001,6005,6010,6023,6027,6032,6037,6042,6045,6048,6051,6055,6198,6199,6200,6201,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6300,6304,6308,6312,6316,6320,6324,6325,6326,6327,6328,6329,6330,6331,6335,6339,6340,6344,6345,6348,6352,6355,6358,6361,6365,6368,6371,6375,6379,6383,6387,6390,6391,6392,6393,6396,6400,6403,6406,6409,6412,6415,6418,6489,6492,6493,6496,6499,6500,6503,6504,6505,6509,6510,6515,6522,6529,6536,6543,6550,6557,6564,6571,6578,6587,6596,6605,6612,6621,6630,6633,6636,6637,6638,6639,6640,6641,6642,6643,6644,6645,6646,6647,6648,6652,6657,6662,6665,6666,6667,6668,6669,6677,6685,6686,6694,6698,6706,6714,6722,6730,6738,6739,6747,6755,6756,6759,6832,6834,6839,6841,6846,6850,6854,6855,6856,6857,6861,6865,6866,6870,6871,6872,6873,6874,6875,6876,6877,6878,6879,6880,6884,6885,6886,6887,6891,6892,6893,6894,6898,6902,6903,6907,6908,6909,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6938,6939,6940,6946,6947,6951,6953,6954,6959,6960,6961,6962,6963,6964,6968,6969,6970,6976,6977,6981,6983,6987,6991,6995,7019,7020,7021,7022,7025,7028,7031,7034,7037,7042,7046,7049,7050,7055,7059,7064,7070,7076,7081,7085,7090,7094,7098,7139,7140,7141,7142,7143,7147,7148,7149,7150,7154,7158,7162,7166,7170,7174,7178,7182,7188,7189,7230,7244,7249,7275,7282,7285,7296,7301,7304,7307,7362,7368,7369,7372,7375,7378,7381,7384,7387,7390,7394,7397,7398,7399,7407,7415,7418,7423,7428,7433,7438,7442,7446,7447,7455,7456,7457,7458,7459,7467,7472,7477,7478,7479,7480,7505,7511,7516,7519,7523,7526,7530,7540,7543,7548,7551,7555,7656,7664,7678,7691,7695,7710,7721,7724,7735,7740,7744,7779,7780,7781,7793,7801,7809,7817,7825,7845,7848,7875,7880,7900,7903,7906,7913,7926,7935,7938,7958,7968,7972,7976,7989,7993,7997,8001,8007,8011,8028,8036,8040,8044,8048,8051,8055,8059,8063,8073,8080,8087,8091,8117,8127,8152,8161,8181,8191,8195,8205,8230,8240,8243,8250,8257,8264,8265,8266,8267,8268,8275,8279,8285,8291,8292,8305,8306,8307,8310,8313,8316,8319,8322,8325,8328,8331,8334,8337,8340,8343,8346,8349,8352,8355,8358,8361,8364,8367,8370,8371,8379,8387,8388,8401,8411,8415,8420,8425,8429,8432,8436,8440,8443,8447,8450,8454,8459,8464,8467,8474,8478,8482,8491,8496,8501,8502,8506,8509,8513,8526,8531,8539,8543,8547,8564,8568,8573,8591,8598,8602,8632,8635,8638,8641,8644,8647,8650,8669,8675,8683,8690,8702,8710,8715,8723,8727,8745,8752,8768,8772,8780,8783,8788,8789,8790,8791,8795,8799,8803,8807,8842,8845,8849,8853,8887,8890,8894,8898,8907,8913,8916,8926,8930,8931,8938,8942,8949,8950,8951,8954,8959,8964,8965,8969,8984,9003,9007,9008,9020,9030,9031,9043,9048,9072,9075,9081,9084,9093,9101,9105,9108,9111,9114,9118,9121,9138,9142,9145,9160,9163,9171,9176,9183,9188,9189,9194,9195,9201,9207,9213,9245,9256,9273,9280,9284,9287,9300,9309,9313,9318,9322,9326,9330,9334,9338,9342,9346,9351,9354,9366,9371,9380,9383,9390,9391,9395,9404,9410,9414,9415,9419,9440,9446,9450,9454,9455,9473,9474,9475,9476,9477,9482,9485,9486,9492,9493,9505,9517,9524,9525,9530,9535,9536,9540,9554,9559,9565,9571,9577,9582,9588,9594,9595,9601,9616,9621,9630,9639,9642,9656,9661,9672,9676,9685,9694,9695,9702,9859,9876,9886,10428,10495,10548,10605,10617,10753,10862,10882,10903,10909,10917,11023,11798,11821,11827,11871,11875,11935,12021,12277,12330,12337,12345,12360,12416,12427,12440,12452,12490,12537,12543,12555,12561,12567,12619,12624,12629,12636,12934,12946,12992,13021,13160,13165,13198,13201,13205,13234,13272,13290,13327,13394,13402,13531,13535,13543,13672,13676,13955,14018,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545,14546,14547,14548,14549,14550", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "490,732,1185,1343,1399,1459,1520,1585,1740,1790,1840,1893,1951,2050,2420,2468,2539,2611,2683,2756,2823,2872,2926,2963,3014,3074,3121,3177,3226,3284,3338,3399,3455,3506,3566,3622,3685,3734,3790,3846,3896,3955,4010,4072,4119,4173,4229,4281,4336,4390,4444,4498,4547,4605,4659,4716,4772,4819,4872,4928,4988,5051,5110,5172,5222,5276,5330,5378,5435,5488,6112,6166,7097,7208,7270,7326,7386,7439,7500,7579,7660,7732,7811,7891,7967,8045,8114,8190,8267,8338,8411,8487,8565,8634,8710,8787,8851,8922,11435,11531,11584,11688,11755,11808,11860,11910,11968,12033,12081,19022,19089,19155,19213,19282,19340,19409,19479,19552,19626,19694,19761,19831,19897,19970,20030,20106,20166,20226,20301,20369,20435,20503,20563,20622,20679,20745,20807,20864,20932,21005,21075,21137,21198,21266,21328,21398,21467,21523,21582,21644,21706,21773,21830,21891,21952,22013,22074,22130,22186,22242,22298,22356,22414,22472,22530,22587,22644,22701,22758,22817,22876,22934,23017,23100,23173,23227,23296,23352,23433,23514,23585,23920,23973,24031,25196,25755,25801,25861,25915,25985,26055,26120,26186,26251,26319,26388,26456,26586,26639,26698,26756,26854,26904,26956,27002,27052,27108,27202,27260,27318,27380,27443,27505,27564,27624,27689,27755,27820,27882,27944,28006,28068,28130,28192,28258,28325,28391,28454,28518,28581,28649,28710,28772,28834,28897,28961,29024,29088,29166,29225,29291,29371,29432,29636,29694,30127,30172,30639,30703,31895,34629,34703,34774,34840,34914,34983,35054,35127,35198,35266,35339,35415,35485,35563,35631,35697,35758,35827,35891,35957,36025,36091,36154,36222,36293,36358,36431,36494,36575,36639,36705,36775,36845,36915,36985,37955,38012,38070,38129,38189,38248,38307,38366,38425,38484,38543,38602,38661,38720,38779,38839,38900,38962,39023,39084,39145,39206,39267,39328,39388,39449,39510,39570,39631,39692,39753,39814,39875,39936,39997,40058,40119,40180,40241,40309,40378,40448,40517,40586,40655,40724,40793,40862,40931,41000,41069,41138,41198,41259,41321,41382,41443,41504,41565,41626,41687,41748,41809,41870,41931,41993,42056,42120,42183,42246,42309,42372,42435,42498,42561,42624,42687,42750,42811,42873,42936,42998,43060,43122,43184,43246,43308,43370,43432,43494,43556,43613,43699,43779,43869,43964,44056,44148,44238,44321,44414,44501,44598,44689,44790,44877,44980,45069,45168,45260,45360,45444,45538,45626,45724,45807,45898,45992,46091,46193,46291,46391,46478,46578,46664,46760,46848,46929,47020,47116,47209,47302,47393,47478,47572,47661,47759,47852,47954,48042,48146,48237,48337,48430,48531,48616,48711,48800,48899,48984,49076,49171,49271,49374,49473,49576,49665,49766,49853,49950,50038,50134,50226,50326,50416,50514,50599,50688,50777,50870,50957,51720,51786,51862,51931,52010,52083,52163,52243,52320,52388,52466,52542,52613,52694,52767,52850,52925,53010,53083,53164,53245,53319,53403,53473,53551,53621,53701,53779,53851,53933,54003,54080,54160,54245,54333,54417,54504,54578,54656,54734,54805,54886,54977,55060,55156,55254,55361,55426,55492,55545,55621,55687,55774,55850,63360,63595,64190,64244,64323,64401,64474,64539,64602,64668,64739,64810,64880,64942,65011,65077,65137,65204,65271,65327,65378,65431,65483,65537,65608,65671,65730,65792,65851,65924,65991,66061,66121,66184,66259,66331,66427,66498,66554,66625,66682,66739,66805,66869,66940,66997,67050,67113,67165,67223,68460,68529,68595,68654,68737,68796,68853,68920,68990,69064,69126,69195,69265,69364,69461,69560,69646,69732,69813,69888,69977,70068,70152,70211,70257,70323,70380,70447,70504,70586,70651,70717,70840,70924,71045,71110,71172,71270,71344,71427,71516,71580,71659,71733,71795,71891,71956,72015,72071,72127,72187,72294,72341,72401,72462,72526,72587,72647,72705,72748,72797,72849,72900,72952,73001,73050,73115,73181,73241,73302,73358,73417,73466,73514,73572,73629,73731,73788,73863,73911,73962,74024,74089,74141,74215,74278,74341,74409,74459,74521,74581,74638,74698,74747,74815,74921,75023,75092,75163,75219,75268,75368,75439,75549,75640,75722,75820,75876,75977,76087,76186,76249,76355,76432,76544,76671,76783,76910,76980,77094,77225,77322,77390,77508,77611,77729,77790,77864,77931,78036,78158,78232,78299,78409,78508,78581,78678,78800,78918,79036,79097,79219,79336,79404,79510,79612,79692,79763,79859,79926,80000,80074,80160,80250,80328,80405,80505,80576,80697,80818,80882,81007,81081,81205,81329,81396,81505,81633,81745,81824,81902,82003,82074,82196,82318,82383,82509,82621,82727,82795,82894,82998,83061,83127,83211,83324,83437,83555,83633,83705,83841,83977,84062,84202,84340,84478,84620,84702,84788,84865,84938,85047,85158,85286,85414,85546,85676,85806,85940,86029,86091,86187,86254,86371,86492,86589,86671,86758,86845,86976,87107,87242,87319,87396,87507,87621,87695,87804,87916,87983,88056,88121,88223,88319,88423,88491,88556,88650,88722,88832,88938,89011,89102,89204,89307,89402,89509,89614,89736,89858,89984,90043,90101,90225,90349,90477,90595,90713,90835,90921,91018,91152,91286,91366,91504,91636,91768,91904,91979,92055,92158,92232,92345,92426,92483,92544,92603,92663,92721,92782,92840,92890,92939,93006,93065,93124,93173,93244,93328,93398,93469,93549,93618,93681,93749,93815,93883,93948,94014,94091,94169,94275,94381,94477,94606,94695,94822,94888,94958,95044,95110,95193,95267,95365,95461,95557,95655,95764,95859,95948,96010,96070,96135,96192,96273,96327,96384,96481,96591,96652,96767,96888,96983,97075,97168,97224,97283,97332,97424,97473,97527,97581,97635,97689,97743,97798,97908,98018,98126,98236,98346,98456,98566,98674,98780,98884,98988,99092,99187,99282,99375,99468,99572,99678,99782,99886,99979,100072,100165,100258,100366,100472,100578,100684,100781,100876,100971,101066,101172,101278,101384,101490,101588,101683,101779,101876,101941,102045,102103,102167,102228,102290,102350,102415,102477,102545,102603,102666,102729,102796,102871,102944,103010,103062,103115,103167,103224,103308,103403,103488,103569,103649,103726,103805,103882,103956,104030,104101,104181,104253,104328,104393,104454,104514,104589,104663,104736,104806,104878,104948,105021,105085,105155,105201,105270,105322,105407,105490,105547,105613,105680,105746,105827,105902,105958,106011,106072,106130,106180,106229,106278,106327,106389,106441,106486,106567,106618,106672,106725,106779,106830,106879,106945,106996,107057,107118,107180,107230,107271,107348,107407,107466,107525,107586,107642,107698,107765,107826,107891,107946,108011,108080,108148,108226,108295,108355,108426,108500,108565,108637,108707,108774,108858,108927,108994,109064,109127,109194,109262,109345,109424,109514,109591,109659,109726,109804,109861,109918,109986,110052,110108,110168,110227,110281,110331,110381,110429,110491,110542,110615,110695,110775,110839,110906,110977,111035,111096,111162,111221,111288,111348,111408,111471,111539,111600,111667,111745,111815,111864,111921,111990,112051,112139,112227,112315,112403,112490,112577,112664,112751,112809,112883,112953,113009,113080,113145,113207,113282,113355,113445,113511,113577,113638,113702,113764,113822,113893,113976,114035,114106,114172,114237,114298,114357,114428,114494,114559,114642,114718,114793,114874,114934,115003,115073,115142,115197,115253,115309,115370,115428,115484,115543,115597,115652,115714,115771,115865,115934,116035,116086,116156,116219,116275,116333,116392,116446,116532,116616,116686,116755,116825,116940,117061,117128,117195,117270,117337,117396,117450,117504,117558,117611,117663,119168,119305,122141,122190,122240,122331,122379,122435,122493,122555,122610,122668,122739,122803,122862,122924,122990,123304,123449,123493,123538,124662,124713,124760,124805,124856,124907,124958,125495,125985,126051,126230,126293,126433,126490,126544,126599,126657,126712,126771,126827,126896,126965,127034,127104,127167,127230,127293,127356,127421,127486,127551,127616,127679,127743,127807,127871,127922,128000,128078,128149,128221,128294,128366,128432,128498,128566,128634,128700,128767,128841,128904,128961,129021,129086,129153,129218,129275,129336,129394,129498,129608,129717,129821,129899,129964,130031,130097,130167,130214,130266,130316,130443,133103,134158,134289,134473,134651,134889,135078,137628,137726,137841,137926,152691,152931,153378,153467,153624,153929,154082,154236,156447,156634,156730,156820,156916,157006,157172,157295,157418,157588,157694,157809,157924,158026,158132,158249,158779,158861,159034,159202,159350,159509,159664,159837,159954,160071,160239,160351,160465,160637,160813,160971,161104,161216,161362,161514,161646,161789,161911,162089,162225,162321,162457,162552,162719,162812,162904,163091,163247,163425,163589,163771,164088,164270,164452,164642,164874,165064,165241,165403,165560,165670,165853,165990,166194,166378,166562,166722,166880,167064,167291,167494,167665,167885,168107,168262,168462,168646,168749,168939,169080,169245,169416,169616,169820,170022,170187,170392,170591,170790,170987,171078,171227,171377,171461,171610,171755,171907,172048,172214,174749,174827,175128,175294,175449,181507,181728,181892,183964,184187,186714,186991,187263,187541,187786,187848,190976,191427,191883,203020,203168,203682,204119,204553,208893,208978,209099,209198,209603,209700,209817,209904,210027,210128,210534,210633,210752,210845,210952,211295,211402,211647,211768,212177,212425,212525,212630,212749,213258,213405,213524,213775,213908,214323,214577,219792,220039,220164,220572,220693,220921,221042,221175,221322,242044,242536,263007,263431,284198,284692,305208,305634,310475,315892,319983,325414,330156,335533,339517,343509,348900,349447,349880,350636,350866,351109,352276,400446,401350,401934,402407,403837,404581,405774,406828,407306,407599,407982,409497,410262,411405,411846,412287,412883,413157,413568,414584,414762,415515,415652,415743,417937,418203,418525,418735,418844,418963,419147,420265,420735,421486,424069,424482,424858,425086,425342,425601,426177,426531,426653,426792,427084,427344,428272,428558,428961,429363,429706,429918,430119,430332,430621,441508,441581,441668,441753,446422,446534,446640,446763,446895,447018,447148,447272,447405,447536,447661,447778,447898,448030,448158,448272,448390,448503,448624,448812,448999,449180,449363,449547,449712,449894,450014,450134,450242,450352,450464,450572,450682,450847,451013,451165,451330,451431,451551,451722,451883,452046,452207,452374,452493,452610,452790,452972,453153,453336,453491,453636,453758,453893,454056,454249,454375,454527,454669,454839,454995,455167,461930,462125,462217,462390,462552,462647,462816,462910,462999,463242,463331,463624,464040,464460,464881,465307,465724,466140,466557,466975,467389,467859,468332,468804,469215,469686,470158,470348,470554,470660,470768,470874,470986,471100,471212,471326,471442,471556,471664,471774,471882,472144,472523,472927,473074,473182,473292,473400,473514,473923,474337,474453,474871,475112,475542,475977,476387,476809,477219,477341,477750,478166,478288,478506,483256,483324,483668,483748,484104,484254,484398,484474,484586,484676,484938,485203,485311,485463,485571,485647,485759,485849,485951,486059,486167,486267,486375,486460,486626,486730,486858,486945,487112,487190,487304,487396,487660,487927,488037,488190,488300,488384,488773,488871,488979,489073,489203,489311,489433,489569,489677,489797,489931,490053,490181,490323,490449,490589,490715,490833,490965,491063,491173,491473,491585,491703,492167,492283,492586,492712,492808,493209,493319,493443,493581,493691,493813,494125,494249,494379,494855,494983,495298,495436,495598,495814,495970,497587,497655,497739,497843,498046,498235,498436,498629,498834,499147,499359,499525,499641,499887,500103,500416,500842,501304,501541,501693,501953,502097,502239,505471,505585,505705,505821,505915,506236,506335,506453,506554,506833,507118,507397,507679,507932,508191,508444,508700,509124,509200,512450,513805,514249,516103,516678,516886,517896,518276,518442,518583,523603,524029,524141,524276,524429,524626,524797,524980,525155,525342,525614,525772,525856,525960,526447,527003,527161,527380,527611,527834,528069,528291,528557,528695,529294,529408,529546,529658,529782,530353,530848,531394,531539,531632,531724,533651,534221,534519,534708,534914,535107,535317,536201,536346,536738,536896,537113,545169,545601,546476,547096,547293,548241,549006,549129,549902,550123,550323,552300,552400,552490,553176,553929,554694,555457,556232,557445,557610,559223,559544,560607,560817,560987,561557,562452,563085,563251,564737,565353,565589,565810,566768,567033,567298,567545,567959,568195,569480,569929,570116,570365,570607,570783,571024,571257,571482,572077,572552,573076,573337,574688,575163,576389,576859,577907,578359,578603,579060,580305,580788,580938,581493,581945,582345,582498,582643,582786,582856,583284,583572,584076,584585,584701,585603,585725,585837,586014,586280,586550,586816,587084,587340,587600,587856,588114,588366,588622,588874,589128,589360,589596,589848,590104,590356,590610,590842,591076,591188,591840,592295,592419,593511,594326,594522,594846,595235,595587,595828,596042,596341,596533,596848,597055,597401,597701,598102,598321,598734,598971,599341,600065,600420,600689,600829,601083,601227,601504,602496,602905,603537,603883,604251,605325,605688,606088,607596,608181,608499,611034,611228,611446,611672,611884,612083,612290,613494,613789,614346,614736,615368,615845,616090,616577,616823,618019,618416,619422,619644,620067,620258,620637,620725,620833,620941,621254,621579,621898,622229,624932,625120,625381,625630,628214,628406,628671,628924,629456,629864,630063,630647,630882,631006,631418,631632,632034,632137,632267,632442,632694,632890,633030,633224,634235,635304,635592,635722,636499,637156,637302,638008,638246,639786,639936,640353,640518,641204,641674,641870,641961,642045,642189,642423,642590,643518,643804,643964,644579,644738,645066,645293,645805,646167,646246,646585,646690,647055,647426,647787,649661,650290,651366,651790,652043,652195,653243,653980,654183,654429,654676,654894,655136,655457,655721,656026,656249,656560,656749,657464,657733,658227,658453,658893,659052,659336,660081,660446,660751,660909,661147,662466,662864,663092,663312,663454,664744,664850,664980,665118,665242,665530,665699,665799,666084,666198,667081,667836,668275,668399,668645,668838,668972,669163,669942,670160,670451,670730,671047,671269,671564,671847,671951,672292,673108,673424,673985,674491,674696,675482,675887,676548,676737,677288,677854,677974,678376,683982,684512,684811,703223,705665,707490,709497,709836,715866,718161,718601,719353,719537,719748,724406,756486,757214,757416,758551,758701,761288,764206,774238,776052,776393,776901,777412,779206,779466,780082,780577,781614,783480,783671,784004,784160,784353,786745,786974,787182,787352,798754,799052,800395,801405,806477,806593,807817,807954,808100,810047,811185,811716,812559,814574,814822,819738,819854,820029,824635,824782,835654,838028,843770,843865,843958,844021,844103,844196,844289,844376,844474,844565,844656,844744,844828,844924,845024,845130,845233,845334,845438,845544,845643,845749,845851,845958,846067,846178,846309,846429,846545,846663,846762,846869,846985,847104,847232,847321,847416,847493,847582,847673,847766,847840,847937,848032,848130,848229,848333,848429,848531,848634,848734,848837,848922,849023,849121,849211,849306,849393,849499,849601,849695,849786,849880,849956,850048,850137,850240,850351,850434,850520,850615,850712,850808,850896,850997,851098,851201,851307,851405,851502,851597,851695,851798,851898,852001,852106,852224,852340,852435,852528,852613,852709,852803,852895,852978,853082,853187,853287,853388,853493,853593,853694,853793,853895,853989,854096,854198,854301,854394,854490,854592,854695,854791,854893,854996,855093,855196,855294,855398,855503,855600,855708,855822,855937,856045,856159,856274,856376,856481,856589,856699,856815,856932,857027,857124,857223,857328,857434,857533,857638,857744,857844,857950,858051,858158,858277,858376,858481,858583,858685,858785,858888,858983,859087,859172,859276,859380,859478,859582,859688,859786,859891,859989,860102,860196,860285,860374,860457,860548,860631,860729,860819,860915,861004,861098,861186,861282,861367,861475,861576,861677,861775,861881,861972,862071,862168,862266,862362,862455,862565,862663,862758,862868,862960,863060,863159,863246,863350,863455,863554,863661,863768,863867,863976,864068,864179,864290,864401,864505,864620,864736,864863,864983,865078,865173,865270,865369,865461,865560,865652,865751,865837,865931,866034,866130,866233,866329,866432,866529,866627,866730,866823,866913,867014,867097,867188,867273,867365,867468,867563,867659,867752,867846,867925,868032,868123,868222,868315,868418,868522,868623,868724,868828,868922,869026,869130,869243,869349,869455,869563,869680,869781,869889,869989,870092,870197,870304,870400,870479,870569,870653,870745,870818,870910,870999,871091,871176,871273,871366,871461,871560,871657,871748,871839,871931,872026,872133,872241,872343,872440,872537,872630,872717,872801,872898,872995,873088,873175,873266,873365,873464,873559,873648,873729,873828,873932,874029,874134,874231,874315,874414,874518,874615,874720,874817,874915,875016,875122,875221,875328,875427,875526,875617,875706,875795,875877,875970,876061,876172,876273,876373,876485,876598,876696,876804,876898,876998,877087,877179,877290,877400,877495,877611,877737,877863,877982,878110,878235,878360,878478,878605,878714,878823,878936,879059,879182,879298,879423,879520,879628,879750,879866,879982,880091,880179,880280,880369,880470,880557,880645,880742,880834,880940,881040,881116", + "endLines": "10,16,27,30,31,32,33,34,37,38,39,40,41,43,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,117,118,140,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,226,228,229,231,232,233,234,235,236,237,238,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,462,467,468,469,497,509,510,511,512,513,514,515,516,517,518,519,523,524,525,526,527,529,530,531,532,533,534,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,575,576,587,588,598,599,629,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,1061,1065,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1783,1784,1832,1833,1834,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1853,1856,1857,1858,1879,1880,1881,1882,1883,1884,1885,1896,1905,1906,1909,1910,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1975,2009,2021,2022,2023,2024,2025,2026,2058,2059,2060,2061,2217,2219,2224,2225,2226,2229,2230,2231,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2319,2322,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2408,2409,2410,2411,2412,2490,2492,2493,2518,2519,2555,2559,2563,2567,2568,2572,2627,2634,2642,2807,2817,2826,2835,2844,2905,2906,2907,2913,2914,2915,2916,2917,2918,2924,2925,2926,2927,2928,2933,2934,2938,2939,2945,2949,2950,2951,2952,2962,2963,2964,2968,2969,2975,2979,2980,3052,3053,3058,3059,3062,3063,3064,3065,3329,3336,3597,3603,3867,3874,4135,4141,4204,4286,4338,4420,4482,4564,4628,4680,4762,4770,4776,4787,4791,4795,4808,4823,5599,5606,5612,5629,5642,5662,5679,5688,5693,5700,5720,5733,5750,5756,5762,5769,5773,5779,5793,5796,5806,5807,5808,5856,5860,5864,5868,5869,5870,5873,5889,5896,5910,5955,5956,5970,5974,5978,5983,5990,5996,5997,6000,6004,6009,6022,6026,6031,6036,6041,6044,6047,6050,6054,6058,6198,6199,6200,6201,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6299,6303,6307,6311,6315,6319,6323,6324,6325,6326,6327,6328,6329,6330,6334,6338,6339,6343,6344,6347,6351,6354,6357,6360,6364,6367,6370,6374,6378,6382,6386,6389,6390,6391,6392,6395,6399,6402,6405,6408,6411,6414,6417,6421,6491,6492,6495,6498,6499,6502,6503,6504,6508,6509,6514,6521,6528,6535,6542,6549,6556,6563,6570,6577,6586,6595,6604,6611,6620,6629,6632,6635,6636,6637,6638,6639,6640,6641,6642,6643,6644,6645,6646,6647,6651,6656,6661,6664,6665,6666,6667,6668,6676,6684,6685,6693,6697,6705,6713,6721,6729,6737,6738,6746,6754,6755,6758,6761,6833,6838,6840,6845,6849,6853,6854,6855,6856,6860,6864,6865,6869,6870,6871,6872,6873,6874,6875,6876,6877,6878,6879,6883,6884,6885,6886,6890,6891,6892,6893,6897,6901,6902,6906,6907,6908,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6937,6938,6939,6945,6946,6950,6952,6953,6958,6959,6960,6961,6962,6963,6967,6968,6969,6975,6976,6980,6982,6986,6990,6994,6998,7019,7020,7021,7024,7027,7030,7033,7036,7041,7045,7048,7049,7054,7058,7063,7069,7075,7080,7084,7089,7093,7097,7138,7139,7140,7141,7142,7146,7147,7148,7149,7153,7157,7161,7165,7169,7173,7177,7181,7187,7188,7229,7243,7248,7274,7281,7284,7295,7300,7303,7306,7361,7367,7368,7371,7374,7377,7380,7383,7386,7389,7393,7396,7397,7398,7406,7414,7417,7422,7427,7432,7437,7441,7445,7446,7454,7455,7456,7457,7458,7466,7471,7476,7477,7478,7479,7504,7510,7515,7518,7522,7525,7529,7539,7542,7547,7550,7554,7558,7663,7677,7690,7694,7709,7720,7723,7734,7739,7743,7778,7779,7780,7792,7800,7808,7816,7824,7844,7847,7874,7879,7899,7902,7905,7912,7925,7934,7937,7957,7967,7971,7975,7988,7992,7996,8000,8006,8010,8027,8035,8039,8043,8047,8050,8054,8058,8062,8072,8079,8086,8090,8116,8126,8151,8160,8180,8190,8194,8204,8229,8239,8242,8249,8256,8263,8264,8265,8266,8267,8274,8278,8284,8290,8291,8304,8305,8306,8309,8312,8315,8318,8321,8324,8327,8330,8333,8336,8339,8342,8345,8348,8351,8354,8357,8360,8363,8366,8369,8370,8378,8386,8387,8400,8410,8414,8419,8424,8428,8431,8435,8439,8442,8446,8449,8453,8458,8463,8466,8473,8477,8481,8490,8495,8500,8501,8505,8508,8512,8525,8530,8538,8542,8546,8563,8567,8572,8590,8597,8601,8631,8634,8637,8640,8643,8646,8649,8668,8674,8682,8689,8701,8709,8714,8722,8726,8744,8751,8767,8771,8779,8782,8787,8788,8789,8790,8794,8798,8802,8806,8841,8844,8848,8852,8886,8889,8893,8897,8906,8912,8915,8925,8929,8930,8937,8941,8948,8949,8950,8953,8958,8963,8964,8968,8983,9002,9006,9007,9019,9029,9030,9042,9047,9071,9074,9080,9083,9092,9100,9104,9107,9110,9113,9117,9120,9137,9141,9144,9159,9162,9170,9175,9182,9187,9188,9193,9194,9200,9206,9212,9244,9255,9272,9279,9283,9286,9299,9308,9312,9317,9321,9325,9329,9333,9337,9341,9345,9350,9353,9365,9370,9379,9382,9389,9390,9394,9403,9409,9413,9414,9418,9439,9445,9449,9453,9454,9472,9473,9474,9475,9476,9481,9484,9485,9491,9492,9504,9516,9523,9524,9529,9534,9535,9539,9553,9558,9564,9570,9576,9581,9587,9593,9594,9600,9615,9620,9629,9638,9641,9655,9660,9671,9675,9684,9693,9694,9701,9709,9875,9885,9932,10494,10547,10604,10616,10674,10861,10881,10902,10908,10916,11022,11036,11820,11826,11870,11874,11880,11940,12031,12310,12336,12344,12359,12415,12426,12439,12451,12489,12536,12542,12554,12560,12566,12618,12623,12628,12635,12670,12945,12991,13020,13083,13164,13170,13200,13204,13232,13271,13289,13307,13393,13401,13425,13534,13542,13635,13675,13954,13962,14028,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545,14546,14547,14548,14549,14550", + "endColumns": "55,48,54,55,59,60,64,54,49,49,52,57,47,68,47,70,71,71,72,66,48,53,36,50,59,46,55,48,57,53,60,55,50,59,55,62,48,55,55,49,58,54,61,46,53,55,51,54,53,53,53,48,57,53,56,55,46,52,55,59,62,58,61,49,53,53,47,56,52,55,53,55,62,61,55,59,52,60,78,80,71,78,79,75,77,68,75,76,70,72,75,77,68,75,76,63,70,71,50,52,54,66,52,51,49,57,64,47,50,66,65,57,68,57,68,69,72,73,67,66,69,65,72,59,75,59,59,74,67,65,67,59,58,56,65,61,56,67,72,69,61,60,67,61,69,68,55,58,61,61,66,56,60,60,60,60,55,55,55,55,57,57,57,57,56,56,56,56,58,58,57,82,82,72,53,68,55,80,80,70,9,52,57,57,57,45,59,53,69,69,64,65,64,67,68,67,9,52,58,57,51,49,51,45,49,55,46,57,57,61,62,61,58,59,64,65,64,61,61,61,61,61,61,65,66,65,62,63,62,67,60,61,61,62,63,62,63,77,58,65,79,60,52,57,50,44,60,63,58,61,73,70,65,73,68,70,72,70,67,72,75,69,77,67,65,60,68,63,65,67,65,62,67,70,64,72,62,80,63,65,69,69,69,69,66,56,57,58,59,58,58,58,58,58,58,58,58,58,58,59,60,61,60,60,60,60,60,60,59,60,60,59,60,60,60,60,60,60,60,60,60,60,60,67,68,69,68,68,68,68,68,68,68,68,68,68,59,60,61,60,60,60,60,60,60,60,60,60,60,61,62,63,62,62,62,62,62,62,62,62,62,62,60,61,62,61,61,61,61,61,61,61,61,61,61,56,85,79,89,94,91,91,89,82,92,86,96,90,100,86,102,88,98,91,99,83,93,87,97,82,90,93,98,101,97,99,86,99,85,95,87,80,90,95,92,92,90,84,93,88,97,92,101,87,103,90,99,92,100,84,94,88,98,84,91,94,99,102,98,102,88,100,86,96,87,95,91,99,89,97,84,88,88,92,86,90,65,75,68,78,72,79,79,76,67,77,75,70,80,72,82,74,84,72,80,80,73,83,69,77,69,79,77,71,81,69,76,79,84,87,83,86,73,77,77,70,80,90,82,95,97,106,64,65,52,75,65,86,75,75,64,54,53,78,77,72,64,62,65,70,70,69,61,68,65,59,66,66,55,50,52,51,53,70,62,58,61,58,72,66,69,59,62,74,71,95,70,55,70,56,56,65,63,70,56,52,62,51,57,66,68,65,58,82,58,56,66,69,73,61,68,69,98,96,98,85,85,80,74,88,90,83,58,45,65,56,66,56,81,64,65,122,83,120,64,61,97,73,82,88,63,78,73,61,95,64,58,55,55,59,106,46,59,60,63,60,59,57,42,48,51,50,51,48,48,64,65,59,60,55,58,48,47,57,56,101,56,74,47,50,61,64,51,73,62,62,67,49,61,59,56,59,48,67,105,101,68,70,55,48,99,70,109,90,81,97,55,100,109,98,62,105,76,111,126,111,126,69,113,130,96,67,117,102,117,60,73,66,104,121,73,66,109,98,72,96,121,117,117,60,121,116,67,105,101,79,70,95,66,73,73,85,89,77,76,99,70,120,120,63,124,73,123,123,66,108,127,111,78,77,100,70,121,121,64,125,111,105,67,98,103,62,65,83,112,112,117,77,71,135,135,84,139,137,137,141,81,85,76,72,108,110,127,127,131,129,129,133,88,61,95,66,116,120,96,81,86,86,130,130,134,76,76,110,113,73,108,111,66,72,64,101,95,103,67,64,93,71,109,105,72,90,101,102,94,106,104,121,121,125,58,57,123,123,127,117,117,121,85,96,133,133,79,137,131,131,135,74,75,102,73,112,80,56,60,58,59,57,60,57,49,48,66,58,58,48,70,83,69,70,79,68,62,67,65,67,64,65,76,77,105,105,95,128,88,126,65,69,85,65,82,73,97,95,95,97,108,94,88,61,59,64,56,80,53,56,96,109,60,114,120,94,91,92,55,58,48,91,48,53,53,53,53,53,54,109,109,107,109,109,109,109,107,105,103,103,103,94,94,92,92,103,105,103,103,92,92,92,92,107,105,105,105,96,94,94,94,105,105,105,105,97,94,95,96,64,103,57,63,60,61,59,64,61,67,57,62,62,66,74,72,65,51,52,51,56,83,94,84,80,79,76,78,76,73,73,70,79,71,74,64,60,59,74,73,72,69,71,69,72,63,69,45,68,51,84,82,56,65,66,65,80,74,55,52,60,57,49,48,48,48,61,51,44,80,50,53,52,53,50,48,65,50,60,60,61,49,40,76,58,58,58,60,55,55,66,60,64,54,64,68,67,77,68,59,70,73,64,71,69,66,83,68,66,69,62,66,67,82,78,89,76,67,66,77,56,56,67,65,55,59,58,53,49,49,47,61,50,72,79,79,63,66,70,57,60,65,58,66,59,59,62,67,60,66,77,69,48,56,68,60,87,87,87,87,86,86,86,86,57,73,69,55,70,64,61,74,72,89,65,65,60,63,61,57,70,82,58,70,65,64,60,58,70,65,64,82,75,74,80,59,68,69,68,54,55,55,60,57,55,58,53,54,61,56,93,68,100,50,69,62,55,57,58,53,85,83,69,68,69,114,120,66,66,74,66,58,53,53,53,52,51,73,136,139,48,49,49,47,55,57,61,54,57,70,63,58,61,65,65,42,43,44,42,50,46,44,50,50,50,50,47,65,61,62,71,56,53,54,57,54,58,55,68,68,68,69,62,62,62,62,64,64,64,64,62,63,63,63,50,77,77,70,71,72,71,65,65,67,67,65,66,73,62,56,59,64,66,64,56,60,57,103,109,108,103,77,64,66,65,69,46,51,49,56,12,149,130,183,177,237,188,168,97,114,84,78,11,64,88,156,156,152,153,58,186,95,89,95,89,165,122,122,169,105,114,114,101,105,116,114,81,172,167,147,158,154,172,116,116,167,111,113,171,175,157,132,111,145,151,131,142,121,177,135,95,135,94,166,92,91,186,11,11,11,181,316,181,181,189,231,189,176,161,156,109,182,136,203,183,183,159,157,183,226,202,170,219,221,154,199,183,102,189,140,164,170,199,203,201,164,204,198,198,196,90,148,149,83,148,144,151,140,165,160,77,300,165,154,101,11,163,185,222,124,10,10,10,10,61,10,10,10,10,10,10,10,10,10,84,120,98,10,96,116,86,122,100,10,98,118,92,106,10,106,10,120,10,10,99,104,118,10,146,118,10,132,10,10,111,10,124,10,120,10,120,132,146,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,136,90,10,10,10,10,108,118,10,10,10,10,10,94,10,10,10,10,10,10,121,10,10,10,10,10,10,10,10,10,10,10,10,10,72,86,84,98,111,105,122,131,122,129,123,132,130,124,116,119,131,127,113,117,112,120,10,10,10,10,10,10,10,119,119,107,109,111,107,109,10,10,151,10,100,10,10,10,10,10,10,10,10,10,10,10,10,10,144,121,134,10,10,10,10,10,10,10,10,10,10,91,10,10,94,10,93,88,10,88,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,105,107,105,111,113,111,113,115,113,107,109,107,10,10,10,10,107,109,107,113,10,10,115,10,10,10,10,10,10,10,121,10,10,121,10,10,10,10,10,10,10,10,75,111,89,10,10,107,10,107,75,111,89,101,107,107,99,107,84,10,103,127,86,10,77,113,91,10,10,109,10,109,83,10,97,107,93,129,107,121,135,107,119,133,121,127,141,125,139,125,117,131,97,109,10,111,117,10,115,10,10,95,10,109,123,137,109,121,10,123,129,10,127,10,10,10,10,10,10,67,83,103,10,10,10,10,10,10,10,10,115,10,10,10,10,10,10,10,10,10,10,10,113,119,115,93,10,98,117,100,10,10,10,10,10,10,10,10,10,75,10,10,10,10,10,10,10,10,10,10,10,10,111,10,10,10,10,10,10,10,10,10,83,103,10,10,10,10,10,10,10,10,10,137,10,113,137,111,123,10,10,10,144,92,91,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,99,89,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,152,144,142,69,10,10,10,10,115,10,121,111,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,111,10,10,123,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,139,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,87,107,107,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,123,10,10,10,102,129,10,10,10,139,10,10,10,10,129,10,10,145,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,78,10,104,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,158,10,10,10,10,157,10,10,10,10,10,141,10,105,129,137,123,10,10,99,10,113,10,10,10,123,10,10,133,10,10,10,10,10,10,10,10,10,103,10,10,10,10,10,10,10,10,10,10,10,10,119,10,10,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,94,92,62,81,92,92,86,97,90,90,87,83,95,99,105,102,100,103,105,98,105,101,106,108,110,130,119,115,117,98,106,115,118,127,88,94,76,88,90,92,73,96,94,97,98,103,95,101,102,99,102,84,100,97,89,94,86,105,101,93,90,93,75,91,88,102,110,82,85,94,96,95,87,100,100,102,105,97,96,94,97,102,99,102,104,117,115,94,92,84,95,93,91,82,103,104,99,100,104,99,100,98,101,93,106,101,102,92,95,101,102,95,101,102,96,102,97,103,104,96,107,113,114,107,113,114,101,104,107,109,115,116,94,96,98,104,105,98,104,105,99,105,100,106,118,98,104,101,101,99,102,94,103,84,103,103,97,103,105,97,104,97,112,93,88,88,82,90,82,97,89,95,88,93,87,95,84,107,100,100,97,105,90,98,96,97,95,92,109,97,94,109,91,99,98,86,103,104,98,106,106,98,108,91,110,110,110,103,114,115,126,119,94,94,96,98,91,98,91,98,85,93,102,95,102,95,102,96,97,102,92,89,100,82,90,84,91,102,94,95,92,93,78,106,90,98,92,102,103,100,100,103,93,103,103,112,105,105,107,116,100,107,99,102,104,106,95,78,89,83,91,72,91,88,91,84,96,92,94,98,96,90,90,91,94,106,107,101,96,96,92,86,83,96,96,92,86,90,98,98,94,88,80,98,103,96,104,96,83,98,103,96,104,96,97,100,105,98,106,98,98,90,88,88,81,92,90,110,100,99,111,112,97,107,93,99,88,91,110,109,94,115,125,125,118,127,124,124,117,126,108,108,112,122,122,115,124,96,107,121,115,115,108,87,100,88,100,86,87,96,91,105,99,75,76", + "endOffsets": "541,776,1235,1394,1454,1515,1580,1635,1785,1835,1888,1946,1994,2114,2463,2534,2606,2678,2751,2818,2867,2921,2958,3009,3069,3116,3172,3221,3279,3333,3394,3450,3501,3561,3617,3680,3729,3785,3841,3891,3950,4005,4067,4114,4168,4224,4276,4331,4385,4439,4493,4542,4600,4654,4711,4767,4814,4867,4923,4983,5046,5105,5167,5217,5271,5325,5373,5430,5483,5539,6161,6217,7155,7265,7321,7381,7434,7495,7574,7655,7727,7806,7886,7962,8040,8109,8185,8262,8333,8406,8482,8560,8629,8705,8782,8846,8917,8989,11481,11579,11634,11750,11803,11855,11905,11963,12028,12076,12127,19084,19150,19208,19277,19335,19404,19474,19547,19621,19689,19756,19826,19892,19965,20025,20101,20161,20221,20296,20364,20430,20498,20558,20617,20674,20740,20802,20859,20927,21000,21070,21132,21193,21261,21323,21393,21462,21518,21577,21639,21701,21768,21825,21886,21947,22008,22069,22125,22181,22237,22293,22351,22409,22467,22525,22582,22639,22696,22753,22812,22871,22929,23012,23095,23168,23222,23291,23347,23428,23509,23580,23709,23968,24026,24084,25249,25796,25856,25910,25980,26050,26115,26181,26246,26314,26383,26451,26581,26634,26693,26751,26803,26899,26951,26997,27047,27103,27150,27255,27313,27375,27438,27500,27559,27619,27684,27750,27815,27877,27939,28001,28063,28125,28187,28253,28320,28386,28449,28513,28576,28644,28705,28767,28829,28892,28956,29019,29083,29161,29220,29286,29366,29427,29480,29689,29740,30167,30228,30698,30757,31952,34698,34769,34835,34909,34978,35049,35122,35193,35261,35334,35410,35480,35558,35626,35692,35753,35822,35886,35952,36020,36086,36149,36217,36288,36353,36426,36489,36570,36634,36700,36770,36840,36910,36980,37047,38007,38065,38124,38184,38243,38302,38361,38420,38479,38538,38597,38656,38715,38774,38834,38895,38957,39018,39079,39140,39201,39262,39323,39383,39444,39505,39565,39626,39687,39748,39809,39870,39931,39992,40053,40114,40175,40236,40304,40373,40443,40512,40581,40650,40719,40788,40857,40926,40995,41064,41133,41193,41254,41316,41377,41438,41499,41560,41621,41682,41743,41804,41865,41926,41988,42051,42115,42178,42241,42304,42367,42430,42493,42556,42619,42682,42745,42806,42868,42931,42993,43055,43117,43179,43241,43303,43365,43427,43489,43551,43608,43694,43774,43864,43959,44051,44143,44233,44316,44409,44496,44593,44684,44785,44872,44975,45064,45163,45255,45355,45439,45533,45621,45719,45802,45893,45987,46086,46188,46286,46386,46473,46573,46659,46755,46843,46924,47015,47111,47204,47297,47388,47473,47567,47656,47754,47847,47949,48037,48141,48232,48332,48425,48526,48611,48706,48795,48894,48979,49071,49166,49266,49369,49468,49571,49660,49761,49848,49945,50033,50129,50221,50321,50411,50509,50594,50683,50772,50865,50952,51043,51781,51857,51926,52005,52078,52158,52238,52315,52383,52461,52537,52608,52689,52762,52845,52920,53005,53078,53159,53240,53314,53398,53468,53546,53616,53696,53774,53846,53928,53998,54075,54155,54240,54328,54412,54499,54573,54651,54729,54800,54881,54972,55055,55151,55249,55356,55421,55487,55540,55616,55682,55769,55845,55921,63420,63645,64239,64318,64396,64469,64534,64597,64663,64734,64805,64875,64937,65006,65072,65132,65199,65266,65322,65373,65426,65478,65532,65603,65666,65725,65787,65846,65919,65986,66056,66116,66179,66254,66326,66422,66493,66549,66620,66677,66734,66800,66864,66935,66992,67045,67108,67160,67218,67285,68524,68590,68649,68732,68791,68848,68915,68985,69059,69121,69190,69260,69359,69456,69555,69641,69727,69808,69883,69972,70063,70147,70206,70252,70318,70375,70442,70499,70581,70646,70712,70835,70919,71040,71105,71167,71265,71339,71422,71511,71575,71654,71728,71790,71886,71951,72010,72066,72122,72182,72289,72336,72396,72457,72521,72582,72642,72700,72743,72792,72844,72895,72947,72996,73045,73110,73176,73236,73297,73353,73412,73461,73509,73567,73624,73726,73783,73858,73906,73957,74019,74084,74136,74210,74273,74336,74404,74454,74516,74576,74633,74693,74742,74810,74916,75018,75087,75158,75214,75263,75363,75434,75544,75635,75717,75815,75871,75972,76082,76181,76244,76350,76427,76539,76666,76778,76905,76975,77089,77220,77317,77385,77503,77606,77724,77785,77859,77926,78031,78153,78227,78294,78404,78503,78576,78673,78795,78913,79031,79092,79214,79331,79399,79505,79607,79687,79758,79854,79921,79995,80069,80155,80245,80323,80400,80500,80571,80692,80813,80877,81002,81076,81200,81324,81391,81500,81628,81740,81819,81897,81998,82069,82191,82313,82378,82504,82616,82722,82790,82889,82993,83056,83122,83206,83319,83432,83550,83628,83700,83836,83972,84057,84197,84335,84473,84615,84697,84783,84860,84933,85042,85153,85281,85409,85541,85671,85801,85935,86024,86086,86182,86249,86366,86487,86584,86666,86753,86840,86971,87102,87237,87314,87391,87502,87616,87690,87799,87911,87978,88051,88116,88218,88314,88418,88486,88551,88645,88717,88827,88933,89006,89097,89199,89302,89397,89504,89609,89731,89853,89979,90038,90096,90220,90344,90472,90590,90708,90830,90916,91013,91147,91281,91361,91499,91631,91763,91899,91974,92050,92153,92227,92340,92421,92478,92539,92598,92658,92716,92777,92835,92885,92934,93001,93060,93119,93168,93239,93323,93393,93464,93544,93613,93676,93744,93810,93878,93943,94009,94086,94164,94270,94376,94472,94601,94690,94817,94883,94953,95039,95105,95188,95262,95360,95456,95552,95650,95759,95854,95943,96005,96065,96130,96187,96268,96322,96379,96476,96586,96647,96762,96883,96978,97070,97163,97219,97278,97327,97419,97468,97522,97576,97630,97684,97738,97793,97903,98013,98121,98231,98341,98451,98561,98669,98775,98879,98983,99087,99182,99277,99370,99463,99567,99673,99777,99881,99974,100067,100160,100253,100361,100467,100573,100679,100776,100871,100966,101061,101167,101273,101379,101485,101583,101678,101774,101871,101936,102040,102098,102162,102223,102285,102345,102410,102472,102540,102598,102661,102724,102791,102866,102939,103005,103057,103110,103162,103219,103303,103398,103483,103564,103644,103721,103800,103877,103951,104025,104096,104176,104248,104323,104388,104449,104509,104584,104658,104731,104801,104873,104943,105016,105080,105150,105196,105265,105317,105402,105485,105542,105608,105675,105741,105822,105897,105953,106006,106067,106125,106175,106224,106273,106322,106384,106436,106481,106562,106613,106667,106720,106774,106825,106874,106940,106991,107052,107113,107175,107225,107266,107343,107402,107461,107520,107581,107637,107693,107760,107821,107886,107941,108006,108075,108143,108221,108290,108350,108421,108495,108560,108632,108702,108769,108853,108922,108989,109059,109122,109189,109257,109340,109419,109509,109586,109654,109721,109799,109856,109913,109981,110047,110103,110163,110222,110276,110326,110376,110424,110486,110537,110610,110690,110770,110834,110901,110972,111030,111091,111157,111216,111283,111343,111403,111466,111534,111595,111662,111740,111810,111859,111916,111985,112046,112134,112222,112310,112398,112485,112572,112659,112746,112804,112878,112948,113004,113075,113140,113202,113277,113350,113440,113506,113572,113633,113697,113759,113817,113888,113971,114030,114101,114167,114232,114293,114352,114423,114489,114554,114637,114713,114788,114869,114929,114998,115068,115137,115192,115248,115304,115365,115423,115479,115538,115592,115647,115709,115766,115860,115929,116030,116081,116151,116214,116270,116328,116387,116441,116527,116611,116681,116750,116820,116935,117056,117123,117190,117265,117332,117391,117445,117499,117553,117606,117658,117732,119300,119440,122185,122235,122285,122374,122430,122488,122550,122605,122663,122734,122798,122857,122919,122985,123051,123342,123488,123533,123576,124708,124755,124800,124851,124902,124953,125004,125538,126046,126108,126288,126360,126485,126539,126594,126652,126707,126766,126822,126891,126960,127029,127099,127162,127225,127288,127351,127416,127481,127546,127611,127674,127738,127802,127866,127917,127995,128073,128144,128216,128289,128361,128427,128493,128561,128629,128695,128762,128836,128899,128956,129016,129081,129148,129213,129270,129331,129389,129493,129603,129712,129816,129894,129959,130026,130092,130162,130209,130261,130311,130368,130758,133248,134284,134468,134646,134884,135073,135242,137721,137836,137921,138000,152846,152991,153462,153619,153776,154077,154231,154290,156629,156725,156815,156911,157001,157167,157290,157413,157583,157689,157804,157919,158021,158127,158244,158359,158856,159029,159197,159345,159504,159659,159832,159949,160066,160234,160346,160460,160632,160808,160966,161099,161211,161357,161509,161641,161784,161906,162084,162220,162316,162452,162547,162714,162807,162899,163086,163242,163420,163584,163766,164083,164265,164447,164637,164869,165059,165236,165398,165555,165665,165848,165985,166189,166373,166557,166717,166875,167059,167286,167489,167660,167880,168102,168257,168457,168641,168744,168934,169075,169240,169411,169611,169815,170017,170182,170387,170586,170785,170982,171073,171222,171372,171456,171605,171750,171902,172043,172209,172370,174822,175123,175289,175444,175546,181660,181887,182073,184182,184307,186986,187258,187536,187781,187843,188128,191422,191878,192387,203163,203677,204114,204548,204991,208973,209094,209193,209598,209695,209812,209899,210022,210123,210529,210628,210747,210840,210947,211290,211397,211642,211763,212172,212420,212520,212625,212744,213253,213400,213519,213770,213903,214318,214572,214684,220034,220159,220567,220688,220916,221037,221170,221317,242039,242531,263002,263426,284193,284687,305203,305629,310470,315887,319978,325409,330151,335528,339512,343504,348895,349442,349875,350631,350861,351104,352271,353200,401345,401929,402402,403832,404576,405769,406823,407301,407594,407977,409492,410257,411400,411841,412282,412878,413152,413563,414579,414757,415510,415647,415738,417932,418198,418520,418730,418839,418958,419142,420260,420730,421481,424064,424159,424853,425081,425337,425596,426172,426526,426648,426787,427079,427339,428267,428553,428956,429358,429701,429913,430114,430327,430616,430901,441576,441663,441748,441847,446529,446635,446758,446890,447013,447143,447267,447400,447531,447656,447773,447893,448025,448153,448267,448385,448498,448619,448807,448994,449175,449358,449542,449707,449889,450009,450129,450237,450347,450459,450567,450677,450842,451008,451160,451325,451426,451546,451717,451878,452041,452202,452369,452488,452605,452785,452967,453148,453331,453486,453631,453753,453888,454051,454244,454370,454522,454664,454834,454990,455162,455453,462120,462212,462385,462547,462642,462811,462905,462994,463237,463326,463619,464035,464455,464876,465302,465719,466135,466552,466970,467384,467854,468327,468799,469210,469681,470153,470343,470549,470655,470763,470869,470981,471095,471207,471321,471437,471551,471659,471769,471877,472139,472518,472922,473069,473177,473287,473395,473509,473918,474332,474448,474866,475107,475537,475972,476382,476804,477214,477336,477745,478161,478283,478501,478685,483319,483663,483743,484099,484249,484393,484469,484581,484671,484933,485198,485306,485458,485566,485642,485754,485844,485946,486054,486162,486262,486370,486455,486621,486725,486853,486940,487107,487185,487299,487391,487655,487922,488032,488185,488295,488379,488768,488866,488974,489068,489198,489306,489428,489564,489672,489792,489926,490048,490176,490318,490444,490584,490710,490828,490960,491058,491168,491468,491580,491698,492162,492278,492581,492707,492803,493204,493314,493438,493576,493686,493808,494120,494244,494374,494850,494978,495293,495431,495593,495809,495965,496169,497650,497734,497838,498041,498230,498431,498624,498829,499142,499354,499520,499636,499882,500098,500411,500837,501299,501536,501688,501948,502092,502234,505466,505580,505700,505816,505910,506231,506330,506448,506549,506828,507113,507392,507674,507927,508186,508439,508695,509119,509195,512445,513800,514244,516098,516673,516881,517891,518271,518437,518578,523598,524024,524136,524271,524424,524621,524792,524975,525150,525337,525609,525767,525851,525955,526442,526998,527156,527375,527606,527829,528064,528286,528552,528690,529289,529403,529541,529653,529777,530348,530843,531389,531534,531627,531719,533646,534216,534514,534703,534909,535102,535312,536196,536341,536733,536891,537108,537369,545596,546471,547091,547288,548236,549001,549124,549897,550118,550318,552295,552395,552485,553171,553924,554689,555452,556227,557440,557605,559218,559539,560602,560812,560982,561552,562447,563080,563246,564732,565348,565584,565805,566763,567028,567293,567540,567954,568190,569475,569924,570111,570360,570602,570778,571019,571252,571477,572072,572547,573071,573332,574683,575158,576384,576854,577902,578354,578598,579055,580300,580783,580933,581488,581940,582340,582493,582638,582781,582851,583279,583567,584071,584580,584696,585598,585720,585832,586009,586275,586545,586811,587079,587335,587595,587851,588109,588361,588617,588869,589123,589355,589591,589843,590099,590351,590605,590837,591071,591183,591835,592290,592414,593506,594321,594517,594841,595230,595582,595823,596037,596336,596528,596843,597050,597396,597696,598097,598316,598729,598966,599336,600060,600415,600684,600824,601078,601222,601499,602491,602900,603532,603878,604246,605320,605683,606083,607591,608176,608494,611029,611223,611441,611667,611879,612078,612285,613489,613784,614341,614731,615363,615840,616085,616572,616818,618014,618411,619417,619639,620062,620253,620632,620720,620828,620936,621249,621574,621893,622224,624927,625115,625376,625625,628209,628401,628666,628919,629451,629859,630058,630642,630877,631001,631413,631627,632029,632132,632262,632437,632689,632885,633025,633219,634230,635299,635587,635717,636494,637151,637297,638003,638241,639781,639931,640348,640513,641199,641669,641865,641956,642040,642184,642418,642585,643513,643799,643959,644574,644733,645061,645288,645800,646162,646241,646580,646685,647050,647421,647782,649656,650285,651361,651785,652038,652190,653238,653975,654178,654424,654671,654889,655131,655452,655716,656021,656244,656555,656744,657459,657728,658222,658448,658888,659047,659331,660076,660441,660746,660904,661142,662461,662859,663087,663307,663449,664739,664845,664975,665113,665237,665525,665694,665794,666079,666193,667076,667831,668270,668394,668640,668833,668967,669158,669937,670155,670446,670725,671042,671264,671559,671842,671946,672287,673103,673419,673980,674486,674691,675477,675882,676543,676732,677283,677849,677969,678371,678905,684507,684806,687151,705660,707485,709492,709831,712264,718156,718596,719348,719532,719743,724401,724984,757209,757411,758546,758696,758871,761508,764795,775532,776388,776896,777407,779201,779461,780077,780572,781609,783475,783666,783999,784155,784348,786740,786969,787177,787347,789119,799047,800390,801400,803365,806588,806757,807949,808095,808780,811180,811711,812137,814569,814817,815587,819849,820024,823239,824777,835649,835892,838441,843860,843953,844016,844098,844191,844284,844371,844469,844560,844651,844739,844823,844919,845019,845125,845228,845329,845433,845539,845638,845744,845846,845953,846062,846173,846304,846424,846540,846658,846757,846864,846980,847099,847227,847316,847411,847488,847577,847668,847761,847835,847932,848027,848125,848224,848328,848424,848526,848629,848729,848832,848917,849018,849116,849206,849301,849388,849494,849596,849690,849781,849875,849951,850043,850132,850235,850346,850429,850515,850610,850707,850803,850891,850992,851093,851196,851302,851400,851497,851592,851690,851793,851893,851996,852101,852219,852335,852430,852523,852608,852704,852798,852890,852973,853077,853182,853282,853383,853488,853588,853689,853788,853890,853984,854091,854193,854296,854389,854485,854587,854690,854786,854888,854991,855088,855191,855289,855393,855498,855595,855703,855817,855932,856040,856154,856269,856371,856476,856584,856694,856810,856927,857022,857119,857218,857323,857429,857528,857633,857739,857839,857945,858046,858153,858272,858371,858476,858578,858680,858780,858883,858978,859082,859167,859271,859375,859473,859577,859683,859781,859886,859984,860097,860191,860280,860369,860452,860543,860626,860724,860814,860910,860999,861093,861181,861277,861362,861470,861571,861672,861770,861876,861967,862066,862163,862261,862357,862450,862560,862658,862753,862863,862955,863055,863154,863241,863345,863450,863549,863656,863763,863862,863971,864063,864174,864285,864396,864500,864615,864731,864858,864978,865073,865168,865265,865364,865456,865555,865647,865746,865832,865926,866029,866125,866228,866324,866427,866524,866622,866725,866818,866908,867009,867092,867183,867268,867360,867463,867558,867654,867747,867841,867920,868027,868118,868217,868310,868413,868517,868618,868719,868823,868917,869021,869125,869238,869344,869450,869558,869675,869776,869884,869984,870087,870192,870299,870395,870474,870564,870648,870740,870813,870905,870994,871086,871171,871268,871361,871456,871555,871652,871743,871834,871926,872021,872128,872236,872338,872435,872532,872625,872712,872796,872893,872990,873083,873170,873261,873360,873459,873554,873643,873724,873823,873927,874024,874129,874226,874310,874409,874513,874610,874715,874812,874910,875011,875117,875216,875323,875422,875521,875612,875701,875790,875872,875965,876056,876167,876268,876368,876480,876593,876691,876799,876893,876993,877082,877174,877285,877395,877490,877606,877732,877858,877977,878105,878230,878355,878473,878600,878709,878818,878931,879054,879177,879293,879418,879515,879623,879745,879861,879977,880086,880174,880275,880364,880465,880552,880640,880737,880829,880935,881035,881111,881188" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/876d8563d3a0673414de11fb9eb4d2a1/transformed/activity-1.8.0/res/values/values.xml", + "from": { + "startLines": "2,3", + "startColumns": "4,4", + "startOffsets": "55,97", + "endColumns": "41,59", + "endOffsets": "92,152" + }, + "to": { + "startLines": "1852,1899", + "startColumns": "4,4", + "startOffsets": "123262,125631", + "endColumns": "41,59", + "endOffsets": "123299,125686" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/9a42c6bba20e3615051551280bf9b220/transformed/startup-runtime-1.1.1/res/values/values.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "82", + "endOffsets": "133" + }, + "to": { + "startLines": "2007", + "startColumns": "4", + "startOffsets": "132970", + "endColumns": "82", + "endOffsets": "133048" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/347545d553f2245dd1a387759374950f/transformed/coordinatorlayout-1.1.0/res/values/values.xml", + "from": { + "startLines": "2,3,6,16", + "startColumns": "4,4,4,4", + "startOffsets": "55,116,261,869", + "endLines": "2,5,15,104", + "endColumns": "60,12,24,24", + "endOffsets": "111,256,864,6075" + }, + "to": { + "startLines": "109,9710,11673,11679", + "startColumns": "4,4,4,4", + "startOffsets": "5765,678910,750379,750590", + "endLines": "109,9712,11678,11762", + "endColumns": "60,12,24,24", + "endOffsets": "5821,679050,750585,755101" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,33,46", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "215,301,377,463,549,625,702,778,951,1052,1233,1354,1457,1637,1756,1868,1967,2155,2256,2437,2558,2733,2877,2936,2994,3164,3475", + "endLines": "4,5,6,7,8,9,10,11,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,45,64", + "endColumns": "85,75,85,85,75,76,75,75,100,180,120,102,179,118,111,98,187,100,180,120,174,143,58,57,74,20,20", + "endOffsets": "300,376,462,548,624,701,777,853,1051,1232,1353,1456,1636,1755,1867,1966,2154,2255,2436,2557,2732,2876,2935,2993,3068,3474,3887" + }, + "to": { + "startLines": "657,658,659,660,661,662,663,664,2076,2077,2078,2079,2080,2081,2082,2083,2085,2086,2087,2088,2089,2090,2091,2092,2093,12317,13308", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "33958,34048,34128,34218,34308,34388,34469,34549,138932,139037,139218,139343,139450,139630,139753,139869,140139,140327,140432,140613,140738,140913,141061,141124,141186,775737,812142", + "endLines": "657,658,659,660,661,662,663,664,2076,2077,2078,2079,2080,2081,2082,2083,2085,2086,2087,2088,2089,2090,2091,2092,2093,12329,13326", + "endColumns": "89,79,89,89,79,80,79,79,104,180,124,106,179,122,115,102,187,104,180,124,174,147,62,61,78,20,20", + "endOffsets": "34043,34123,34213,34303,34383,34464,34544,34624,139032,139213,139338,139445,139625,139748,139864,139967,140322,140427,140608,140733,140908,141056,141119,141181,141260,776047,812554" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-fr-rCA_values-fr-rCA.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-fr-rCA/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "197,299,475,601,706,873,1002,1119,1228,1419,1527,1708,1840,1996,2171,2240,2303", + "endColumns": "101,175,125,104,166,128,116,108,190,107,180,131,155,174,68,62,79", + "endOffsets": "298,474,600,705,872,1001,1118,1227,1418,1526,1707,1839,1995,2170,2239,2302,2382" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4608,4714,4894,5024,5133,5304,5437,5558,5832,6027,6139,6324,6460,6620,6799,6872,6939", + "endColumns": "105,179,129,108,170,132,120,112,194,111,184,135,159,178,72,66,83", + "endOffsets": "4709,4889,5019,5128,5299,5432,5553,5666,6022,6134,6319,6455,6615,6794,6867,6934,7018" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-fr-rCA/values-fr-rCA.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,283,390,498,580,681,778,878,1000,1085,1150,1216,1313,1393,1455,1547,1614,1688,1749,1828,1892,1946,2062,2121,2183,2237,2319,2448,2540,2615,2710,2791,2875,3019,3098,3179,3326,3419,3498,3553,3604,3670,3749,3830,3901,3981,4053,4131,4206,4278,4389,4486,4563,4661,4759,4837,4918,5018,5075,5159,5225,5308,5395,5457,5521,5584,5660,5762,5869,5966,6072,6131,6186,6275,6362,6439", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,106,107,81,100,96,99,121,84,64,65,96,79,61,91,66,73,60,78,63,53,115,58,61,53,81,128,91,74,94,80,83,143,78,80,146,92,78,54,50,65,78,80,70,79,71,77,74,71,110,96,76,97,97,77,80,99,56,83,65,82,86,61,63,62,75,101,106,96,105,58,54,88,86,76,80", + "endOffsets": "278,385,493,575,676,773,873,995,1080,1145,1211,1308,1388,1450,1542,1609,1683,1744,1823,1887,1941,2057,2116,2178,2232,2314,2443,2535,2610,2705,2786,2870,3014,3093,3174,3321,3414,3493,3548,3599,3665,3744,3825,3896,3976,4048,4126,4201,4273,4384,4481,4558,4656,4754,4832,4913,5013,5070,5154,5220,5303,5390,5452,5516,5579,5655,5757,5864,5961,6067,6126,6181,6270,6357,6434,6515" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3083,3190,3298,3380,3481,4301,4401,4523,7023,7088,7154,7251,7331,7393,7485,7552,7626,7687,7766,7830,7884,8000,8059,8121,8175,8257,8386,8478,8553,8648,8729,8813,8957,9036,9117,9264,9357,9436,9491,9542,9608,9687,9768,9839,9919,9991,10069,10144,10216,10327,10424,10501,10599,10697,10775,10856,10956,11013,11097,11163,11246,11333,11395,11459,11522,11598,11700,11807,11904,12010,12069,12124,12300,12387,12464", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,106,107,81,100,96,99,121,84,64,65,96,79,61,91,66,73,60,78,63,53,115,58,61,53,81,128,91,74,94,80,83,143,78,80,146,92,78,54,50,65,78,80,70,79,71,77,74,71,110,96,76,97,97,77,80,99,56,83,65,82,86,61,63,62,75,101,106,96,105,58,54,88,86,76,80", + "endOffsets": "328,3185,3293,3375,3476,3573,4396,4518,4603,7083,7149,7246,7326,7388,7480,7547,7621,7682,7761,7825,7879,7995,8054,8116,8170,8252,8381,8473,8548,8643,8724,8808,8952,9031,9112,9259,9352,9431,9486,9537,9603,9682,9763,9834,9914,9986,10064,10139,10211,10322,10419,10496,10594,10692,10770,10851,10951,11008,11092,11158,11241,11328,11390,11454,11517,11593,11695,11802,11899,12005,12064,12119,12208,12382,12459,12540" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-fr-rCA/values-fr-rCA.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,354,456,560,664,778", + "endColumns": "97,101,98,101,103,103,113,100", + "endOffsets": "148,250,349,451,555,659,773,874" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3578,3676,3778,3877,3979,4083,4187,12545", + "endColumns": "97,101,98,101,103,103,113,100", + "endOffsets": "3671,3773,3872,3974,4078,4182,4296,12641" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-fr-rCA/values-fr-rCA.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,216,323,433,520,626,756,841,921,1012,1105,1203,1298,1398,1491,1584,1679,1770,1861,1947,2057,2168,2271,2382,2490,2597,2756,2855", + "endColumns": "110,106,109,86,105,129,84,79,90,92,97,94,99,92,92,94,90,90,85,109,110,102,110,107,106,158,98,86", + "endOffsets": "211,318,428,515,621,751,836,916,1007,1100,1198,1293,1393,1486,1579,1674,1765,1856,1942,2052,2163,2266,2377,2485,2592,2751,2850,2937" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "333,444,551,661,748,854,984,1069,1149,1240,1333,1431,1526,1626,1719,1812,1907,1998,2089,2175,2285,2396,2499,2610,2718,2825,2984,12213", + "endColumns": "110,106,109,86,105,129,84,79,90,92,97,94,99,92,92,94,90,90,85,109,110,102,110,107,106,158,98,86", + "endOffsets": "439,546,656,743,849,979,1064,1144,1235,1328,1426,1521,1621,1714,1807,1902,1993,2084,2170,2280,2391,2494,2605,2713,2820,2979,3078,12295" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-fr-rCA/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "199", + "endColumns": "156", + "endOffsets": "355" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5671", + "endColumns": "160", + "endOffsets": "5827" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-sk_values-sk.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-sk/values-sk.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,354,452,562,670,792", + "endColumns": "95,101,100,97,109,107,121,100", + "endOffsets": "146,248,349,447,557,665,787,888" + }, + "to": { + "startLines": "40,41,42,43,44,45,46,136", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3543,3639,3741,3842,3940,4050,4158,12222", + "endColumns": "95,101,100,97,109,107,121,100", + "endOffsets": "3634,3736,3837,3935,4045,4153,4275,12318" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-sk/values-sk.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,212,313,424,510,618,736,815,892,983,1076,1174,1268,1368,1461,1556,1654,1745,1836,1920,2025,2133,2232,2338,2450,2553,2719,2817", + "endColumns": "106,100,110,85,107,117,78,76,90,92,97,93,99,92,94,97,90,90,83,104,107,98,105,111,102,165,97,82", + "endOffsets": "207,308,419,505,613,731,810,887,978,1071,1169,1263,1363,1456,1551,1649,1740,1831,1915,2020,2128,2227,2333,2445,2548,2714,2812,2895" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,132", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "428,535,636,747,833,941,1059,1138,1215,1306,1399,1497,1591,1691,1784,1879,1977,2068,2159,2243,2348,2456,2555,2661,2773,2876,3042,11905", + "endColumns": "106,100,110,85,107,117,78,76,90,92,97,93,99,92,94,97,90,90,83,104,107,98,105,111,102,165,97,82", + "endOffsets": "530,631,742,828,936,1054,1133,1210,1301,1394,1492,1586,1686,1779,1874,1972,2063,2154,2238,2343,2451,2550,2656,2768,2871,3037,3135,11983" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-sk/values-sk.xml", + "from": { + "startLines": "2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,378,453,528,606,698,781,873,1001,1082,1143,1208,1307,1383,1448,1538,1602,1668,1722,1791,1851,1905,2022,2082,2144,2198,2270,2400,2487,2567,2663,2747,2839,2978,3047,3125,3256,3344,3424,3478,3529,3595,3667,3744,3815,3897,3969,4046,4119,4190,4295,4383,4455,4547,4643,4717,4791,4887,4939,5021,5088,5175,5262,5324,5388,5451,5519,5625,5732,5830,5947,6005,6060,6139,6222,6297", + "endLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "endColumns": "12,74,74,77,91,82,91,127,80,60,64,98,75,64,89,63,65,53,68,59,53,116,59,61,53,71,129,86,79,95,83,91,138,68,77,130,87,79,53,50,65,71,76,70,81,71,76,72,70,104,87,71,91,95,73,73,95,51,81,66,86,86,61,63,62,67,105,106,97,116,57,54,78,82,74,75", + "endOffsets": "373,448,523,601,693,776,868,996,1077,1138,1203,1302,1378,1443,1533,1597,1663,1717,1786,1846,1900,2017,2077,2139,2193,2265,2395,2482,2562,2658,2742,2834,2973,3042,3120,3251,3339,3419,3473,3524,3590,3662,3739,3810,3892,3964,4041,4114,4185,4290,4378,4450,4542,4638,4712,4786,4882,4934,5016,5083,5170,5257,5319,5383,5446,5514,5620,5727,5825,5942,6000,6055,6134,6217,6292,6368" + }, + "to": { + "startLines": "2,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3140,3215,3290,3368,3460,4280,4372,4500,6848,6909,6974,7073,7149,7214,7304,7368,7434,7488,7557,7617,7671,7788,7848,7910,7964,8036,8166,8253,8333,8429,8513,8605,8744,8813,8891,9022,9110,9190,9244,9295,9361,9433,9510,9581,9663,9735,9812,9885,9956,10061,10149,10221,10313,10409,10483,10557,10653,10705,10787,10854,10941,11028,11090,11154,11217,11285,11391,11498,11596,11713,11771,11826,11988,12071,12146", + "endLines": "7,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "endColumns": "12,74,74,77,91,82,91,127,80,60,64,98,75,64,89,63,65,53,68,59,53,116,59,61,53,71,129,86,79,95,83,91,138,68,77,130,87,79,53,50,65,71,76,70,81,71,76,72,70,104,87,71,91,95,73,73,95,51,81,66,86,86,61,63,62,67,105,106,97,116,57,54,78,82,74,75", + "endOffsets": "423,3210,3285,3363,3455,3538,4367,4495,4576,6904,6969,7068,7144,7209,7299,7363,7429,7483,7552,7612,7666,7783,7843,7905,7959,8031,8161,8248,8328,8424,8508,8600,8739,8808,8886,9017,9105,9185,9239,9290,9356,9428,9505,9576,9658,9730,9807,9880,9951,10056,10144,10216,10308,10404,10478,10552,10648,10700,10782,10849,10936,11023,11085,11149,11212,11280,11386,11493,11591,11708,11766,11821,11900,12066,12141,12217" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-sk/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "134", + "endOffsets": "329" + }, + "to": { + "startLines": "58", + "startColumns": "4", + "startOffsets": "5580", + "endColumns": "138", + "endOffsets": "5714" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-sk/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,451,571,677,829,953,1062,1160,1325,1432,1598,1724,1883,2043,2107,2170", + "endColumns": "101,155,119,105,151,123,108,97,164,106,165,125,158,159,63,62,82", + "endOffsets": "294,450,570,676,828,952,1061,1159,1324,1431,1597,1723,1882,2042,2106,2169,2252" + }, + "to": { + "startLines": "50,51,52,53,54,55,56,57,59,60,61,62,63,64,65,66,67", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4581,4687,4847,4971,5081,5237,5365,5478,5719,5888,5999,6169,6299,6462,6626,6694,6761", + "endColumns": "105,159,123,109,155,127,112,101,168,110,169,129,162,163,67,66,86", + "endOffsets": "4682,4842,4966,5076,5232,5360,5473,5575,5883,5994,6164,6294,6457,6621,6689,6756,6843" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-hu_values-hu.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-hu/values-hu.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,305,420,504,619,742,819,894,985,1078,1173,1267,1367,1460,1555,1650,1741,1832,1915,2025,2135,2235,2346,2455,2574,2756,2859", + "endColumns": "107,91,114,83,114,122,76,74,90,92,94,93,99,92,94,94,90,90,82,109,109,99,110,108,118,181,102,83", + "endOffsets": "208,300,415,499,614,737,814,889,980,1073,1168,1262,1362,1455,1550,1645,1736,1827,1910,2020,2130,2230,2341,2450,2569,2751,2854,2938" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "313,421,513,628,712,827,950,1027,1102,1193,1286,1381,1475,1575,1668,1763,1858,1949,2040,2123,2233,2343,2443,2554,2663,2782,2964,12039", + "endColumns": "107,91,114,83,114,122,76,74,90,92,94,93,99,92,94,94,90,90,82,109,109,99,110,108,118,181,102,83", + "endOffsets": "416,508,623,707,822,945,1022,1097,1188,1281,1376,1470,1570,1663,1758,1853,1944,2035,2118,2228,2338,2438,2549,2658,2777,2959,3062,12118" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-hu/values-hu.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,263,344,420,497,587,667,766,886,969,1032,1096,1195,1270,1329,1439,1501,1570,1628,1700,1761,1816,1919,1976,2036,2091,2172,2292,2375,2453,2549,2635,2723,2858,2941,3021,3161,3255,3337,3390,3441,3507,3583,3665,3736,3820,3897,3972,4051,4128,4233,4329,4406,4498,4595,4669,4754,4851,4903,4986,5053,5141,5228,5290,5354,5417,5483,5581,5687,5781,5888,5945,6000,6085,6170,6247", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,80,75,76,89,79,98,119,82,62,63,98,74,58,109,61,68,57,71,60,54,102,56,59,54,80,119,82,77,95,85,87,134,82,79,139,93,81,52,50,65,75,81,70,83,76,74,78,76,104,95,76,91,96,73,84,96,51,82,66,87,86,61,63,62,65,97,105,93,106,56,54,84,84,76,72", + "endOffsets": "258,339,415,492,582,662,761,881,964,1027,1091,1190,1265,1324,1434,1496,1565,1623,1695,1756,1811,1914,1971,2031,2086,2167,2287,2370,2448,2544,2630,2718,2853,2936,3016,3156,3250,3332,3385,3436,3502,3578,3660,3731,3815,3892,3967,4046,4123,4228,4324,4401,4493,4590,4664,4749,4846,4898,4981,5048,5136,5223,5285,5349,5412,5478,5576,5682,5776,5883,5940,5995,6080,6165,6242,6315" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3067,3148,3224,3301,3391,4193,4292,4412,6923,6986,7050,7149,7224,7283,7393,7455,7524,7582,7654,7715,7770,7873,7930,7990,8045,8126,8246,8329,8407,8503,8589,8677,8812,8895,8975,9115,9209,9291,9344,9395,9461,9537,9619,9690,9774,9851,9926,10005,10082,10187,10283,10360,10452,10549,10623,10708,10805,10857,10940,11007,11095,11182,11244,11308,11371,11437,11535,11641,11735,11842,11899,11954,12123,12208,12285", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,80,75,76,89,79,98,119,82,62,63,98,74,58,109,61,68,57,71,60,54,102,56,59,54,80,119,82,77,95,85,87,134,82,79,139,93,81,52,50,65,75,81,70,83,76,74,78,76,104,95,76,91,96,73,84,96,51,82,66,87,86,61,63,62,65,97,105,93,106,56,54,84,84,76,72", + "endOffsets": "308,3143,3219,3296,3386,3466,4287,4407,4490,6981,7045,7144,7219,7278,7388,7450,7519,7577,7649,7710,7765,7868,7925,7985,8040,8121,8241,8324,8402,8498,8584,8672,8807,8890,8970,9110,9204,9286,9339,9390,9456,9532,9614,9685,9769,9846,9921,10000,10077,10182,10278,10355,10447,10544,10618,10703,10800,10852,10935,11002,11090,11177,11239,11303,11366,11432,11530,11636,11730,11837,11894,11949,12034,12203,12280,12353" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-hu/values-hu.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,356,457,560,667,777", + "endColumns": "96,101,101,100,102,106,109,100", + "endOffsets": "147,249,351,452,555,662,772,873" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3471,3568,3670,3772,3873,3976,4083,12358", + "endColumns": "96,101,101,100,102,106,109,100", + "endOffsets": "3563,3665,3767,3868,3971,4078,4188,12454" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-hu/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,300,480,614,719,883,1017,1135,1241,1407,1511,1692,1825,1993,2161,2228,2292", + "endColumns": "106,179,133,104,163,133,117,105,165,103,180,132,167,167,66,63,83", + "endOffsets": "299,479,613,718,882,1016,1134,1240,1406,1510,1691,1824,1992,2160,2227,2291,2375" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4495,4606,4790,4928,5037,5205,5343,5465,5752,5922,6030,6215,6352,6524,6696,6767,6835", + "endColumns": "110,183,137,108,167,137,121,109,169,107,184,136,171,171,70,67,87", + "endOffsets": "4601,4785,4923,5032,5200,5338,5460,5570,5917,6025,6210,6347,6519,6691,6762,6830,6918" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-hu/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "172", + "endOffsets": "367" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5575", + "endColumns": "176", + "endOffsets": "5747" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-w400dp-port-v13_values-w400dp-port-v13.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-w400dp-port-v13/values-w400dp-port-v13.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,114,170,226,293,358,413,478", + "endColumns": "58,55,55,66,64,54,64,68", + "endOffsets": "109,165,221,288,353,408,473,542" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-zh-rHK_values-zh-rHK.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-zh-rHK/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "199", + "endColumns": "103", + "endOffsets": "302" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "4990", + "endColumns": "107", + "endOffsets": "5093" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-zh-rHK/values-zh-rHK.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,147,246,340,434,527,620,716", + "endColumns": "91,98,93,93,92,92,95,100", + "endOffsets": "142,241,335,429,522,615,711,812" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3195,3287,3386,3480,3574,3667,3760,10671", + "endColumns": "91,98,93,93,92,92,95,100", + "endOffsets": "3282,3381,3475,3569,3662,3755,3851,10767" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-zh-rHK/values-zh-rHK.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,200,293,393,475,572,680,757,832,924,1018,1109,1205,1300,1394,1490,1582,1674,1766,1844,1940,2035,2130,2227,2323,2421,2572,2666", + "endColumns": "94,92,99,81,96,107,76,74,91,93,90,95,94,93,95,91,91,91,77,95,94,94,96,95,97,150,93,78", + "endOffsets": "195,288,388,470,567,675,752,827,919,1013,1104,1200,1295,1389,1485,1577,1669,1761,1839,1935,2030,2125,2222,2318,2416,2567,2661,2740" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "297,392,485,585,667,764,872,949,1024,1116,1210,1301,1397,1492,1586,1682,1774,1866,1958,2036,2132,2227,2322,2419,2515,2613,2764,10374", + "endColumns": "94,92,99,81,96,107,76,74,91,93,90,95,94,93,95,91,91,91,77,95,94,94,96,95,97,150,93,78", + "endOffsets": "387,480,580,662,759,867,944,1019,1111,1205,1296,1392,1487,1581,1677,1769,1861,1953,2031,2127,2222,2317,2414,2510,2608,2759,2853,10448" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-zh-rHK/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "197,294,418,529,627,730,842,940,1029,1135,1232,1357,1468,1571,1675,1726,1779", + "endColumns": "96,123,110,97,102,111,97,88,105,96,124,110,102,103,50,52,67", + "endOffsets": "293,417,528,626,729,841,939,1028,1134,1231,1356,1467,1570,1674,1725,1778,1846" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4126,4227,4355,4470,4572,4679,4795,4897,5098,5208,5309,5438,5553,5660,5768,5823,5880", + "endColumns": "100,127,114,101,106,115,101,92,109,100,128,114,106,107,54,56,71", + "endOffsets": "4222,4350,4465,4567,4674,4790,4892,4985,5203,5304,5433,5548,5655,5763,5818,5875,5947" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-zh-rHK/values-zh-rHK.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,247,310,371,438,507,584,674,781,854,905,967,1045,1104,1162,1240,1301,1358,1414,1473,1531,1585,1671,1727,1785,1839,1904,1997,2071,2143,2223,2297,2375,2495,2558,2621,2720,2797,2871,2921,2972,3038,3102,3170,3241,3313,3374,3445,3512,3572,3660,3740,3803,3886,3971,4045,4110,4186,4234,4308,4372,4448,4526,4588,4652,4715,4781,4861,4941,5017,5098,5152,5207,5276,5351,5424", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,62,60,66,68,76,89,106,72,50,61,77,58,57,77,60,56,55,58,57,53,85,55,57,53,64,92,73,71,79,73,77,119,62,62,98,76,73,49,50,65,63,67,70,71,60,70,66,59,87,79,62,82,84,73,64,75,47,73,63,75,77,61,63,62,65,79,79,75,80,53,54,68,74,72,69", + "endOffsets": "242,305,366,433,502,579,669,776,849,900,962,1040,1099,1157,1235,1296,1353,1409,1468,1526,1580,1666,1722,1780,1834,1899,1992,2066,2138,2218,2292,2370,2490,2553,2616,2715,2792,2866,2916,2967,3033,3097,3165,3236,3308,3369,3440,3507,3567,3655,3735,3798,3881,3966,4040,4105,4181,4229,4303,4367,4443,4521,4583,4647,4710,4776,4856,4936,5012,5093,5147,5202,5271,5346,5419,5489" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2858,2921,2982,3049,3118,3856,3946,4053,5952,6003,6065,6143,6202,6260,6338,6399,6456,6512,6571,6629,6683,6769,6825,6883,6937,7002,7095,7169,7241,7321,7395,7473,7593,7656,7719,7818,7895,7969,8019,8070,8136,8200,8268,8339,8411,8472,8543,8610,8670,8758,8838,8901,8984,9069,9143,9208,9284,9332,9406,9470,9546,9624,9686,9750,9813,9879,9959,10039,10115,10196,10250,10305,10453,10528,10601", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,62,60,66,68,76,89,106,72,50,61,77,58,57,77,60,56,55,58,57,53,85,55,57,53,64,92,73,71,79,73,77,119,62,62,98,76,73,49,50,65,63,67,70,71,60,70,66,59,87,79,62,82,84,73,64,75,47,73,63,75,77,61,63,62,65,79,79,75,80,53,54,68,74,72,69", + "endOffsets": "292,2916,2977,3044,3113,3190,3941,4048,4121,5998,6060,6138,6197,6255,6333,6394,6451,6507,6566,6624,6678,6764,6820,6878,6932,6997,7090,7164,7236,7316,7390,7468,7588,7651,7714,7813,7890,7964,8014,8065,8131,8195,8263,8334,8406,8467,8538,8605,8665,8753,8833,8896,8979,9064,9138,9203,9279,9327,9401,9465,9541,9619,9681,9745,9808,9874,9954,10034,10110,10191,10245,10300,10369,10523,10596,10666" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-th_values-th.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-th/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "124", + "endOffsets": "319" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5340", + "endColumns": "128", + "endOffsets": "5464" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-th/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,438,557,660,792,912,1027,1131,1271,1372,1515,1633,1769,1916,1976,2040", + "endColumns": "101,142,118,102,131,119,114,103,139,100,142,117,135,146,59,63,79", + "endOffsets": "294,437,556,659,791,911,1026,1130,1270,1371,1514,1632,1768,1915,1975,2039,2119" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4370,4476,4623,4746,4853,4989,5113,5232,5469,5613,5718,5865,5987,6127,6278,6342,6410", + "endColumns": "105,146,122,106,135,123,118,107,143,104,146,121,139,150,63,67,83", + "endOffsets": "4471,4618,4741,4848,4984,5108,5227,5335,5608,5713,5860,5982,6122,6273,6337,6405,6489" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-th/values-th.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,285,358,430,513,598,684,783,896,976,1044,1114,1204,1274,1334,1421,1487,1552,1613,1677,1738,1792,1893,1954,2014,2068,2138,2249,2336,2413,2500,2582,2663,2806,2885,2967,3099,3191,3269,3323,3376,3442,3512,3590,3661,3741,3813,3891,3960,4029,4127,4209,4297,4390,4484,4558,4627,4722,4774,4857,4925,5010,5098,5160,5224,5287,5357,5457,5553,5650,5743,5801,5858,5935,6017,6092", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,72,71,82,84,85,98,112,79,67,69,89,69,59,86,65,64,60,63,60,53,100,60,59,53,69,110,86,76,86,81,80,142,78,81,131,91,77,53,52,65,69,77,70,79,71,77,68,68,97,81,87,92,93,73,68,94,51,82,67,84,87,61,63,62,69,99,95,96,92,57,56,76,81,74,75", + "endOffsets": "280,353,425,508,593,679,778,891,971,1039,1109,1199,1269,1329,1416,1482,1547,1608,1672,1733,1787,1888,1949,2009,2063,2133,2244,2331,2408,2495,2577,2658,2801,2880,2962,3094,3186,3264,3318,3371,3437,3507,3585,3656,3736,3808,3886,3955,4024,4122,4204,4292,4385,4479,4553,4622,4717,4769,4852,4920,5005,5093,5155,5219,5282,5352,5452,5548,5645,5738,5796,5853,5930,6012,6087,6163" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2964,3037,3109,3192,3277,4078,4177,4290,6494,6562,6632,6722,6792,6852,6939,7005,7070,7131,7195,7256,7310,7411,7472,7532,7586,7656,7767,7854,7931,8018,8100,8181,8324,8403,8485,8617,8709,8787,8841,8894,8960,9030,9108,9179,9259,9331,9409,9478,9547,9645,9727,9815,9908,10002,10076,10145,10240,10292,10375,10443,10528,10616,10678,10742,10805,10875,10975,11071,11168,11261,11319,11376,11535,11617,11692", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,72,71,82,84,85,98,112,79,67,69,89,69,59,86,65,64,60,63,60,53,100,60,59,53,69,110,86,76,86,81,80,142,78,81,131,91,77,53,52,65,69,77,70,79,71,77,68,68,97,81,87,92,93,73,68,94,51,82,67,84,87,61,63,62,69,99,95,96,92,57,56,76,81,74,75", + "endOffsets": "330,3032,3104,3187,3272,3358,4172,4285,4365,6557,6627,6717,6787,6847,6934,7000,7065,7126,7190,7251,7305,7406,7467,7527,7581,7651,7762,7849,7926,8013,8095,8176,8319,8398,8480,8612,8704,8782,8836,8889,8955,9025,9103,9174,9254,9326,9404,9473,9542,9640,9722,9810,9903,9997,10071,10140,10235,10287,10370,10438,10523,10611,10673,10737,10800,10870,10970,11066,11163,11256,11314,11371,11448,11612,11687,11763" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-th/values-th.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,254,352,450,553,658,770", + "endColumns": "95,102,97,97,102,104,111,100", + "endOffsets": "146,249,347,445,548,653,765,866" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3363,3459,3562,3660,3758,3861,3966,11768", + "endColumns": "95,102,97,97,102,104,111,100", + "endOffsets": "3454,3557,3655,3753,3856,3961,4073,11864" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-th/values-th.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,210,303,411,496,598,708,786,863,954,1047,1138,1232,1332,1425,1520,1614,1705,1796,1877,1980,2078,2176,2279,2385,2486,2639,2734", + "endColumns": "104,92,107,84,101,109,77,76,90,92,90,93,99,92,94,93,90,90,80,102,97,97,102,105,100,152,94,81", + "endOffsets": "205,298,406,491,593,703,781,858,949,1042,1133,1227,1327,1420,1515,1609,1700,1791,1872,1975,2073,2171,2274,2380,2481,2634,2729,2811" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "335,440,533,641,726,828,938,1016,1093,1184,1277,1368,1462,1562,1655,1750,1844,1935,2026,2107,2210,2308,2406,2509,2615,2716,2869,11453", + "endColumns": "104,92,107,84,101,109,77,76,90,92,90,93,99,92,94,93,90,90,80,102,97,97,102,105,100,152,94,81", + "endOffsets": "435,528,636,721,823,933,1011,1088,1179,1272,1363,1457,1557,1650,1745,1839,1930,2021,2102,2205,2303,2401,2504,2610,2711,2864,2959,11530" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-tr_values-tr.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-tr/values-tr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,219,318,430,515,621,741,821,896,987,1080,1172,1266,1366,1459,1561,1656,1747,1838,1917,2024,2128,2224,2331,2434,2543,2699,2797", + "endColumns": "113,98,111,84,105,119,79,74,90,92,91,93,99,92,101,94,90,90,78,106,103,95,106,102,108,155,97,79", + "endOffsets": "214,313,425,510,616,736,816,891,982,1075,1167,1261,1361,1454,1556,1651,1742,1833,1912,2019,2123,2219,2326,2429,2538,2694,2792,2872" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "315,429,528,640,725,831,951,1031,1106,1197,1290,1382,1476,1576,1669,1771,1866,1957,2048,2127,2234,2338,2434,2541,2644,2753,2909,11680", + "endColumns": "113,98,111,84,105,119,79,74,90,92,91,93,99,92,101,94,90,90,78,106,103,95,106,102,108,155,97,79", + "endOffsets": "424,523,635,720,826,946,1026,1101,1192,1285,1377,1471,1571,1664,1766,1861,1952,2043,2122,2229,2333,2429,2536,2639,2748,2904,3002,11755" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-tr/values-tr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,352,449,551,657,768", + "endColumns": "96,101,97,96,101,105,110,100", + "endOffsets": "147,249,347,444,546,652,763,864" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3424,3521,3623,3721,3818,3920,4026,11993", + "endColumns": "96,101,97,96,101,105,110,100", + "endOffsets": "3516,3618,3716,3813,3915,4021,4132,12089" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-tr/values-tr.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,265,340,415,492,591,682,778,890,972,1032,1096,1187,1264,1325,1416,1479,1542,1601,1670,1733,1787,1895,1953,2015,2069,2142,2263,2347,2427,2526,2610,2701,2841,2918,2994,3125,3212,3288,3341,3395,3461,3531,3608,3679,3759,3830,3905,3983,4054,4155,4240,4329,4424,4517,4589,4661,4757,4809,4895,4962,5046,5136,5198,5262,5325,5395,5489,5591,5680,5780,5837,5895,5974,6058,6133", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,74,74,76,98,90,95,111,81,59,63,90,76,60,90,62,62,58,68,62,53,107,57,61,53,72,120,83,79,98,83,90,139,76,75,130,86,75,52,53,65,69,76,70,79,70,74,77,70,100,84,88,94,92,71,71,95,51,85,66,83,89,61,63,62,69,93,101,88,99,56,57,78,83,74,73", + "endOffsets": "260,335,410,487,586,677,773,885,967,1027,1091,1182,1259,1320,1411,1474,1537,1596,1665,1728,1782,1890,1948,2010,2064,2137,2258,2342,2422,2521,2605,2696,2836,2913,2989,3120,3207,3283,3336,3390,3456,3526,3603,3674,3754,3825,3900,3978,4049,4150,4235,4324,4419,4512,4584,4656,4752,4804,4890,4957,5041,5131,5193,5257,5320,5390,5484,5586,5675,5775,5832,5890,5969,6053,6128,6202" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3007,3082,3157,3234,3333,4137,4233,4345,6678,6738,6802,6893,6970,7031,7122,7185,7248,7307,7376,7439,7493,7601,7659,7721,7775,7848,7969,8053,8133,8232,8316,8407,8547,8624,8700,8831,8918,8994,9047,9101,9167,9237,9314,9385,9465,9536,9611,9689,9760,9861,9946,10035,10130,10223,10295,10367,10463,10515,10601,10668,10752,10842,10904,10968,11031,11101,11195,11297,11386,11486,11543,11601,11760,11844,11919", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,74,74,76,98,90,95,111,81,59,63,90,76,60,90,62,62,58,68,62,53,107,57,61,53,72,120,83,79,98,83,90,139,76,75,130,86,75,52,53,65,69,76,70,79,70,74,77,70,100,84,88,94,92,71,71,95,51,85,66,83,89,61,63,62,69,93,101,88,99,56,57,78,83,74,73", + "endOffsets": "310,3077,3152,3229,3328,3419,4228,4340,4422,6733,6797,6888,6965,7026,7117,7180,7243,7302,7371,7434,7488,7596,7654,7716,7770,7843,7964,8048,8128,8227,8311,8402,8542,8619,8695,8826,8913,8989,9042,9096,9162,9232,9309,9380,9460,9531,9606,9684,9755,9856,9941,10030,10125,10218,10290,10362,10458,10510,10596,10663,10747,10837,10899,10963,11026,11096,11190,11292,11381,11481,11538,11596,11675,11839,11914,11988" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-tr/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,299,450,582,683,826,952,1075,1177,1345,1448,1601,1731,1872,2035,2093,2153", + "endColumns": "105,150,131,100,142,125,122,101,167,102,152,129,140,162,57,59,75", + "endOffsets": "298,449,581,682,825,951,1074,1176,1344,1447,1600,1730,1871,2034,2092,2152,2228" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4427,4537,4692,4828,4933,5080,5210,5337,5590,5762,5869,6026,6160,6305,6472,6534,6598", + "endColumns": "109,154,135,104,146,129,126,105,171,106,156,133,144,166,61,63,79", + "endOffsets": "4532,4687,4823,4928,5075,5205,5332,5438,5757,5864,6021,6155,6300,6467,6529,6593,6673" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-tr/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "142", + "endOffsets": "337" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5443", + "endColumns": "146", + "endOffsets": "5585" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-da_values-da.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-da/values-da.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,272,350,426,504,601,681,781,930,1008,1067,1131,1217,1290,1350,1437,1501,1563,1625,1693,1758,1812,1930,1988,2049,2105,2180,2306,2392,2469,2560,2644,2724,2865,2943,3023,3145,3231,3309,3365,3416,3482,3550,3624,3695,3770,3842,3920,3990,4063,4167,4251,4328,4416,4505,4579,4652,4737,4786,4864,4930,5010,5093,5155,5219,5282,5351,5459,5562,5663,5762,5822,5877,5957,6037,6115", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,77,75,77,96,79,99,148,77,58,63,85,72,59,86,63,61,61,67,64,53,117,57,60,55,74,125,85,76,90,83,79,140,77,79,121,85,77,55,50,65,67,73,70,74,71,77,69,72,103,83,76,87,88,73,72,84,48,77,65,79,82,61,63,62,68,107,102,100,98,59,54,79,79,77,76", + "endOffsets": "267,345,421,499,596,676,776,925,1003,1062,1126,1212,1285,1345,1432,1496,1558,1620,1688,1753,1807,1925,1983,2044,2100,2175,2301,2387,2464,2555,2639,2719,2860,2938,3018,3140,3226,3304,3360,3411,3477,3545,3619,3690,3765,3837,3915,3985,4058,4162,4246,4323,4411,4500,4574,4647,4732,4781,4859,4925,5005,5088,5150,5214,5277,5346,5454,5557,5658,5757,5817,5872,5952,6032,6110,6187" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2974,3052,3128,3206,3303,4110,4210,4359,6639,6698,6762,6848,6921,6981,7068,7132,7194,7256,7324,7389,7443,7561,7619,7680,7736,7811,7937,8023,8100,8191,8275,8355,8496,8574,8654,8776,8862,8940,8996,9047,9113,9181,9255,9326,9401,9473,9551,9621,9694,9798,9882,9959,10047,10136,10210,10283,10368,10417,10495,10561,10641,10724,10786,10850,10913,10982,11090,11193,11294,11393,11453,11508,11668,11748,11826", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,77,75,77,96,79,99,148,77,58,63,85,72,59,86,63,61,61,67,64,53,117,57,60,55,74,125,85,76,90,83,79,140,77,79,121,85,77,55,50,65,67,73,70,74,71,77,69,72,103,83,76,87,88,73,72,84,48,77,65,79,82,61,63,62,68,107,102,100,98,59,54,79,79,77,76", + "endOffsets": "317,3047,3123,3201,3298,3378,4205,4354,4432,6693,6757,6843,6916,6976,7063,7127,7189,7251,7319,7384,7438,7556,7614,7675,7731,7806,7932,8018,8095,8186,8270,8350,8491,8569,8649,8771,8857,8935,8991,9042,9108,9176,9250,9321,9396,9468,9546,9616,9689,9793,9877,9954,10042,10131,10205,10278,10363,10412,10490,10556,10636,10719,10781,10845,10908,10977,11085,11188,11289,11388,11448,11503,11583,11743,11821,11898" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-da/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,451,574,679,818,939,1055,1156,1308,1410,1568,1691,1832,2006,2068,2126", + "endColumns": "101,155,122,104,138,120,115,100,151,101,157,122,140,173,61,57,73", + "endOffsets": "294,450,573,678,817,938,1054,1155,1307,1409,1567,1690,1831,2005,2067,2125,2199" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4437,4543,4703,4830,4939,5082,5207,5327,5559,5715,5821,5983,6110,6255,6433,6499,6561", + "endColumns": "105,159,126,108,142,124,119,104,155,105,161,126,144,177,65,61,77", + "endOffsets": "4538,4698,4825,4934,5077,5202,5322,5427,5710,5816,5978,6105,6250,6428,6494,6556,6634" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-da/values-da.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,350,448,555,664,782", + "endColumns": "95,101,96,97,106,108,117,100", + "endOffsets": "146,248,345,443,550,659,777,878" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3383,3479,3581,3678,3776,3883,3992,11903", + "endColumns": "95,101,96,97,106,108,117,100", + "endOffsets": "3474,3576,3673,3771,3878,3987,4105,11999" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-da/values-da.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,205,299,415,500,600,713,791,867,958,1051,1144,1238,1332,1425,1520,1618,1709,1800,1879,1987,2094,2190,2303,2406,2507,2660,2757", + "endColumns": "99,93,115,84,99,112,77,75,90,92,92,93,93,92,94,97,90,90,78,107,106,95,112,102,100,152,96,79", + "endOffsets": "200,294,410,495,595,708,786,862,953,1046,1139,1233,1327,1420,1515,1613,1704,1795,1874,1982,2089,2185,2298,2401,2502,2655,2752,2832" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "322,422,516,632,717,817,930,1008,1084,1175,1268,1361,1455,1549,1642,1737,1835,1926,2017,2096,2204,2311,2407,2520,2623,2724,2877,11588", + "endColumns": "99,93,115,84,99,112,77,75,90,92,92,93,93,92,94,97,90,90,78,107,106,95,112,102,100,152,96,79", + "endOffsets": "417,511,627,712,812,925,1003,1079,1170,1263,1356,1450,1544,1637,1732,1830,1921,2012,2091,2199,2306,2402,2515,2618,2719,2872,2969,11663" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-da/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "122", + "endOffsets": "317" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5432", + "endColumns": "126", + "endOffsets": "5554" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-az_values-az.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-az/values-az.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,265,353,438,518,603,682,778,894,974,1035,1099,1193,1261,1320,1415,1478,1542,1601,1668,1731,1785,1900,1958,2020,2074,2145,2277,2361,2440,2532,2616,2696,2830,2906,2982,3111,3195,3274,3331,3382,3448,3518,3596,3667,3747,3817,3893,3971,4042,4140,4226,4309,4402,4495,4568,4640,4734,4788,4872,4939,5023,5111,5175,5240,5304,5374,5476,5580,5676,5777,5838,5893,5973,6060,6135", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,87,84,79,84,78,95,115,79,60,63,93,67,58,94,62,63,58,66,62,53,114,57,61,53,70,131,83,78,91,83,79,133,75,75,128,83,78,56,50,65,69,77,70,79,69,75,77,70,97,85,82,92,92,72,71,93,53,83,66,83,87,63,64,63,69,101,103,95,100,60,54,79,86,74,73", + "endOffsets": "260,348,433,513,598,677,773,889,969,1030,1094,1188,1256,1315,1410,1473,1537,1596,1663,1726,1780,1895,1953,2015,2069,2140,2272,2356,2435,2527,2611,2691,2825,2901,2977,3106,3190,3269,3326,3377,3443,3513,3591,3662,3742,3812,3888,3966,4037,4135,4221,4304,4397,4490,4563,4635,4729,4783,4867,4934,5018,5106,5170,5235,5299,5369,5471,5575,5671,5772,5833,5888,5968,6055,6130,6204" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3023,3111,3196,3276,3361,4167,4263,4379,6705,6766,6830,6924,6992,7051,7146,7209,7273,7332,7399,7462,7516,7631,7689,7751,7805,7876,8008,8092,8171,8263,8347,8427,8561,8637,8713,8842,8926,9005,9062,9113,9179,9249,9327,9398,9478,9548,9624,9702,9773,9871,9957,10040,10133,10226,10299,10371,10465,10519,10603,10670,10754,10842,10906,10971,11035,11105,11207,11311,11407,11508,11569,11624,11788,11875,11950", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,87,84,79,84,78,95,115,79,60,63,93,67,58,94,62,63,58,66,62,53,114,57,61,53,70,131,83,78,91,83,79,133,75,75,128,83,78,56,50,65,69,77,70,79,69,75,77,70,97,85,82,92,92,72,71,93,53,83,66,83,87,63,64,63,69,101,103,95,100,60,54,79,86,74,73", + "endOffsets": "310,3106,3191,3271,3356,3435,4258,4374,4454,6761,6825,6919,6987,7046,7141,7204,7268,7327,7394,7457,7511,7626,7684,7746,7800,7871,8003,8087,8166,8258,8342,8422,8556,8632,8708,8837,8921,9000,9057,9108,9174,9244,9322,9393,9473,9543,9619,9697,9768,9866,9952,10035,10128,10221,10294,10366,10460,10514,10598,10665,10749,10837,10901,10966,11030,11100,11202,11306,11402,11503,11564,11619,11699,11870,11945,12019" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-az/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "157", + "endOffsets": "352" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5471", + "endColumns": "161", + "endOffsets": "5628" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-az/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,298,449,578,684,826,955,1071,1173,1335,1441,1586,1719,1859,2011,2071,2132", + "endColumns": "104,150,128,105,141,128,115,101,161,105,144,132,139,151,59,60,76", + "endOffsets": "297,448,577,683,825,954,1070,1172,1334,1440,1585,1718,1858,2010,2070,2131,2208" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4459,4568,4723,4856,4966,5112,5245,5365,5633,5799,5909,6058,6195,6339,6495,6559,6624", + "endColumns": "108,154,132,109,145,132,119,105,165,109,148,136,143,155,63,64,80", + "endOffsets": "4563,4718,4851,4961,5107,5240,5360,5466,5794,5904,6053,6190,6334,6490,6554,6619,6700" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-az/values-az.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,215,316,426,514,621,735,817,895,986,1079,1173,1272,1372,1465,1560,1654,1745,1837,1922,2027,2133,2233,2342,2447,2549,2707,2813", + "endColumns": "109,100,109,87,106,113,81,77,90,92,93,98,99,92,94,93,90,91,84,104,105,99,108,104,101,157,105,83", + "endOffsets": "210,311,421,509,616,730,812,890,981,1074,1168,1267,1367,1460,1555,1649,1740,1832,1917,2022,2128,2228,2337,2442,2544,2702,2808,2892" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "315,425,526,636,724,831,945,1027,1105,1196,1289,1383,1482,1582,1675,1770,1864,1955,2047,2132,2237,2343,2443,2552,2657,2759,2917,11704", + "endColumns": "109,100,109,87,106,113,81,77,90,92,93,98,99,92,94,93,90,91,84,104,105,99,108,104,101,157,105,83", + "endOffsets": "420,521,631,719,826,940,1022,1100,1191,1284,1378,1477,1577,1670,1765,1859,1950,2042,2127,2232,2338,2438,2547,2652,2754,2912,3018,11783" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-az/values-az.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,156,258,361,465,566,671,782", + "endColumns": "100,101,102,103,100,104,110,100", + "endOffsets": "151,253,356,460,561,666,777,878" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3440,3541,3643,3746,3850,3951,4056,12024", + "endColumns": "100,101,102,103,100,104,110,100", + "endOffsets": "3536,3638,3741,3845,3946,4051,4162,12120" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-nb_values-nb.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-nb/values-nb.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,208,303,417,503,603,716,793,868,959,1052,1146,1240,1340,1433,1528,1626,1717,1808,1886,1989,2087,2183,2287,2386,2487,2640,2737", + "endColumns": "102,94,113,85,99,112,76,74,90,92,93,93,99,92,94,97,90,90,77,102,97,95,103,98,100,152,96,79", + "endOffsets": "203,298,412,498,598,711,788,863,954,1047,1141,1235,1335,1428,1523,1621,1712,1803,1881,1984,2082,2178,2282,2381,2482,2635,2732,2812" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "311,414,509,623,709,809,922,999,1074,1165,1258,1352,1446,1546,1639,1734,1832,1923,2014,2092,2195,2293,2389,2493,2592,2693,2846,11494", + "endColumns": "102,94,113,85,99,112,76,74,90,92,93,93,99,92,94,97,90,90,77,102,97,95,103,98,100,152,96,79", + "endOffsets": "409,504,618,704,804,917,994,1069,1160,1253,1347,1441,1541,1634,1729,1827,1918,2009,2087,2190,2288,2384,2488,2587,2688,2841,2938,11569" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-nb/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,450,572,677,829,955,1071,1170,1320,1423,1580,1704,1842,2014,2077,2135", + "endColumns": "101,154,121,104,151,125,115,98,149,102,156,123,137,171,62,57,73", + "endOffsets": "294,449,571,676,828,954,1070,1169,1319,1422,1579,1703,1841,2013,2076,2134,2208" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4374,4480,4639,4765,4874,5030,5160,5280,5513,5667,5774,5935,6063,6205,6381,6448,6510", + "endColumns": "105,158,125,108,155,129,119,102,153,106,160,127,141,175,66,61,77", + "endOffsets": "4475,4634,4760,4869,5025,5155,5275,5378,5662,5769,5930,6058,6200,6376,6443,6505,6583" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-nb/values-nb.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,149,251,348,447,555,661,781", + "endColumns": "93,101,96,98,107,105,119,100", + "endOffsets": "144,246,343,442,550,656,776,877" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3348,3442,3544,3641,3740,3848,3954,11808", + "endColumns": "93,101,96,98,107,105,119,100", + "endOffsets": "3437,3539,3636,3735,3843,3949,4069,11904" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-nb/values-nb.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,261,338,411,498,586,666,765,884,966,1025,1089,1181,1249,1309,1396,1460,1522,1586,1654,1719,1773,1882,1940,2002,2056,2131,2251,2333,2410,2500,2584,2664,2798,2876,2956,3079,3167,3245,3299,3350,3416,3484,3558,3629,3705,3776,3854,3924,3994,4094,4183,4261,4349,4439,4511,4583,4667,4718,4796,4862,4943,5026,5088,5152,5215,5284,5384,5488,5581,5681,5739,5794,5872,5956,6034", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,76,72,86,87,79,98,118,81,58,63,91,67,59,86,63,61,63,67,64,53,108,57,61,53,74,119,81,76,89,83,79,133,77,79,122,87,77,53,50,65,67,73,70,75,70,77,69,69,99,88,77,87,89,71,71,83,50,77,65,80,82,61,63,62,68,99,103,92,99,57,54,77,83,77,71", + "endOffsets": "256,333,406,493,581,661,760,879,961,1020,1084,1176,1244,1304,1391,1455,1517,1581,1649,1714,1768,1877,1935,1997,2051,2126,2246,2328,2405,2495,2579,2659,2793,2871,2951,3074,3162,3240,3294,3345,3411,3479,3553,3624,3700,3771,3849,3919,3989,4089,4178,4256,4344,4434,4506,4578,4662,4713,4791,4857,4938,5021,5083,5147,5210,5279,5379,5483,5576,5676,5734,5789,5867,5951,6029,6101" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2943,3020,3093,3180,3268,4074,4173,4292,6588,6647,6711,6803,6871,6931,7018,7082,7144,7208,7276,7341,7395,7504,7562,7624,7678,7753,7873,7955,8032,8122,8206,8286,8420,8498,8578,8701,8789,8867,8921,8972,9038,9106,9180,9251,9327,9398,9476,9546,9616,9716,9805,9883,9971,10061,10133,10205,10289,10340,10418,10484,10565,10648,10710,10774,10837,10906,11006,11110,11203,11303,11361,11416,11574,11658,11736", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,76,72,86,87,79,98,118,81,58,63,91,67,59,86,63,61,63,67,64,53,108,57,61,53,74,119,81,76,89,83,79,133,77,79,122,87,77,53,50,65,67,73,70,75,70,77,69,69,99,88,77,87,89,71,71,83,50,77,65,80,82,61,63,62,68,99,103,92,99,57,54,77,83,77,71", + "endOffsets": "306,3015,3088,3175,3263,3343,4168,4287,4369,6642,6706,6798,6866,6926,7013,7077,7139,7203,7271,7336,7390,7499,7557,7619,7673,7748,7868,7950,8027,8117,8201,8281,8415,8493,8573,8696,8784,8862,8916,8967,9033,9101,9175,9246,9322,9393,9471,9541,9611,9711,9800,9878,9966,10056,10128,10200,10284,10335,10413,10479,10560,10643,10705,10769,10832,10901,11001,11105,11198,11298,11356,11411,11489,11653,11731,11803" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-nb/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "125", + "endOffsets": "320" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5383", + "endColumns": "129", + "endOffsets": "5508" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-w360dp-port-v13_values-w360dp-port-v13.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-w360dp-port-v13/values-w360dp-port-v13.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,114,170,226,293,358,413,478", + "endColumns": "58,55,55,66,64,54,64,68", + "endOffsets": "109,165,221,288,353,408,473,542" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-iw_values-iw.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-iw/values-iw.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,210,310,418,502,604,720,799,877,968,1062,1156,1250,1350,1443,1538,1631,1722,1814,1895,2000,2103,2201,2306,2408,2510,2664,2761", + "endColumns": "104,99,107,83,101,115,78,77,90,93,93,93,99,92,94,92,90,91,80,104,102,97,104,101,101,153,96,81", + "endOffsets": "205,305,413,497,599,715,794,872,963,1057,1151,1245,1345,1438,1533,1626,1717,1809,1890,1995,2098,2196,2301,2403,2505,2659,2756,2838" + }, + "to": { + "startLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,131", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "361,466,566,674,758,860,976,1055,1133,1224,1318,1412,1506,1606,1699,1794,1887,1978,2070,2151,2256,2359,2457,2562,2664,2766,2920,11337", + "endColumns": "104,99,107,83,101,115,78,77,90,93,93,93,99,92,94,92,90,91,80,104,102,97,104,101,101,153,96,81", + "endOffsets": "461,561,669,753,855,971,1050,1128,1219,1313,1407,1501,1601,1694,1789,1882,1973,2065,2146,2251,2354,2452,2557,2659,2761,2915,3012,11414" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-iw/values-iw.xml", + "from": { + "startLines": "2,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,311,388,463,540,640,731,824,937,1017,1077,1142,1230,1300,1363,1455,1518,1578,1637,1700,1761,1815,1917,1974,2033,2087,2155,2266,2347,2422,2509,2589,2671,2803,2874,2947,3071,3159,3235,3288,3342,3408,3481,3557,3628,3706,3776,3851,3933,4001,4102,4187,4257,4347,4438,4512,4585,4674,4725,4806,4873,4955,5040,5102,5166,5229,5297,5391,5486,5576,5673,5730,5788,5863,5945,6020", + "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "endColumns": "12,76,74,76,99,90,92,112,79,59,64,87,69,62,91,62,59,58,62,60,53,101,56,58,53,67,110,80,74,86,79,81,131,70,72,123,87,75,52,53,65,72,75,70,77,69,74,81,67,100,84,69,89,90,73,72,88,50,80,66,81,84,61,63,62,67,93,94,89,96,56,57,74,81,74,75", + "endOffsets": "306,383,458,535,635,726,819,932,1012,1072,1137,1225,1295,1358,1450,1513,1573,1632,1695,1756,1810,1912,1969,2028,2082,2150,2261,2342,2417,2504,2584,2666,2798,2869,2942,3066,3154,3230,3283,3337,3403,3476,3552,3623,3701,3771,3846,3928,3996,4097,4182,4252,4342,4433,4507,4580,4669,4720,4801,4868,4950,5035,5097,5161,5224,5292,5386,5481,5571,5668,5725,5783,5858,5940,6015,6091" + }, + "to": { + "startLines": "2,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3017,3094,3169,3246,3346,4134,4227,4340,6491,6551,6616,6704,6774,6837,6929,6992,7052,7111,7174,7235,7289,7391,7448,7507,7561,7629,7740,7821,7896,7983,8063,8145,8277,8348,8421,8545,8633,8709,8762,8816,8882,8955,9031,9102,9180,9250,9325,9407,9475,9576,9661,9731,9821,9912,9986,10059,10148,10199,10280,10347,10429,10514,10576,10640,10703,10771,10865,10960,11050,11147,11204,11262,11419,11501,11576", + "endLines": "6,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "endColumns": "12,76,74,76,99,90,92,112,79,59,64,87,69,62,91,62,59,58,62,60,53,101,56,58,53,67,110,80,74,86,79,81,131,70,72,123,87,75,52,53,65,72,75,70,77,69,74,81,67,100,84,69,89,90,73,72,88,50,80,66,81,84,61,63,62,67,93,94,89,96,56,57,74,81,74,75", + "endOffsets": "356,3089,3164,3241,3341,3432,4222,4335,4415,6546,6611,6699,6769,6832,6924,6987,7047,7106,7169,7230,7284,7386,7443,7502,7556,7624,7735,7816,7891,7978,8058,8140,8272,8343,8416,8540,8628,8704,8757,8811,8877,8950,9026,9097,9175,9245,9320,9402,9470,9571,9656,9726,9816,9907,9981,10054,10143,10194,10275,10342,10424,10509,10571,10635,10698,10766,10860,10955,11045,11142,11199,11257,11332,11496,11571,11647" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-iw/values-iw.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,149,251,348,445,546,646,752", + "endColumns": "93,101,96,96,100,99,105,100", + "endOffsets": "144,246,343,440,541,641,747,848" + }, + "to": { + "startLines": "39,40,41,42,43,44,45,135", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3437,3531,3633,3730,3827,3928,4028,11652", + "endColumns": "93,101,96,96,100,99,105,100", + "endOffsets": "3526,3628,3725,3822,3923,4023,4129,11748" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-iw/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "113", + "endOffsets": "308" + }, + "to": { + "startLines": "57", + "startColumns": "4", + "startOffsets": "5385", + "endColumns": "117", + "endOffsets": "5498" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-iw/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,292,442,563,663,798,919,1027,1126,1258,1358,1499,1618,1748,1889,1945,2001", + "endColumns": "98,149,120,99,134,120,107,98,131,99,140,118,129,140,55,55,76", + "endOffsets": "291,441,562,662,797,918,1026,1125,1257,1357,1498,1617,1747,1888,1944,2000,2077" + }, + "to": { + "startLines": "49,50,51,52,53,54,55,56,58,59,60,61,62,63,64,65,66", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4420,4523,4677,4802,4906,5045,5170,5282,5503,5639,5743,5888,6011,6145,6290,6350,6410", + "endColumns": "102,153,124,103,138,124,111,102,135,103,144,122,133,144,59,59,80", + "endOffsets": "4518,4672,4797,4901,5040,5165,5277,5380,5634,5738,5883,6006,6140,6285,6345,6405,6486" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-kn_values-kn.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-kn/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,300,466,595,706,845,970,1074,1169,1315,1424,1585,1716,1857,2010,2075,2134", + "endColumns": "106,165,128,110,138,124,103,94,145,108,160,130,140,152,64,58,80", + "endOffsets": "299,465,594,705,844,969,1073,1168,1314,1423,1584,1715,1856,2009,2074,2133,2214" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4587,4698,4868,5001,5116,5259,5388,5496,5741,5891,6004,6169,6304,6449,6606,6675,6738", + "endColumns": "110,169,132,114,142,128,107,98,149,112,164,134,144,156,68,62,84", + "endOffsets": "4693,4863,4996,5111,5254,5383,5491,5590,5886,5999,6164,6299,6444,6601,6670,6733,6818" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-kn/values-kn.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,219,331,444,529,636,762,840,916,1007,1100,1195,1289,1389,1482,1577,1671,1762,1853,1935,2051,2161,2260,2373,2478,2592,2756,2856", + "endColumns": "113,111,112,84,106,125,77,75,90,92,94,93,99,92,94,93,90,90,81,115,109,98,112,104,113,163,99,82", + "endOffsets": "214,326,439,524,631,757,835,911,1002,1095,1190,1284,1384,1477,1572,1666,1757,1848,1930,2046,2156,2255,2368,2473,2587,2751,2851,2934" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "327,441,553,666,751,858,984,1062,1138,1229,1322,1417,1511,1611,1704,1799,1893,1984,2075,2157,2273,2383,2482,2595,2700,2814,2978,11952", + "endColumns": "113,111,112,84,106,125,77,75,90,92,94,93,99,92,94,93,90,90,81,115,109,98,112,104,113,163,99,82", + "endOffsets": "436,548,661,746,853,979,1057,1133,1224,1317,1412,1506,1606,1699,1794,1888,1979,2070,2152,2268,2378,2477,2590,2695,2809,2973,3073,12030" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-kn/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "141", + "endOffsets": "336" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5595", + "endColumns": "145", + "endOffsets": "5736" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-kn/values-kn.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,256,357,463,564,672,800", + "endColumns": "97,102,100,105,100,107,127,100", + "endOffsets": "148,251,352,458,559,667,795,896" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3537,3635,3738,3839,3945,4046,4154,12280", + "endColumns": "97,102,100,105,100,107,127,100", + "endOffsets": "3630,3733,3834,3940,4041,4149,4277,12376" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-kn/values-kn.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,277,361,444,526,641,736,843,956,1041,1098,1161,1255,1321,1383,1486,1552,1623,1682,1758,1823,1877,1990,2048,2109,2163,2242,2358,2444,2527,2622,2708,2799,2941,3020,3099,3228,3316,3400,3457,3509,3575,3655,3745,3816,3895,3972,4049,4126,4195,4312,4411,4488,4581,4676,4750,4831,4927,4978,5062,5130,5216,5304,5367,5432,5495,5563,5668,5773,5868,5971,6032,6088,6170,6262,6341", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,83,82,81,114,94,106,112,84,56,62,93,65,61,102,65,70,58,75,64,53,112,57,60,53,78,115,85,82,94,85,90,141,78,78,128,87,83,56,51,65,79,89,70,78,76,76,76,68,116,98,76,92,94,73,80,95,50,83,67,85,87,62,64,62,67,104,104,94,102,60,55,81,91,78,73", + "endOffsets": "272,356,439,521,636,731,838,951,1036,1093,1156,1250,1316,1378,1481,1547,1618,1677,1753,1818,1872,1985,2043,2104,2158,2237,2353,2439,2522,2617,2703,2794,2936,3015,3094,3223,3311,3395,3452,3504,3570,3650,3740,3811,3890,3967,4044,4121,4190,4307,4406,4483,4576,4671,4745,4826,4922,4973,5057,5125,5211,5299,5362,5427,5490,5558,5663,5768,5863,5966,6027,6083,6165,6257,6336,6410" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3078,3162,3245,3327,3442,4282,4389,4502,6823,6880,6943,7037,7103,7165,7268,7334,7405,7464,7540,7605,7659,7772,7830,7891,7945,8024,8140,8226,8309,8404,8490,8581,8723,8802,8881,9010,9098,9182,9239,9291,9357,9437,9527,9598,9677,9754,9831,9908,9977,10094,10193,10270,10363,10458,10532,10613,10709,10760,10844,10912,10998,11086,11149,11214,11277,11345,11450,11555,11650,11753,11814,11870,12035,12127,12206", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,83,82,81,114,94,106,112,84,56,62,93,65,61,102,65,70,58,75,64,53,112,57,60,53,78,115,85,82,94,85,90,141,78,78,128,87,83,56,51,65,79,89,70,78,76,76,76,68,116,98,76,92,94,73,80,95,50,83,67,85,87,62,64,62,67,104,104,94,102,60,55,81,91,78,73", + "endOffsets": "322,3157,3240,3322,3437,3532,4384,4497,4582,6875,6938,7032,7098,7160,7263,7329,7400,7459,7535,7600,7654,7767,7825,7886,7940,8019,8135,8221,8304,8399,8485,8576,8718,8797,8876,9005,9093,9177,9234,9286,9352,9432,9522,9593,9672,9749,9826,9903,9972,10089,10188,10265,10358,10453,10527,10608,10704,10755,10839,10907,10993,11081,11144,11209,11272,11340,11445,11550,11645,11748,11809,11865,11947,12122,12201,12275" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-hy_values-hy.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-hy/values-hy.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,155,260,358,457,562,664,775", + "endColumns": "99,104,97,98,104,101,110,100", + "endOffsets": "150,255,353,452,557,659,770,871" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3436,3536,3641,3739,3838,3943,4045,12207", + "endColumns": "99,104,97,98,104,101,110,100", + "endOffsets": "3531,3636,3734,3833,3938,4040,4151,12303" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-hy/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,456,586,690,840,972,1095,1204,1367,1471,1635,1767,1925,2087,2148,2211", + "endColumns": "101,160,129,103,149,131,122,108,162,103,163,131,157,161,60,62,77", + "endOffsets": "294,455,585,689,839,971,1094,1203,1366,1470,1634,1766,1924,2086,2147,2210,2288" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4462,4568,4733,4867,4975,5129,5265,5392,5656,5823,5931,6099,6235,6397,6563,6628,6695", + "endColumns": "105,164,133,107,153,135,126,112,166,107,167,135,161,165,64,66,81", + "endOffsets": "4563,4728,4862,4970,5124,5260,5387,5500,5818,5926,6094,6230,6392,6558,6623,6690,6772" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-hy/values-hy.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,313,423,512,618,735,817,897,988,1081,1176,1270,1370,1463,1558,1652,1743,1834,1917,2023,2129,2228,2338,2446,2547,2717,2814", + "endColumns": "107,99,109,88,105,116,81,79,90,92,94,93,99,92,94,93,90,90,82,105,105,98,109,107,100,169,96,82", + "endOffsets": "208,308,418,507,613,730,812,892,983,1076,1171,1265,1365,1458,1553,1647,1738,1829,1912,2018,2124,2223,2333,2441,2542,2712,2809,2892" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "315,423,523,633,722,828,945,1027,1107,1198,1291,1386,1480,1580,1673,1768,1862,1953,2044,2127,2233,2339,2438,2548,2656,2757,2927,11887", + "endColumns": "107,99,109,88,105,116,81,79,90,92,94,93,99,92,94,93,90,90,82,105,105,98,109,107,100,169,96,82", + "endOffsets": "418,518,628,717,823,940,1022,1102,1193,1286,1381,1475,1575,1668,1763,1857,1948,2039,2122,2228,2334,2433,2543,2651,2752,2922,3019,11965" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-hy/values-hy.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,265,341,417,497,589,677,772,902,983,1044,1108,1205,1290,1352,1439,1501,1565,1626,1693,1754,1808,1930,1987,2047,2101,2182,2317,2401,2477,2567,2646,2731,2867,2942,3017,3160,3255,3335,3391,3444,3510,3584,3663,3734,3817,3888,3964,4040,4117,4223,4311,4391,4487,4583,4657,4735,4835,4886,4970,5039,5126,5217,5279,5343,5406,5477,5582,5688,5788,5891,5951,6008,6093,6176,6250", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,75,75,79,91,87,94,129,80,60,63,96,84,61,86,61,63,60,66,60,53,121,56,59,53,80,134,83,75,89,78,84,135,74,74,142,94,79,55,52,65,73,78,70,82,70,75,75,76,105,87,79,95,95,73,77,99,50,83,68,86,90,61,63,62,70,104,105,99,102,59,56,84,82,73,79", + "endOffsets": "260,336,412,492,584,672,767,897,978,1039,1103,1200,1285,1347,1434,1496,1560,1621,1688,1749,1803,1925,1982,2042,2096,2177,2312,2396,2472,2562,2641,2726,2862,2937,3012,3155,3250,3330,3386,3439,3505,3579,3658,3729,3812,3883,3959,4035,4112,4218,4306,4386,4482,4578,4652,4730,4830,4881,4965,5034,5121,5212,5274,5338,5401,5472,5577,5683,5783,5886,5946,6003,6088,6171,6245,6325" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3024,3100,3176,3256,3348,4156,4251,4381,6777,6838,6902,6999,7084,7146,7233,7295,7359,7420,7487,7548,7602,7724,7781,7841,7895,7976,8111,8195,8271,8361,8440,8525,8661,8736,8811,8954,9049,9129,9185,9238,9304,9378,9457,9528,9611,9682,9758,9834,9911,10017,10105,10185,10281,10377,10451,10529,10629,10680,10764,10833,10920,11011,11073,11137,11200,11271,11376,11482,11582,11685,11745,11802,11970,12053,12127", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,75,75,79,91,87,94,129,80,60,63,96,84,61,86,61,63,60,66,60,53,121,56,59,53,80,134,83,75,89,78,84,135,74,74,142,94,79,55,52,65,73,78,70,82,70,75,75,76,105,87,79,95,95,73,77,99,50,83,68,86,90,61,63,62,70,104,105,99,102,59,56,84,82,73,79", + "endOffsets": "310,3095,3171,3251,3343,3431,4246,4376,4457,6833,6897,6994,7079,7141,7228,7290,7354,7415,7482,7543,7597,7719,7776,7836,7890,7971,8106,8190,8266,8356,8435,8520,8656,8731,8806,8949,9044,9124,9180,9233,9299,9373,9452,9523,9606,9677,9753,9829,9906,10012,10100,10180,10276,10372,10446,10524,10624,10675,10759,10828,10915,11006,11068,11132,11195,11266,11371,11477,11577,11680,11740,11797,11882,12048,12122,12202" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-hy/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "146", + "endOffsets": "341" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5505", + "endColumns": "150", + "endOffsets": "5651" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-v21_values-v21.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-v21/values-v21.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,13", + "startColumns": "4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,173,237,304,368,484,610,736,864,1036", + "endLines": "2,3,4,5,6,7,8,9,12,17", + "endColumns": "117,63,66,63,115,125,125,127,12,12", + "endOffsets": "168,232,299,363,479,605,731,859,1031,1383" + }, + "to": { + "startLines": "2,17,18,19,347,348,349,350,537,540", + "startColumns": "4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,1406,1470,1537,25556,25672,25798,25924,37215,37387", + "endLines": "2,17,18,19,347,348,349,350,539,544", + "endColumns": "117,63,66,63,115,125,125,127,12,12", + "endOffsets": "168,1465,1532,1596,25667,25793,25919,26047,37382,37734" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-v21/values-v21.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,29,32,35,38,41,44,47,50,53,56,59,60,63,68,79,85,94,103,112,121,130,139,148,157,166,175,184,193,202,211,220,226,232,238,244,248,252,253,254,255,259,262,265,268,271,272,275,278,282,286", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,153,248,344,441,509,588,676,764,852,940,1027,1114,1201,1288,1384,1474,1570,1660,1753,1860,1965,2084,2209,2330,2543,2802,3073,3291,3523,3759,4009,4222,4431,4662,4863,4979,5149,5470,6499,6956,7460,7968,8477,8991,9496,10000,10505,11011,11513,12019,12528,13036,13535,14042,14550,14842,15136,15436,15736,16065,16406,16544,16688,16844,17237,17455,17677,17903,18119,18229,18399,18589,18830,19089", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,28,31,34,37,40,43,46,49,52,55,58,59,62,67,78,84,93,102,111,120,129,138,147,156,165,174,183,192,201,210,219,225,231,237,243,247,251,252,253,254,258,261,264,267,270,271,274,277,281,285,288", + "endColumns": "97,94,95,96,67,78,87,87,87,87,86,86,86,86,95,89,95,89,92,106,104,118,124,120,10,10,10,10,10,10,10,10,10,10,10,115,10,12,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,137,143,155,10,10,10,10,10,109,10,10,10,10,10", + "endOffsets": "148,243,339,436,504,583,671,759,847,935,1022,1109,1196,1283,1379,1469,1565,1655,1748,1855,1960,2079,2204,2325,2538,2797,3068,3286,3518,3754,4004,4217,4426,4657,4858,4974,5144,5465,6494,6951,7455,7963,8472,8986,9491,9995,10500,11006,11508,12014,12523,13031,13530,14037,14545,14837,15131,15431,15731,16060,16401,16539,16683,16839,17232,17450,17672,17898,18114,18224,18394,18584,18825,19084,19261" + }, + "to": { + "startLines": "3,4,5,6,7,8,9,10,11,12,13,14,15,16,20,21,22,23,84,85,86,87,89,90,91,94,97,192,195,198,201,207,210,213,280,283,284,287,292,303,351,360,369,378,387,396,405,414,423,432,441,450,459,468,477,486,492,498,504,510,514,518,519,520,521,525,528,531,534,545,546,549,552,556,560", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "173,271,366,462,559,627,706,794,882,970,1058,1145,1232,1319,1601,1697,1787,1883,7340,7433,7540,7645,7867,7992,8113,8326,8585,14766,14984,15216,15452,15901,16114,16323,21110,21311,21427,21597,21918,22947,26052,26556,27064,27573,28087,28592,29096,29601,30107,30609,31115,31624,32132,32631,33138,33646,33938,34232,34532,34832,35161,35502,35640,35784,35940,36333,36551,36773,36999,37739,37849,38019,38209,38450,38709", + "endLines": "3,4,5,6,7,8,9,10,11,12,13,14,15,16,20,21,22,23,84,85,86,87,89,90,93,96,99,194,197,200,203,209,212,215,282,283,286,291,302,308,359,368,377,386,395,404,413,422,431,440,449,458,467,476,485,491,497,503,509,513,517,518,519,520,524,527,530,533,536,545,548,551,555,559,562", + "endColumns": "97,94,95,96,67,78,87,87,87,87,86,86,86,86,95,89,95,89,92,106,104,118,124,120,10,10,10,10,10,10,10,10,10,10,10,115,10,12,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,137,143,155,10,10,10,10,10,109,10,10,10,10,10", + "endOffsets": "266,361,457,554,622,701,789,877,965,1053,1140,1227,1314,1401,1692,1782,1878,1968,7428,7535,7640,7759,7987,8108,8321,8580,8851,14979,15211,15447,15697,16109,16318,16549,21306,21422,21592,21913,22942,23399,26551,27059,27568,28082,28587,29091,29596,30102,30604,31110,31619,32127,32626,33133,33641,33933,34227,34527,34827,35156,35497,35635,35779,35935,36328,36546,36768,36994,37210,37844,38014,38204,38445,38704,38881" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v21/values-v21.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,19,20,21,22,24,26,27,28,29,30,32,34,36,38,40,42,43,48,50,52,53,54,56,58,59,60,61,62,63,106,109,152,155,158,160,162,164,167,171,174,175,176,179,180,181,182,183,184,187,188,190,192,194,196,200,202,203,204,205,207,211,213,215,216,217,218,219,220,222,223,224,234,235,236,248", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,146,249,352,457,564,673,782,891,1000,1109,1216,1319,1438,1593,1748,1853,1974,2075,2222,2363,2466,2585,2692,2795,2950,3121,3270,3435,3592,3743,3862,4213,4362,4511,4623,4770,4923,5070,5145,5234,5321,5422,5525,8283,8468,11238,11435,11634,11757,11880,11993,12176,12431,12632,12721,12832,13065,13166,13261,13384,13513,13630,13807,13906,14041,14184,14319,14438,14639,14758,14851,14962,15018,15125,15320,15431,15564,15659,15750,15841,15934,16051,16190,16261,16344,16967,17024,17082,17706", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,19,20,21,23,25,26,27,28,29,31,33,35,37,39,41,42,47,49,51,52,53,55,57,58,59,60,61,62,105,108,151,154,157,159,161,163,166,170,173,174,175,178,179,180,181,182,183,186,187,189,191,193,195,199,201,202,203,204,206,210,212,214,215,216,217,218,219,221,222,223,233,234,235,247,259", + "endColumns": "90,102,102,104,106,108,108,108,108,108,106,102,118,12,12,104,120,100,12,12,102,118,106,102,12,12,12,12,12,12,118,12,12,12,111,146,12,12,74,88,86,100,102,12,12,12,12,12,12,12,12,12,12,12,88,110,12,100,94,122,128,116,12,98,12,12,12,12,12,12,92,110,55,12,12,12,12,94,90,90,92,116,12,70,82,12,56,57,12,12", + "endOffsets": "141,244,347,452,559,668,777,886,995,1104,1211,1314,1433,1588,1743,1848,1969,2070,2217,2358,2461,2580,2687,2790,2945,3116,3265,3430,3587,3738,3857,4208,4357,4506,4618,4765,4918,5065,5140,5229,5316,5417,5520,8278,8463,11233,11430,11629,11752,11875,11988,12171,12426,12627,12716,12827,13060,13161,13256,13379,13508,13625,13802,13901,14036,14179,14314,14433,14634,14753,14846,14957,15013,15120,15315,15426,15559,15654,15745,15836,15929,16046,16185,16256,16339,16962,17019,17077,17701,18337" + }, + "to": { + "startLines": "24,25,26,27,28,29,30,31,32,33,34,35,36,37,39,41,42,43,44,46,48,49,50,51,52,54,56,58,60,62,64,65,70,72,74,75,76,78,80,81,82,83,88,100,143,146,189,204,216,218,220,222,225,229,232,233,234,237,238,239,240,241,242,245,246,248,250,252,254,258,260,261,262,263,265,269,271,273,274,275,276,277,278,309,310,311,321,322,323,335", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "1973,2064,2167,2270,2375,2482,2591,2700,2809,2918,3027,3134,3237,3356,3511,3666,3771,3892,3993,4140,4281,4384,4503,4610,4713,4868,5039,5188,5353,5510,5661,5780,6131,6280,6429,6541,6688,6841,6988,7063,7152,7239,7764,8856,11614,11799,14569,15702,16554,16677,16800,16913,17096,17351,17552,17641,17752,17985,18086,18181,18304,18433,18550,18727,18826,18961,19104,19239,19358,19559,19678,19771,19882,19938,20045,20240,20351,20484,20579,20670,20761,20854,20971,23404,23475,23558,24181,24238,24296,24920", + "endLines": "24,25,26,27,28,29,30,31,32,33,34,35,36,38,40,41,42,43,45,47,48,49,50,51,53,55,57,59,61,63,64,69,71,73,74,75,77,79,80,81,82,83,88,142,145,188,191,206,217,219,221,224,228,231,232,233,236,237,238,239,240,241,244,245,247,249,251,253,257,259,260,261,262,264,268,270,272,273,274,275,276,277,279,309,310,320,321,322,334,346", + "endColumns": "90,102,102,104,106,108,108,108,108,108,106,102,118,12,12,104,120,100,12,12,102,118,106,102,12,12,12,12,12,12,118,12,12,12,111,146,12,12,74,88,86,100,102,12,12,12,12,12,12,12,12,12,12,12,88,110,12,100,94,122,128,116,12,98,12,12,12,12,12,12,92,110,55,12,12,12,12,94,90,90,92,116,12,70,82,12,56,57,12,12", + "endOffsets": "2059,2162,2265,2370,2477,2586,2695,2804,2913,3022,3129,3232,3351,3506,3661,3766,3887,3988,4135,4276,4379,4498,4605,4708,4863,5034,5183,5348,5505,5656,5775,6126,6275,6424,6536,6683,6836,6983,7058,7147,7234,7335,7862,11609,11794,14564,14761,15896,16672,16795,16908,17091,17346,17547,17636,17747,17980,18081,18176,18299,18428,18545,18722,18821,18956,19099,19234,19353,19554,19673,19766,19877,19933,20040,20235,20346,20479,20574,20665,20756,20849,20966,21105,23470,23553,24176,24233,24291,24915,25551" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-v23_values-v23.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-v23/values-v23.xml", + "from": { + "startLines": "2,5,9,13,16,19,22,25,28,32", + "startColumns": "4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,271,413,574,784,991,1198,1401,1603,1868", + "endLines": "4,8,12,15,18,21,24,27,31,35", + "endColumns": "10,10,10,10,10,10,10,10,10,10", + "endOffsets": "266,408,569,779,986,1193,1396,1598,1863,2136" + }, + "to": { + "startLines": "53,56,60,64,67,70,73,76,79,83", + "startColumns": "4,4,4,4,4,4,4,4,4,4", + "startOffsets": "3382,3598,3740,3901,4111,4318,4525,4728,4930,5195", + "endLines": "55,59,63,66,69,72,75,78,82,86", + "endColumns": "10,10,10,10,10,10,10,10,10,10", + "endOffsets": "3593,3735,3896,4106,4313,4520,4723,4925,5190,5463" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v23/values-v23.xml", + "from": { + "startLines": "2,3,4,5,6,20,34,35,36,39,43,44,45,46", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,190,325,400,487,1225,1975,2094,2221,2443,2667,2782,2889,3002", + "endLines": "2,3,4,5,19,33,34,35,38,42,43,44,45,49", + "endColumns": "134,134,74,86,12,12,118,126,12,12,114,106,112,12", + "endOffsets": "185,320,395,482,1220,1970,2089,2216,2438,2662,2777,2884,2997,3227" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/30d4e98469639d69ad240eb0afa9d087/transformed/cardview-1.0.0/res/values-v23/values-v23.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endLines": "4", + "endColumns": "12", + "endOffsets": "200" + }, + "to": { + "startLines": "50", + "startColumns": "4", + "startOffsets": "3232", + "endLines": "52", + "endColumns": "12", + "endOffsets": "3377" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-sw600dp-v13_values-sw600dp-v13.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-sw600dp-v13/values-sw600dp-v13.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,124,193,263,337,413,472,543", + "endColumns": "68,68,69,73,75,58,70,67", + "endOffsets": "119,188,258,332,408,467,538,606" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-sw600dp-v13/values-sw600dp-v13.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,10,11,12,13,14", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,115,185,256,328,386,444,553,617,673,732,795", + "endLines": "2,3,4,5,6,7,9,10,11,12,13,17", + "endColumns": "59,69,70,71,57,57,10,63,55,58,62,10", + "endOffsets": "110,180,251,323,381,439,548,612,668,727,790,962" + }, + "to": { + "startLines": "10,11,12,13,14,15,16,18,19,20,21,22", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "611,671,741,812,884,942,1000,1109,1173,1229,1288,1351", + "endLines": "10,11,12,13,14,15,17,18,19,20,21,25", + "endColumns": "59,69,70,71,57,57,10,63,55,58,62,10", + "endOffsets": "666,736,807,879,937,995,1104,1168,1224,1283,1346,1518" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-mn_values-mn.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-mn/values-mn.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,265,344,421,500,587,672,770,889,974,1035,1100,1198,1279,1338,1431,1493,1556,1614,1685,1747,1801,1922,1979,2040,2094,2165,2298,2382,2462,2558,2641,2724,2857,2939,3017,3149,3239,3319,3373,3424,3490,3561,3639,3710,3789,3864,3942,4022,4105,4210,4298,4377,4467,4560,4634,4704,4795,4849,4929,4996,5080,5165,5227,5291,5354,5425,5529,5644,5741,5855,5913,5968,6052,6139,6215", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,78,76,78,86,84,97,118,84,60,64,97,80,58,92,61,62,57,70,61,53,120,56,60,53,70,132,83,79,95,82,82,132,81,77,131,89,79,53,50,65,70,77,70,78,74,77,79,82,104,87,78,89,92,73,69,90,53,79,66,83,84,61,63,62,70,103,114,96,113,57,54,83,86,75,81", + "endOffsets": "260,339,416,495,582,667,765,884,969,1030,1095,1193,1274,1333,1426,1488,1551,1609,1680,1742,1796,1917,1974,2035,2089,2160,2293,2377,2457,2553,2636,2719,2852,2934,3012,3144,3234,3314,3368,3419,3485,3556,3634,3705,3784,3859,3937,4017,4100,4205,4293,4372,4462,4555,4629,4699,4790,4844,4924,4991,5075,5160,5222,5286,5349,5420,5524,5639,5736,5850,5908,5963,6047,6134,6210,6292" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3007,3086,3163,3242,3329,4149,4247,4366,6666,6727,6792,6890,6971,7030,7123,7185,7248,7306,7377,7439,7493,7614,7671,7732,7786,7857,7990,8074,8154,8250,8333,8416,8549,8631,8709,8841,8931,9011,9065,9116,9182,9253,9331,9402,9481,9556,9634,9714,9797,9902,9990,10069,10159,10252,10326,10396,10487,10541,10621,10688,10772,10857,10919,10983,11046,11117,11221,11336,11433,11547,11605,11660,11825,11912,11988", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,78,76,78,86,84,97,118,84,60,64,97,80,58,92,61,62,57,70,61,53,120,56,60,53,70,132,83,79,95,82,82,132,81,77,131,89,79,53,50,65,70,77,70,78,74,77,79,82,104,87,78,89,92,73,69,90,53,79,66,83,84,61,63,62,70,103,114,96,113,57,54,83,86,75,81", + "endOffsets": "310,3081,3158,3237,3324,3409,4242,4361,4446,6722,6787,6885,6966,7025,7118,7180,7243,7301,7372,7434,7488,7609,7666,7727,7781,7852,7985,8069,8149,8245,8328,8411,8544,8626,8704,8836,8926,9006,9060,9111,9177,9248,9326,9397,9476,9551,9629,9709,9792,9897,9985,10064,10154,10247,10321,10391,10482,10536,10616,10683,10767,10852,10914,10978,11041,11112,11216,11331,11428,11542,11600,11655,11739,11907,11983,12065" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-mn/values-mn.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,356,454,559,671,790", + "endColumns": "97,101,100,97,104,111,118,100", + "endOffsets": "148,250,351,449,554,666,785,886" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3414,3512,3614,3715,3813,3918,4030,12070", + "endColumns": "97,101,100,97,104,111,118,100", + "endOffsets": "3507,3609,3710,3808,3913,4025,4144,12166" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-mn/values-mn.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,219,319,428,514,620,734,817,898,989,1082,1177,1273,1370,1463,1557,1649,1740,1830,1910,2017,2120,2217,2324,2426,2539,2698,2797", + "endColumns": "113,99,108,85,105,113,82,80,90,92,94,95,96,92,93,91,90,89,79,106,102,96,106,101,112,158,98,80", + "endOffsets": "214,314,423,509,615,729,812,893,984,1077,1172,1268,1365,1458,1552,1644,1735,1825,1905,2012,2115,2212,2319,2421,2534,2693,2792,2873" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "315,429,529,638,724,830,944,1027,1108,1199,1292,1387,1483,1580,1673,1767,1859,1950,2040,2120,2227,2330,2427,2534,2636,2749,2908,11744", + "endColumns": "113,99,108,85,105,113,82,80,90,92,94,95,96,92,93,91,90,89,79,106,102,96,106,101,112,158,98,80", + "endOffsets": "424,524,633,719,825,939,1022,1103,1194,1287,1382,1478,1575,1668,1762,1854,1945,2035,2115,2222,2325,2422,2529,2631,2744,2903,3002,11820" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-mn/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "145", + "endOffsets": "340" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5459", + "endColumns": "149", + "endOffsets": "5604" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-mn/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,299,452,580,683,816,938,1063,1169,1309,1412,1576,1701,1838,2002,2059,2117", + "endColumns": "105,152,127,102,132,121,124,105,139,102,163,124,136,163,56,57,72", + "endOffsets": "298,451,579,682,815,937,1062,1168,1308,1411,1575,1700,1837,2001,2058,2116,2189" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4451,4561,4718,4850,4957,5094,5220,5349,5609,5753,5860,6028,6157,6298,6466,6527,6589", + "endColumns": "109,156,131,106,136,125,128,109,143,106,167,128,140,167,60,61,76", + "endOffsets": "4556,4713,4845,4952,5089,5215,5344,5454,5748,5855,6023,6152,6293,6461,6522,6584,6661" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-fa_values-fa.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-fa/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,450,575,674,810,932,1042,1140,1289,1395,1561,1688,1837,1989,2051,2115", + "endColumns": "103,152,124,98,135,121,109,97,148,105,165,126,148,151,61,63,80", + "endOffsets": "296,449,574,673,809,931,1041,1139,1288,1394,1560,1687,1836,1988,2050,2114,2195" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4447,4555,4712,4841,4944,5084,5210,5324,5581,5734,5844,6014,6145,6298,6454,6520,6588", + "endColumns": "107,156,128,102,139,125,113,101,152,109,169,130,152,155,65,67,84", + "endOffsets": "4550,4707,4836,4939,5079,5205,5319,5421,5729,5839,6009,6140,6293,6449,6515,6583,6668" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-fa/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "150", + "endOffsets": "345" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5426", + "endColumns": "154", + "endOffsets": "5576" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-fa/values-fa.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,259,334,411,493,586,673,770,899,983,1041,1104,1194,1263,1323,1414,1477,1541,1600,1667,1729,1784,1907,1965,2026,2081,2153,2290,2371,2451,2548,2629,2711,2841,2915,2989,3121,3207,3284,3335,3389,3455,3526,3603,3674,3753,3826,3900,3970,4044,4145,4231,4305,4394,4486,4560,4633,4722,4773,4853,4920,5003,5087,5149,5213,5276,5345,5439,5540,5633,5731,5786,5844,5922,6008,6085", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,74,76,81,92,86,96,128,83,57,62,89,68,59,90,62,63,58,66,61,54,122,57,60,54,71,136,80,79,96,80,81,129,73,73,131,85,76,50,53,65,70,76,70,78,72,73,69,73,100,85,73,88,91,73,72,88,50,79,66,82,83,61,63,62,68,93,100,92,97,54,57,77,85,76,73", + "endOffsets": "254,329,406,488,581,668,765,894,978,1036,1099,1189,1258,1318,1409,1472,1536,1595,1662,1724,1779,1902,1960,2021,2076,2148,2285,2366,2446,2543,2624,2706,2836,2910,2984,3116,3202,3279,3330,3384,3450,3521,3598,3669,3748,3821,3895,3965,4039,4140,4226,4300,4389,4481,4555,4628,4717,4768,4848,4915,4998,5082,5144,5208,5271,5340,5434,5535,5628,5726,5781,5839,5917,6003,6080,6154" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2999,3074,3151,3233,3326,4137,4234,4363,6673,6731,6794,6884,6953,7013,7104,7167,7231,7290,7357,7419,7474,7597,7655,7716,7771,7843,7980,8061,8141,8238,8319,8401,8531,8605,8679,8811,8897,8974,9025,9079,9145,9216,9293,9364,9443,9516,9590,9660,9734,9835,9921,9995,10084,10176,10250,10323,10412,10463,10543,10610,10693,10777,10839,10903,10966,11035,11129,11230,11323,11421,11476,11534,11694,11780,11857", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,74,76,81,92,86,96,128,83,57,62,89,68,59,90,62,63,58,66,61,54,122,57,60,54,71,136,80,79,96,80,81,129,73,73,131,85,76,50,53,65,70,76,70,78,72,73,69,73,100,85,73,88,91,73,72,88,50,79,66,82,83,61,63,62,68,93,100,92,97,54,57,77,85,76,73", + "endOffsets": "304,3069,3146,3228,3321,3408,4229,4358,4442,6726,6789,6879,6948,7008,7099,7162,7226,7285,7352,7414,7469,7592,7650,7711,7766,7838,7975,8056,8136,8233,8314,8396,8526,8600,8674,8806,8892,8969,9020,9074,9140,9211,9288,9359,9438,9511,9585,9655,9729,9830,9916,9990,10079,10171,10245,10318,10407,10458,10538,10605,10688,10772,10834,10898,10961,11030,11124,11225,11318,11416,11471,11529,11607,11775,11852,11926" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-fa/values-fa.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,154,256,355,455,556,662,779", + "endColumns": "98,101,98,99,100,105,116,100", + "endOffsets": "149,251,350,450,551,657,774,875" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3413,3512,3614,3713,3813,3914,4020,11931", + "endColumns": "98,101,98,99,100,105,116,100", + "endOffsets": "3507,3609,3708,3808,3909,4015,4132,12027" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-fa/values-fa.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,215,316,427,511,612,727,807,884,977,1072,1164,1258,1360,1455,1552,1646,1739,1829,1911,2019,2123,2221,2327,2432,2537,2694,2795", + "endColumns": "109,100,110,83,100,114,79,76,92,94,91,93,101,94,96,93,92,89,81,107,103,97,105,104,104,156,100,81", + "endOffsets": "210,311,422,506,607,722,802,879,972,1067,1159,1253,1355,1450,1547,1641,1734,1824,1906,2014,2118,2216,2322,2427,2532,2689,2790,2872" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "309,419,520,631,715,816,931,1011,1088,1181,1276,1368,1462,1564,1659,1756,1850,1943,2033,2115,2223,2327,2425,2531,2636,2741,2898,11612", + "endColumns": "109,100,110,83,100,114,79,76,92,94,91,93,101,94,96,93,92,89,81,107,103,97,105,104,104,156,100,81", + "endOffsets": "414,515,626,710,811,926,1006,1083,1176,1271,1363,1457,1559,1654,1751,1845,1938,2028,2110,2218,2322,2420,2526,2631,2736,2893,2994,11689" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-nl_values-nl.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-nl/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,444,568,675,838,961,1080,1182,1356,1458,1623,1745,1904,2082,2146,2205", + "endColumns": "103,146,123,106,162,122,118,101,173,101,164,121,158,177,63,58,74", + "endOffsets": "296,443,567,674,837,960,1079,1181,1355,1457,1622,1744,1903,2081,2145,2204,2279" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4512,4620,4771,4899,5010,5177,5304,5427,5676,5854,5960,6129,6255,6418,6600,6668,6731", + "endColumns": "107,150,127,110,166,126,122,105,177,105,168,125,162,181,67,62,78", + "endOffsets": "4615,4766,4894,5005,5172,5299,5422,5528,5849,5955,6124,6250,6413,6595,6663,6726,6805" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-nl/values-nl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,157,259,359,459,566,670,789", + "endColumns": "101,101,99,99,106,103,118,100", + "endOffsets": "152,254,354,454,561,665,784,885" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3478,3580,3682,3782,3882,3989,4093,12217", + "endColumns": "101,101,99,99,106,103,118,100", + "endOffsets": "3575,3677,3777,3877,3984,4088,4207,12313" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-nl/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "138", + "endOffsets": "333" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5533", + "endColumns": "142", + "endOffsets": "5671" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-nl/values-nl.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,269,355,437,514,612,706,803,925,1006,1066,1130,1219,1298,1361,1454,1516,1582,1640,1713,1777,1833,1955,2012,2074,2130,2206,2340,2425,2504,2602,2688,2774,2912,2993,3072,3196,3286,3363,3420,3471,3537,3615,3698,3769,3845,3920,3999,4072,4143,4252,4346,4424,4513,4603,4677,4758,4845,4898,4977,5044,5125,5209,5271,5335,5398,5469,5577,5689,5791,5902,5963,6018,6099,6182,6258", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,85,81,76,97,93,96,121,80,59,63,88,78,62,92,61,65,57,72,63,55,121,56,61,55,75,133,84,78,97,85,85,137,80,78,123,89,76,56,50,65,77,82,70,75,74,78,72,70,108,93,77,88,89,73,80,86,52,78,66,80,83,61,63,62,70,107,111,101,110,60,54,80,82,75,71", + "endOffsets": "264,350,432,509,607,701,798,920,1001,1061,1125,1214,1293,1356,1449,1511,1577,1635,1708,1772,1828,1950,2007,2069,2125,2201,2335,2420,2499,2597,2683,2769,2907,2988,3067,3191,3281,3358,3415,3466,3532,3610,3693,3764,3840,3915,3994,4067,4138,4247,4341,4419,4508,4598,4672,4753,4840,4893,4972,5039,5120,5204,5266,5330,5393,5464,5572,5684,5786,5897,5958,6013,6094,6177,6253,6325" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3041,3127,3209,3286,3384,4212,4309,4431,6810,6870,6934,7023,7102,7165,7258,7320,7386,7444,7517,7581,7637,7759,7816,7878,7934,8010,8144,8229,8308,8406,8492,8578,8716,8797,8876,9000,9090,9167,9224,9275,9341,9419,9502,9573,9649,9724,9803,9876,9947,10056,10150,10228,10317,10407,10481,10562,10649,10702,10781,10848,10929,11013,11075,11139,11202,11273,11381,11493,11595,11706,11767,11822,11986,12069,12145", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,85,81,76,97,93,96,121,80,59,63,88,78,62,92,61,65,57,72,63,55,121,56,61,55,75,133,84,78,97,85,85,137,80,78,123,89,76,56,50,65,77,82,70,75,74,78,72,70,108,93,77,88,89,73,80,86,52,78,66,80,83,61,63,62,70,107,111,101,110,60,54,80,82,75,71", + "endOffsets": "314,3122,3204,3281,3379,3473,4304,4426,4507,6865,6929,7018,7097,7160,7253,7315,7381,7439,7512,7576,7632,7754,7811,7873,7929,8005,8139,8224,8303,8401,8487,8573,8711,8792,8871,8995,9085,9162,9219,9270,9336,9414,9497,9568,9644,9719,9798,9871,9942,10051,10145,10223,10312,10402,10476,10557,10644,10697,10776,10843,10924,11008,11070,11134,11197,11268,11376,11488,11590,11701,11762,11817,11898,12064,12140,12212" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-nl/values-nl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,223,328,435,520,624,744,822,898,990,1084,1179,1273,1373,1467,1563,1658,1750,1842,1924,2035,2138,2237,2352,2466,2569,2724,2827", + "endColumns": "117,104,106,84,103,119,77,75,91,93,94,93,99,93,95,94,91,91,81,110,102,98,114,113,102,154,102,82", + "endOffsets": "218,323,430,515,619,739,817,893,985,1079,1174,1268,1368,1462,1558,1653,1745,1837,1919,2030,2133,2232,2347,2461,2564,2719,2822,2905" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "319,437,542,649,734,838,958,1036,1112,1204,1298,1393,1487,1587,1681,1777,1872,1964,2056,2138,2249,2352,2451,2566,2680,2783,2938,11903", + "endColumns": "117,104,106,84,103,119,77,75,91,93,94,93,99,93,95,94,91,91,81,110,102,98,114,113,102,154,102,82", + "endOffsets": "432,537,644,729,833,953,1031,1107,1199,1293,1388,1482,1582,1676,1772,1867,1959,2051,2133,2244,2347,2446,2561,2675,2778,2933,3036,11981" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-be_values-be.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-be/values-be.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,225,328,444,530,635,754,834,911,1003,1097,1192,1286,1381,1475,1571,1666,1758,1850,1931,2037,2142,2240,2348,2454,2562,2735,2835", + "endColumns": "119,102,115,85,104,118,79,76,91,93,94,93,94,93,95,94,91,91,80,105,104,97,107,105,107,172,99,81", + "endOffsets": "220,323,439,525,630,749,829,906,998,1092,1187,1281,1376,1470,1566,1661,1753,1845,1926,2032,2137,2235,2343,2449,2557,2730,2830,2912" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,132", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "432,552,655,771,857,962,1081,1161,1238,1330,1424,1519,1613,1708,1802,1898,1993,2085,2177,2258,2364,2469,2567,2675,2781,2889,3062,12041", + "endColumns": "119,102,115,85,104,118,79,76,91,93,94,93,94,93,95,94,91,91,80,105,104,97,107,105,107,172,99,81", + "endOffsets": "547,650,766,852,957,1076,1156,1233,1325,1419,1514,1608,1703,1797,1893,1988,2080,2172,2253,2359,2464,2562,2670,2776,2884,3057,3157,12118" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-be/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "141", + "endOffsets": "336" + }, + "to": { + "startLines": "58", + "startColumns": "4", + "startOffsets": "5634", + "endColumns": "145", + "endOffsets": "5775" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-be/values-be.xml", + "from": { + "startLines": "2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,382,459,536,618,715,807,904,1036,1119,1197,1264,1357,1434,1497,1613,1676,1745,1804,1875,1934,1988,2109,2170,2233,2287,2360,2482,2570,2646,2737,2818,2901,3053,3139,3226,3359,3450,3533,3590,3641,3707,3779,3856,3927,4010,4085,4162,4244,4320,4428,4517,4599,4690,4786,4860,4941,5036,5090,5172,5238,5325,5411,5473,5537,5600,5669,5779,5892,5995,6102,6163,6218,6298,6383,6459", + "endLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "endColumns": "12,76,76,81,96,91,96,131,82,77,66,92,76,62,115,62,68,58,70,58,53,120,60,62,53,72,121,87,75,90,80,82,151,85,86,132,90,82,56,50,65,71,76,70,82,74,76,81,75,107,88,81,90,95,73,80,94,53,81,65,86,85,61,63,62,68,109,112,102,106,60,54,79,84,75,78", + "endOffsets": "377,454,531,613,710,802,899,1031,1114,1192,1259,1352,1429,1492,1608,1671,1740,1799,1870,1929,1983,2104,2165,2228,2282,2355,2477,2565,2641,2732,2813,2896,3048,3134,3221,3354,3445,3528,3585,3636,3702,3774,3851,3922,4005,4080,4157,4239,4315,4423,4512,4594,4685,4781,4855,4936,5031,5085,5167,5233,5320,5406,5468,5532,5595,5664,5774,5887,5990,6097,6158,6213,6293,6378,6454,6533" + }, + "to": { + "startLines": "2,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3162,3239,3316,3398,3495,4318,4415,4547,6862,6940,7007,7100,7177,7240,7356,7419,7488,7547,7618,7677,7731,7852,7913,7976,8030,8103,8225,8313,8389,8480,8561,8644,8796,8882,8969,9102,9193,9276,9333,9384,9450,9522,9599,9670,9753,9828,9905,9987,10063,10171,10260,10342,10433,10529,10603,10684,10779,10833,10915,10981,11068,11154,11216,11280,11343,11412,11522,11635,11738,11845,11906,11961,12123,12208,12284", + "endLines": "7,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "endColumns": "12,76,76,81,96,91,96,131,82,77,66,92,76,62,115,62,68,58,70,58,53,120,60,62,53,72,121,87,75,90,80,82,151,85,86,132,90,82,56,50,65,71,76,70,82,74,76,81,75,107,88,81,90,95,73,80,94,53,81,65,86,85,61,63,62,68,109,112,102,106,60,54,79,84,75,78", + "endOffsets": "427,3234,3311,3393,3490,3582,4410,4542,4625,6935,7002,7095,7172,7235,7351,7414,7483,7542,7613,7672,7726,7847,7908,7971,8025,8098,8220,8308,8384,8475,8556,8639,8791,8877,8964,9097,9188,9271,9328,9379,9445,9517,9594,9665,9748,9823,9900,9982,10058,10166,10255,10337,10428,10524,10598,10679,10774,10828,10910,10976,11063,11149,11211,11275,11338,11407,11517,11630,11733,11840,11901,11956,12036,12203,12279,12358" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-be/values-be.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,355,456,562,665,786", + "endColumns": "97,101,99,100,105,102,120,100", + "endOffsets": "148,250,350,451,557,660,781,882" + }, + "to": { + "startLines": "40,41,42,43,44,45,46,136", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3587,3685,3787,3887,3988,4094,4197,12363", + "endColumns": "97,101,99,100,105,102,120,100", + "endOffsets": "3680,3782,3882,3983,4089,4192,4313,12459" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-be/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,454,575,681,832,954,1065,1165,1323,1426,1585,1709,1858,2013,2078,2136", + "endColumns": "102,157,120,105,150,121,110,99,157,102,158,123,148,154,64,57,74", + "endOffsets": "295,453,574,680,831,953,1064,1164,1322,1425,1584,1708,1857,2012,2077,2135,2210" + }, + "to": { + "startLines": "50,51,52,53,54,55,56,57,59,60,61,62,63,64,65,66,67", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4630,4737,4899,5024,5134,5289,5415,5530,5780,5942,6049,6212,6340,6493,6652,6721,6783", + "endColumns": "106,161,124,109,154,125,114,103,161,106,162,127,152,158,68,61,78", + "endOffsets": "4732,4894,5019,5129,5284,5410,5525,5629,5937,6044,6207,6335,6488,6647,6716,6778,6857" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/values-ms_values-ms.arsc.flat", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ms/values-ms.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,150,252,349,459,565,683,798", + "endColumns": "94,101,96,109,105,117,114,100", + "endOffsets": "145,247,344,454,560,678,793,894" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3449,3544,3646,3743,3853,3959,4077,12185", + "endColumns": "94,101,96,109,105,117,114,100", + "endOffsets": "3539,3641,3738,3848,3954,4072,4187,12281" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ms/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,464,590,692,860,988,1104,1207,1388,1493,1664,1795,1962,2133,2196,2256", + "endColumns": "101,168,125,101,167,127,115,102,180,104,170,130,166,170,62,59,78", + "endOffsets": "294,463,589,691,859,987,1103,1206,1387,1492,1663,1794,1961,2132,2195,2255,2334" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4494,4600,4773,4903,5009,5181,5313,5433,5686,5871,5980,6155,6290,6461,6636,6703,6767", + "endColumns": "105,172,129,105,171,131,119,106,184,108,174,134,170,174,66,63,82", + "endOffsets": "4595,4768,4898,5004,5176,5308,5428,5535,5866,5975,6150,6285,6456,6631,6698,6762,6845" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ms/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "141", + "endOffsets": "336" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5540", + "endColumns": "145", + "endOffsets": "5681" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ms/values-ms.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,279,359,438,525,617,704,807,923,1006,1068,1133,1226,1291,1350,1437,1499,1561,1621,1687,1749,1803,1911,1968,2029,2084,2155,2275,2366,2443,2540,2625,2711,2859,2945,3031,3159,3247,3325,3378,3429,3495,3566,3644,3715,3794,3867,3943,4016,4087,4194,4286,4359,4449,4542,4616,4687,4778,4830,4910,4978,5062,5147,5209,5273,5336,5408,5512,5620,5716,5822,5879,5934,6020,6105,6183", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,79,78,86,91,86,102,115,82,61,64,92,64,58,86,61,61,59,65,61,53,107,56,60,54,70,119,90,76,96,84,85,147,85,85,127,87,77,52,50,65,70,77,70,78,72,75,72,70,106,91,72,89,92,73,70,90,51,79,67,83,84,61,63,62,71,103,107,95,105,56,54,85,84,77,76", + "endOffsets": "274,354,433,520,612,699,802,918,1001,1063,1128,1221,1286,1345,1432,1494,1556,1616,1682,1744,1798,1906,1963,2024,2079,2150,2270,2361,2438,2535,2620,2706,2854,2940,3026,3154,3242,3320,3373,3424,3490,3561,3639,3710,3789,3862,3938,4011,4082,4189,4281,4354,4444,4537,4611,4682,4773,4825,4905,4973,5057,5142,5204,5268,5331,5403,5507,5615,5711,5817,5874,5929,6015,6100,6178,6255" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3024,3104,3183,3270,3362,4192,4295,4411,6850,6912,6977,7070,7135,7194,7281,7343,7405,7465,7531,7593,7647,7755,7812,7873,7928,7999,8119,8210,8287,8384,8469,8555,8703,8789,8875,9003,9091,9169,9222,9273,9339,9410,9488,9559,9638,9711,9787,9860,9931,10038,10130,10203,10293,10386,10460,10531,10622,10674,10754,10822,10906,10991,11053,11117,11180,11252,11356,11464,11560,11666,11723,11778,11945,12030,12108", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,79,78,86,91,86,102,115,82,61,64,92,64,58,86,61,61,59,65,61,53,107,56,60,54,70,119,90,76,96,84,85,147,85,85,127,87,77,52,50,65,70,77,70,78,72,75,72,70,106,91,72,89,92,73,70,90,51,79,67,83,84,61,63,62,71,103,107,95,105,56,54,85,84,77,76", + "endOffsets": "324,3099,3178,3265,3357,3444,4290,4406,4489,6907,6972,7065,7130,7189,7276,7338,7400,7460,7526,7588,7642,7750,7807,7868,7923,7994,8114,8205,8282,8379,8464,8550,8698,8784,8870,8998,9086,9164,9217,9268,9334,9405,9483,9554,9633,9706,9782,9855,9926,10033,10125,10198,10288,10381,10455,10526,10617,10669,10749,10817,10901,10986,11048,11112,11175,11247,11351,11459,11555,11661,11718,11773,11859,12025,12103,12180" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ms/values-ms.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,216,321,429,516,620,731,810,888,979,1072,1167,1261,1359,1452,1547,1641,1732,1823,1903,2015,2123,2220,2329,2433,2540,2699,2800", + "endColumns": "110,104,107,86,103,110,78,77,90,92,94,93,97,92,94,93,90,90,79,111,107,96,108,103,106,158,100,80", + "endOffsets": "211,316,424,511,615,726,805,883,974,1067,1162,1256,1354,1447,1542,1636,1727,1818,1898,2010,2118,2215,2324,2428,2535,2694,2795,2876" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "329,440,545,653,740,844,955,1034,1112,1203,1296,1391,1485,1583,1676,1771,1865,1956,2047,2127,2239,2347,2444,2553,2657,2764,2923,11864", + "endColumns": "110,104,107,86,103,110,78,77,90,92,94,93,97,92,94,93,90,90,79,111,107,96,108,103,106,158,100,80", + "endOffsets": "435,540,648,735,839,950,1029,1107,1198,1291,1386,1480,1578,1671,1766,1860,1951,2042,2122,2234,2342,2439,2548,2652,2759,2918,3019,11940" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-af.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-af.json new file mode 100644 index 0000000..a38f10f --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-af.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-af/values-af.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-af/values-af.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,274,355,435,513,608,696,796,910,991,1051,1115,1203,1269,1332,1418,1480,1541,1599,1665,1728,1783,1901,1958,2020,2075,2144,2263,2351,2426,2519,2604,2687,2826,2909,2990,3118,3205,3282,3340,3391,3457,3526,3602,3673,3749,3823,3902,3975,4046,4149,4236,4307,4396,4486,4558,4633,4720,4771,4850,4917,4998,5082,5144,5208,5271,5341,5445,5548,5644,5744,5806,5861,5938,6021,6097", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,80,79,77,94,87,99,113,80,59,63,87,65,62,85,61,60,57,65,62,54,117,56,61,54,68,118,87,74,92,84,82,138,82,80,127,86,76,57,50,65,68,75,70,75,73,78,72,70,102,86,70,88,89,71,74,86,50,78,66,80,83,61,63,62,69,103,102,95,99,61,54,76,82,75,72", + "endOffsets": "269,350,430,508,603,691,791,905,986,1046,1110,1198,1264,1327,1413,1475,1536,1594,1660,1723,1778,1896,1953,2015,2070,2139,2258,2346,2421,2514,2599,2682,2821,2904,2985,3113,3200,3277,3335,3386,3452,3521,3597,3668,3744,3818,3897,3970,4041,4144,4231,4302,4391,4481,4553,4628,4715,4766,4845,4912,4993,5077,5139,5203,5266,5336,5440,5543,5639,5739,5801,5856,5933,6016,6092,6165" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2996,3077,3157,3235,3330,4150,4250,4364,6641,6701,6765,6853,6919,6982,7068,7130,7191,7249,7315,7378,7433,7551,7608,7670,7725,7794,7913,8001,8076,8169,8254,8337,8476,8559,8640,8768,8855,8932,8990,9041,9107,9176,9252,9323,9399,9473,9552,9625,9696,9799,9886,9957,10046,10136,10208,10283,10370,10421,10500,10567,10648,10732,10794,10858,10921,10991,11095,11198,11294,11394,11456,11511,11669,11752,11828", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,80,79,77,94,87,99,113,80,59,63,87,65,62,85,61,60,57,65,62,54,117,56,61,54,68,118,87,74,92,84,82,138,82,80,127,86,76,57,50,65,68,75,70,75,73,78,72,70,102,86,70,88,89,71,74,86,50,78,66,80,83,61,63,62,69,103,102,95,99,61,54,76,82,75,72", + "endOffsets": "319,3072,3152,3230,3325,3413,4245,4359,4440,6696,6760,6848,6914,6977,7063,7125,7186,7244,7310,7373,7428,7546,7603,7665,7720,7789,7908,7996,8071,8164,8249,8332,8471,8554,8635,8763,8850,8927,8985,9036,9102,9171,9247,9318,9394,9468,9547,9620,9691,9794,9881,9952,10041,10131,10203,10278,10365,10416,10495,10562,10643,10727,10789,10853,10916,10986,11090,11193,11289,11389,11451,11506,11583,11747,11823,11896" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-af/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "138", + "endOffsets": "333" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5439", + "endColumns": "142", + "endOffsets": "5577" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-af/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,448,570,676,822,940,1057,1155,1317,1421,1574,1697,1832,1982,2044,2103", + "endColumns": "102,151,121,105,145,117,116,97,161,103,152,122,134,149,61,58,74", + "endOffsets": "295,447,569,675,821,939,1056,1154,1316,1420,1573,1696,1831,1981,2043,2102,2177" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4445,4552,4708,4834,4944,5094,5216,5337,5582,5748,5856,6013,6140,6279,6433,6499,6562", + "endColumns": "106,155,125,109,149,121,120,101,165,107,156,126,138,153,65,62,78", + "endOffsets": "4547,4703,4829,4939,5089,5211,5332,5434,5743,5851,6008,6135,6274,6428,6494,6557,6636" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-af/values-af.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,353,451,558,667,787", + "endColumns": "97,101,97,97,106,108,119,100", + "endOffsets": "148,250,348,446,553,662,782,883" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3418,3516,3618,3716,3814,3921,4030,11901", + "endColumns": "97,101,97,97,106,108,119,100", + "endOffsets": "3511,3613,3711,3809,3916,4025,4145,11997" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-af/values-af.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,309,415,500,603,721,798,874,965,1058,1153,1247,1346,1439,1534,1633,1728,1822,1903,2010,2115,2212,2320,2423,2525,2679,2777", + "endColumns": "107,95,105,84,102,117,76,75,90,92,94,93,98,92,94,98,94,93,80,106,104,96,107,102,101,153,97,80", + "endOffsets": "208,304,410,495,598,716,793,869,960,1053,1148,1242,1341,1434,1529,1628,1723,1817,1898,2005,2110,2207,2315,2418,2520,2674,2772,2853" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "324,432,528,634,719,822,940,1017,1093,1184,1277,1372,1466,1565,1658,1753,1852,1947,2041,2122,2229,2334,2431,2539,2642,2744,2898,11588", + "endColumns": "107,95,105,84,102,117,76,75,90,92,94,93,98,92,94,98,94,93,80,106,104,96,107,102,101,153,97,80", + "endOffsets": "427,523,629,714,817,935,1012,1088,1179,1272,1367,1461,1560,1653,1748,1847,1942,2036,2117,2224,2329,2426,2534,2637,2739,2893,2991,11664" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-am.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-am.json new file mode 100644 index 0000000..7b5546c --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-am.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-am/values-am.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-am/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,291,426,544,642,765,884,988,1086,1210,1309,1450,1569,1700,1823,1879,1932", + "endColumns": "97,134,117,97,122,118,103,97,123,98,140,118,130,122,55,52,66", + "endOffsets": "290,425,543,641,764,883,987,1085,1209,1308,1449,1568,1699,1822,1878,1931,1998" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4261,4363,4502,4624,4726,4853,4976,5084,5318,5446,5549,5694,5817,5952,6079,6139,6196", + "endColumns": "101,138,121,101,126,122,107,101,127,102,144,122,134,126,59,56,70", + "endOffsets": "4358,4497,4619,4721,4848,4971,5079,5181,5441,5544,5689,5812,5947,6074,6134,6191,6262" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-am/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "127", + "endOffsets": "322" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5186", + "endColumns": "131", + "endOffsets": "5313" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-am/values-am.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,261,332,400,475,557,638,727,829,906,965,1029,1114,1176,1234,1319,1382,1444,1502,1568,1630,1685,1781,1838,1897,1953,2020,2125,2205,2286,2378,2463,2544,2673,2746,2817,2931,3013,3089,3140,3191,3257,3323,3396,3467,3542,3610,3683,3754,3821,3919,4004,4071,4158,4246,4320,4388,4473,4524,4602,4666,4746,4828,4890,4954,5017,5083,5178,5273,5358,5449,5504,5559,5635,5714,5789", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,70,67,74,81,80,88,101,76,58,63,84,61,57,84,62,61,57,65,61,54,95,56,58,55,66,104,79,80,91,84,80,128,72,70,113,81,75,50,50,65,65,72,70,74,67,72,70,66,97,84,66,86,87,73,67,84,50,77,63,79,81,61,63,62,65,94,94,84,90,54,54,75,78,74,70", + "endOffsets": "256,327,395,470,552,633,722,824,901,960,1024,1109,1171,1229,1314,1377,1439,1497,1563,1625,1680,1776,1833,1892,1948,2015,2120,2200,2281,2373,2458,2539,2668,2741,2812,2926,3008,3084,3135,3186,3252,3318,3391,3462,3537,3605,3678,3749,3816,3914,3999,4066,4153,4241,4315,4383,4468,4519,4597,4661,4741,4823,4885,4949,5012,5078,5173,5268,5353,5444,5499,5554,5630,5709,5784,5855" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2929,3000,3068,3143,3225,3993,4082,4184,6267,6326,6390,6475,6537,6595,6680,6743,6805,6863,6929,6991,7046,7142,7199,7258,7314,7381,7486,7566,7647,7739,7824,7905,8034,8107,8178,8292,8374,8450,8501,8552,8618,8684,8757,8828,8903,8971,9044,9115,9182,9280,9365,9432,9519,9607,9681,9749,9834,9885,9963,10027,10107,10189,10251,10315,10378,10444,10539,10634,10719,10810,10865,10920,11076,11155,11230", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,70,67,74,81,80,88,101,76,58,63,84,61,57,84,62,61,57,65,61,54,95,56,58,55,66,104,79,80,91,84,80,128,72,70,113,81,75,50,50,65,65,72,70,74,67,72,70,66,97,84,66,86,87,73,67,84,50,77,63,79,81,61,63,62,65,94,94,84,90,54,54,75,78,74,70", + "endOffsets": "306,2995,3063,3138,3220,3301,4077,4179,4256,6321,6385,6470,6532,6590,6675,6738,6800,6858,6924,6986,7041,7137,7194,7253,7309,7376,7481,7561,7642,7734,7819,7900,8029,8102,8173,8287,8369,8445,8496,8547,8613,8679,8752,8823,8898,8966,9039,9110,9177,9275,9360,9427,9514,9602,9676,9744,9829,9880,9958,10022,10102,10184,10246,10310,10373,10439,10534,10629,10714,10805,10860,10915,10991,11150,11225,11296" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-am/values-am.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,148,248,345,444,540,642,742", + "endColumns": "92,99,96,98,95,101,99,100", + "endOffsets": "143,243,340,439,535,637,737,838" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3306,3399,3499,3596,3695,3791,3893,11301", + "endColumns": "92,99,96,98,95,101,99,100", + "endOffsets": "3394,3494,3591,3690,3786,3888,3988,11397" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-am/values-am.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,203,301,407,493,596,713,791,867,958,1051,1143,1237,1337,1430,1525,1618,1709,1800,1880,1980,2080,2176,2278,2378,2477,2627,2723", + "endColumns": "97,97,105,85,102,116,77,75,90,92,91,93,99,92,94,92,90,90,79,99,99,95,101,99,98,149,95,79", + "endOffsets": "198,296,402,488,591,708,786,862,953,1046,1138,1232,1332,1425,1520,1613,1704,1795,1875,1975,2075,2171,2273,2373,2472,2622,2718,2798" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "311,409,507,613,699,802,919,997,1073,1164,1257,1349,1443,1543,1636,1731,1824,1915,2006,2086,2186,2286,2382,2484,2584,2683,2833,10996", + "endColumns": "97,97,105,85,102,116,77,75,90,92,91,93,99,92,94,92,90,90,79,99,99,95,101,99,98,149,95,79", + "endOffsets": "404,502,608,694,797,914,992,1068,1159,1252,1344,1438,1538,1631,1726,1819,1910,2001,2081,2181,2281,2377,2479,2579,2678,2828,2924,11071" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ar.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ar.json new file mode 100644 index 0000000..d5db171 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ar.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-ar/values-ar.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ar/values-ar.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,148,250,345,448,551,653,767", + "endColumns": "92,101,94,102,102,101,113,100", + "endOffsets": "143,245,340,443,546,648,762,863" + }, + "to": { + "startLines": "42,43,44,45,46,47,48,138", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3582,3675,3777,3872,3975,4078,4180,12092", + "endColumns": "92,101,94,102,102,101,113,100", + "endOffsets": "3670,3772,3867,3970,4073,4175,4289,12188" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ar/values-ar.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,317,424,506,607,721,801,880,971,1064,1156,1250,1350,1443,1538,1631,1722,1816,1895,2000,2098,2196,2304,2404,2507,2662,2759", + "endColumns": "107,103,106,81,100,113,79,78,90,92,91,93,99,92,94,92,90,93,78,104,97,97,107,99,102,154,96,81", + "endOffsets": "208,312,419,501,602,716,796,875,966,1059,1151,1245,1345,1438,1533,1626,1717,1811,1890,1995,2093,2191,2299,2399,2502,2657,2754,2836" + }, + "to": { + "startLines": "10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,134", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "515,623,727,834,916,1017,1131,1211,1290,1381,1474,1566,1660,1760,1853,1948,2041,2132,2226,2305,2410,2508,2606,2714,2814,2917,3072,11780", + "endColumns": "107,103,106,81,100,113,79,78,90,92,91,93,99,92,94,92,90,93,78,104,97,97,107,99,102,154,96,81", + "endOffsets": "618,722,829,911,1012,1126,1206,1285,1376,1469,1561,1655,1755,1848,1943,2036,2127,2221,2300,2405,2503,2601,2709,2809,2912,3067,3164,11857" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ar/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "125", + "endOffsets": "320" + }, + "to": { + "startLines": "60", + "startColumns": "4", + "startOffsets": "5545", + "endColumns": "129", + "endOffsets": "5670" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ar/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,293,433,551,652,786,910,1017,1115,1248,1348,1494,1612,1747,1889,1949,2011", + "endColumns": "99,139,117,100,133,123,106,97,132,99,145,117,134,141,59,61,79", + "endOffsets": "292,432,550,651,785,909,1016,1114,1247,1347,1493,1611,1746,1888,1948,2010,2090" + }, + "to": { + "startLines": "52,53,54,55,56,57,58,59,61,62,63,64,65,66,67,68,69", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4591,4695,4839,4961,5066,5204,5332,5443,5675,5812,5916,6066,6188,6327,6473,6537,6603", + "endColumns": "103,143,121,104,137,127,110,101,136,103,149,121,138,145,63,65,83", + "endOffsets": "4690,4834,4956,5061,5199,5327,5438,5540,5807,5911,6061,6183,6322,6468,6532,6598,6682" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ar/values-ar.xml", + "from": { + "startLines": "2,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,465,543,619,703,795,878,979,1098,1175,1234,1297,1388,1457,1524,1624,1687,1752,1813,1881,1943,2001,2115,2175,2236,2293,2366,2489,2570,2662,2769,2867,2947,3095,3176,3257,3385,3474,3550,3603,3657,3723,3801,3881,3952,4034,4106,4180,4253,4323,4432,4523,4594,4684,4779,4853,4936,5029,5078,5159,5228,5314,5399,5461,5525,5588,5657,5766,5876,5973,6073,6130,6188,6268,6347,6422", + "endLines": "9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84", + "endColumns": "12,77,75,83,91,82,100,118,76,58,62,90,68,66,99,62,64,60,67,61,57,113,59,60,56,72,122,80,91,106,97,79,147,80,80,127,88,75,52,53,65,77,79,70,81,71,73,72,69,108,90,70,89,94,73,82,92,48,80,68,85,84,61,63,62,68,108,109,96,99,56,57,79,78,74,75", + "endOffsets": "460,538,614,698,790,873,974,1093,1170,1229,1292,1383,1452,1519,1619,1682,1747,1808,1876,1938,1996,2110,2170,2231,2288,2361,2484,2565,2657,2764,2862,2942,3090,3171,3252,3380,3469,3545,3598,3652,3718,3796,3876,3947,4029,4101,4175,4248,4318,4427,4518,4589,4679,4774,4848,4931,5024,5073,5154,5223,5309,5394,5456,5520,5583,5652,5761,5871,5968,6068,6125,6183,6263,6342,6417,6493" + }, + "to": { + "startLines": "2,37,38,39,40,41,49,50,51,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,135,136,137", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3169,3247,3323,3407,3499,4294,4395,4514,6687,6746,6809,6900,6969,7036,7136,7199,7264,7325,7393,7455,7513,7627,7687,7748,7805,7878,8001,8082,8174,8281,8379,8459,8607,8688,8769,8897,8986,9062,9115,9169,9235,9313,9393,9464,9546,9618,9692,9765,9835,9944,10035,10106,10196,10291,10365,10448,10541,10590,10671,10740,10826,10911,10973,11037,11100,11169,11278,11388,11485,11585,11642,11700,11862,11941,12016", + "endLines": "9,37,38,39,40,41,49,50,51,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,135,136,137", + "endColumns": "12,77,75,83,91,82,100,118,76,58,62,90,68,66,99,62,64,60,67,61,57,113,59,60,56,72,122,80,91,106,97,79,147,80,80,127,88,75,52,53,65,77,79,70,81,71,73,72,69,108,90,70,89,94,73,82,92,48,80,68,85,84,61,63,62,68,108,109,96,99,56,57,79,78,74,75", + "endOffsets": "510,3242,3318,3402,3494,3577,4390,4509,4586,6741,6804,6895,6964,7031,7131,7194,7259,7320,7388,7450,7508,7622,7682,7743,7800,7873,7996,8077,8169,8276,8374,8454,8602,8683,8764,8892,8981,9057,9110,9164,9230,9308,9388,9459,9541,9613,9687,9760,9830,9939,10030,10101,10191,10286,10360,10443,10536,10585,10666,10735,10821,10906,10968,11032,11095,11164,11273,11383,11480,11580,11637,11695,11775,11936,12011,12087" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-as.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-as.json new file mode 100644 index 0000000..a9353de --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-as.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-as/values-as.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-as/values-as.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,272,354,432,509,595,679,781,904,983,1043,1108,1197,1262,1321,1407,1471,1535,1598,1668,1732,1786,1891,1949,2011,2065,2137,2254,2341,2417,2509,2591,2674,2814,2891,2972,3099,3190,3267,3321,3372,3438,3508,3585,3656,3731,3802,3879,3948,4017,4124,4215,4287,4376,4465,4539,4611,4697,4747,4826,4892,4972,5056,5118,5182,5245,5314,5414,5509,5601,5693,5751,5806,5887,5968,6043", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,81,77,76,85,83,101,122,78,59,64,88,64,58,85,63,63,62,69,63,53,104,57,61,53,71,116,86,75,91,81,82,139,76,80,126,90,76,53,50,65,69,76,70,74,70,76,68,68,106,90,71,88,88,73,71,85,49,78,65,79,83,61,63,62,68,99,94,91,91,57,54,80,80,74,74", + "endOffsets": "267,349,427,504,590,674,776,899,978,1038,1103,1192,1257,1316,1402,1466,1530,1593,1663,1727,1781,1886,1944,2006,2060,2132,2249,2336,2412,2504,2586,2669,2809,2886,2967,3094,3185,3262,3316,3367,3433,3503,3580,3651,3726,3797,3874,3943,4012,4119,4210,4282,4371,4460,4534,4606,4692,4742,4821,4887,4967,5051,5113,5177,5240,5309,5409,5504,5596,5688,5746,5801,5882,5963,6038,6113" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3065,3147,3225,3302,3388,4222,4324,4447,6648,6708,6773,6862,6927,6986,7072,7136,7200,7263,7333,7397,7451,7556,7614,7676,7730,7802,7919,8006,8082,8174,8256,8339,8479,8556,8637,8764,8855,8932,8986,9037,9103,9173,9250,9321,9396,9467,9544,9613,9682,9789,9880,9952,10041,10130,10204,10276,10362,10412,10491,10557,10637,10721,10783,10847,10910,10979,11079,11174,11266,11358,11416,11471,11635,11716,11791", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,81,77,76,85,83,101,122,78,59,64,88,64,58,85,63,63,62,69,63,53,104,57,61,53,71,116,86,75,91,81,82,139,76,80,126,90,76,53,50,65,69,76,70,74,70,76,68,68,106,90,71,88,88,73,71,85,49,78,65,79,83,61,63,62,68,99,94,91,91,57,54,80,80,74,74", + "endOffsets": "317,3142,3220,3297,3383,3467,4319,4442,4521,6703,6768,6857,6922,6981,7067,7131,7195,7258,7328,7392,7446,7551,7609,7671,7725,7797,7914,8001,8077,8169,8251,8334,8474,8551,8632,8759,8850,8927,8981,9032,9098,9168,9245,9316,9391,9462,9539,9608,9677,9784,9875,9947,10036,10125,10199,10271,10357,10407,10486,10552,10632,10716,10778,10842,10905,10974,11074,11169,11261,11353,11411,11466,11547,11711,11786,11861" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-as/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,446,565,671,797,915,1024,1132,1271,1376,1522,1643,1772,1921,1977,2039", + "endColumns": "103,148,118,105,125,117,108,107,138,104,145,120,128,148,55,61,81", + "endOffsets": "296,445,564,670,796,914,1023,1131,1270,1375,1521,1642,1771,1920,1976,2038,2120" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4526,4634,4787,4910,5020,5150,5272,5385,5623,5766,5875,6025,6150,6283,6436,6496,6562", + "endColumns": "107,152,122,109,129,121,112,111,142,108,149,124,132,152,59,65,85", + "endOffsets": "4629,4782,4905,5015,5145,5267,5380,5492,5761,5870,6020,6145,6278,6431,6491,6557,6643" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-as/values-as.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,312,419,510,615,735,812,887,978,1071,1166,1260,1360,1453,1548,1642,1733,1824,1910,2023,2131,2234,2343,2459,2579,2746,2848", + "endColumns": "107,98,106,90,104,119,76,74,90,92,94,93,99,92,94,93,90,90,85,112,107,102,108,115,119,166,101,82", + "endOffsets": "208,307,414,505,610,730,807,882,973,1066,1161,1255,1355,1448,1543,1637,1728,1819,1905,2018,2126,2229,2338,2454,2574,2741,2843,2926" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "322,430,529,636,727,832,952,1029,1104,1195,1288,1383,1477,1577,1670,1765,1859,1950,2041,2127,2240,2348,2451,2560,2676,2796,2963,11552", + "endColumns": "107,98,106,90,104,119,76,74,90,92,94,93,99,92,94,93,90,90,85,112,107,102,108,115,119,166,101,82", + "endOffsets": "425,524,631,722,827,947,1024,1099,1190,1283,1378,1472,1572,1665,1760,1854,1945,2036,2122,2235,2343,2446,2555,2671,2791,2958,3060,11630" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-as/values-as.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,156,259,367,472,576,676,805", + "endColumns": "100,102,107,104,103,99,128,100", + "endOffsets": "151,254,362,467,571,671,800,901" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3472,3573,3676,3784,3889,3993,4093,11866", + "endColumns": "100,102,107,104,103,99,128,100", + "endOffsets": "3568,3671,3779,3884,3988,4088,4217,11962" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-as/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "121", + "endOffsets": "316" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5497", + "endColumns": "125", + "endOffsets": "5618" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-az.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-az.json new file mode 100644 index 0000000..18dea48 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-az.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-az/values-az.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-az/values-az.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,265,353,438,518,603,682,778,894,974,1035,1099,1193,1261,1320,1415,1478,1542,1601,1668,1731,1785,1900,1958,2020,2074,2145,2277,2361,2440,2532,2616,2696,2830,2906,2982,3111,3195,3274,3331,3382,3448,3518,3596,3667,3747,3817,3893,3971,4042,4140,4226,4309,4402,4495,4568,4640,4734,4788,4872,4939,5023,5111,5175,5240,5304,5374,5476,5580,5676,5777,5838,5893,5973,6060,6135", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,87,84,79,84,78,95,115,79,60,63,93,67,58,94,62,63,58,66,62,53,114,57,61,53,70,131,83,78,91,83,79,133,75,75,128,83,78,56,50,65,69,77,70,79,69,75,77,70,97,85,82,92,92,72,71,93,53,83,66,83,87,63,64,63,69,101,103,95,100,60,54,79,86,74,73", + "endOffsets": "260,348,433,513,598,677,773,889,969,1030,1094,1188,1256,1315,1410,1473,1537,1596,1663,1726,1780,1895,1953,2015,2069,2140,2272,2356,2435,2527,2611,2691,2825,2901,2977,3106,3190,3269,3326,3377,3443,3513,3591,3662,3742,3812,3888,3966,4037,4135,4221,4304,4397,4490,4563,4635,4729,4783,4867,4934,5018,5106,5170,5235,5299,5369,5471,5575,5671,5772,5833,5888,5968,6055,6130,6204" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3023,3111,3196,3276,3361,4167,4263,4379,6705,6766,6830,6924,6992,7051,7146,7209,7273,7332,7399,7462,7516,7631,7689,7751,7805,7876,8008,8092,8171,8263,8347,8427,8561,8637,8713,8842,8926,9005,9062,9113,9179,9249,9327,9398,9478,9548,9624,9702,9773,9871,9957,10040,10133,10226,10299,10371,10465,10519,10603,10670,10754,10842,10906,10971,11035,11105,11207,11311,11407,11508,11569,11624,11788,11875,11950", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,87,84,79,84,78,95,115,79,60,63,93,67,58,94,62,63,58,66,62,53,114,57,61,53,70,131,83,78,91,83,79,133,75,75,128,83,78,56,50,65,69,77,70,79,69,75,77,70,97,85,82,92,92,72,71,93,53,83,66,83,87,63,64,63,69,101,103,95,100,60,54,79,86,74,73", + "endOffsets": "310,3106,3191,3271,3356,3435,4258,4374,4454,6761,6825,6919,6987,7046,7141,7204,7268,7327,7394,7457,7511,7626,7684,7746,7800,7871,8003,8087,8166,8258,8342,8422,8556,8632,8708,8837,8921,9000,9057,9108,9174,9244,9322,9393,9473,9543,9619,9697,9768,9866,9952,10035,10128,10221,10294,10366,10460,10514,10598,10665,10749,10837,10901,10966,11030,11100,11202,11306,11402,11503,11564,11619,11699,11870,11945,12019" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-az/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "157", + "endOffsets": "352" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5471", + "endColumns": "161", + "endOffsets": "5628" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-az/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,298,449,578,684,826,955,1071,1173,1335,1441,1586,1719,1859,2011,2071,2132", + "endColumns": "104,150,128,105,141,128,115,101,161,105,144,132,139,151,59,60,76", + "endOffsets": "297,448,577,683,825,954,1070,1172,1334,1440,1585,1718,1858,2010,2070,2131,2208" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4459,4568,4723,4856,4966,5112,5245,5365,5633,5799,5909,6058,6195,6339,6495,6559,6624", + "endColumns": "108,154,132,109,145,132,119,105,165,109,148,136,143,155,63,64,80", + "endOffsets": "4563,4718,4851,4961,5107,5240,5360,5466,5794,5904,6053,6190,6334,6490,6554,6619,6700" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-az/values-az.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,215,316,426,514,621,735,817,895,986,1079,1173,1272,1372,1465,1560,1654,1745,1837,1922,2027,2133,2233,2342,2447,2549,2707,2813", + "endColumns": "109,100,109,87,106,113,81,77,90,92,93,98,99,92,94,93,90,91,84,104,105,99,108,104,101,157,105,83", + "endOffsets": "210,311,421,509,616,730,812,890,981,1074,1168,1267,1367,1460,1555,1649,1740,1832,1917,2022,2128,2228,2337,2442,2544,2702,2808,2892" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "315,425,526,636,724,831,945,1027,1105,1196,1289,1383,1482,1582,1675,1770,1864,1955,2047,2132,2237,2343,2443,2552,2657,2759,2917,11704", + "endColumns": "109,100,109,87,106,113,81,77,90,92,93,98,99,92,94,93,90,91,84,104,105,99,108,104,101,157,105,83", + "endOffsets": "420,521,631,719,826,940,1022,1100,1191,1284,1378,1477,1577,1670,1765,1859,1950,2042,2127,2232,2338,2438,2547,2652,2754,2912,3018,11783" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-az/values-az.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,156,258,361,465,566,671,782", + "endColumns": "100,101,102,103,100,104,110,100", + "endOffsets": "151,253,356,460,561,666,777,878" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3440,3541,3643,3746,3850,3951,4056,12024", + "endColumns": "100,101,102,103,100,104,110,100", + "endOffsets": "3536,3638,3741,3845,3946,4051,4162,12120" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-b+es+419.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-b+es+419.json new file mode 100644 index 0000000..8a64e8f --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-b+es+419.json @@ -0,0 +1,20 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-b+es+419/values-b+es+419.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-b+es+419/values-b+es+419.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,278,360,440,526,631,727,829,957,1038,1100,1165,1260,1330,1393,1486,1550,1622,1685,1759,1823,1879,1997,2055,2117,2173,2253,2387,2476,2552,2650,2731,2812,2953,3034,3114,3265,3355,3432,3488,3544,3610,3689,3771,3842,3931,4004,4081,4151,4228,4334,4423,4497,4591,4693,4765,4846,4950,5003,5088,5155,5248,5337,5399,5463,5526,5594,5705,5816,5918,6023,6083,6143,6226,6309,6385", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,81,79,85,104,95,101,127,80,61,64,94,69,62,92,63,71,62,73,63,55,117,57,61,55,79,133,88,75,97,80,80,140,80,79,150,89,76,55,55,65,78,81,70,88,72,76,69,76,105,88,73,93,101,71,80,103,52,84,66,92,88,61,63,62,67,110,110,101,104,59,59,82,82,75,76", + "endOffsets": "273,355,435,521,626,722,824,952,1033,1095,1160,1255,1325,1388,1481,1545,1617,1680,1754,1818,1874,1992,2050,2112,2168,2248,2382,2471,2547,2645,2726,2807,2948,3029,3109,3260,3350,3427,3483,3539,3605,3684,3766,3837,3926,3999,4076,4146,4223,4329,4418,4492,4586,4688,4760,4841,4945,4998,5083,5150,5243,5332,5394,5458,5521,5589,5700,5811,5913,6018,6078,6138,6221,6304,6380,6457" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-b+sr+Latn.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-b+sr+Latn.json new file mode 100644 index 0000000..68ca2d9 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-b+sr+Latn.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-b+sr+Latn/values-b+sr+Latn.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-b+sr+Latn/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "200,303,457,580,686,836,959,1067,1165,1310,1413,1569,1692,1837,1976,2040,2101", + "endColumns": "102,153,122,105,149,122,107,97,144,102,155,122,144,138,63,60,75", + "endOffsets": "302,456,579,685,835,958,1066,1164,1309,1412,1568,1691,1836,1975,2039,2100,2176" + }, + "to": { + "startLines": "49,50,51,52,53,54,55,56,58,59,60,61,62,63,64,65,66", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4574,4681,4839,4966,5076,5230,5357,5469,5701,5850,5957,6117,6244,6393,6536,6604,6669", + "endColumns": "106,157,126,109,153,126,111,101,148,106,159,126,148,142,67,64,79", + "endOffsets": "4676,4834,4961,5071,5225,5352,5464,5566,5845,5952,6112,6239,6388,6531,6599,6664,6744" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-b+sr+Latn/values-b+sr+Latn.xml", + "from": { + "startLines": "2,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,324,401,478,558,666,760,854,986,1067,1130,1196,1289,1357,1420,1523,1583,1649,1705,1776,1836,1890,2002,2059,2120,2174,2250,2375,2462,2539,2632,2716,2799,2938,3020,3103,3234,3322,3400,3454,3510,3576,3650,3728,3799,3881,3957,4033,4108,4180,4287,4377,4450,4542,4638,4710,4786,4882,4935,5017,5084,5171,5258,5320,5384,5447,5516,5621,5731,5827,5935,5993,6053,6133,6216,6292", + "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "endColumns": "12,76,76,79,107,93,93,131,80,62,65,92,67,62,102,59,65,55,70,59,53,111,56,60,53,75,124,86,76,92,83,82,138,81,82,130,87,77,53,55,65,73,77,70,81,75,75,74,71,106,89,72,91,95,71,75,95,52,81,66,86,86,61,63,62,68,104,109,95,107,57,59,79,82,75,76", + "endOffsets": "319,396,473,553,661,755,849,981,1062,1125,1191,1284,1352,1415,1518,1578,1644,1700,1771,1831,1885,1997,2054,2115,2169,2245,2370,2457,2534,2627,2711,2794,2933,3015,3098,3229,3317,3395,3449,3505,3571,3645,3723,3794,3876,3952,4028,4103,4175,4282,4372,4445,4537,4633,4705,4781,4877,4930,5012,5079,5166,5253,5315,5379,5442,5511,5616,5726,5822,5930,5988,6048,6128,6211,6287,6364" + }, + "to": { + "startLines": "2,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3105,3182,3259,3339,3447,4267,4361,4493,6749,6812,6878,6971,7039,7102,7205,7265,7331,7387,7458,7518,7572,7684,7741,7802,7856,7932,8057,8144,8221,8314,8398,8481,8620,8702,8785,8916,9004,9082,9136,9192,9258,9332,9410,9481,9563,9639,9715,9790,9862,9969,10059,10132,10224,10320,10392,10468,10564,10617,10699,10766,10853,10940,11002,11066,11129,11198,11303,11413,11509,11617,11675,11735,11902,11985,12061", + "endLines": "6,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "endColumns": "12,76,76,79,107,93,93,131,80,62,65,92,67,62,102,59,65,55,70,59,53,111,56,60,53,75,124,86,76,92,83,82,138,81,82,130,87,77,53,55,65,73,77,70,81,75,75,74,71,106,89,72,91,95,71,75,95,52,81,66,86,86,61,63,62,68,104,109,95,107,57,59,79,82,75,76", + "endOffsets": "369,3177,3254,3334,3442,3536,4356,4488,4569,6807,6873,6966,7034,7097,7200,7260,7326,7382,7453,7513,7567,7679,7736,7797,7851,7927,8052,8139,8216,8309,8393,8476,8615,8697,8780,8911,8999,9077,9131,9187,9253,9327,9405,9476,9558,9634,9710,9785,9857,9964,10054,10127,10219,10315,10387,10463,10559,10612,10694,10761,10848,10935,10997,11061,11124,11193,11298,11408,11504,11612,11670,11730,11810,11980,12056,12133" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-b+sr+Latn/values-b+sr+Latn.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,352,456,560,665,781", + "endColumns": "97,101,96,103,103,104,115,100", + "endOffsets": "148,250,347,451,555,660,776,877" + }, + "to": { + "startLines": "39,40,41,42,43,44,45,135", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3541,3639,3741,3838,3942,4046,4151,12138", + "endColumns": "97,101,96,103,103,104,115,100", + "endOffsets": "3634,3736,3833,3937,4041,4146,4262,12234" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-b+sr+Latn/values-b+sr+Latn.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,212,313,419,505,609,731,816,898,989,1082,1177,1271,1371,1464,1559,1664,1755,1846,1932,2037,2143,2246,2353,2462,2569,2739,2836", + "endColumns": "106,100,105,85,103,121,84,81,90,92,94,93,99,92,94,104,90,90,85,104,105,102,106,108,106,169,96,86", + "endOffsets": "207,308,414,500,604,726,811,893,984,1077,1172,1266,1366,1459,1554,1659,1750,1841,1927,2032,2138,2241,2348,2457,2564,2734,2831,2918" + }, + "to": { + "startLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,131", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "374,481,582,688,774,878,1000,1085,1167,1258,1351,1446,1540,1640,1733,1828,1933,2024,2115,2201,2306,2412,2515,2622,2731,2838,3008,11815", + "endColumns": "106,100,105,85,103,121,84,81,90,92,94,93,99,92,94,104,90,90,85,104,105,102,106,108,106,169,96,86", + "endOffsets": "476,577,683,769,873,995,1080,1162,1253,1346,1441,1535,1635,1728,1823,1928,2019,2110,2196,2301,2407,2510,2617,2726,2833,3003,3100,11897" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-b+sr+Latn/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "202", + "endColumns": "125", + "endOffsets": "327" + }, + "to": { + "startLines": "57", + "startColumns": "4", + "startOffsets": "5571", + "endColumns": "129", + "endOffsets": "5696" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-be.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-be.json new file mode 100644 index 0000000..a071dda --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-be.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-be/values-be.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-be/values-be.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,225,328,444,530,635,754,834,911,1003,1097,1192,1286,1381,1475,1571,1666,1758,1850,1931,2037,2142,2240,2348,2454,2562,2735,2835", + "endColumns": "119,102,115,85,104,118,79,76,91,93,94,93,94,93,95,94,91,91,80,105,104,97,107,105,107,172,99,81", + "endOffsets": "220,323,439,525,630,749,829,906,998,1092,1187,1281,1376,1470,1566,1661,1753,1845,1926,2032,2137,2235,2343,2449,2557,2730,2830,2912" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,132", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "432,552,655,771,857,962,1081,1161,1238,1330,1424,1519,1613,1708,1802,1898,1993,2085,2177,2258,2364,2469,2567,2675,2781,2889,3062,12041", + "endColumns": "119,102,115,85,104,118,79,76,91,93,94,93,94,93,95,94,91,91,80,105,104,97,107,105,107,172,99,81", + "endOffsets": "547,650,766,852,957,1076,1156,1233,1325,1419,1514,1608,1703,1797,1893,1988,2080,2172,2253,2359,2464,2562,2670,2776,2884,3057,3157,12118" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-be/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "141", + "endOffsets": "336" + }, + "to": { + "startLines": "58", + "startColumns": "4", + "startOffsets": "5634", + "endColumns": "145", + "endOffsets": "5775" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-be/values-be.xml", + "from": { + "startLines": "2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,382,459,536,618,715,807,904,1036,1119,1197,1264,1357,1434,1497,1613,1676,1745,1804,1875,1934,1988,2109,2170,2233,2287,2360,2482,2570,2646,2737,2818,2901,3053,3139,3226,3359,3450,3533,3590,3641,3707,3779,3856,3927,4010,4085,4162,4244,4320,4428,4517,4599,4690,4786,4860,4941,5036,5090,5172,5238,5325,5411,5473,5537,5600,5669,5779,5892,5995,6102,6163,6218,6298,6383,6459", + "endLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "endColumns": "12,76,76,81,96,91,96,131,82,77,66,92,76,62,115,62,68,58,70,58,53,120,60,62,53,72,121,87,75,90,80,82,151,85,86,132,90,82,56,50,65,71,76,70,82,74,76,81,75,107,88,81,90,95,73,80,94,53,81,65,86,85,61,63,62,68,109,112,102,106,60,54,79,84,75,78", + "endOffsets": "377,454,531,613,710,802,899,1031,1114,1192,1259,1352,1429,1492,1608,1671,1740,1799,1870,1929,1983,2104,2165,2228,2282,2355,2477,2565,2641,2732,2813,2896,3048,3134,3221,3354,3445,3528,3585,3636,3702,3774,3851,3922,4005,4080,4157,4239,4315,4423,4512,4594,4685,4781,4855,4936,5031,5085,5167,5233,5320,5406,5468,5532,5595,5664,5774,5887,5990,6097,6158,6213,6293,6378,6454,6533" + }, + "to": { + "startLines": "2,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3162,3239,3316,3398,3495,4318,4415,4547,6862,6940,7007,7100,7177,7240,7356,7419,7488,7547,7618,7677,7731,7852,7913,7976,8030,8103,8225,8313,8389,8480,8561,8644,8796,8882,8969,9102,9193,9276,9333,9384,9450,9522,9599,9670,9753,9828,9905,9987,10063,10171,10260,10342,10433,10529,10603,10684,10779,10833,10915,10981,11068,11154,11216,11280,11343,11412,11522,11635,11738,11845,11906,11961,12123,12208,12284", + "endLines": "7,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "endColumns": "12,76,76,81,96,91,96,131,82,77,66,92,76,62,115,62,68,58,70,58,53,120,60,62,53,72,121,87,75,90,80,82,151,85,86,132,90,82,56,50,65,71,76,70,82,74,76,81,75,107,88,81,90,95,73,80,94,53,81,65,86,85,61,63,62,68,109,112,102,106,60,54,79,84,75,78", + "endOffsets": "427,3234,3311,3393,3490,3582,4410,4542,4625,6935,7002,7095,7172,7235,7351,7414,7483,7542,7613,7672,7726,7847,7908,7971,8025,8098,8220,8308,8384,8475,8556,8639,8791,8877,8964,9097,9188,9271,9328,9379,9445,9517,9594,9665,9748,9823,9900,9982,10058,10166,10255,10337,10428,10524,10598,10679,10774,10828,10910,10976,11063,11149,11211,11275,11338,11407,11517,11630,11733,11840,11901,11956,12036,12203,12279,12358" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-be/values-be.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,355,456,562,665,786", + "endColumns": "97,101,99,100,105,102,120,100", + "endOffsets": "148,250,350,451,557,660,781,882" + }, + "to": { + "startLines": "40,41,42,43,44,45,46,136", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3587,3685,3787,3887,3988,4094,4197,12363", + "endColumns": "97,101,99,100,105,102,120,100", + "endOffsets": "3680,3782,3882,3983,4089,4192,4313,12459" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-be/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,454,575,681,832,954,1065,1165,1323,1426,1585,1709,1858,2013,2078,2136", + "endColumns": "102,157,120,105,150,121,110,99,157,102,158,123,148,154,64,57,74", + "endOffsets": "295,453,574,680,831,953,1064,1164,1322,1425,1584,1708,1857,2012,2077,2135,2210" + }, + "to": { + "startLines": "50,51,52,53,54,55,56,57,59,60,61,62,63,64,65,66,67", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4630,4737,4899,5024,5134,5289,5415,5530,5780,5942,6049,6212,6340,6493,6652,6721,6783", + "endColumns": "106,161,124,109,154,125,114,103,161,106,162,127,152,158,68,61,78", + "endOffsets": "4732,4894,5019,5129,5284,5410,5525,5629,5937,6044,6207,6335,6488,6647,6716,6778,6857" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-bg.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-bg.json new file mode 100644 index 0000000..dc77041 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-bg.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-bg/values-bg.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-bg/values-bg.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,262,364,465,572,677,796", + "endColumns": "96,109,101,100,106,104,118,100", + "endOffsets": "147,257,359,460,567,672,791,892" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3537,3634,3744,3846,3947,4054,4159,12385", + "endColumns": "96,109,101,100,106,104,118,100", + "endOffsets": "3629,3739,3841,3942,4049,4154,4273,12481" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-bg/values-bg.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,225,331,436,522,632,753,833,910,1001,1094,1189,1283,1383,1476,1571,1679,1770,1861,1944,2058,2166,2266,2380,2487,2595,2755,2854", + "endColumns": "119,105,104,85,109,120,79,76,90,92,94,93,99,92,94,107,90,90,82,113,107,99,113,106,107,159,98,83", + "endOffsets": "220,326,431,517,627,748,828,905,996,1089,1184,1278,1378,1471,1566,1674,1765,1856,1939,2053,2161,2261,2375,2482,2590,2750,2849,2933" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "315,435,541,646,732,842,963,1043,1120,1211,1304,1399,1493,1593,1686,1781,1889,1980,2071,2154,2268,2376,2476,2590,2697,2805,2965,12055", + "endColumns": "119,105,104,85,109,120,79,76,90,92,94,93,99,92,94,107,90,90,82,113,107,99,113,106,107,159,98,83", + "endOffsets": "430,536,641,727,837,958,1038,1115,1206,1299,1394,1488,1588,1681,1776,1884,1975,2066,2149,2263,2371,2471,2585,2692,2800,2960,3059,12134" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-bg/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "133", + "endOffsets": "328" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5645", + "endColumns": "137", + "endOffsets": "5778" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-bg/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,298,459,590,697,860,991,1106,1211,1376,1484,1655,1789,1942,2104,2170,2225", + "endColumns": "104,160,130,106,162,130,114,104,164,107,170,133,152,161,65,54,68", + "endOffsets": "297,458,589,696,859,990,1105,1210,1375,1483,1654,1788,1941,2103,2169,2224,2293" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4595,4704,4869,5004,5115,5282,5417,5536,5783,5952,6064,6239,6377,6534,6700,6770,6829", + "endColumns": "108,164,134,110,166,134,118,108,168,111,174,137,156,165,69,58,72", + "endOffsets": "4699,4864,4999,5110,5277,5412,5531,5640,5947,6059,6234,6372,6529,6695,6765,6824,6897" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-bg/values-bg.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,265,344,423,506,628,738,833,966,1055,1118,1184,1281,1361,1423,1512,1575,1640,1699,1772,1835,1889,2017,2074,2136,2190,2263,2406,2490,2568,2661,2743,2831,2967,3055,3143,3279,3364,3441,3494,3545,3611,3686,3762,3833,3912,3989,4065,4142,4216,4328,4419,4494,4585,4677,4751,4838,4929,4984,5066,5132,5215,5301,5363,5427,5490,5560,5677,5789,5900,6010,6067,6122,6208,6299,6375", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,78,78,82,121,109,94,132,88,62,65,96,79,61,88,62,64,58,72,62,53,127,56,61,53,72,142,83,77,92,81,87,135,87,87,135,84,76,52,50,65,74,75,70,78,76,75,76,73,111,90,74,90,91,73,86,90,54,81,65,82,85,61,63,62,69,116,111,110,109,56,54,85,90,75,78", + "endOffsets": "260,339,418,501,623,733,828,961,1050,1113,1179,1276,1356,1418,1507,1570,1635,1694,1767,1830,1884,2012,2069,2131,2185,2258,2401,2485,2563,2656,2738,2826,2962,3050,3138,3274,3359,3436,3489,3540,3606,3681,3757,3828,3907,3984,4060,4137,4211,4323,4414,4489,4580,4672,4746,4833,4924,4979,5061,5127,5210,5296,5358,5422,5485,5555,5672,5784,5895,6005,6062,6117,6203,6294,6370,6449" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3064,3143,3222,3305,3427,4278,4373,4506,6902,6965,7031,7128,7208,7270,7359,7422,7487,7546,7619,7682,7736,7864,7921,7983,8037,8110,8253,8337,8415,8508,8590,8678,8814,8902,8990,9126,9211,9288,9341,9392,9458,9533,9609,9680,9759,9836,9912,9989,10063,10175,10266,10341,10432,10524,10598,10685,10776,10831,10913,10979,11062,11148,11210,11274,11337,11407,11524,11636,11747,11857,11914,11969,12139,12230,12306", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,78,78,82,121,109,94,132,88,62,65,96,79,61,88,62,64,58,72,62,53,127,56,61,53,72,142,83,77,92,81,87,135,87,87,135,84,76,52,50,65,74,75,70,78,76,75,76,73,111,90,74,90,91,73,86,90,54,81,65,82,85,61,63,62,69,116,111,110,109,56,54,85,90,75,78", + "endOffsets": "310,3138,3217,3300,3422,3532,4368,4501,4590,6960,7026,7123,7203,7265,7354,7417,7482,7541,7614,7677,7731,7859,7916,7978,8032,8105,8248,8332,8410,8503,8585,8673,8809,8897,8985,9121,9206,9283,9336,9387,9453,9528,9604,9675,9754,9831,9907,9984,10058,10170,10261,10336,10427,10519,10593,10680,10771,10826,10908,10974,11057,11143,11205,11269,11332,11402,11519,11631,11742,11852,11909,11964,12050,12225,12301,12380" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-bn.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-bn.json new file mode 100644 index 0000000..83c59c1 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-bn.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-bn/values-bn.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-bn/values-bn.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,271,369,462,545,646,738,842,959,1040,1101,1167,1258,1324,1385,1475,1539,1606,1667,1736,1798,1852,1959,2018,2079,2133,2207,2327,2412,2502,2608,2698,2782,2917,2988,3058,3190,3277,3360,3418,3474,3540,3613,3693,3764,3846,3915,3991,4071,4140,4249,4344,4427,4517,4612,4686,4760,4853,4907,4992,5059,5145,5230,5292,5356,5419,5485,5587,5686,5779,5878,5940,6000,6080,6163,6242", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,97,92,82,100,91,103,116,80,60,65,90,65,60,89,63,66,60,68,61,53,106,58,60,53,73,119,84,89,105,89,83,134,70,69,131,86,82,57,55,65,72,79,70,81,68,75,79,68,108,94,82,89,94,73,73,92,53,84,66,85,84,61,63,62,65,101,98,92,98,61,59,79,82,78,72", + "endOffsets": "266,364,457,540,641,733,837,954,1035,1096,1162,1253,1319,1380,1470,1534,1601,1662,1731,1793,1847,1954,2013,2074,2128,2202,2322,2407,2497,2603,2693,2777,2912,2983,3053,3185,3272,3355,3413,3469,3535,3608,3688,3759,3841,3910,3986,4066,4135,4244,4339,4422,4512,4607,4681,4755,4848,4902,4987,5054,5140,5225,5287,5351,5414,5480,5582,5681,5774,5873,5935,5995,6075,6158,6237,6310" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3051,3149,3242,3325,3426,4247,4351,4468,6716,6777,6843,6934,7000,7061,7151,7215,7282,7343,7412,7474,7528,7635,7694,7755,7809,7883,8003,8088,8178,8284,8374,8458,8593,8664,8734,8866,8953,9036,9094,9150,9216,9289,9369,9440,9522,9591,9667,9747,9816,9925,10020,10103,10193,10288,10362,10436,10529,10583,10668,10735,10821,10906,10968,11032,11095,11161,11263,11362,11455,11554,11616,11676,11843,11926,12005", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,97,92,82,100,91,103,116,80,60,65,90,65,60,89,63,66,60,68,61,53,106,58,60,53,73,119,84,89,105,89,83,134,70,69,131,86,82,57,55,65,72,79,70,81,68,75,79,68,108,94,82,89,94,73,73,92,53,84,66,85,84,61,63,62,65,101,98,92,98,61,59,79,82,78,72", + "endOffsets": "316,3144,3237,3320,3421,3513,4346,4463,4544,6772,6838,6929,6995,7056,7146,7210,7277,7338,7407,7469,7523,7630,7689,7750,7804,7878,7998,8083,8173,8279,8369,8453,8588,8659,8729,8861,8948,9031,9089,9145,9211,9284,9364,9435,9517,9586,9662,9742,9811,9920,10015,10098,10188,10283,10357,10431,10524,10578,10663,10730,10816,10901,10963,11027,11090,11156,11258,11357,11450,11549,11611,11671,11751,11921,12000,12073" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-bn/values-bn.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,319,425,514,619,740,823,905,996,1089,1183,1277,1377,1470,1565,1659,1750,1841,1927,2037,2141,2244,2352,2460,2565,2730,2835", + "endColumns": "107,105,105,88,104,120,82,81,90,92,93,93,99,92,94,93,90,90,85,109,103,102,107,107,104,164,104,86", + "endOffsets": "208,314,420,509,614,735,818,900,991,1084,1178,1272,1372,1465,1560,1654,1745,1836,1922,2032,2136,2239,2347,2455,2560,2725,2830,2917" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "321,429,535,641,730,835,956,1039,1121,1212,1305,1399,1493,1593,1686,1781,1875,1966,2057,2143,2253,2357,2460,2568,2676,2781,2946,11756", + "endColumns": "107,105,105,88,104,120,82,81,90,92,93,93,99,92,94,93,90,90,85,109,103,102,107,107,104,164,104,86", + "endOffsets": "424,530,636,725,830,951,1034,1116,1207,1300,1394,1488,1588,1681,1776,1870,1961,2052,2138,2248,2352,2455,2563,2671,2776,2941,3046,11838" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-bn/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,298,453,577,684,816,934,1042,1142,1281,1386,1538,1662,1791,1935,1991,2054", + "endColumns": "104,154,123,106,131,117,107,99,138,104,151,123,128,143,55,62,85", + "endOffsets": "297,452,576,683,815,933,1041,1141,1280,1385,1537,1661,1790,1934,1990,2053,2139" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4549,4658,4817,4945,5056,5192,5314,5426,5682,5825,5934,6090,6218,6351,6499,6559,6626", + "endColumns": "108,158,127,110,135,121,111,103,142,108,155,127,132,147,59,66,89", + "endOffsets": "4653,4812,4940,5051,5187,5309,5421,5525,5820,5929,6085,6213,6346,6494,6554,6621,6711" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-bn/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "147", + "endOffsets": "342" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5530", + "endColumns": "151", + "endOffsets": "5677" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-bn/values-bn.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,154,256,358,461,562,664,784", + "endColumns": "98,101,101,102,100,101,119,100", + "endOffsets": "149,251,353,456,557,659,779,880" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3518,3617,3719,3821,3924,4025,4127,12078", + "endColumns": "98,101,101,102,100,101,119,100", + "endOffsets": "3612,3714,3816,3919,4020,4122,4242,12174" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-bs.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-bs.json new file mode 100644 index 0000000..5f5ef16 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-bs.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-bs/values-bs.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-bs/values-bs.xml", + "from": { + "startLines": "2,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,327,406,486,568,670,764,860,986,1067,1129,1195,1287,1364,1427,1535,1595,1661,1717,1788,1848,1902,2021,2078,2140,2194,2269,2393,2481,2558,2652,2736,2819,2964,3049,3135,3268,3356,3434,3488,3542,3608,3682,3760,3831,3913,3985,4062,4135,4205,4314,4407,4479,4571,4667,4741,4817,4913,4966,5048,5115,5202,5289,5351,5415,5478,5547,5655,5760,5861,5964,6022,6080,6160,6246,6322", + "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "endColumns": "12,78,79,81,101,93,95,125,80,61,65,91,76,62,107,59,65,55,70,59,53,118,56,61,53,74,123,87,76,93,83,82,144,84,85,132,87,77,53,53,65,73,77,70,81,71,76,72,69,108,92,71,91,95,73,75,95,52,81,66,86,86,61,63,62,68,107,104,100,102,57,57,79,85,75,76", + "endOffsets": "322,401,481,563,665,759,855,981,1062,1124,1190,1282,1359,1422,1530,1590,1656,1712,1783,1843,1897,2016,2073,2135,2189,2264,2388,2476,2553,2647,2731,2814,2959,3044,3130,3263,3351,3429,3483,3537,3603,3677,3755,3826,3908,3980,4057,4130,4200,4309,4402,4474,4566,4662,4736,4812,4908,4961,5043,5110,5197,5284,5346,5410,5473,5542,5650,5755,5856,5959,6017,6075,6155,6241,6317,6394" + }, + "to": { + "startLines": "2,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3107,3186,3266,3348,3450,4269,4365,4491,6765,6827,6893,6985,7062,7125,7233,7293,7359,7415,7486,7546,7600,7719,7776,7838,7892,7967,8091,8179,8256,8350,8434,8517,8662,8747,8833,8966,9054,9132,9186,9240,9306,9380,9458,9529,9611,9683,9760,9833,9903,10012,10105,10177,10269,10365,10439,10515,10611,10664,10746,10813,10900,10987,11049,11113,11176,11245,11353,11458,11559,11662,11720,11778,11945,12031,12107", + "endLines": "6,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "endColumns": "12,78,79,81,101,93,95,125,80,61,65,91,76,62,107,59,65,55,70,59,53,118,56,61,53,74,123,87,76,93,83,82,144,84,85,132,87,77,53,53,65,73,77,70,81,71,76,72,69,108,92,71,91,95,73,75,95,52,81,66,86,86,61,63,62,68,107,104,100,102,57,57,79,85,75,76", + "endOffsets": "372,3181,3261,3343,3445,3539,4360,4486,4567,6822,6888,6980,7057,7120,7228,7288,7354,7410,7481,7541,7595,7714,7771,7833,7887,7962,8086,8174,8251,8345,8429,8512,8657,8742,8828,8961,9049,9127,9181,9235,9301,9375,9453,9524,9606,9678,9755,9828,9898,10007,10100,10172,10264,10360,10434,10510,10606,10659,10741,10808,10895,10982,11044,11108,11171,11240,11348,11453,11554,11657,11715,11773,11853,12026,12102,12179" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-bs/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "136", + "endOffsets": "331" + }, + "to": { + "startLines": "57", + "startColumns": "4", + "startOffsets": "5564", + "endColumns": "140", + "endOffsets": "5700" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-bs/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,451,573,679,825,947,1055,1153,1303,1406,1563,1686,1832,1974,2038,2096", + "endColumns": "101,155,121,105,145,121,107,97,149,102,156,122,145,141,63,57,80", + "endOffsets": "294,450,572,678,824,946,1054,1152,1302,1405,1562,1685,1831,1973,2037,2095,2176" + }, + "to": { + "startLines": "49,50,51,52,53,54,55,56,58,59,60,61,62,63,64,65,66", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4572,4678,4838,4964,5074,5224,5350,5462,5705,5859,5966,6127,6254,6404,6550,6618,6680", + "endColumns": "105,159,125,109,149,125,111,101,153,106,160,126,149,145,67,61,84", + "endOffsets": "4673,4833,4959,5069,5219,5345,5457,5559,5854,5961,6122,6249,6399,6545,6613,6675,6760" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-bs/values-bs.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,226,323,430,516,620,742,827,909,1000,1093,1188,1282,1382,1475,1570,1665,1756,1847,1935,2038,2142,2248,2353,2467,2570,2739,2835", + "endColumns": "120,96,106,85,103,121,84,81,90,92,94,93,99,92,94,94,90,90,87,102,103,105,104,113,102,168,95,86", + "endOffsets": "221,318,425,511,615,737,822,904,995,1088,1183,1277,1377,1470,1565,1660,1751,1842,1930,2033,2137,2243,2348,2462,2565,2734,2830,2917" + }, + "to": { + "startLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,131", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "377,498,595,702,788,892,1014,1099,1181,1272,1365,1460,1554,1654,1747,1842,1937,2028,2119,2207,2310,2414,2520,2625,2739,2842,3011,11858", + "endColumns": "120,96,106,85,103,121,84,81,90,92,94,93,99,92,94,94,90,90,87,102,103,105,104,113,102,168,95,86", + "endOffsets": "493,590,697,783,887,1009,1094,1176,1267,1360,1455,1549,1649,1742,1837,1932,2023,2114,2202,2305,2409,2515,2620,2734,2837,3006,3102,11940" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-bs/values-bs.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,353,457,561,663,780", + "endColumns": "97,101,97,103,103,101,116,100", + "endOffsets": "148,250,348,452,556,658,775,876" + }, + "to": { + "startLines": "39,40,41,42,43,44,45,135", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3544,3642,3744,3842,3946,4050,4152,12184", + "endColumns": "97,101,97,103,103,101,116,100", + "endOffsets": "3637,3739,3837,3941,4045,4147,4264,12280" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ca.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ca.json new file mode 100644 index 0000000..9498900 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ca.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-ca/values-ca.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ca/values-ca.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,274,355,435,523,626,718,819,947,1031,1092,1157,1254,1334,1399,1494,1558,1630,1692,1768,1831,1888,2009,2067,2128,2185,2265,2402,2489,2564,2657,2737,2821,2960,3038,3117,3269,3358,3434,3491,3547,3613,3691,3772,3843,3931,4009,4086,4160,4239,4349,4439,4531,4623,4724,4798,4880,4981,5031,5114,5180,5272,5359,5421,5485,5548,5621,5744,5857,5961,6069,6130,6190,6276,6362,6439", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,80,79,87,102,91,100,127,83,60,64,96,79,64,94,63,71,61,75,62,56,120,57,60,56,79,136,86,74,92,79,83,138,77,78,151,88,75,56,55,65,77,80,70,87,77,76,73,78,109,89,91,91,100,73,81,100,49,82,65,91,86,61,63,62,72,122,112,103,107,60,59,85,85,76,78", + "endOffsets": "269,350,430,518,621,713,814,942,1026,1087,1152,1249,1329,1394,1489,1553,1625,1687,1763,1826,1883,2004,2062,2123,2180,2260,2397,2484,2559,2652,2732,2816,2955,3033,3112,3264,3353,3429,3486,3542,3608,3686,3767,3838,3926,4004,4081,4155,4234,4344,4434,4526,4618,4719,4793,4875,4976,5026,5109,5175,5267,5354,5416,5480,5543,5616,5739,5852,5956,6064,6125,6185,6271,6357,6434,6513" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3049,3130,3210,3298,3401,4224,4325,4453,6785,6846,6911,7008,7088,7153,7248,7312,7384,7446,7522,7585,7642,7763,7821,7882,7939,8019,8156,8243,8318,8411,8491,8575,8714,8792,8871,9023,9112,9188,9245,9301,9367,9445,9526,9597,9685,9763,9840,9914,9993,10103,10193,10285,10377,10478,10552,10634,10735,10785,10868,10934,11026,11113,11175,11239,11302,11375,11498,11611,11715,11823,11884,11944,12112,12198,12275", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,80,79,87,102,91,100,127,83,60,64,96,79,64,94,63,71,61,75,62,56,120,57,60,56,79,136,86,74,92,79,83,138,77,78,151,88,75,56,55,65,77,80,70,87,77,76,73,78,109,89,91,91,100,73,81,100,49,82,65,91,86,61,63,62,72,122,112,103,107,60,59,85,85,76,78", + "endOffsets": "319,3125,3205,3293,3396,3488,4320,4448,4532,6841,6906,7003,7083,7148,7243,7307,7379,7441,7517,7580,7637,7758,7816,7877,7934,8014,8151,8238,8313,8406,8486,8570,8709,8787,8866,9018,9107,9183,9240,9296,9362,9440,9521,9592,9680,9758,9835,9909,9988,10098,10188,10280,10372,10473,10547,10629,10730,10780,10863,10929,11021,11108,11170,11234,11297,11370,11493,11606,11710,11818,11879,11939,12025,12193,12270,12349" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ca/values-ca.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,228,333,440,523,629,755,839,918,1009,1102,1195,1290,1388,1481,1574,1668,1759,1850,1931,2042,2150,2248,2358,2463,2571,2731,2830", + "endColumns": "122,104,106,82,105,125,83,78,90,92,92,94,97,92,92,93,90,90,80,110,107,97,109,104,107,159,98,81", + "endOffsets": "223,328,435,518,624,750,834,913,1004,1097,1190,1285,1383,1476,1569,1663,1754,1845,1926,2037,2145,2243,2353,2458,2566,2726,2825,2907" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "324,447,552,659,742,848,974,1058,1137,1228,1321,1414,1509,1607,1700,1793,1887,1978,2069,2150,2261,2369,2467,2577,2682,2790,2950,12030", + "endColumns": "122,104,106,82,105,125,83,78,90,92,92,94,97,92,92,93,90,90,80,110,107,97,109,104,107,159,98,81", + "endOffsets": "442,547,654,737,843,969,1053,1132,1223,1316,1409,1504,1602,1695,1788,1882,1973,2064,2145,2256,2364,2462,2572,2677,2785,2945,3044,12107" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ca/values-ca.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,352,449,555,660,786", + "endColumns": "95,101,98,96,105,104,125,100", + "endOffsets": "146,248,347,444,550,655,781,882" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3493,3589,3691,3790,3887,3993,4098,12354", + "endColumns": "95,101,98,96,105,104,125,100", + "endOffsets": "3584,3686,3785,3882,3988,4093,4219,12450" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ca/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,294,442,565,670,816,939,1058,1162,1329,1434,1589,1716,1876,2030,2091,2155", + "endColumns": "100,147,122,104,145,122,118,103,166,104,154,126,159,153,60,63,82", + "endOffsets": "293,441,564,669,815,938,1057,1161,1328,1433,1588,1715,1875,2029,2090,2154,2237" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4537,4642,4794,4921,5030,5180,5307,5430,5673,5844,5953,6112,6243,6407,6565,6630,6698", + "endColumns": "104,151,126,108,149,126,122,107,170,108,158,130,163,157,64,67,86", + "endOffsets": "4637,4789,4916,5025,5175,5302,5425,5533,5839,5948,6107,6238,6402,6560,6625,6693,6780" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ca/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "130", + "endOffsets": "325" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5538", + "endColumns": "134", + "endOffsets": "5668" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-cs.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-cs.json new file mode 100644 index 0000000..4bd025a --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-cs.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-cs/values-cs.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-cs/values-cs.xml", + "from": { + "startLines": "2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,368,446,524,601,704,796,888,1014,1095,1156,1221,1320,1396,1457,1546,1610,1677,1731,1799,1859,1913,2030,2090,2152,2206,2278,2400,2484,2563,2657,2740,2832,2969,3047,3129,3256,3344,3424,3478,3529,3595,3667,3744,3815,3896,3968,4045,4119,4190,4295,4383,4454,4547,4642,4716,4790,4886,4938,5021,5088,5174,5262,5324,5388,5451,5519,5629,5735,5834,5948,6006,6061,6140,6223,6298", + "endLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "endColumns": "12,77,77,76,102,91,91,125,80,60,64,98,75,60,88,63,66,53,67,59,53,116,59,61,53,71,121,83,78,93,82,91,136,77,81,126,87,79,53,50,65,71,76,70,80,71,76,73,70,104,87,70,92,94,73,73,95,51,82,66,85,87,61,63,62,67,109,105,98,113,57,54,78,82,74,78", + "endOffsets": "363,441,519,596,699,791,883,1009,1090,1151,1216,1315,1391,1452,1541,1605,1672,1726,1794,1854,1908,2025,2085,2147,2201,2273,2395,2479,2558,2652,2735,2827,2964,3042,3124,3251,3339,3419,3473,3524,3590,3662,3739,3810,3891,3963,4040,4114,4185,4290,4378,4449,4542,4637,4711,4785,4881,4933,5016,5083,5169,5257,5319,5383,5446,5514,5624,5730,5829,5943,6001,6056,6135,6218,6293,6372" + }, + "to": { + "startLines": "2,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3112,3190,3268,3345,3448,4271,4363,4489,6822,6883,6948,7047,7123,7184,7273,7337,7404,7458,7526,7586,7640,7757,7817,7879,7933,8005,8127,8211,8290,8384,8467,8559,8696,8774,8856,8983,9071,9151,9205,9256,9322,9394,9471,9542,9623,9695,9772,9846,9917,10022,10110,10181,10274,10369,10443,10517,10613,10665,10748,10815,10901,10989,11051,11115,11178,11246,11356,11462,11561,11675,11733,11788,11950,12033,12108", + "endLines": "7,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "endColumns": "12,77,77,76,102,91,91,125,80,60,64,98,75,60,88,63,66,53,67,59,53,116,59,61,53,71,121,83,78,93,82,91,136,77,81,126,87,79,53,50,65,71,76,70,80,71,76,73,70,104,87,70,92,94,73,73,95,51,82,66,85,87,61,63,62,67,109,105,98,113,57,54,78,82,74,78", + "endOffsets": "413,3185,3263,3340,3443,3535,4358,4484,4565,6878,6943,7042,7118,7179,7268,7332,7399,7453,7521,7581,7635,7752,7812,7874,7928,8000,8122,8206,8285,8379,8462,8554,8691,8769,8851,8978,9066,9146,9200,9251,9317,9389,9466,9537,9618,9690,9767,9841,9912,10017,10105,10176,10269,10364,10438,10512,10608,10660,10743,10810,10896,10984,11046,11110,11173,11241,11351,11457,11556,11670,11728,11783,11862,12028,12103,12182" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-cs/values-cs.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,356,455,560,667,786", + "endColumns": "97,101,100,98,104,106,118,100", + "endOffsets": "148,250,351,450,555,662,781,882" + }, + "to": { + "startLines": "40,41,42,43,44,45,46,136", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3540,3638,3740,3841,3940,4045,4152,12187", + "endColumns": "97,101,100,98,104,106,118,100", + "endOffsets": "3633,3735,3836,3935,4040,4147,4266,12283" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-cs/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "138", + "endOffsets": "333" + }, + "to": { + "startLines": "58", + "startColumns": "4", + "startOffsets": "5564", + "endColumns": "142", + "endOffsets": "5702" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-cs/values-cs.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,212,314,424,510,615,732,810,886,977,1070,1165,1259,1353,1446,1541,1638,1729,1820,1904,2008,2120,2219,2325,2436,2538,2701,2799", + "endColumns": "106,101,109,85,104,116,77,75,90,92,94,93,93,92,94,96,90,90,83,103,111,98,105,110,101,162,97,82", + "endOffsets": "207,309,419,505,610,727,805,881,972,1065,1160,1254,1348,1441,1536,1633,1724,1815,1899,2003,2115,2214,2320,2431,2533,2696,2794,2877" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,132", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "418,525,627,737,823,928,1045,1123,1199,1290,1383,1478,1572,1666,1759,1854,1951,2042,2133,2217,2321,2433,2532,2638,2749,2851,3014,11867", + "endColumns": "106,101,109,85,104,116,77,75,90,92,94,93,93,92,94,96,90,90,83,103,111,98,105,110,101,162,97,82", + "endOffsets": "520,622,732,818,923,1040,1118,1194,1285,1378,1473,1567,1661,1754,1849,1946,2037,2128,2212,2316,2428,2527,2633,2744,2846,3009,3107,11945" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-cs/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,451,572,678,827,950,1058,1155,1326,1433,1593,1717,1874,2025,2089,2152", + "endColumns": "101,155,120,105,148,122,107,96,170,106,159,123,156,150,63,62,81", + "endOffsets": "294,450,571,677,826,949,1057,1154,1325,1432,1592,1716,1873,2024,2088,2151,2233" + }, + "to": { + "startLines": "50,51,52,53,54,55,56,57,59,60,61,62,63,64,65,66,67", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4570,4676,4836,4961,5071,5224,5351,5463,5707,5882,5993,6157,6285,6446,6601,6669,6736", + "endColumns": "105,159,124,109,152,126,111,100,174,110,163,127,160,154,67,66,85", + "endOffsets": "4671,4831,4956,5066,5219,5346,5458,5559,5877,5988,6152,6280,6441,6596,6664,6731,6817" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-da.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-da.json new file mode 100644 index 0000000..10b8619 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-da.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-da/values-da.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-da/values-da.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,272,350,426,504,601,681,781,930,1008,1067,1131,1217,1290,1350,1437,1501,1563,1625,1693,1758,1812,1930,1988,2049,2105,2180,2306,2392,2469,2560,2644,2724,2865,2943,3023,3145,3231,3309,3365,3416,3482,3550,3624,3695,3770,3842,3920,3990,4063,4167,4251,4328,4416,4505,4579,4652,4737,4786,4864,4930,5010,5093,5155,5219,5282,5351,5459,5562,5663,5762,5822,5877,5957,6037,6115", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,77,75,77,96,79,99,148,77,58,63,85,72,59,86,63,61,61,67,64,53,117,57,60,55,74,125,85,76,90,83,79,140,77,79,121,85,77,55,50,65,67,73,70,74,71,77,69,72,103,83,76,87,88,73,72,84,48,77,65,79,82,61,63,62,68,107,102,100,98,59,54,79,79,77,76", + "endOffsets": "267,345,421,499,596,676,776,925,1003,1062,1126,1212,1285,1345,1432,1496,1558,1620,1688,1753,1807,1925,1983,2044,2100,2175,2301,2387,2464,2555,2639,2719,2860,2938,3018,3140,3226,3304,3360,3411,3477,3545,3619,3690,3765,3837,3915,3985,4058,4162,4246,4323,4411,4500,4574,4647,4732,4781,4859,4925,5005,5088,5150,5214,5277,5346,5454,5557,5658,5757,5817,5872,5952,6032,6110,6187" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2974,3052,3128,3206,3303,4110,4210,4359,6639,6698,6762,6848,6921,6981,7068,7132,7194,7256,7324,7389,7443,7561,7619,7680,7736,7811,7937,8023,8100,8191,8275,8355,8496,8574,8654,8776,8862,8940,8996,9047,9113,9181,9255,9326,9401,9473,9551,9621,9694,9798,9882,9959,10047,10136,10210,10283,10368,10417,10495,10561,10641,10724,10786,10850,10913,10982,11090,11193,11294,11393,11453,11508,11668,11748,11826", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,77,75,77,96,79,99,148,77,58,63,85,72,59,86,63,61,61,67,64,53,117,57,60,55,74,125,85,76,90,83,79,140,77,79,121,85,77,55,50,65,67,73,70,74,71,77,69,72,103,83,76,87,88,73,72,84,48,77,65,79,82,61,63,62,68,107,102,100,98,59,54,79,79,77,76", + "endOffsets": "317,3047,3123,3201,3298,3378,4205,4354,4432,6693,6757,6843,6916,6976,7063,7127,7189,7251,7319,7384,7438,7556,7614,7675,7731,7806,7932,8018,8095,8186,8270,8350,8491,8569,8649,8771,8857,8935,8991,9042,9108,9176,9250,9321,9396,9468,9546,9616,9689,9793,9877,9954,10042,10131,10205,10278,10363,10412,10490,10556,10636,10719,10781,10845,10908,10977,11085,11188,11289,11388,11448,11503,11583,11743,11821,11898" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-da/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,451,574,679,818,939,1055,1156,1308,1410,1568,1691,1832,2006,2068,2126", + "endColumns": "101,155,122,104,138,120,115,100,151,101,157,122,140,173,61,57,73", + "endOffsets": "294,450,573,678,817,938,1054,1155,1307,1409,1567,1690,1831,2005,2067,2125,2199" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4437,4543,4703,4830,4939,5082,5207,5327,5559,5715,5821,5983,6110,6255,6433,6499,6561", + "endColumns": "105,159,126,108,142,124,119,104,155,105,161,126,144,177,65,61,77", + "endOffsets": "4538,4698,4825,4934,5077,5202,5322,5427,5710,5816,5978,6105,6250,6428,6494,6556,6634" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-da/values-da.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,350,448,555,664,782", + "endColumns": "95,101,96,97,106,108,117,100", + "endOffsets": "146,248,345,443,550,659,777,878" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3383,3479,3581,3678,3776,3883,3992,11903", + "endColumns": "95,101,96,97,106,108,117,100", + "endOffsets": "3474,3576,3673,3771,3878,3987,4105,11999" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-da/values-da.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,205,299,415,500,600,713,791,867,958,1051,1144,1238,1332,1425,1520,1618,1709,1800,1879,1987,2094,2190,2303,2406,2507,2660,2757", + "endColumns": "99,93,115,84,99,112,77,75,90,92,92,93,93,92,94,97,90,90,78,107,106,95,112,102,100,152,96,79", + "endOffsets": "200,294,410,495,595,708,786,862,953,1046,1139,1233,1327,1420,1515,1613,1704,1795,1874,1982,2089,2185,2298,2401,2502,2655,2752,2832" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "322,422,516,632,717,817,930,1008,1084,1175,1268,1361,1455,1549,1642,1737,1835,1926,2017,2096,2204,2311,2407,2520,2623,2724,2877,11588", + "endColumns": "99,93,115,84,99,112,77,75,90,92,92,93,93,92,94,97,90,90,78,107,106,95,112,102,100,152,96,79", + "endOffsets": "417,511,627,712,812,925,1003,1079,1170,1263,1356,1450,1544,1637,1732,1830,1921,2012,2091,2199,2306,2402,2515,2618,2719,2872,2969,11663" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-da/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "122", + "endOffsets": "317" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5432", + "endColumns": "126", + "endOffsets": "5554" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-de.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-de.json new file mode 100644 index 0000000..0430835 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-de.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-de/values-de.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-de/values-de.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,283,374,463,547,637,719,820,942,1023,1085,1151,1245,1315,1374,1482,1548,1617,1675,1747,1811,1865,1993,2053,2115,2169,2247,2384,2476,2554,2648,2734,2818,2963,3047,3133,3266,3356,3435,3492,3543,3609,3683,3765,3836,3911,3985,4063,4135,4209,4319,4411,4493,4582,4671,4745,4823,4909,4964,5043,5110,5190,5274,5336,5400,5463,5532,5639,5746,5845,5951,6012,6067,6149,6232,6309", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,90,88,83,89,81,100,121,80,61,65,93,69,58,107,65,68,57,71,63,53,127,59,61,53,77,136,91,77,93,85,83,144,83,85,132,89,78,56,50,65,73,81,70,74,73,77,71,73,109,91,81,88,88,73,77,85,54,78,66,79,83,61,63,62,68,106,106,98,105,60,54,81,82,76,75", + "endOffsets": "278,369,458,542,632,714,815,937,1018,1080,1146,1240,1310,1369,1477,1543,1612,1670,1742,1806,1860,1988,2048,2110,2164,2242,2379,2471,2549,2643,2729,2813,2958,3042,3128,3261,3351,3430,3487,3538,3604,3678,3760,3831,3906,3980,4058,4130,4204,4314,4406,4488,4577,4666,4740,4818,4904,4959,5038,5105,5185,5269,5331,5395,5458,5527,5634,5741,5840,5946,6007,6062,6144,6227,6304,6380" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3060,3151,3240,3324,3414,4227,4328,4450,6882,6944,7010,7104,7174,7233,7341,7407,7476,7534,7606,7670,7724,7852,7912,7974,8028,8106,8243,8335,8413,8507,8593,8677,8822,8906,8992,9125,9215,9294,9351,9402,9468,9542,9624,9695,9770,9844,9922,9994,10068,10178,10270,10352,10441,10530,10604,10682,10768,10823,10902,10969,11049,11133,11195,11259,11322,11391,11498,11605,11704,11810,11871,11926,12090,12173,12250", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,90,88,83,89,81,100,121,80,61,65,93,69,58,107,65,68,57,71,63,53,127,59,61,53,77,136,91,77,93,85,83,144,83,85,132,89,78,56,50,65,73,81,70,74,73,77,71,73,109,91,81,88,88,73,77,85,54,78,66,79,83,61,63,62,68,106,106,98,105,60,54,81,82,76,75", + "endOffsets": "328,3146,3235,3319,3409,3491,4323,4445,4526,6939,7005,7099,7169,7228,7336,7402,7471,7529,7601,7665,7719,7847,7907,7969,8023,8101,8238,8330,8408,8502,8588,8672,8817,8901,8987,9120,9210,9289,9346,9397,9463,9537,9619,9690,9765,9839,9917,9989,10063,10173,10265,10347,10436,10525,10599,10677,10763,10818,10897,10964,11044,11128,11190,11254,11317,11386,11493,11600,11699,11805,11866,11921,12003,12168,12245,12321" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-de/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "140", + "endOffsets": "335" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5593", + "endColumns": "144", + "endOffsets": "5733" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-de/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,298,458,582,690,864,991,1108,1223,1399,1507,1672,1799,1957,2129,2196,2255", + "endColumns": "104,159,123,107,173,126,116,114,175,107,164,126,157,171,66,58,75", + "endOffsets": "297,457,581,689,863,990,1107,1222,1398,1506,1671,1798,1956,2128,2195,2254,2330" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4531,4640,4804,4932,5044,5222,5353,5474,5738,5918,6030,6199,6330,6492,6668,6739,6802", + "endColumns": "108,163,127,111,177,130,120,118,179,111,168,130,161,175,70,62,79", + "endOffsets": "4635,4799,4927,5039,5217,5348,5469,5588,5913,6025,6194,6325,6487,6663,6734,6797,6877" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-de/values-de.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,355,455,563,668,786", + "endColumns": "97,101,99,99,107,104,117,100", + "endOffsets": "148,250,350,450,558,663,781,882" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3496,3594,3696,3796,3896,4004,4109,12326", + "endColumns": "97,101,99,99,107,104,117,100", + "endOffsets": "3589,3691,3791,3891,3999,4104,4222,12422" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-de/values-de.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,210,308,420,506,612,727,805,880,972,1066,1162,1263,1370,1470,1574,1672,1770,1867,1949,2060,2162,2260,2367,2470,2574,2730,2832", + "endColumns": "104,97,111,85,105,114,77,74,91,93,95,100,106,99,103,97,97,96,81,110,101,97,106,102,103,155,101,81", + "endOffsets": "205,303,415,501,607,722,800,875,967,1061,1157,1258,1365,1465,1569,1667,1765,1862,1944,2055,2157,2255,2362,2465,2569,2725,2827,2909" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "333,438,536,648,734,840,955,1033,1108,1200,1294,1390,1491,1598,1698,1802,1900,1998,2095,2177,2288,2390,2488,2595,2698,2802,2958,12008", + "endColumns": "104,97,111,85,105,114,77,74,91,93,95,100,106,99,103,97,97,96,81,110,101,97,106,102,103,155,101,81", + "endOffsets": "433,531,643,729,835,950,1028,1103,1195,1289,1385,1486,1593,1693,1797,1895,1993,2090,2172,2283,2385,2483,2590,2693,2797,2953,3055,12085" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-el.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-el.json new file mode 100644 index 0000000..904bb57 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-el.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-el/values-el.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-el/values-el.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,256,356,459,567,673,790", + "endColumns": "97,102,99,102,107,105,116,100", + "endOffsets": "148,251,351,454,562,668,785,886" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3543,3641,3744,3844,3947,4055,4161,12510", + "endColumns": "97,102,99,102,107,105,116,100", + "endOffsets": "3636,3739,3839,3942,4050,4156,4273,12606" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-el/values-el.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,270,358,444,529,625,712,814,931,1017,1080,1146,1246,1328,1391,1482,1545,1610,1672,1741,1803,1857,1995,2052,2113,2167,2240,2393,2478,2557,2653,2737,2821,2960,3041,3126,3267,3357,3443,3498,3549,3615,3693,3778,3849,3932,4004,4084,4164,4235,4342,4434,4506,4603,4700,4774,4848,4950,5006,5093,5165,5253,5345,5407,5471,5534,5604,5720,5829,5938,6043,6102,6157,6248,6336,6411", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,87,85,84,95,86,101,116,85,62,65,99,81,62,90,62,64,61,68,61,53,137,56,60,53,72,152,84,78,95,83,83,138,80,84,140,89,85,54,50,65,77,84,70,82,71,79,79,70,106,91,71,96,96,73,73,101,55,86,71,87,91,61,63,62,69,115,108,108,104,58,54,90,87,74,80", + "endOffsets": "265,353,439,524,620,707,809,926,1012,1075,1141,1241,1323,1386,1477,1540,1605,1667,1736,1798,1852,1990,2047,2108,2162,2235,2388,2473,2552,2648,2732,2816,2955,3036,3121,3262,3352,3438,3493,3544,3610,3688,3773,3844,3927,3999,4079,4159,4230,4337,4429,4501,4598,4695,4769,4843,4945,5001,5088,5160,5248,5340,5402,5466,5529,5599,5715,5824,5933,6038,6097,6152,6243,6331,6406,6487" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3101,3189,3275,3360,3456,4278,4380,4497,6949,7012,7078,7178,7260,7323,7414,7477,7542,7604,7673,7735,7789,7927,7984,8045,8099,8172,8325,8410,8489,8585,8669,8753,8892,8973,9058,9199,9289,9375,9430,9481,9547,9625,9710,9781,9864,9936,10016,10096,10167,10274,10366,10438,10535,10632,10706,10780,10882,10938,11025,11097,11185,11277,11339,11403,11466,11536,11652,11761,11870,11975,12034,12089,12266,12354,12429", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,87,85,84,95,86,101,116,85,62,65,99,81,62,90,62,64,61,68,61,53,137,56,60,53,72,152,84,78,95,83,83,138,80,84,140,89,85,54,50,65,77,84,70,82,71,79,79,70,106,91,71,96,96,73,73,101,55,86,71,87,91,61,63,62,69,115,108,108,104,58,54,90,87,74,80", + "endOffsets": "315,3184,3270,3355,3451,3538,4375,4492,4578,7007,7073,7173,7255,7318,7409,7472,7537,7599,7668,7730,7784,7922,7979,8040,8094,8167,8320,8405,8484,8580,8664,8748,8887,8968,9053,9194,9284,9370,9425,9476,9542,9620,9705,9776,9859,9931,10011,10091,10162,10269,10361,10433,10530,10627,10701,10775,10877,10933,11020,11092,11180,11272,11334,11398,11461,11531,11647,11756,11865,11970,12029,12084,12175,12349,12424,12505" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-el/values-el.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,223,334,451,536,642,765,854,939,1030,1123,1218,1312,1412,1505,1600,1697,1788,1879,1964,2075,2184,2286,2397,2507,2615,2786,2886", + "endColumns": "117,110,116,84,105,122,88,84,90,92,94,93,99,92,94,96,90,90,84,110,108,101,110,109,107,170,99,85", + "endOffsets": "218,329,446,531,637,760,849,934,1025,1118,1213,1307,1407,1500,1595,1692,1783,1874,1959,2070,2179,2281,2392,2502,2610,2781,2881,2967" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "320,438,549,666,751,857,980,1069,1154,1245,1338,1433,1527,1627,1720,1815,1912,2003,2094,2179,2290,2399,2501,2612,2722,2830,3001,12180", + "endColumns": "117,110,116,84,105,122,88,84,90,92,94,93,99,92,94,96,90,90,84,110,108,101,110,109,107,170,99,85", + "endOffsets": "433,544,661,746,852,975,1064,1149,1240,1333,1428,1522,1622,1715,1810,1907,1998,2089,2174,2285,2394,2496,2607,2717,2825,2996,3096,12261" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-el/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,300,482,610,717,894,1015,1129,1230,1415,1519,1685,1810,1984,2125,2190,2248", + "endColumns": "106,181,127,106,176,120,113,100,184,103,165,124,173,140,64,57,78", + "endOffsets": "299,481,609,716,893,1014,1128,1229,1414,1518,1684,1809,1983,2124,2189,2247,2326" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4583,4694,4880,5012,5123,5304,5429,5547,5816,6005,6113,6283,6412,6590,6735,6804,6866", + "endColumns": "110,185,131,110,180,124,117,104,188,107,169,128,177,144,68,61,82", + "endOffsets": "4689,4875,5007,5118,5299,5424,5542,5647,6000,6108,6278,6407,6585,6730,6799,6861,6944" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-el/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "159", + "endOffsets": "354" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5652", + "endColumns": "163", + "endOffsets": "5811" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-en-rAU.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-en-rAU.json new file mode 100644 index 0000000..a7f5d23 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-en-rAU.json @@ -0,0 +1,43 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-en-rAU/values-en-rAU.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-en-rAU/values-en-rAU.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,209,309,417,501,601,716,794,869,960,1053,1148,1242,1342,1435,1530,1624,1715,1806,1888,1991,2094,2193,2298,2402,2506,2662,2762", + "endColumns": "103,99,107,83,99,114,77,74,90,92,94,93,99,92,94,93,90,90,81,102,102,98,104,103,103,155,99,82", + "endOffsets": "204,304,412,496,596,711,789,864,955,1048,1143,1237,1337,1430,1525,1619,1710,1801,1883,1986,2089,2188,2293,2397,2501,2657,2757,2840" + }, + "to": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,209,309,417,501,601,716,794,869,960,1053,1148,1242,1342,1435,1530,1624,1715,1806,1888,1991,2094,2193,2298,2402,2506,2662,3481", + "endColumns": "103,99,107,83,99,114,77,74,90,92,94,93,99,92,94,93,90,90,81,102,102,98,104,103,103,155,99,82", + "endOffsets": "204,304,412,496,596,711,789,864,955,1048,1143,1237,1337,1430,1525,1619,1710,1801,1883,1986,2089,2188,2293,2397,2501,2657,2757,3559" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-en-rAU/values-en-rAU.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,352,451,555,658,774", + "endColumns": "95,101,98,98,103,102,115,100", + "endOffsets": "146,248,347,446,550,653,769,870" + }, + "to": { + "startLines": "29,30,31,32,33,34,35,37", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "2762,2858,2960,3059,3158,3262,3365,3564", + "endColumns": "95,101,98,98,103,102,115,100", + "endOffsets": "2853,2955,3054,3153,3257,3360,3476,3660" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-en-rCA.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-en-rCA.json new file mode 100644 index 0000000..f2ec3af --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-en-rCA.json @@ -0,0 +1,43 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-en-rCA/values-en-rCA.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-en-rCA/values-en-rCA.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,352,451,555,657,773", + "endColumns": "95,101,98,98,103,101,115,100", + "endOffsets": "146,248,347,446,550,652,768,869" + }, + "to": { + "startLines": "29,30,31,32,33,34,35,37", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "2762,2858,2960,3059,3158,3262,3364,3563", + "endColumns": "95,101,98,98,103,101,115,100", + "endOffsets": "2853,2955,3054,3153,3257,3359,3475,3659" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-en-rCA/values-en-rCA.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,209,309,417,501,601,716,794,869,960,1053,1148,1242,1342,1435,1530,1624,1715,1806,1888,1991,2094,2193,2298,2402,2506,2662,2762", + "endColumns": "103,99,107,83,99,114,77,74,90,92,94,93,99,92,94,93,90,90,81,102,102,98,104,103,103,155,99,82", + "endOffsets": "204,304,412,496,596,711,789,864,955,1048,1143,1237,1337,1430,1525,1619,1710,1801,1883,1986,2089,2188,2293,2397,2501,2657,2757,2840" + }, + "to": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,209,309,417,501,601,716,794,869,960,1053,1148,1242,1342,1435,1530,1624,1715,1806,1888,1991,2094,2193,2298,2402,2506,2662,3480", + "endColumns": "103,99,107,83,99,114,77,74,90,92,94,93,99,92,94,93,90,90,81,102,102,98,104,103,103,155,99,82", + "endOffsets": "204,304,412,496,596,711,789,864,955,1048,1143,1237,1337,1430,1525,1619,1710,1801,1883,1986,2089,2188,2293,2397,2501,2657,2757,3558" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-en-rGB.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-en-rGB.json new file mode 100644 index 0000000..8d0e227 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-en-rGB.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-en-rGB/values-en-rGB.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-en-rGB/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "199", + "endColumns": "133", + "endOffsets": "332" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5379", + "endColumns": "137", + "endOffsets": "5512" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-en-rGB/values-en-rGB.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,272,354,432,509,595,679,777,892,971,1031,1096,1186,1253,1312,1402,1466,1530,1593,1662,1726,1780,1892,1950,2012,2066,2138,2260,2347,2422,2513,2594,2675,2815,2892,2973,3100,3191,3268,3322,3373,3439,3509,3586,3657,3732,3803,3880,3949,4018,4125,4216,4288,4377,4466,4540,4612,4698,4748,4827,4893,4973,5057,5119,5183,5246,5315,5415,5510,5602,5694,5752,5807,5885,5966,6041", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,81,77,76,85,83,97,114,78,59,64,89,66,58,89,63,63,62,68,63,53,111,57,61,53,71,121,86,74,90,80,80,139,76,80,126,90,76,53,50,65,69,76,70,74,70,76,68,68,106,90,71,88,88,73,71,85,49,78,65,79,83,61,63,62,68,99,94,91,91,57,54,77,80,74,74", + "endOffsets": "267,349,427,504,590,674,772,887,966,1026,1091,1181,1248,1307,1397,1461,1525,1588,1657,1721,1775,1887,1945,2007,2061,2133,2255,2342,2417,2508,2589,2670,2810,2887,2968,3095,3186,3263,3317,3368,3434,3504,3581,3652,3727,3798,3875,3944,4013,4120,4211,4283,4372,4461,4535,4607,4693,4743,4822,4888,4968,5052,5114,5178,5241,5310,5410,5505,5597,5689,5747,5802,5880,5961,6036,6111" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2979,3061,3139,3216,3302,4105,4203,4318,6556,6616,6681,6771,6838,6897,6987,7051,7115,7178,7247,7311,7365,7477,7535,7597,7651,7723,7845,7932,8007,8098,8179,8260,8400,8477,8558,8685,8776,8853,8907,8958,9024,9094,9171,9242,9317,9388,9465,9534,9603,9710,9801,9873,9962,10051,10125,10197,10283,10333,10412,10478,10558,10642,10704,10768,10831,10900,11000,11095,11187,11279,11337,11392,11553,11634,11709", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,81,77,76,85,83,97,114,78,59,64,89,66,58,89,63,63,62,68,63,53,111,57,61,53,71,121,86,74,90,80,80,139,76,80,126,90,76,53,50,65,69,76,70,74,70,76,68,68,106,90,71,88,88,73,71,85,49,78,65,79,83,61,63,62,68,99,94,91,91,57,54,77,80,74,74", + "endOffsets": "317,3056,3134,3211,3297,3381,4198,4313,4392,6611,6676,6766,6833,6892,6982,7046,7110,7173,7242,7306,7360,7472,7530,7592,7646,7718,7840,7927,8002,8093,8174,8255,8395,8472,8553,8680,8771,8848,8902,8953,9019,9089,9166,9237,9312,9383,9460,9529,9598,9705,9796,9868,9957,10046,10120,10192,10278,10328,10407,10473,10553,10637,10699,10763,10826,10895,10995,11090,11182,11274,11332,11387,11465,11629,11704,11779" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-en-rGB/values-en-rGB.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,209,309,417,501,601,716,794,869,960,1053,1148,1242,1342,1435,1530,1624,1715,1806,1888,1991,2094,2193,2298,2402,2506,2662,2762", + "endColumns": "103,99,107,83,99,114,77,74,90,92,94,93,99,92,94,93,90,90,81,102,102,98,104,103,103,155,99,82", + "endOffsets": "204,304,412,496,596,711,789,864,955,1048,1143,1237,1337,1430,1525,1619,1710,1801,1883,1986,2089,2188,2293,2397,2501,2657,2757,2840" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "322,426,526,634,718,818,933,1011,1086,1177,1270,1365,1459,1559,1652,1747,1841,1932,2023,2105,2208,2311,2410,2515,2619,2723,2879,11470", + "endColumns": "103,99,107,83,99,114,77,74,90,92,94,93,99,92,94,93,90,90,81,102,102,98,104,103,103,155,99,82", + "endOffsets": "421,521,629,713,813,928,1006,1081,1172,1265,1360,1454,1554,1647,1742,1836,1927,2018,2100,2203,2306,2405,2510,2614,2718,2874,2974,11548" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-en-rGB/values-en-rGB.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,352,451,555,658,774", + "endColumns": "95,101,98,98,103,102,115,100", + "endOffsets": "146,248,347,446,550,653,769,870" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3386,3482,3584,3683,3782,3886,3989,11784", + "endColumns": "95,101,98,98,103,102,115,100", + "endOffsets": "3477,3579,3678,3777,3881,3984,4100,11880" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-en-rGB/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "197,298,446,567,670,817,936,1048,1147,1302,1403,1551,1672,1814,1958,2017,2075", + "endColumns": "100,147,120,102,146,118,111,98,154,100,147,120,141,143,58,57,74", + "endOffsets": "297,445,566,669,816,935,1047,1146,1301,1402,1550,1671,1813,1957,2016,2074,2149" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4397,4502,4654,4779,4886,5037,5160,5276,5517,5676,5781,5933,6058,6204,6352,6415,6477", + "endColumns": "104,151,124,106,150,122,115,102,158,104,151,124,145,147,62,61,78", + "endOffsets": "4497,4649,4774,4881,5032,5155,5271,5374,5671,5776,5928,6053,6199,6347,6410,6472,6551" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-en-rIN.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-en-rIN.json new file mode 100644 index 0000000..ec2c839 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-en-rIN.json @@ -0,0 +1,43 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-en-rIN/values-en-rIN.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-en-rIN/values-en-rIN.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,209,309,417,501,601,716,794,869,960,1053,1148,1242,1342,1435,1530,1624,1715,1806,1888,1991,2094,2193,2298,2402,2506,2662,2762", + "endColumns": "103,99,107,83,99,114,77,74,90,92,94,93,99,92,94,93,90,90,81,102,102,98,104,103,103,155,99,82", + "endOffsets": "204,304,412,496,596,711,789,864,955,1048,1143,1237,1337,1430,1525,1619,1710,1801,1883,1986,2089,2188,2293,2397,2501,2657,2757,2840" + }, + "to": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,209,309,417,501,601,716,794,869,960,1053,1148,1242,1342,1435,1530,1624,1715,1806,1888,1991,2094,2193,2298,2402,2506,2662,3481", + "endColumns": "103,99,107,83,99,114,77,74,90,92,94,93,99,92,94,93,90,90,81,102,102,98,104,103,103,155,99,82", + "endOffsets": "204,304,412,496,596,711,789,864,955,1048,1143,1237,1337,1430,1525,1619,1710,1801,1883,1986,2089,2188,2293,2397,2501,2657,2757,3559" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-en-rIN/values-en-rIN.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,352,451,555,658,774", + "endColumns": "95,101,98,98,103,102,115,100", + "endOffsets": "146,248,347,446,550,653,769,870" + }, + "to": { + "startLines": "29,30,31,32,33,34,35,37", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "2762,2858,2960,3059,3158,3262,3365,3564", + "endColumns": "95,101,98,98,103,102,115,100", + "endOffsets": "2853,2955,3054,3153,3257,3360,3476,3660" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-en-rXC.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-en-rXC.json new file mode 100644 index 0000000..e08f160 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-en-rXC.json @@ -0,0 +1,43 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-en-rXC/values-en-rXC.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-en-rXC/values-en-rXC.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,312,515,725,912,1113,1329,1509,1684,1878,2072,2267,2464,2663,2858,3056,3253,3447,3641,3826,4031,4234,4435,4641,4846,5053,5327,5528", + "endColumns": "206,202,209,186,200,215,179,174,193,193,194,196,198,194,197,196,193,193,184,204,202,200,205,204,206,273,200,185", + "endOffsets": "307,510,720,907,1108,1324,1504,1679,1873,2067,2262,2459,2658,2853,3051,3248,3442,3636,3821,4026,4229,4430,4636,4841,5048,5322,5523,5709" + }, + "to": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,312,515,725,912,1113,1329,1509,1684,1878,2072,2267,2464,2663,2858,3056,3253,3447,3641,3826,4031,4234,4435,4641,4846,5053,5327,6955", + "endColumns": "206,202,209,186,200,215,179,174,193,193,194,196,198,194,197,196,193,193,184,204,202,200,205,204,206,273,200,185", + "endOffsets": "307,510,720,907,1108,1324,1504,1679,1873,2067,2262,2459,2658,2853,3051,3248,3442,3636,3821,4026,4229,4430,4636,4841,5048,5322,5523,7136" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-en-rXC/values-en-rXC.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,251,456,657,858,1065,1270,1482", + "endColumns": "195,204,200,200,206,204,211,203", + "endOffsets": "246,451,652,853,1060,1265,1477,1681" + }, + "to": { + "startLines": "29,30,31,32,33,34,35,37", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "5528,5724,5929,6130,6331,6538,6743,7141", + "endColumns": "195,204,200,200,206,204,211,203", + "endOffsets": "5719,5924,6125,6326,6533,6738,6950,7340" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-es-rUS.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-es-rUS.json new file mode 100644 index 0000000..5995b04 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-es-rUS.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-es-rUS/values-es-rUS.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-es-rUS/values-es-rUS.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,154,256,356,454,561,667,787", + "endColumns": "98,101,99,97,106,105,119,100", + "endOffsets": "149,251,351,449,556,662,782,883" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3493,3592,3694,3794,3892,3999,4105,12372", + "endColumns": "98,101,99,97,106,105,119,100", + "endOffsets": "3587,3689,3789,3887,3994,4100,4220,12468" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-es-rUS/values-es-rUS.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,278,360,440,526,631,727,829,957,1038,1100,1165,1260,1330,1393,1486,1550,1622,1685,1759,1823,1879,1997,2055,2117,2173,2253,2387,2476,2552,2650,2731,2812,2953,3034,3114,3265,3355,3432,3488,3544,3610,3689,3771,3842,3931,4004,4081,4151,4228,4334,4423,4497,4591,4693,4765,4846,4950,5003,5088,5155,5248,5337,5399,5463,5526,5594,5705,5816,5918,6023,6083,6143,6226,6309,6385", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,81,79,85,104,95,101,127,80,61,64,94,69,62,92,63,71,62,73,63,55,117,57,61,55,79,133,88,75,97,80,80,140,80,79,150,89,76,55,55,65,78,81,70,88,72,76,69,76,105,88,73,93,101,71,80,103,52,84,66,92,88,61,63,62,67,110,110,101,104,59,59,82,82,75,76", + "endOffsets": "273,355,435,521,626,722,824,952,1033,1095,1160,1255,1325,1388,1481,1545,1617,1680,1754,1818,1874,1992,2050,2112,2168,2248,2382,2471,2547,2645,2726,2807,2948,3029,3109,3260,3350,3427,3483,3539,3605,3684,3766,3837,3926,3999,4076,4146,4223,4329,4418,4492,4586,4688,4760,4841,4945,4998,5083,5150,5243,5332,5394,5458,5521,5589,5700,5811,5913,6018,6078,6138,6221,6304,6380,6457" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3044,3126,3206,3292,3397,4225,4327,4455,6865,6927,6992,7087,7157,7220,7313,7377,7449,7512,7586,7650,7706,7824,7882,7944,8000,8080,8214,8303,8379,8477,8558,8639,8780,8861,8941,9092,9182,9259,9315,9371,9437,9516,9598,9669,9758,9831,9908,9978,10055,10161,10250,10324,10418,10520,10592,10673,10777,10830,10915,10982,11075,11164,11226,11290,11353,11421,11532,11643,11745,11850,11910,11970,12136,12219,12295", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,81,79,85,104,95,101,127,80,61,64,94,69,62,92,63,71,62,73,63,55,117,57,61,55,79,133,88,75,97,80,80,140,80,79,150,89,76,55,55,65,78,81,70,88,72,76,69,76,105,88,73,93,101,71,80,103,52,84,66,92,88,61,63,62,67,110,110,101,104,59,59,82,82,75,76", + "endOffsets": "323,3121,3201,3287,3392,3488,4322,4450,4531,6922,6987,7082,7152,7215,7308,7372,7444,7507,7581,7645,7701,7819,7877,7939,7995,8075,8209,8298,8374,8472,8553,8634,8775,8856,8936,9087,9177,9254,9310,9366,9432,9511,9593,9664,9753,9826,9903,9973,10050,10156,10245,10319,10413,10515,10587,10668,10772,10825,10910,10977,11070,11159,11221,11285,11348,11416,11527,11638,11740,11845,11905,11965,12048,12214,12290,12367" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-es-rUS/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "197,301,463,591,695,852,979,1098,1200,1367,1472,1638,1767,1940,2114,2180,2238", + "endColumns": "103,161,127,103,156,126,118,101,166,104,165,128,172,173,65,57,73", + "endOffsets": "300,462,590,694,851,978,1097,1199,1366,1471,1637,1766,1939,2113,2179,2237,2311" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4536,4644,4810,4942,5050,5211,5342,5465,5717,5888,5997,6167,6300,6477,6655,6725,6787", + "endColumns": "107,165,131,107,160,130,122,105,170,108,169,132,176,177,69,61,77", + "endOffsets": "4639,4805,4937,5045,5206,5337,5460,5566,5883,5992,6162,6295,6472,6650,6720,6782,6860" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-es-rUS/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "199", + "endColumns": "141", + "endOffsets": "340" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5571", + "endColumns": "145", + "endOffsets": "5712" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-es-rUS/values-es-rUS.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,225,334,442,527,629,745,830,910,1001,1094,1189,1283,1382,1475,1574,1670,1761,1852,1934,2041,2140,2239,2347,2455,2562,2721,2821", + "endColumns": "119,108,107,84,101,115,84,79,90,92,94,93,98,92,98,95,90,90,81,106,98,98,107,107,106,158,99,82", + "endOffsets": "220,329,437,522,624,740,825,905,996,1089,1184,1278,1377,1470,1569,1665,1756,1847,1929,2036,2135,2234,2342,2450,2557,2716,2816,2899" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "328,448,557,665,750,852,968,1053,1133,1224,1317,1412,1506,1605,1698,1797,1893,1984,2075,2157,2264,2363,2462,2570,2678,2785,2944,12053", + "endColumns": "119,108,107,84,101,115,84,79,90,92,94,93,98,92,98,95,90,90,81,106,98,98,107,107,106,158,99,82", + "endOffsets": "443,552,660,745,847,963,1048,1128,1219,1312,1407,1501,1600,1693,1792,1888,1979,2070,2152,2259,2358,2457,2565,2673,2780,2939,3039,12131" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-es.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-es.json new file mode 100644 index 0000000..96ef281 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-es.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-es/values-es.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-es/values-es.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,154,256,356,454,561,667,787", + "endColumns": "98,101,99,97,106,105,119,100", + "endOffsets": "149,251,351,449,556,662,782,883" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3503,3602,3704,3804,3902,4009,4115,12392", + "endColumns": "98,101,99,97,106,105,119,100", + "endOffsets": "3597,3699,3799,3897,4004,4110,4230,12488" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-es/values-es.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,278,359,438,525,626,722,826,948,1029,1091,1156,1251,1332,1395,1484,1548,1617,1680,1754,1818,1875,1993,2051,2113,2170,2250,2389,2478,2554,2649,2730,2812,2953,3034,3114,3265,3355,3435,3491,3547,3613,3692,3774,3845,3934,4008,4085,4155,4234,4334,4418,4502,4594,4694,4768,4849,4951,5004,5089,5156,5249,5338,5400,5464,5527,5595,5708,5815,5919,6020,6080,6140,6223,6306,6382", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,80,78,86,100,95,103,121,80,61,64,94,80,62,88,63,68,62,73,63,56,117,57,61,56,79,138,88,75,94,80,81,140,80,79,150,89,79,55,55,65,78,81,70,88,73,76,69,78,99,83,83,91,99,73,80,101,52,84,66,92,88,61,63,62,67,112,106,103,100,59,59,82,82,75,76", + "endOffsets": "273,354,433,520,621,717,821,943,1024,1086,1151,1246,1327,1390,1479,1543,1612,1675,1749,1813,1870,1988,2046,2108,2165,2245,2384,2473,2549,2644,2725,2807,2948,3029,3109,3260,3350,3430,3486,3542,3608,3687,3769,3840,3929,4003,4080,4150,4229,4329,4413,4497,4589,4689,4763,4844,4946,4999,5084,5151,5244,5333,5395,5459,5522,5590,5703,5810,5914,6015,6075,6135,6218,6301,6377,6454" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3059,3140,3219,3306,3407,4235,4339,4461,6879,6941,7006,7101,7182,7245,7334,7398,7467,7530,7604,7668,7725,7843,7901,7963,8020,8100,8239,8328,8404,8499,8580,8662,8803,8884,8964,9115,9205,9285,9341,9397,9463,9542,9624,9695,9784,9858,9935,10005,10084,10184,10268,10352,10444,10544,10618,10699,10801,10854,10939,11006,11099,11188,11250,11314,11377,11445,11558,11665,11769,11870,11930,11990,12156,12239,12315", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,80,78,86,100,95,103,121,80,61,64,94,80,62,88,63,68,62,73,63,56,117,57,61,56,79,138,88,75,94,80,81,140,80,79,150,89,79,55,55,65,78,81,70,88,73,76,69,78,99,83,83,91,99,73,80,101,52,84,66,92,88,61,63,62,67,112,106,103,100,59,59,82,82,75,76", + "endOffsets": "323,3135,3214,3301,3402,3498,4334,4456,4537,6936,7001,7096,7177,7240,7329,7393,7462,7525,7599,7663,7720,7838,7896,7958,8015,8095,8234,8323,8399,8494,8575,8657,8798,8879,8959,9110,9200,9280,9336,9392,9458,9537,9619,9690,9779,9853,9930,10000,10079,10179,10263,10347,10439,10539,10613,10694,10796,10849,10934,11001,11094,11183,11245,11309,11372,11440,11553,11660,11764,11865,11925,11985,12068,12234,12310,12387" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-es/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "155", + "endOffsets": "350" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5578", + "endColumns": "159", + "endOffsets": "5733" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-es/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,456,583,687,844,973,1091,1197,1385,1490,1651,1779,1940,2093,2156,2221", + "endColumns": "103,158,126,103,156,128,117,105,187,104,160,127,160,152,62,64,80", + "endOffsets": "296,455,582,686,843,972,1090,1196,1384,1489,1650,1778,1939,2092,2155,2220,2301" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4542,4650,4813,4944,5052,5213,5346,5468,5738,5930,6039,6204,6336,6501,6658,6725,6794", + "endColumns": "107,162,130,107,160,132,121,109,191,108,164,131,164,156,66,68,84", + "endOffsets": "4645,4808,4939,5047,5208,5341,5463,5573,5925,6034,6199,6331,6496,6653,6720,6789,6874" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-es/values-es.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,207,320,428,513,614,742,828,909,1001,1095,1192,1286,1386,1480,1576,1672,1764,1856,1938,2045,2156,2255,2363,2471,2578,2737,2836", + "endColumns": "101,112,107,84,100,127,85,80,91,93,96,93,99,93,95,95,91,91,81,106,110,98,107,107,106,158,98,82", + "endOffsets": "202,315,423,508,609,737,823,904,996,1090,1187,1281,1381,1475,1571,1667,1759,1851,1933,2040,2151,2250,2358,2466,2573,2732,2831,2914" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "328,430,543,651,736,837,965,1051,1132,1224,1318,1415,1509,1609,1703,1799,1895,1987,2079,2161,2268,2379,2478,2586,2694,2801,2960,12073", + "endColumns": "101,112,107,84,100,127,85,80,91,93,96,93,99,93,95,95,91,91,81,106,110,98,107,107,106,158,98,82", + "endOffsets": "425,538,646,731,832,960,1046,1127,1219,1313,1410,1504,1604,1698,1794,1890,1982,2074,2156,2263,2374,2473,2581,2689,2796,2955,3054,12151" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-et.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-et.json new file mode 100644 index 0000000..49beb48 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-et.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-et/values-et.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-et/values-et.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,211,310,421,507,609,726,807,884,976,1070,1166,1268,1377,1471,1572,1666,1758,1851,1934,2045,2149,2248,2358,2460,2559,2725,2827", + "endColumns": "105,98,110,85,101,116,80,76,91,93,95,101,108,93,100,93,91,92,82,110,103,98,109,101,98,165,101,82", + "endOffsets": "206,305,416,502,604,721,802,879,971,1065,1161,1263,1372,1466,1567,1661,1753,1846,1929,2040,2144,2243,2353,2455,2554,2720,2822,2905" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "316,422,521,632,718,820,937,1018,1095,1187,1281,1377,1479,1588,1682,1783,1877,1969,2062,2145,2256,2360,2459,2569,2671,2770,2936,11726", + "endColumns": "105,98,110,85,101,116,80,76,91,93,95,101,108,93,100,93,91,92,82,110,103,98,109,101,98,165,101,82", + "endOffsets": "417,516,627,713,815,932,1013,1090,1182,1276,1372,1474,1583,1677,1778,1872,1964,2057,2140,2251,2355,2454,2564,2666,2765,2931,3033,11804" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-et/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,292,450,573,677,823,948,1060,1159,1315,1419,1579,1707,1858,1999,2058,2119", + "endColumns": "98,157,122,103,145,124,111,98,155,103,159,127,150,140,58,60,83", + "endOffsets": "291,449,572,676,822,947,1059,1158,1314,1418,1578,1706,1857,1998,2057,2118,2202" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4488,4591,4753,4880,4988,5138,5267,5383,5626,5786,5894,6058,6190,6345,6490,6553,6618", + "endColumns": "102,161,126,107,149,128,115,102,159,107,163,131,154,144,62,64,87", + "endOffsets": "4586,4748,4875,4983,5133,5262,5378,5481,5781,5889,6053,6185,6340,6485,6548,6613,6701" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-et/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "135", + "endOffsets": "330" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5486", + "endColumns": "139", + "endOffsets": "5621" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-et/values-et.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,150,252,350,453,559,664,784", + "endColumns": "94,101,97,102,105,104,119,100", + "endOffsets": "145,247,345,448,554,659,779,880" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3461,3556,3658,3756,3859,3965,4070,12053", + "endColumns": "94,101,97,102,105,104,119,100", + "endOffsets": "3551,3653,3751,3854,3960,4065,4185,12149" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-et/values-et.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,266,346,425,510,602,689,788,905,987,1047,1111,1196,1264,1328,1415,1479,1543,1602,1674,1738,1792,1911,1971,2032,2086,2159,2292,2376,2453,2546,2626,2719,2857,2937,3016,3142,3230,3309,3364,3415,3481,3554,3633,3704,3783,3856,3931,4005,4077,4190,4278,4355,4446,4538,4612,4686,4777,4831,4913,4982,5065,5151,5213,5277,5340,5408,5511,5614,5711,5812,5871,5926,6007,6096,6173", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,79,78,84,91,86,98,116,81,59,63,84,67,63,86,63,63,58,71,63,53,118,59,60,53,72,132,83,76,92,79,92,137,79,78,125,87,78,54,50,65,72,78,70,78,72,74,73,71,112,87,76,90,91,73,73,90,53,81,68,82,85,61,63,62,67,102,102,96,100,58,54,80,88,76,77", + "endOffsets": "261,341,420,505,597,684,783,900,982,1042,1106,1191,1259,1323,1410,1474,1538,1597,1669,1733,1787,1906,1966,2027,2081,2154,2287,2371,2448,2541,2621,2714,2852,2932,3011,3137,3225,3304,3359,3410,3476,3549,3628,3699,3778,3851,3926,4000,4072,4185,4273,4350,4441,4533,4607,4681,4772,4826,4908,4977,5060,5146,5208,5272,5335,5403,5506,5609,5706,5807,5866,5921,6002,6091,6168,6246" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3038,3118,3197,3282,3374,4190,4289,4406,6706,6766,6830,6915,6983,7047,7134,7198,7262,7321,7393,7457,7511,7630,7690,7751,7805,7878,8011,8095,8172,8265,8345,8438,8576,8656,8735,8861,8949,9028,9083,9134,9200,9273,9352,9423,9502,9575,9650,9724,9796,9909,9997,10074,10165,10257,10331,10405,10496,10550,10632,10701,10784,10870,10932,10996,11059,11127,11230,11333,11430,11531,11590,11645,11809,11898,11975", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,79,78,84,91,86,98,116,81,59,63,84,67,63,86,63,63,58,71,63,53,118,59,60,53,72,132,83,76,92,79,92,137,79,78,125,87,78,54,50,65,72,78,70,78,72,74,73,71,112,87,76,90,91,73,73,90,53,81,68,82,85,61,63,62,67,102,102,96,100,58,54,80,88,76,77", + "endOffsets": "311,3113,3192,3277,3369,3456,4284,4401,4483,6761,6825,6910,6978,7042,7129,7193,7257,7316,7388,7452,7506,7625,7685,7746,7800,7873,8006,8090,8167,8260,8340,8433,8571,8651,8730,8856,8944,9023,9078,9129,9195,9268,9347,9418,9497,9570,9645,9719,9791,9904,9992,10069,10160,10252,10326,10400,10491,10545,10627,10696,10779,10865,10927,10991,11054,11122,11225,11328,11425,11526,11585,11640,11721,11893,11970,12048" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-eu.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-eu.json new file mode 100644 index 0000000..46bed09 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-eu.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-eu/values-eu.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-eu/values-eu.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,256,356,459,564,667,786", + "endColumns": "97,102,99,102,104,102,118,100", + "endOffsets": "148,251,351,454,559,662,781,882" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3569,3667,3770,3870,3973,4078,4181,12270", + "endColumns": "97,102,99,102,104,102,118,100", + "endOffsets": "3662,3765,3865,3968,4073,4176,4295,12366" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-eu/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "138", + "endOffsets": "333" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5614", + "endColumns": "142", + "endOffsets": "5752" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-eu/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,293,461,581,686,834,955,1075,1179,1353,1457,1616,1740,1890,2046,2108,2169", + "endColumns": "99,167,119,104,147,120,119,103,173,103,158,123,149,155,61,60,87", + "endOffsets": "292,460,580,685,833,954,1074,1178,1352,1456,1615,1739,1889,2045,2107,2168,2256" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4596,4700,4872,4996,5105,5257,5382,5506,5757,5935,6043,6206,6334,6488,6648,6714,6779", + "endColumns": "103,171,123,108,151,124,123,107,177,107,162,127,153,159,65,64,91", + "endOffsets": "4695,4867,4991,5100,5252,5377,5501,5609,5930,6038,6201,6329,6483,6643,6709,6774,6866" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-eu/values-eu.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,275,382,487,567,674,774,872,987,1070,1136,1203,1302,1370,1431,1519,1582,1648,1712,1783,1846,1900,2009,2068,2131,2185,2259,2384,2474,2552,2641,2724,2804,2949,3032,3114,3252,3343,3426,3478,3531,3597,3668,3748,3819,3899,3977,4055,4128,4203,4310,4397,4484,4575,4668,4740,4816,4908,4959,5041,5107,5191,5277,5339,5403,5466,5534,5641,5750,5846,5951,6007,6064,6147,6232,6309", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,106,104,79,106,99,97,114,82,65,66,98,67,60,87,62,65,63,70,62,53,108,58,62,53,73,124,89,77,88,82,79,144,82,81,137,90,82,51,52,65,70,79,70,79,77,77,72,74,106,86,86,90,92,71,75,91,50,81,65,83,85,61,63,62,67,106,108,95,104,55,56,82,84,76,76", + "endOffsets": "270,377,482,562,669,769,867,982,1065,1131,1198,1297,1365,1426,1514,1577,1643,1707,1778,1841,1895,2004,2063,2126,2180,2254,2379,2469,2547,2636,2719,2799,2944,3027,3109,3247,3338,3421,3473,3526,3592,3663,3743,3814,3894,3972,4050,4123,4198,4305,4392,4479,4570,4663,4735,4811,4903,4954,5036,5102,5186,5272,5334,5398,5461,5529,5636,5745,5841,5946,6002,6059,6142,6227,6304,6381" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3070,3177,3282,3362,3469,4300,4398,4513,6871,6937,7004,7103,7171,7232,7320,7383,7449,7513,7584,7647,7701,7810,7869,7932,7986,8060,8185,8275,8353,8442,8525,8605,8750,8833,8915,9053,9144,9227,9279,9332,9398,9469,9549,9620,9700,9778,9856,9929,10004,10111,10198,10285,10376,10469,10541,10617,10709,10760,10842,10908,10992,11078,11140,11204,11267,11335,11442,11551,11647,11752,11808,11865,12031,12116,12193", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,106,104,79,106,99,97,114,82,65,66,98,67,60,87,62,65,63,70,62,53,108,58,62,53,73,124,89,77,88,82,79,144,82,81,137,90,82,51,52,65,70,79,70,79,77,77,72,74,106,86,86,90,92,71,75,91,50,81,65,83,85,61,63,62,67,106,108,95,104,55,56,82,84,76,76", + "endOffsets": "320,3172,3277,3357,3464,3564,4393,4508,4591,6932,6999,7098,7166,7227,7315,7378,7444,7508,7579,7642,7696,7805,7864,7927,7981,8055,8180,8270,8348,8437,8520,8600,8745,8828,8910,9048,9139,9222,9274,9327,9393,9464,9544,9615,9695,9773,9851,9924,9999,10106,10193,10280,10371,10464,10536,10612,10704,10755,10837,10903,10987,11073,11135,11199,11262,11330,11437,11546,11642,11747,11803,11860,11943,12111,12188,12265" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-eu/values-eu.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,214,312,422,508,614,738,824,905,997,1091,1187,1281,1382,1476,1572,1669,1761,1854,1936,2045,2154,2253,2362,2469,2580,2751,2850", + "endColumns": "108,97,109,85,105,123,85,80,91,93,95,93,100,93,95,96,91,92,81,108,108,98,108,106,110,170,98,82", + "endOffsets": "209,307,417,503,609,733,819,900,992,1086,1182,1276,1377,1471,1567,1664,1756,1849,1931,2040,2149,2248,2357,2464,2575,2746,2845,2928" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "325,434,532,642,728,834,958,1044,1125,1217,1311,1407,1501,1602,1696,1792,1889,1981,2074,2156,2265,2374,2473,2582,2689,2800,2971,11948", + "endColumns": "108,97,109,85,105,123,85,80,91,93,95,93,100,93,95,96,91,92,81,108,108,98,108,106,110,170,98,82", + "endOffsets": "429,527,637,723,829,953,1039,1120,1212,1306,1402,1496,1597,1691,1787,1884,1976,2069,2151,2260,2369,2468,2577,2684,2795,2966,3065,12026" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-fa.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-fa.json new file mode 100644 index 0000000..c0760b8 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-fa.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-fa/values-fa.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-fa/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,450,575,674,810,932,1042,1140,1289,1395,1561,1688,1837,1989,2051,2115", + "endColumns": "103,152,124,98,135,121,109,97,148,105,165,126,148,151,61,63,80", + "endOffsets": "296,449,574,673,809,931,1041,1139,1288,1394,1560,1687,1836,1988,2050,2114,2195" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4447,4555,4712,4841,4944,5084,5210,5324,5581,5734,5844,6014,6145,6298,6454,6520,6588", + "endColumns": "107,156,128,102,139,125,113,101,152,109,169,130,152,155,65,67,84", + "endOffsets": "4550,4707,4836,4939,5079,5205,5319,5421,5729,5839,6009,6140,6293,6449,6515,6583,6668" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-fa/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "150", + "endOffsets": "345" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5426", + "endColumns": "154", + "endOffsets": "5576" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-fa/values-fa.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,259,334,411,493,586,673,770,899,983,1041,1104,1194,1263,1323,1414,1477,1541,1600,1667,1729,1784,1907,1965,2026,2081,2153,2290,2371,2451,2548,2629,2711,2841,2915,2989,3121,3207,3284,3335,3389,3455,3526,3603,3674,3753,3826,3900,3970,4044,4145,4231,4305,4394,4486,4560,4633,4722,4773,4853,4920,5003,5087,5149,5213,5276,5345,5439,5540,5633,5731,5786,5844,5922,6008,6085", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,74,76,81,92,86,96,128,83,57,62,89,68,59,90,62,63,58,66,61,54,122,57,60,54,71,136,80,79,96,80,81,129,73,73,131,85,76,50,53,65,70,76,70,78,72,73,69,73,100,85,73,88,91,73,72,88,50,79,66,82,83,61,63,62,68,93,100,92,97,54,57,77,85,76,73", + "endOffsets": "254,329,406,488,581,668,765,894,978,1036,1099,1189,1258,1318,1409,1472,1536,1595,1662,1724,1779,1902,1960,2021,2076,2148,2285,2366,2446,2543,2624,2706,2836,2910,2984,3116,3202,3279,3330,3384,3450,3521,3598,3669,3748,3821,3895,3965,4039,4140,4226,4300,4389,4481,4555,4628,4717,4768,4848,4915,4998,5082,5144,5208,5271,5340,5434,5535,5628,5726,5781,5839,5917,6003,6080,6154" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2999,3074,3151,3233,3326,4137,4234,4363,6673,6731,6794,6884,6953,7013,7104,7167,7231,7290,7357,7419,7474,7597,7655,7716,7771,7843,7980,8061,8141,8238,8319,8401,8531,8605,8679,8811,8897,8974,9025,9079,9145,9216,9293,9364,9443,9516,9590,9660,9734,9835,9921,9995,10084,10176,10250,10323,10412,10463,10543,10610,10693,10777,10839,10903,10966,11035,11129,11230,11323,11421,11476,11534,11694,11780,11857", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,74,76,81,92,86,96,128,83,57,62,89,68,59,90,62,63,58,66,61,54,122,57,60,54,71,136,80,79,96,80,81,129,73,73,131,85,76,50,53,65,70,76,70,78,72,73,69,73,100,85,73,88,91,73,72,88,50,79,66,82,83,61,63,62,68,93,100,92,97,54,57,77,85,76,73", + "endOffsets": "304,3069,3146,3228,3321,3408,4229,4358,4442,6726,6789,6879,6948,7008,7099,7162,7226,7285,7352,7414,7469,7592,7650,7711,7766,7838,7975,8056,8136,8233,8314,8396,8526,8600,8674,8806,8892,8969,9020,9074,9140,9211,9288,9359,9438,9511,9585,9655,9729,9830,9916,9990,10079,10171,10245,10318,10407,10458,10538,10605,10688,10772,10834,10898,10961,11030,11124,11225,11318,11416,11471,11529,11607,11775,11852,11926" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-fa/values-fa.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,154,256,355,455,556,662,779", + "endColumns": "98,101,98,99,100,105,116,100", + "endOffsets": "149,251,350,450,551,657,774,875" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3413,3512,3614,3713,3813,3914,4020,11931", + "endColumns": "98,101,98,99,100,105,116,100", + "endOffsets": "3507,3609,3708,3808,3909,4015,4132,12027" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-fa/values-fa.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,215,316,427,511,612,727,807,884,977,1072,1164,1258,1360,1455,1552,1646,1739,1829,1911,2019,2123,2221,2327,2432,2537,2694,2795", + "endColumns": "109,100,110,83,100,114,79,76,92,94,91,93,101,94,96,93,92,89,81,107,103,97,105,104,104,156,100,81", + "endOffsets": "210,311,422,506,607,722,802,879,972,1067,1159,1253,1355,1450,1547,1641,1734,1824,1906,2014,2118,2216,2322,2427,2532,2689,2790,2872" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "309,419,520,631,715,816,931,1011,1088,1181,1276,1368,1462,1564,1659,1756,1850,1943,2033,2115,2223,2327,2425,2531,2636,2741,2898,11612", + "endColumns": "109,100,110,83,100,114,79,76,92,94,91,93,101,94,96,93,92,89,81,107,103,97,105,104,104,156,100,81", + "endOffsets": "414,515,626,710,811,926,1006,1083,1176,1271,1363,1457,1559,1654,1751,1845,1938,2028,2110,2218,2322,2420,2526,2631,2736,2893,2994,11689" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-fi.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-fi.json new file mode 100644 index 0000000..fcc78d3 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-fi.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-fi/values-fi.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-fi/values-fi.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,268,344,418,501,590,672,768,876,960,1022,1087,1180,1255,1320,1408,1473,1539,1597,1668,1734,1788,1898,1958,2022,2076,2149,2265,2349,2425,2516,2597,2678,2811,2896,2981,3114,3204,3278,3330,3381,3447,3524,3606,3677,3751,3825,3904,3981,4053,4160,4249,4325,4416,4511,4585,4658,4752,4806,4880,4952,5038,5124,5186,5250,5313,5384,5485,5588,5683,5783,5839,5894,5973,6059,6138", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,75,73,82,88,81,95,107,83,61,64,92,74,64,87,64,65,57,70,65,53,109,59,63,53,72,115,83,75,90,80,80,132,84,84,132,89,73,51,50,65,76,81,70,73,73,78,76,71,106,88,75,90,94,73,72,93,53,73,71,85,85,61,63,62,70,100,102,94,99,55,54,78,85,78,74", + "endOffsets": "263,339,413,496,585,667,763,871,955,1017,1082,1175,1250,1315,1403,1468,1534,1592,1663,1729,1783,1893,1953,2017,2071,2144,2260,2344,2420,2511,2592,2673,2806,2891,2976,3109,3199,3273,3325,3376,3442,3519,3601,3672,3746,3820,3899,3976,4048,4155,4244,4320,4411,4506,4580,4653,4747,4801,4875,4947,5033,5119,5181,5245,5308,5379,5480,5583,5678,5778,5834,5889,5968,6054,6133,6208" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2988,3064,3138,3221,3310,4126,4222,4330,6585,6647,6712,6805,6880,6945,7033,7098,7164,7222,7293,7359,7413,7523,7583,7647,7701,7774,7890,7974,8050,8141,8222,8303,8436,8521,8606,8739,8829,8903,8955,9006,9072,9149,9231,9302,9376,9450,9529,9606,9678,9785,9874,9950,10041,10136,10210,10283,10377,10431,10505,10577,10663,10749,10811,10875,10938,11009,11110,11213,11308,11408,11464,11519,11679,11765,11844", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,75,73,82,88,81,95,107,83,61,64,92,74,64,87,64,65,57,70,65,53,109,59,63,53,72,115,83,75,90,80,80,132,84,84,132,89,73,51,50,65,76,81,70,73,73,78,76,71,106,88,75,90,94,73,72,93,53,73,71,85,85,61,63,62,70,100,102,94,99,55,54,78,85,78,74", + "endOffsets": "313,3059,3133,3216,3305,3387,4217,4325,4409,6642,6707,6800,6875,6940,7028,7093,7159,7217,7288,7354,7408,7518,7578,7642,7696,7769,7885,7969,8045,8136,8217,8298,8431,8516,8601,8734,8824,8898,8950,9001,9067,9144,9226,9297,9371,9445,9524,9601,9673,9780,9869,9945,10036,10131,10205,10278,10372,10426,10500,10572,10658,10744,10806,10870,10933,11004,11105,11208,11303,11403,11459,11514,11593,11760,11839,11914" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-fi/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,300,449,576,678,817,939,1051,1154,1291,1393,1538,1660,1804,1939,2001,2067", + "endColumns": "106,148,126,101,138,121,111,102,136,101,144,121,143,134,61,65,78", + "endOffsets": "299,448,575,677,816,938,1050,1153,1290,1392,1537,1659,1803,1938,2000,2066,2145" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4414,4525,4678,4809,4915,5058,5184,5300,5557,5698,5804,5953,6079,6227,6366,6432,6502", + "endColumns": "110,152,130,105,142,125,115,106,140,105,148,125,147,138,65,69,82", + "endOffsets": "4520,4673,4804,4910,5053,5179,5295,5402,5693,5799,5948,6074,6222,6361,6427,6497,6580" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-fi/values-fi.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,313,422,508,613,731,817,896,987,1080,1175,1269,1363,1456,1552,1651,1742,1836,1916,2023,2124,2221,2327,2427,2525,2675,2775", + "endColumns": "107,99,108,85,104,117,85,78,90,92,94,93,93,92,95,98,90,93,79,106,100,96,105,99,97,149,99,80", + "endOffsets": "208,308,417,503,608,726,812,891,982,1075,1170,1264,1358,1451,1547,1646,1737,1831,1911,2018,2119,2216,2322,2422,2520,2670,2770,2851" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "318,426,526,635,721,826,944,1030,1109,1200,1293,1388,1482,1576,1669,1765,1864,1955,2049,2129,2236,2337,2434,2540,2640,2738,2888,11598", + "endColumns": "107,99,108,85,104,117,85,78,90,92,94,93,93,92,95,98,90,93,79,106,100,96,105,99,97,149,99,80", + "endOffsets": "421,521,630,716,821,939,1025,1104,1195,1288,1383,1477,1571,1664,1760,1859,1950,2044,2124,2231,2332,2429,2535,2635,2733,2883,2983,11674" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-fi/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "145", + "endOffsets": "340" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5407", + "endColumns": "149", + "endOffsets": "5552" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-fi/values-fi.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,351,456,561,673,789", + "endColumns": "95,101,97,104,104,111,115,100", + "endOffsets": "146,248,346,451,556,668,784,885" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3392,3488,3590,3688,3793,3898,4010,11919", + "endColumns": "95,101,97,104,104,111,115,100", + "endOffsets": "3483,3585,3683,3788,3893,4005,4121,12015" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-fr-rCA.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-fr-rCA.json new file mode 100644 index 0000000..d2b9f66 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-fr-rCA.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-fr-rCA/values-fr-rCA.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-fr-rCA/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "197,299,475,601,706,873,1002,1119,1228,1419,1527,1708,1840,1996,2171,2240,2303", + "endColumns": "101,175,125,104,166,128,116,108,190,107,180,131,155,174,68,62,79", + "endOffsets": "298,474,600,705,872,1001,1118,1227,1418,1526,1707,1839,1995,2170,2239,2302,2382" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4608,4714,4894,5024,5133,5304,5437,5558,5832,6027,6139,6324,6460,6620,6799,6872,6939", + "endColumns": "105,179,129,108,170,132,120,112,194,111,184,135,159,178,72,66,83", + "endOffsets": "4709,4889,5019,5128,5299,5432,5553,5666,6022,6134,6319,6455,6615,6794,6867,6934,7018" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-fr-rCA/values-fr-rCA.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,283,390,498,580,681,778,878,1000,1085,1150,1216,1313,1393,1455,1547,1614,1688,1749,1828,1892,1946,2062,2121,2183,2237,2319,2448,2540,2615,2710,2791,2875,3019,3098,3179,3326,3419,3498,3553,3604,3670,3749,3830,3901,3981,4053,4131,4206,4278,4389,4486,4563,4661,4759,4837,4918,5018,5075,5159,5225,5308,5395,5457,5521,5584,5660,5762,5869,5966,6072,6131,6186,6275,6362,6439", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,106,107,81,100,96,99,121,84,64,65,96,79,61,91,66,73,60,78,63,53,115,58,61,53,81,128,91,74,94,80,83,143,78,80,146,92,78,54,50,65,78,80,70,79,71,77,74,71,110,96,76,97,97,77,80,99,56,83,65,82,86,61,63,62,75,101,106,96,105,58,54,88,86,76,80", + "endOffsets": "278,385,493,575,676,773,873,995,1080,1145,1211,1308,1388,1450,1542,1609,1683,1744,1823,1887,1941,2057,2116,2178,2232,2314,2443,2535,2610,2705,2786,2870,3014,3093,3174,3321,3414,3493,3548,3599,3665,3744,3825,3896,3976,4048,4126,4201,4273,4384,4481,4558,4656,4754,4832,4913,5013,5070,5154,5220,5303,5390,5452,5516,5579,5655,5757,5864,5961,6067,6126,6181,6270,6357,6434,6515" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3083,3190,3298,3380,3481,4301,4401,4523,7023,7088,7154,7251,7331,7393,7485,7552,7626,7687,7766,7830,7884,8000,8059,8121,8175,8257,8386,8478,8553,8648,8729,8813,8957,9036,9117,9264,9357,9436,9491,9542,9608,9687,9768,9839,9919,9991,10069,10144,10216,10327,10424,10501,10599,10697,10775,10856,10956,11013,11097,11163,11246,11333,11395,11459,11522,11598,11700,11807,11904,12010,12069,12124,12300,12387,12464", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,106,107,81,100,96,99,121,84,64,65,96,79,61,91,66,73,60,78,63,53,115,58,61,53,81,128,91,74,94,80,83,143,78,80,146,92,78,54,50,65,78,80,70,79,71,77,74,71,110,96,76,97,97,77,80,99,56,83,65,82,86,61,63,62,75,101,106,96,105,58,54,88,86,76,80", + "endOffsets": "328,3185,3293,3375,3476,3573,4396,4518,4603,7083,7149,7246,7326,7388,7480,7547,7621,7682,7761,7825,7879,7995,8054,8116,8170,8252,8381,8473,8548,8643,8724,8808,8952,9031,9112,9259,9352,9431,9486,9537,9603,9682,9763,9834,9914,9986,10064,10139,10211,10322,10419,10496,10594,10692,10770,10851,10951,11008,11092,11158,11241,11328,11390,11454,11517,11593,11695,11802,11899,12005,12064,12119,12208,12382,12459,12540" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-fr-rCA/values-fr-rCA.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,354,456,560,664,778", + "endColumns": "97,101,98,101,103,103,113,100", + "endOffsets": "148,250,349,451,555,659,773,874" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3578,3676,3778,3877,3979,4083,4187,12545", + "endColumns": "97,101,98,101,103,103,113,100", + "endOffsets": "3671,3773,3872,3974,4078,4182,4296,12641" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-fr-rCA/values-fr-rCA.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,216,323,433,520,626,756,841,921,1012,1105,1203,1298,1398,1491,1584,1679,1770,1861,1947,2057,2168,2271,2382,2490,2597,2756,2855", + "endColumns": "110,106,109,86,105,129,84,79,90,92,97,94,99,92,92,94,90,90,85,109,110,102,110,107,106,158,98,86", + "endOffsets": "211,318,428,515,621,751,836,916,1007,1100,1198,1293,1393,1486,1579,1674,1765,1856,1942,2052,2163,2266,2377,2485,2592,2751,2850,2937" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "333,444,551,661,748,854,984,1069,1149,1240,1333,1431,1526,1626,1719,1812,1907,1998,2089,2175,2285,2396,2499,2610,2718,2825,2984,12213", + "endColumns": "110,106,109,86,105,129,84,79,90,92,97,94,99,92,92,94,90,90,85,109,110,102,110,107,106,158,98,86", + "endOffsets": "439,546,656,743,849,979,1064,1144,1235,1328,1426,1521,1621,1714,1807,1902,1993,2084,2170,2280,2391,2494,2605,2713,2820,2979,3078,12295" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-fr-rCA/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "199", + "endColumns": "156", + "endOffsets": "355" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5671", + "endColumns": "160", + "endOffsets": "5827" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-fr.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-fr.json new file mode 100644 index 0000000..3df3b28 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-fr.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-fr/values-fr.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-fr/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,471,597,702,869,998,1115,1224,1398,1506,1687,1819,1975,2150,2219,2282", + "endColumns": "101,175,125,104,166,128,116,108,173,107,180,131,155,174,68,62,79", + "endOffsets": "294,470,596,701,868,997,1114,1223,1397,1505,1686,1818,1974,2149,2218,2281,2361" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4563,4669,4849,4979,5088,5259,5392,5513,5791,5969,6081,6266,6402,6562,6741,6814,6881", + "endColumns": "105,179,129,108,170,132,120,112,177,111,184,135,159,178,72,66,83", + "endOffsets": "4664,4844,4974,5083,5254,5387,5508,5621,5964,6076,6261,6397,6557,6736,6809,6876,6960" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-fr/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "160", + "endOffsets": "355" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5626", + "endColumns": "164", + "endOffsets": "5786" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-fr/values-fr.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,283,363,444,527,636,731,829,959,1044,1109,1175,1272,1355,1421,1523,1588,1663,1719,1798,1858,1912,2034,2093,2155,2209,2291,2426,2518,2593,2688,2769,2853,2997,3076,3157,3298,3391,3470,3525,3576,3642,3722,3803,3874,3954,4027,4105,4178,4250,4362,4455,4527,4619,4711,4785,4869,4961,5018,5102,5168,5251,5338,5400,5464,5527,5605,5707,5811,5908,6012,6071,6126,6215,6302,6379", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,79,80,82,108,94,97,129,84,64,65,96,82,65,101,64,74,55,78,59,53,121,58,61,53,81,134,91,74,94,80,83,143,78,80,140,92,78,54,50,65,79,80,70,79,72,77,72,71,111,92,71,91,91,73,83,91,56,83,65,82,86,61,63,62,77,101,103,96,103,58,54,88,86,76,80", + "endOffsets": "278,358,439,522,631,726,824,954,1039,1104,1170,1267,1350,1416,1518,1583,1658,1714,1793,1853,1907,2029,2088,2150,2204,2286,2421,2513,2588,2683,2764,2848,2992,3071,3152,3293,3386,3465,3520,3571,3637,3717,3798,3869,3949,4022,4100,4173,4245,4357,4450,4522,4614,4706,4780,4864,4956,5013,5097,5163,5246,5333,5395,5459,5522,5600,5702,5806,5903,6007,6066,6121,6210,6297,6374,6455" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3075,3155,3236,3319,3428,4250,4348,4478,6965,7030,7096,7193,7276,7342,7444,7509,7584,7640,7719,7779,7833,7955,8014,8076,8130,8212,8347,8439,8514,8609,8690,8774,8918,8997,9078,9219,9312,9391,9446,9497,9563,9643,9724,9795,9875,9948,10026,10099,10171,10283,10376,10448,10540,10632,10706,10790,10882,10939,11023,11089,11172,11259,11321,11385,11448,11526,11628,11732,11829,11933,11992,12047,12223,12310,12387", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,79,80,82,108,94,97,129,84,64,65,96,82,65,101,64,74,55,78,59,53,121,58,61,53,81,134,91,74,94,80,83,143,78,80,140,92,78,54,50,65,79,80,70,79,72,77,72,71,111,92,71,91,91,73,83,91,56,83,65,82,86,61,63,62,77,101,103,96,103,58,54,88,86,76,80", + "endOffsets": "328,3150,3231,3314,3423,3518,4343,4473,4558,7025,7091,7188,7271,7337,7439,7504,7579,7635,7714,7774,7828,7950,8009,8071,8125,8207,8342,8434,8509,8604,8685,8769,8913,8992,9073,9214,9307,9386,9441,9492,9558,9638,9719,9790,9870,9943,10021,10094,10166,10278,10371,10443,10535,10627,10701,10785,10877,10934,11018,11084,11167,11254,11316,11380,11443,11521,11623,11727,11824,11928,11987,12042,12131,12305,12382,12463" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-fr/values-fr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,354,456,560,664,782", + "endColumns": "97,101,98,101,103,103,117,100", + "endOffsets": "148,250,349,451,555,659,777,878" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3523,3621,3723,3822,3924,4028,4132,12468", + "endColumns": "97,101,98,101,103,103,117,100", + "endOffsets": "3616,3718,3817,3919,4023,4127,4245,12564" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-fr/values-fr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,216,331,441,523,629,759,837,913,1004,1097,1195,1290,1390,1483,1576,1671,1762,1853,1939,2049,2160,2263,2374,2482,2589,2748,2847", + "endColumns": "110,114,109,81,105,129,77,75,90,92,97,94,99,92,92,94,90,90,85,109,110,102,110,107,106,158,98,86", + "endOffsets": "211,326,436,518,624,754,832,908,999,1092,1190,1285,1385,1478,1571,1666,1757,1848,1934,2044,2155,2258,2369,2477,2584,2743,2842,2929" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "333,444,559,669,751,857,987,1065,1141,1232,1325,1423,1518,1618,1711,1804,1899,1990,2081,2167,2277,2388,2491,2602,2710,2817,2976,12136", + "endColumns": "110,114,109,81,105,129,77,75,90,92,97,94,99,92,92,94,90,90,85,109,110,102,110,107,106,158,98,86", + "endOffsets": "439,554,664,746,852,982,1060,1136,1227,1320,1418,1513,1613,1706,1799,1894,1985,2076,2162,2272,2383,2486,2597,2705,2812,2971,3070,12218" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-gl.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-gl.json new file mode 100644 index 0000000..c711b46 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-gl.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-gl/values-gl.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-gl/values-gl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,154,256,356,454,561,667,783", + "endColumns": "98,101,99,97,106,105,115,100", + "endOffsets": "149,251,351,449,556,662,778,879" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3519,3618,3720,3820,3918,4025,4131,12420", + "endColumns": "98,101,99,97,106,105,115,100", + "endOffsets": "3613,3715,3815,3913,4020,4126,4242,12516" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-gl/values-gl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,209,313,421,506,607,735,821,902,994,1088,1185,1279,1379,1473,1569,1664,1756,1848,1929,2037,2144,2251,2360,2465,2579,2756,2855", + "endColumns": "103,103,107,84,100,127,85,80,91,93,96,93,99,93,95,94,91,91,80,107,106,106,108,104,113,176,98,82", + "endOffsets": "204,308,416,501,602,730,816,897,989,1083,1180,1274,1374,1468,1564,1659,1751,1843,1924,2032,2139,2246,2355,2460,2574,2751,2850,2933" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "325,429,533,641,726,827,955,1041,1122,1214,1308,1405,1499,1599,1693,1789,1884,1976,2068,2149,2257,2364,2471,2580,2685,2799,2976,12097", + "endColumns": "103,103,107,84,100,127,85,80,91,93,96,93,99,93,95,94,91,91,80,107,106,106,108,104,113,176,98,82", + "endOffsets": "424,528,636,721,822,950,1036,1117,1209,1303,1400,1494,1594,1688,1784,1879,1971,2063,2144,2252,2359,2466,2575,2680,2794,2971,3070,12175" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-gl/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "129", + "endOffsets": "324" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5590", + "endColumns": "133", + "endOffsets": "5719" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-gl/values-gl.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,275,356,436,521,623,719,824,957,1037,1099,1177,1273,1352,1415,1510,1574,1643,1706,1780,1844,1900,2021,2079,2141,2197,2274,2413,2501,2578,2674,2758,2838,2978,3058,3138,3287,3377,3458,3514,3570,3636,3715,3796,3867,3955,4034,4111,4193,4282,4383,4467,4559,4652,4753,4827,4919,5021,5073,5157,5223,5315,5403,5465,5529,5592,5662,5773,5878,5984,6083,6143,6203,6288,6371,6450", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,80,79,84,101,95,104,132,79,61,77,95,78,62,94,63,68,62,73,63,55,120,57,61,55,76,138,87,76,95,83,79,139,79,79,148,89,80,55,55,65,78,80,70,87,78,76,81,88,100,83,91,92,100,73,91,101,51,83,65,91,87,61,63,62,69,110,104,105,98,59,59,84,82,78,77", + "endOffsets": "270,351,431,516,618,714,819,952,1032,1094,1172,1268,1347,1410,1505,1569,1638,1701,1775,1839,1895,2016,2074,2136,2192,2269,2408,2496,2573,2669,2753,2833,2973,3053,3133,3282,3372,3453,3509,3565,3631,3710,3791,3862,3950,4029,4106,4188,4277,4378,4462,4554,4647,4748,4822,4914,5016,5068,5152,5218,5310,5398,5460,5524,5587,5657,5768,5873,5979,6078,6138,6198,6283,6366,6445,6523" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3075,3156,3236,3321,3423,4247,4352,4485,6846,6908,6986,7082,7161,7224,7319,7383,7452,7515,7589,7653,7709,7830,7888,7950,8006,8083,8222,8310,8387,8483,8567,8647,8787,8867,8947,9096,9186,9267,9323,9379,9445,9524,9605,9676,9764,9843,9920,10002,10091,10192,10276,10368,10461,10562,10636,10728,10830,10882,10966,11032,11124,11212,11274,11338,11401,11471,11582,11687,11793,11892,11952,12012,12180,12263,12342", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,80,79,84,101,95,104,132,79,61,77,95,78,62,94,63,68,62,73,63,55,120,57,61,55,76,138,87,76,95,83,79,139,79,79,148,89,80,55,55,65,78,80,70,87,78,76,81,88,100,83,91,92,100,73,91,101,51,83,65,91,87,61,63,62,69,110,104,105,98,59,59,84,82,78,77", + "endOffsets": "320,3151,3231,3316,3418,3514,4347,4480,4560,6903,6981,7077,7156,7219,7314,7378,7447,7510,7584,7648,7704,7825,7883,7945,8001,8078,8217,8305,8382,8478,8562,8642,8782,8862,8942,9091,9181,9262,9318,9374,9440,9519,9600,9671,9759,9838,9915,9997,10086,10187,10271,10363,10456,10557,10631,10723,10825,10877,10961,11027,11119,11207,11269,11333,11396,11466,11577,11682,11788,11887,11947,12007,12092,12258,12337,12415" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-gl/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,454,579,683,838,966,1081,1186,1353,1458,1623,1754,1915,2063,2126,2191", + "endColumns": "101,158,124,103,154,127,114,104,166,104,164,130,160,147,62,64,80", + "endOffsets": "294,453,578,682,837,965,1080,1185,1352,1457,1622,1753,1914,2062,2125,2190,2271" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4565,4671,4834,4963,5071,5230,5362,5481,5724,5895,6004,6173,6308,6473,6625,6692,6761", + "endColumns": "105,162,128,107,158,131,118,108,170,108,168,134,164,151,66,68,84", + "endOffsets": "4666,4829,4958,5066,5225,5357,5476,5585,5890,5999,6168,6303,6468,6620,6687,6756,6841" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-gu.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-gu.json new file mode 100644 index 0000000..9799618 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-gu.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-gu/values-gu.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-gu/values-gu.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,268,342,414,496,602,700,799,919,1003,1060,1123,1214,1281,1340,1430,1493,1558,1622,1691,1753,1807,1922,1980,2041,2095,2168,2295,2381,2463,2562,2647,2731,2864,2939,3015,3148,3234,3315,3369,3421,3487,3560,3640,3711,3791,3862,3938,4017,4086,4193,4289,4367,4462,4558,4632,4707,4806,4857,4939,5006,5093,5183,5245,5309,5372,5439,5541,5646,5743,5845,5903,5959,6037,6123,6198", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,73,71,81,105,97,98,119,83,56,62,90,66,58,89,62,64,63,68,61,53,114,57,60,53,72,126,85,81,98,84,83,132,74,75,132,85,80,53,51,65,72,79,70,79,70,75,78,68,106,95,77,94,95,73,74,98,50,81,66,86,89,61,63,62,66,101,104,96,101,57,55,77,85,74,72", + "endOffsets": "263,337,409,491,597,695,794,914,998,1055,1118,1209,1276,1335,1425,1488,1553,1617,1686,1748,1802,1917,1975,2036,2090,2163,2290,2376,2458,2557,2642,2726,2859,2934,3010,3143,3229,3310,3364,3416,3482,3555,3635,3706,3786,3857,3933,4012,4081,4188,4284,4362,4457,4553,4627,4702,4801,4852,4934,5001,5088,5178,5240,5304,5367,5434,5536,5641,5738,5840,5898,5954,6032,6118,6193,6266" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3001,3075,3147,3229,3335,4151,4250,4370,6630,6687,6750,6841,6908,6967,7057,7120,7185,7249,7318,7380,7434,7549,7607,7668,7722,7795,7922,8008,8090,8189,8274,8358,8491,8566,8642,8775,8861,8942,8996,9048,9114,9187,9267,9338,9418,9489,9565,9644,9713,9820,9916,9994,10089,10185,10259,10334,10433,10484,10566,10633,10720,10810,10872,10936,10999,11066,11168,11273,11370,11472,11530,11586,11745,11831,11906", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,73,71,81,105,97,98,119,83,56,62,90,66,58,89,62,64,63,68,61,53,114,57,60,53,72,126,85,81,98,84,83,132,74,75,132,85,80,53,51,65,72,79,70,79,70,75,78,68,106,95,77,94,95,73,74,98,50,81,66,86,89,61,63,62,66,101,104,96,101,57,55,77,85,74,72", + "endOffsets": "313,3070,3142,3224,3330,3428,4245,4365,4449,6682,6745,6836,6903,6962,7052,7115,7180,7244,7313,7375,7429,7544,7602,7663,7717,7790,7917,8003,8085,8184,8269,8353,8486,8561,8637,8770,8856,8937,8991,9043,9109,9182,9262,9333,9413,9484,9560,9639,9708,9815,9911,9989,10084,10180,10254,10329,10428,10479,10561,10628,10715,10805,10867,10931,10994,11061,11163,11268,11365,11467,11525,11581,11659,11826,11901,11974" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-gu/values-gu.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,149,252,349,451,553,651,773", + "endColumns": "93,102,96,101,101,97,121,100", + "endOffsets": "144,247,344,446,548,646,768,869" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3433,3527,3630,3727,3829,3931,4029,11979", + "endColumns": "93,102,96,101,101,97,121,100", + "endOffsets": "3522,3625,3722,3824,3926,4024,4146,12075" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-gu/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "142", + "endOffsets": "337" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5436", + "endColumns": "146", + "endOffsets": "5578" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-gu/values-gu.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,212,316,423,510,610,730,808,885,976,1069,1164,1258,1358,1451,1546,1640,1731,1822,1902,2008,2109,2206,2315,2415,2525,2685,2788", + "endColumns": "106,103,106,86,99,119,77,76,90,92,94,93,99,92,94,93,90,90,79,105,100,96,108,99,109,159,102,80", + "endOffsets": "207,311,418,505,605,725,803,880,971,1064,1159,1253,1353,1446,1541,1635,1726,1817,1897,2003,2104,2201,2310,2410,2520,2680,2783,2864" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "318,425,529,636,723,823,943,1021,1098,1189,1282,1377,1471,1571,1664,1759,1853,1944,2035,2115,2221,2322,2419,2528,2628,2738,2898,11664", + "endColumns": "106,103,106,86,99,119,77,76,90,92,94,93,99,92,94,93,90,90,79,105,100,96,108,99,109,159,102,80", + "endOffsets": "420,524,631,718,818,938,1016,1093,1184,1277,1372,1466,1566,1659,1754,1848,1939,2030,2110,2216,2317,2414,2523,2623,2733,2893,2996,11740" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-gu/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,459,580,688,822,940,1047,1143,1287,1391,1551,1672,1811,1957,2014,2076", + "endColumns": "103,161,120,107,133,117,106,95,143,103,159,120,138,145,56,61,77", + "endOffsets": "296,458,579,687,821,939,1046,1142,1286,1390,1550,1671,1810,1956,2013,2075,2153" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4454,4562,4728,4853,4965,5103,5225,5336,5583,5731,5839,6003,6128,6271,6421,6482,6548", + "endColumns": "107,165,124,111,137,121,110,99,147,107,163,124,142,149,60,65,81", + "endOffsets": "4557,4723,4848,4960,5098,5220,5331,5431,5726,5834,5998,6123,6266,6416,6477,6543,6625" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-h320dp-port-v13.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-h320dp-port-v13.json new file mode 100644 index 0000000..4856b4c --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-h320dp-port-v13.json @@ -0,0 +1,19 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-h320dp-port-v13/values-h320dp-port-v13.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-h320dp-port-v13/values-h320dp-port-v13.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "63", + "endOffsets": "114" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-h360dp-land-v13.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-h360dp-land-v13.json new file mode 100644 index 0000000..a2db5a9 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-h360dp-land-v13.json @@ -0,0 +1,19 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-h360dp-land-v13/values-h360dp-land-v13.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-h360dp-land-v13/values-h360dp-land-v13.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10", + "startColumns": "4,4,4,4,4,4,4,4,4", + "startOffsets": "55,114,170,226,293,358,413,478,547", + "endColumns": "58,55,55,66,64,54,64,68,68", + "endOffsets": "109,165,221,288,353,408,473,542,611" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-h480dp-land-v13.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-h480dp-land-v13.json new file mode 100644 index 0000000..37f9de3 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-h480dp-land-v13.json @@ -0,0 +1,19 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-h480dp-land-v13/values-h480dp-land-v13.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-h480dp-land-v13/values-h480dp-land-v13.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10", + "startColumns": "4,4,4,4,4,4,4,4,4", + "startOffsets": "55,114,170,226,293,358,413,478,547", + "endColumns": "58,55,55,66,64,54,64,68,68", + "endOffsets": "109,165,221,288,353,408,473,542,611" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-h550dp-port-v13.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-h550dp-port-v13.json new file mode 100644 index 0000000..0420c91 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-h550dp-port-v13.json @@ -0,0 +1,19 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-h550dp-port-v13/values-h550dp-port-v13.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-h550dp-port-v13/values-h550dp-port-v13.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "64", + "endOffsets": "115" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-h720dp-v13.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-h720dp-v13.json new file mode 100644 index 0000000..e2a71cd --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-h720dp-v13.json @@ -0,0 +1,19 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-h720dp-v13/values-h720dp-v13.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-h720dp-v13/values-h720dp-v13.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "66", + "endOffsets": "117" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-hdpi-v4.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-hdpi-v4.json new file mode 100644 index 0000000..cb1ac32 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-hdpi-v4.json @@ -0,0 +1,20 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-hdpi-v4/values-hdpi-v4.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-hdpi-v4/values-hdpi-v4.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endLines": "6", + "endColumns": "13", + "endOffsets": "327" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-hi.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-hi.json new file mode 100644 index 0000000..f27d14d --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-hi.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-hi/values-hi.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-hi/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "141", + "endOffsets": "336" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5515", + "endColumns": "145", + "endOffsets": "5656" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-hi/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,453,575,683,830,956,1064,1172,1325,1430,1592,1718,1855,2004,2063,2126", + "endColumns": "103,155,121,107,146,125,107,107,152,104,161,125,136,148,58,62,83", + "endOffsets": "296,452,574,682,829,955,1063,1171,1324,1429,1591,1717,1854,2003,2062,2125,2209" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4504,4612,4772,4898,5010,5161,5291,5403,5661,5818,5927,6093,6223,6364,6517,6580,6647", + "endColumns": "107,159,125,111,150,129,111,111,156,108,165,129,140,152,62,66,87", + "endOffsets": "4607,4767,4893,5005,5156,5286,5398,5510,5813,5922,6088,6218,6359,6512,6575,6642,6730" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-hi/values-hi.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,211,309,419,505,607,728,806,883,974,1067,1162,1256,1356,1449,1544,1638,1729,1820,1901,2006,2108,2206,2316,2419,2528,2686,2787", + "endColumns": "105,97,109,85,101,120,77,76,90,92,94,93,99,92,94,93,90,90,80,104,101,97,109,102,108,157,100,81", + "endOffsets": "206,304,414,500,602,723,801,878,969,1062,1157,1251,1351,1444,1539,1633,1724,1815,1896,2001,2103,2201,2311,2414,2523,2681,2782,2864" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "309,415,513,623,709,811,932,1010,1087,1178,1271,1366,1460,1560,1653,1748,1842,1933,2024,2105,2210,2312,2410,2520,2623,2732,2890,11841", + "endColumns": "105,97,109,85,101,120,77,76,90,92,94,93,99,92,94,93,90,90,80,104,101,97,109,102,108,157,100,81", + "endOffsets": "410,508,618,704,806,927,1005,1082,1173,1266,1361,1455,1555,1648,1743,1837,1928,2019,2100,2205,2307,2405,2515,2618,2727,2885,2986,11918" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-hi/values-hi.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,256,361,462,575,681,808", + "endColumns": "97,102,104,100,112,105,126,100", + "endOffsets": "148,251,356,457,570,676,803,904" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3429,3527,3630,3735,3836,3949,4055,12161", + "endColumns": "97,102,104,100,112,105,126,100", + "endOffsets": "3522,3625,3730,3831,3944,4050,4177,12257" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-hi/values-hi.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,259,337,413,494,601,697,804,936,1019,1086,1151,1245,1314,1373,1458,1521,1584,1642,1707,1768,1829,1935,1993,2053,2112,2182,2298,2377,2468,2561,2659,2739,2873,2948,3024,3161,3258,3356,3413,3468,3534,3604,3681,3752,3837,3905,3981,4062,4140,4241,4327,4414,4511,4610,4684,4754,4858,4912,4999,5066,5156,5248,5310,5374,5437,5503,5608,5718,5819,5926,5987,6046,6125,6210,6290", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,77,75,80,106,95,106,131,82,66,64,93,68,58,84,62,62,57,64,60,60,105,57,59,58,69,115,78,90,92,97,79,133,74,75,136,96,97,56,54,65,69,76,70,84,67,75,80,77,100,85,86,96,98,73,69,103,53,86,66,89,91,61,63,62,65,104,109,100,106,60,58,78,84,79,72", + "endOffsets": "254,332,408,489,596,692,799,931,1014,1081,1146,1240,1309,1368,1453,1516,1579,1637,1702,1763,1824,1930,1988,2048,2107,2177,2293,2372,2463,2556,2654,2734,2868,2943,3019,3156,3253,3351,3408,3463,3529,3599,3676,3747,3832,3900,3976,4057,4135,4236,4322,4409,4506,4605,4679,4749,4853,4907,4994,5061,5151,5243,5305,5369,5432,5498,5603,5713,5814,5921,5982,6041,6120,6205,6285,6358" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2991,3069,3145,3226,3333,4182,4289,4421,6735,6802,6867,6961,7030,7089,7174,7237,7300,7358,7423,7484,7545,7651,7709,7769,7828,7898,8014,8093,8184,8277,8375,8455,8589,8664,8740,8877,8974,9072,9129,9184,9250,9320,9397,9468,9553,9621,9697,9778,9856,9957,10043,10130,10227,10326,10400,10470,10574,10628,10715,10782,10872,10964,11026,11090,11153,11219,11324,11434,11535,11642,11703,11762,11923,12008,12088", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,77,75,80,106,95,106,131,82,66,64,93,68,58,84,62,62,57,64,60,60,105,57,59,58,69,115,78,90,92,97,79,133,74,75,136,96,97,56,54,65,69,76,70,84,67,75,80,77,100,85,86,96,98,73,69,103,53,86,66,89,91,61,63,62,65,104,109,100,106,60,58,78,84,79,72", + "endOffsets": "304,3064,3140,3221,3328,3424,4284,4416,4499,6797,6862,6956,7025,7084,7169,7232,7295,7353,7418,7479,7540,7646,7704,7764,7823,7893,8009,8088,8179,8272,8370,8450,8584,8659,8735,8872,8969,9067,9124,9179,9245,9315,9392,9463,9548,9616,9692,9773,9851,9952,10038,10125,10222,10321,10395,10465,10569,10623,10710,10777,10867,10959,11021,11085,11148,11214,11319,11429,11530,11637,11698,11757,11836,12003,12083,12156" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-hr.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-hr.json new file mode 100644 index 0000000..04b8c9d --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-hr.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-hr/values-hr.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-hr/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "127", + "endOffsets": "322" + }, + "to": { + "startLines": "57", + "startColumns": "4", + "startOffsets": "5560", + "endColumns": "131", + "endOffsets": "5687" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-hr/values-hr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,260,357,456,560,664,781", + "endColumns": "97,106,96,98,103,103,116,100", + "endOffsets": "148,255,352,451,555,659,776,877" + }, + "to": { + "startLines": "39,40,41,42,43,44,45,135", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3512,3610,3717,3814,3913,4017,4121,12191", + "endColumns": "97,106,96,98,103,103,116,100", + "endOffsets": "3605,3712,3809,3908,4012,4116,4233,12287" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-hr/values-hr.xml", + "from": { + "startLines": "2,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,320,398,476,561,658,751,847,977,1061,1128,1196,1292,1360,1423,1531,1591,1657,1713,1784,1844,1898,2024,2081,2143,2197,2272,2406,2491,2569,2664,2749,2830,2967,3051,3137,3270,3361,3439,3495,3550,3616,3690,3768,3839,3921,3993,4070,4150,4224,4331,4424,4497,4589,4685,4759,4835,4931,4983,5065,5132,5219,5306,5368,5432,5495,5565,5671,5787,5884,5998,6058,6117,6197,6280,6357", + "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "endColumns": "12,77,77,84,96,92,95,129,83,66,67,95,67,62,107,59,65,55,70,59,53,125,56,61,53,74,133,84,77,94,84,80,136,83,85,132,90,77,55,54,65,73,77,70,81,71,76,79,73,106,92,72,91,95,73,75,95,51,81,66,86,86,61,63,62,69,105,115,96,113,59,58,79,82,76,74", + "endOffsets": "315,393,471,556,653,746,842,972,1056,1123,1191,1287,1355,1418,1526,1586,1652,1708,1779,1839,1893,2019,2076,2138,2192,2267,2401,2486,2564,2659,2744,2825,2962,3046,3132,3265,3356,3434,3490,3545,3611,3685,3763,3834,3916,3988,4065,4145,4219,4326,4419,4492,4584,4680,4754,4830,4926,4978,5060,5127,5214,5301,5363,5427,5490,5560,5666,5782,5879,5993,6053,6112,6192,6275,6352,6427" + }, + "to": { + "startLines": "2,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3081,3159,3237,3322,3419,4238,4334,4464,6735,6802,6870,6966,7034,7097,7205,7265,7331,7387,7458,7518,7572,7698,7755,7817,7871,7946,8080,8165,8243,8338,8423,8504,8641,8725,8811,8944,9035,9113,9169,9224,9290,9364,9442,9513,9595,9667,9744,9824,9898,10005,10098,10171,10263,10359,10433,10509,10605,10657,10739,10806,10893,10980,11042,11106,11169,11239,11345,11461,11558,11672,11732,11791,11956,12039,12116", + "endLines": "6,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "endColumns": "12,77,77,84,96,92,95,129,83,66,67,95,67,62,107,59,65,55,70,59,53,125,56,61,53,74,133,84,77,94,84,80,136,83,85,132,90,77,55,54,65,73,77,70,81,71,76,79,73,106,92,72,91,95,73,75,95,51,81,66,86,86,61,63,62,69,105,115,96,113,59,58,79,82,76,74", + "endOffsets": "365,3154,3232,3317,3414,3507,4329,4459,4543,6797,6865,6961,7029,7092,7200,7260,7326,7382,7453,7513,7567,7693,7750,7812,7866,7941,8075,8160,8238,8333,8418,8499,8636,8720,8806,8939,9030,9108,9164,9219,9285,9359,9437,9508,9590,9662,9739,9819,9893,10000,10093,10166,10258,10354,10428,10504,10600,10652,10734,10801,10888,10975,11037,11101,11164,11234,11340,11456,11553,11667,11727,11786,11866,12034,12111,12186" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-hr/values-hr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,210,305,412,498,602,721,806,888,979,1072,1167,1261,1361,1454,1549,1644,1735,1826,1912,2016,2128,2229,2334,2448,2550,2719,2816", + "endColumns": "104,94,106,85,103,118,84,81,90,92,94,93,99,92,94,94,90,90,85,103,111,100,104,113,101,168,96,84", + "endOffsets": "205,300,407,493,597,716,801,883,974,1067,1162,1256,1356,1449,1544,1639,1730,1821,1907,2011,2123,2224,2329,2443,2545,2714,2811,2896" + }, + "to": { + "startLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,131", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "370,475,570,677,763,867,986,1071,1153,1244,1337,1432,1526,1626,1719,1814,1909,2000,2091,2177,2281,2393,2494,2599,2713,2815,2984,11871", + "endColumns": "104,94,106,85,103,118,84,81,90,92,94,93,99,92,94,94,90,90,85,103,111,100,104,113,101,168,96,84", + "endOffsets": "470,565,672,758,862,981,1066,1148,1239,1332,1427,1521,1621,1714,1809,1904,1995,2086,2172,2276,2388,2489,2594,2708,2810,2979,3076,11951" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-hr/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,448,574,680,833,959,1070,1173,1319,1422,1575,1699,1842,1981,2045,2103", + "endColumns": "101,152,125,105,152,125,110,102,145,102,152,123,142,138,63,57,76", + "endOffsets": "294,447,573,679,832,958,1069,1172,1318,1421,1574,1698,1841,1980,2044,2102,2179" + }, + "to": { + "startLines": "49,50,51,52,53,54,55,56,58,59,60,61,62,63,64,65,66", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4548,4654,4811,4941,5051,5208,5338,5453,5692,5842,5949,6106,6234,6381,6524,6592,6654", + "endColumns": "105,156,129,109,156,129,114,106,149,106,156,127,146,142,67,61,80", + "endOffsets": "4649,4806,4936,5046,5203,5333,5448,5555,5837,5944,6101,6229,6376,6519,6587,6649,6730" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-hu.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-hu.json new file mode 100644 index 0000000..bece26d --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-hu.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-hu/values-hu.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-hu/values-hu.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,305,420,504,619,742,819,894,985,1078,1173,1267,1367,1460,1555,1650,1741,1832,1915,2025,2135,2235,2346,2455,2574,2756,2859", + "endColumns": "107,91,114,83,114,122,76,74,90,92,94,93,99,92,94,94,90,90,82,109,109,99,110,108,118,181,102,83", + "endOffsets": "208,300,415,499,614,737,814,889,980,1073,1168,1262,1362,1455,1550,1645,1736,1827,1910,2020,2130,2230,2341,2450,2569,2751,2854,2938" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "313,421,513,628,712,827,950,1027,1102,1193,1286,1381,1475,1575,1668,1763,1858,1949,2040,2123,2233,2343,2443,2554,2663,2782,2964,12039", + "endColumns": "107,91,114,83,114,122,76,74,90,92,94,93,99,92,94,94,90,90,82,109,109,99,110,108,118,181,102,83", + "endOffsets": "416,508,623,707,822,945,1022,1097,1188,1281,1376,1470,1570,1663,1758,1853,1944,2035,2118,2228,2338,2438,2549,2658,2777,2959,3062,12118" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-hu/values-hu.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,263,344,420,497,587,667,766,886,969,1032,1096,1195,1270,1329,1439,1501,1570,1628,1700,1761,1816,1919,1976,2036,2091,2172,2292,2375,2453,2549,2635,2723,2858,2941,3021,3161,3255,3337,3390,3441,3507,3583,3665,3736,3820,3897,3972,4051,4128,4233,4329,4406,4498,4595,4669,4754,4851,4903,4986,5053,5141,5228,5290,5354,5417,5483,5581,5687,5781,5888,5945,6000,6085,6170,6247", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,80,75,76,89,79,98,119,82,62,63,98,74,58,109,61,68,57,71,60,54,102,56,59,54,80,119,82,77,95,85,87,134,82,79,139,93,81,52,50,65,75,81,70,83,76,74,78,76,104,95,76,91,96,73,84,96,51,82,66,87,86,61,63,62,65,97,105,93,106,56,54,84,84,76,72", + "endOffsets": "258,339,415,492,582,662,761,881,964,1027,1091,1190,1265,1324,1434,1496,1565,1623,1695,1756,1811,1914,1971,2031,2086,2167,2287,2370,2448,2544,2630,2718,2853,2936,3016,3156,3250,3332,3385,3436,3502,3578,3660,3731,3815,3892,3967,4046,4123,4228,4324,4401,4493,4590,4664,4749,4846,4898,4981,5048,5136,5223,5285,5349,5412,5478,5576,5682,5776,5883,5940,5995,6080,6165,6242,6315" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3067,3148,3224,3301,3391,4193,4292,4412,6923,6986,7050,7149,7224,7283,7393,7455,7524,7582,7654,7715,7770,7873,7930,7990,8045,8126,8246,8329,8407,8503,8589,8677,8812,8895,8975,9115,9209,9291,9344,9395,9461,9537,9619,9690,9774,9851,9926,10005,10082,10187,10283,10360,10452,10549,10623,10708,10805,10857,10940,11007,11095,11182,11244,11308,11371,11437,11535,11641,11735,11842,11899,11954,12123,12208,12285", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,80,75,76,89,79,98,119,82,62,63,98,74,58,109,61,68,57,71,60,54,102,56,59,54,80,119,82,77,95,85,87,134,82,79,139,93,81,52,50,65,75,81,70,83,76,74,78,76,104,95,76,91,96,73,84,96,51,82,66,87,86,61,63,62,65,97,105,93,106,56,54,84,84,76,72", + "endOffsets": "308,3143,3219,3296,3386,3466,4287,4407,4490,6981,7045,7144,7219,7278,7388,7450,7519,7577,7649,7710,7765,7868,7925,7985,8040,8121,8241,8324,8402,8498,8584,8672,8807,8890,8970,9110,9204,9286,9339,9390,9456,9532,9614,9685,9769,9846,9921,10000,10077,10182,10278,10355,10447,10544,10618,10703,10800,10852,10935,11002,11090,11177,11239,11303,11366,11432,11530,11636,11730,11837,11894,11949,12034,12203,12280,12353" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-hu/values-hu.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,356,457,560,667,777", + "endColumns": "96,101,101,100,102,106,109,100", + "endOffsets": "147,249,351,452,555,662,772,873" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3471,3568,3670,3772,3873,3976,4083,12358", + "endColumns": "96,101,101,100,102,106,109,100", + "endOffsets": "3563,3665,3767,3868,3971,4078,4188,12454" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-hu/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,300,480,614,719,883,1017,1135,1241,1407,1511,1692,1825,1993,2161,2228,2292", + "endColumns": "106,179,133,104,163,133,117,105,165,103,180,132,167,167,66,63,83", + "endOffsets": "299,479,613,718,882,1016,1134,1240,1406,1510,1691,1824,1992,2160,2227,2291,2375" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4495,4606,4790,4928,5037,5205,5343,5465,5752,5922,6030,6215,6352,6524,6696,6767,6835", + "endColumns": "110,183,137,108,167,137,121,109,169,107,184,136,171,171,70,67,87", + "endOffsets": "4601,4785,4923,5032,5200,5338,5460,5570,5917,6025,6210,6347,6519,6691,6762,6830,6918" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-hu/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "172", + "endOffsets": "367" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5575", + "endColumns": "176", + "endOffsets": "5747" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-hy.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-hy.json new file mode 100644 index 0000000..494974d --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-hy.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-hy/values-hy.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-hy/values-hy.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,155,260,358,457,562,664,775", + "endColumns": "99,104,97,98,104,101,110,100", + "endOffsets": "150,255,353,452,557,659,770,871" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3436,3536,3641,3739,3838,3943,4045,12207", + "endColumns": "99,104,97,98,104,101,110,100", + "endOffsets": "3531,3636,3734,3833,3938,4040,4151,12303" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-hy/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,456,586,690,840,972,1095,1204,1367,1471,1635,1767,1925,2087,2148,2211", + "endColumns": "101,160,129,103,149,131,122,108,162,103,163,131,157,161,60,62,77", + "endOffsets": "294,455,585,689,839,971,1094,1203,1366,1470,1634,1766,1924,2086,2147,2210,2288" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4462,4568,4733,4867,4975,5129,5265,5392,5656,5823,5931,6099,6235,6397,6563,6628,6695", + "endColumns": "105,164,133,107,153,135,126,112,166,107,167,135,161,165,64,66,81", + "endOffsets": "4563,4728,4862,4970,5124,5260,5387,5500,5818,5926,6094,6230,6392,6558,6623,6690,6772" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-hy/values-hy.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,313,423,512,618,735,817,897,988,1081,1176,1270,1370,1463,1558,1652,1743,1834,1917,2023,2129,2228,2338,2446,2547,2717,2814", + "endColumns": "107,99,109,88,105,116,81,79,90,92,94,93,99,92,94,93,90,90,82,105,105,98,109,107,100,169,96,82", + "endOffsets": "208,308,418,507,613,730,812,892,983,1076,1171,1265,1365,1458,1553,1647,1738,1829,1912,2018,2124,2223,2333,2441,2542,2712,2809,2892" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "315,423,523,633,722,828,945,1027,1107,1198,1291,1386,1480,1580,1673,1768,1862,1953,2044,2127,2233,2339,2438,2548,2656,2757,2927,11887", + "endColumns": "107,99,109,88,105,116,81,79,90,92,94,93,99,92,94,93,90,90,82,105,105,98,109,107,100,169,96,82", + "endOffsets": "418,518,628,717,823,940,1022,1102,1193,1286,1381,1475,1575,1668,1763,1857,1948,2039,2122,2228,2334,2433,2543,2651,2752,2922,3019,11965" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-hy/values-hy.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,265,341,417,497,589,677,772,902,983,1044,1108,1205,1290,1352,1439,1501,1565,1626,1693,1754,1808,1930,1987,2047,2101,2182,2317,2401,2477,2567,2646,2731,2867,2942,3017,3160,3255,3335,3391,3444,3510,3584,3663,3734,3817,3888,3964,4040,4117,4223,4311,4391,4487,4583,4657,4735,4835,4886,4970,5039,5126,5217,5279,5343,5406,5477,5582,5688,5788,5891,5951,6008,6093,6176,6250", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,75,75,79,91,87,94,129,80,60,63,96,84,61,86,61,63,60,66,60,53,121,56,59,53,80,134,83,75,89,78,84,135,74,74,142,94,79,55,52,65,73,78,70,82,70,75,75,76,105,87,79,95,95,73,77,99,50,83,68,86,90,61,63,62,70,104,105,99,102,59,56,84,82,73,79", + "endOffsets": "260,336,412,492,584,672,767,897,978,1039,1103,1200,1285,1347,1434,1496,1560,1621,1688,1749,1803,1925,1982,2042,2096,2177,2312,2396,2472,2562,2641,2726,2862,2937,3012,3155,3250,3330,3386,3439,3505,3579,3658,3729,3812,3883,3959,4035,4112,4218,4306,4386,4482,4578,4652,4730,4830,4881,4965,5034,5121,5212,5274,5338,5401,5472,5577,5683,5783,5886,5946,6003,6088,6171,6245,6325" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3024,3100,3176,3256,3348,4156,4251,4381,6777,6838,6902,6999,7084,7146,7233,7295,7359,7420,7487,7548,7602,7724,7781,7841,7895,7976,8111,8195,8271,8361,8440,8525,8661,8736,8811,8954,9049,9129,9185,9238,9304,9378,9457,9528,9611,9682,9758,9834,9911,10017,10105,10185,10281,10377,10451,10529,10629,10680,10764,10833,10920,11011,11073,11137,11200,11271,11376,11482,11582,11685,11745,11802,11970,12053,12127", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,75,75,79,91,87,94,129,80,60,63,96,84,61,86,61,63,60,66,60,53,121,56,59,53,80,134,83,75,89,78,84,135,74,74,142,94,79,55,52,65,73,78,70,82,70,75,75,76,105,87,79,95,95,73,77,99,50,83,68,86,90,61,63,62,70,104,105,99,102,59,56,84,82,73,79", + "endOffsets": "310,3095,3171,3251,3343,3431,4246,4376,4457,6833,6897,6994,7079,7141,7228,7290,7354,7415,7482,7543,7597,7719,7776,7836,7890,7971,8106,8190,8266,8356,8435,8520,8656,8731,8806,8949,9044,9124,9180,9233,9299,9373,9452,9523,9606,9677,9753,9829,9906,10012,10100,10180,10276,10372,10446,10524,10624,10675,10759,10828,10915,11006,11068,11132,11195,11266,11371,11477,11577,11680,11740,11797,11882,12048,12122,12202" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-hy/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "146", + "endOffsets": "341" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5505", + "endColumns": "150", + "endOffsets": "5651" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-in.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-in.json new file mode 100644 index 0000000..d162699 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-in.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-in/values-in.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-in/values-in.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,150,252,349,446,552,670,785", + "endColumns": "94,101,96,96,105,117,114,100", + "endOffsets": "145,247,344,441,547,665,780,881" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3435,3530,3632,3729,3826,3932,4050,12007", + "endColumns": "94,101,96,96,105,117,114,100", + "endOffsets": "3525,3627,3724,3821,3927,4045,4160,12103" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-in/values-in.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,220,324,432,519,623,739,822,900,991,1084,1179,1273,1373,1466,1561,1655,1746,1837,1923,2026,2131,2232,2336,2445,2553,2713,2812", + "endColumns": "114,103,107,86,103,115,82,77,90,92,94,93,99,92,94,93,90,90,85,102,104,100,103,108,107,159,98,84", + "endOffsets": "215,319,427,514,618,734,817,895,986,1079,1174,1268,1368,1461,1556,1650,1741,1832,1918,2021,2126,2227,2331,2440,2548,2708,2807,2892" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "319,434,538,646,733,837,953,1036,1114,1205,1298,1393,1487,1587,1680,1775,1869,1960,2051,2137,2240,2345,2446,2550,2659,2767,2927,11685", + "endColumns": "114,103,107,86,103,115,82,77,90,92,94,93,99,92,94,93,90,90,85,102,104,100,103,108,107,159,98,84", + "endOffsets": "429,533,641,728,832,948,1031,1109,1200,1293,1388,1482,1582,1675,1770,1864,1955,2046,2132,2235,2340,2441,2545,2654,2762,2922,3021,11765" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-in/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,456,578,680,831,954,1065,1167,1329,1430,1590,1712,1863,2003,2063,2119", + "endColumns": "102,159,121,101,150,122,110,101,161,100,159,121,150,139,59,55,74", + "endOffsets": "295,455,577,679,830,953,1064,1166,1328,1429,1589,1711,1862,2002,2062,2118,2193" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4470,4577,4741,4867,4973,5128,5255,5370,5608,5774,5879,6043,6169,6324,6468,6532,6592", + "endColumns": "106,163,125,105,154,126,114,105,165,104,163,125,154,143,63,59,78", + "endOffsets": "4572,4736,4862,4968,5123,5250,5365,5471,5769,5874,6038,6164,6319,6463,6527,6587,6666" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-in/values-in.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,269,348,424,503,593,678,784,900,983,1047,1112,1206,1271,1330,1417,1479,1541,1601,1667,1729,1783,1895,1952,2013,2067,2139,2265,2351,2429,2522,2608,2692,2831,2912,2993,3128,3218,3300,3353,3405,3471,3543,3627,3698,3778,3853,3929,4002,4077,4175,4260,4335,4427,4521,4595,4668,4762,4814,4896,4965,5050,5137,5199,5263,5326,5398,5501,5606,5701,5804,5861,5917,5997,6078,6156", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,78,75,78,89,84,105,115,82,63,64,93,64,58,86,61,61,59,65,61,53,111,56,60,53,71,125,85,77,92,85,83,138,80,80,134,89,81,52,51,65,71,83,70,79,74,75,72,74,97,84,74,91,93,73,72,93,51,81,68,84,86,61,63,62,71,102,104,94,102,56,55,79,80,77,77", + "endOffsets": "264,343,419,498,588,673,779,895,978,1042,1107,1201,1266,1325,1412,1474,1536,1596,1662,1724,1778,1890,1947,2008,2062,2134,2260,2346,2424,2517,2603,2687,2826,2907,2988,3123,3213,3295,3348,3400,3466,3538,3622,3693,3773,3848,3924,3997,4072,4170,4255,4330,4422,4516,4590,4663,4757,4809,4891,4960,5045,5132,5194,5258,5321,5393,5496,5601,5696,5799,5856,5912,5992,6073,6151,6229" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3026,3105,3181,3260,3350,4165,4271,4387,6671,6735,6800,6894,6959,7018,7105,7167,7229,7289,7355,7417,7471,7583,7640,7701,7755,7827,7953,8039,8117,8210,8296,8380,8519,8600,8681,8816,8906,8988,9041,9093,9159,9231,9315,9386,9466,9541,9617,9690,9765,9863,9948,10023,10115,10209,10283,10356,10450,10502,10584,10653,10738,10825,10887,10951,11014,11086,11189,11294,11389,11492,11549,11605,11770,11851,11929", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,78,75,78,89,84,105,115,82,63,64,93,64,58,86,61,61,59,65,61,53,111,56,60,53,71,125,85,77,92,85,83,138,80,80,134,89,81,52,51,65,71,83,70,79,74,75,72,74,97,84,74,91,93,73,72,93,51,81,68,84,86,61,63,62,71,102,104,94,102,56,55,79,80,77,77", + "endOffsets": "314,3100,3176,3255,3345,3430,4266,4382,4465,6730,6795,6889,6954,7013,7100,7162,7224,7284,7350,7412,7466,7578,7635,7696,7750,7822,7948,8034,8112,8205,8291,8375,8514,8595,8676,8811,8901,8983,9036,9088,9154,9226,9310,9381,9461,9536,9612,9685,9760,9858,9943,10018,10110,10204,10278,10351,10445,10497,10579,10648,10733,10820,10882,10946,11009,11081,11184,11289,11384,11487,11544,11600,11680,11846,11924,12002" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-in/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "127", + "endOffsets": "322" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5476", + "endColumns": "131", + "endOffsets": "5603" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-is.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-is.json new file mode 100644 index 0000000..200cd9f --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-is.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-is/values-is.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-is/values-is.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,270,344,416,495,577,657,754,869,951,1009,1074,1162,1226,1287,1377,1441,1504,1566,1634,1698,1754,1877,1942,2004,2060,2131,2258,2342,2416,2513,2594,2678,2814,2891,2968,3084,3171,3250,3307,3362,3428,3504,3584,3655,3731,3798,3872,3942,4008,4110,4196,4266,4357,4447,4521,4594,4683,4734,4815,4887,4968,5054,5116,5180,5243,5312,5426,5532,5640,5742,5803,5862,5942,6026,6105", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,73,71,78,81,79,96,114,81,57,64,87,63,60,89,63,62,61,67,63,55,122,64,61,55,70,126,83,73,96,80,83,135,76,76,115,86,78,56,54,65,75,79,70,75,66,73,69,65,101,85,69,90,89,73,72,88,50,80,71,80,85,61,63,62,68,113,105,107,101,60,58,79,83,78,74", + "endOffsets": "265,339,411,490,572,652,749,864,946,1004,1069,1157,1221,1282,1372,1436,1499,1561,1629,1693,1749,1872,1937,1999,2055,2126,2253,2337,2411,2508,2589,2673,2809,2886,2963,3079,3166,3245,3302,3357,3423,3499,3579,3650,3726,3793,3867,3937,4003,4105,4191,4261,4352,4442,4516,4589,4678,4729,4810,4882,4963,5049,5111,5175,5238,5307,5421,5527,5635,5737,5798,5857,5937,6021,6100,6175" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2994,3068,3140,3219,3301,4098,4195,4310,6540,6598,6663,6751,6815,6876,6966,7030,7093,7155,7223,7287,7343,7466,7531,7593,7649,7720,7847,7931,8005,8102,8183,8267,8403,8480,8557,8673,8760,8839,8896,8951,9017,9093,9173,9244,9320,9387,9461,9531,9597,9699,9785,9855,9946,10036,10110,10183,10272,10323,10404,10476,10557,10643,10705,10769,10832,10901,11015,11121,11229,11331,11392,11451,11612,11696,11775", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,73,71,78,81,79,96,114,81,57,64,87,63,60,89,63,62,61,67,63,55,122,64,61,55,70,126,83,73,96,80,83,135,76,76,115,86,78,56,54,65,75,79,70,75,66,73,69,65,101,85,69,90,89,73,72,88,50,80,71,80,85,61,63,62,68,113,105,107,101,60,58,79,83,78,74", + "endOffsets": "315,3063,3135,3214,3296,3376,4190,4305,4387,6593,6658,6746,6810,6871,6961,7025,7088,7150,7218,7282,7338,7461,7526,7588,7644,7715,7842,7926,8000,8097,8178,8262,8398,8475,8552,8668,8755,8834,8891,8946,9012,9088,9168,9239,9315,9382,9456,9526,9592,9694,9780,9850,9941,10031,10105,10178,10267,10318,10399,10471,10552,10638,10700,10764,10827,10896,11010,11116,11224,11326,11387,11446,11526,11691,11770,11845" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-is/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "124", + "endOffsets": "319" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5366", + "endColumns": "128", + "endOffsets": "5490" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-is/values-is.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,205,302,414,499,600,714,795,874,965,1058,1151,1245,1351,1444,1539,1634,1725,1819,1900,2010,2117,2214,2323,2423,2526,2681,2779", + "endColumns": "99,96,111,84,100,113,80,78,90,92,92,93,105,92,94,94,90,93,80,109,106,96,108,99,102,154,97,80", + "endOffsets": "200,297,409,494,595,709,790,869,960,1053,1146,1240,1346,1439,1534,1629,1720,1814,1895,2005,2112,2209,2318,2418,2521,2676,2774,2855" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "320,420,517,629,714,815,929,1010,1089,1180,1273,1366,1460,1566,1659,1754,1849,1940,2034,2115,2225,2332,2429,2538,2638,2741,2896,11531", + "endColumns": "99,96,111,84,100,113,80,78,90,92,92,93,105,92,94,94,90,93,80,109,106,96,108,99,102,154,97,80", + "endOffsets": "415,512,624,709,810,924,1005,1084,1175,1268,1361,1455,1561,1654,1749,1844,1935,2029,2110,2220,2327,2424,2533,2633,2736,2891,2989,11607" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-is/values-is.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,150,257,354,454,557,661,772", + "endColumns": "94,106,96,99,102,103,110,100", + "endOffsets": "145,252,349,449,552,656,767,868" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3381,3476,3583,3680,3780,3883,3987,11850", + "endColumns": "94,106,96,99,102,103,110,100", + "endOffsets": "3471,3578,3675,3775,3878,3982,4093,11946" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-is/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,445,566,671,808,929,1034,1135,1285,1387,1540,1662,1800,1950,2010,2069", + "endColumns": "101,149,120,104,136,120,104,100,149,101,152,121,137,149,59,58,74", + "endOffsets": "294,444,565,670,807,928,1033,1134,1284,1386,1539,1661,1799,1949,2009,2068,2143" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4392,4498,4652,4777,4886,5027,5152,5261,5495,5649,5755,5912,6038,6180,6334,6398,6461", + "endColumns": "105,153,124,108,140,124,108,104,153,105,156,125,141,153,63,62,78", + "endOffsets": "4493,4647,4772,4881,5022,5147,5256,5361,5644,5750,5907,6033,6175,6329,6393,6456,6535" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-it.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-it.json new file mode 100644 index 0000000..8199c21 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-it.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-it/values-it.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-it/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,294,441,562,666,820,944,1060,1160,1313,1416,1566,1689,1841,2018,2081,2138", + "endColumns": "100,146,120,103,153,123,115,99,152,102,149,122,151,176,62,56,72", + "endOffsets": "293,440,561,665,819,943,1059,1159,1312,1415,1565,1688,1840,2017,2080,2137,2210" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4517,4622,4773,4898,5006,5164,5292,5412,5652,5809,5916,6070,6197,6353,6534,6601,6662", + "endColumns": "104,150,124,107,157,127,119,103,156,106,153,126,155,180,66,60,76", + "endOffsets": "4617,4768,4893,5001,5159,5287,5407,5511,5804,5911,6065,6192,6348,6529,6596,6657,6734" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-it/values-it.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,354,456,565,672,802", + "endColumns": "97,101,98,101,108,106,129,100", + "endOffsets": "148,250,349,451,560,667,797,898" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3448,3546,3648,3747,3849,3958,4065,12233", + "endColumns": "97,101,98,101,108,106,129,100", + "endOffsets": "3541,3643,3742,3844,3953,4060,4190,12329" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-it/values-it.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,268,352,433,510,609,704,803,943,1026,1090,1156,1251,1336,1398,1486,1548,1617,1680,1753,1816,1870,1991,2048,2110,2164,2241,2378,2463,2543,2642,2728,2810,2945,3026,3107,3253,3344,3434,3489,3540,3606,3679,3759,3830,3910,3985,4062,4131,4208,4313,4401,4490,4583,4676,4750,4830,4924,4975,5059,5125,5209,5297,5359,5423,5486,5554,5669,5783,5889,5998,6057,6112,6192,6277,6356", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,83,80,76,98,94,98,139,82,63,65,94,84,61,87,61,68,62,72,62,53,120,56,61,53,76,136,84,79,98,85,81,134,80,80,145,90,89,54,50,65,72,79,70,79,74,76,68,76,104,87,88,92,92,73,79,93,50,83,65,83,87,61,63,62,67,114,113,105,108,58,54,79,84,78,81", + "endOffsets": "263,347,428,505,604,699,798,938,1021,1085,1151,1246,1331,1393,1481,1543,1612,1675,1748,1811,1865,1986,2043,2105,2159,2236,2373,2458,2538,2637,2723,2805,2940,3021,3102,3248,3339,3429,3484,3535,3601,3674,3754,3825,3905,3980,4057,4126,4203,4308,4396,4485,4578,4671,4745,4825,4919,4970,5054,5120,5204,5292,5354,5418,5481,5549,5664,5778,5884,5993,6052,6107,6187,6272,6351,6433" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3012,3096,3177,3254,3353,4195,4294,4434,6739,6803,6869,6964,7049,7111,7199,7261,7330,7393,7466,7529,7583,7704,7761,7823,7877,7954,8091,8176,8256,8355,8441,8523,8658,8739,8820,8966,9057,9147,9202,9253,9319,9392,9472,9543,9623,9698,9775,9844,9921,10026,10114,10203,10296,10389,10463,10543,10637,10688,10772,10838,10922,11010,11072,11136,11199,11267,11382,11496,11602,11711,11770,11825,11987,12072,12151", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,83,80,76,98,94,98,139,82,63,65,94,84,61,87,61,68,62,72,62,53,120,56,61,53,76,136,84,79,98,85,81,134,80,80,145,90,89,54,50,65,72,79,70,79,74,76,68,76,104,87,88,92,92,73,79,93,50,83,65,83,87,61,63,62,67,114,113,105,108,58,54,79,84,78,81", + "endOffsets": "313,3091,3172,3249,3348,3443,4289,4429,4512,6798,6864,6959,7044,7106,7194,7256,7325,7388,7461,7524,7578,7699,7756,7818,7872,7949,8086,8171,8251,8350,8436,8518,8653,8734,8815,8961,9052,9142,9197,9248,9314,9387,9467,9538,9618,9693,9770,9839,9916,10021,10109,10198,10291,10384,10458,10538,10632,10683,10767,10833,10917,11005,11067,11131,11194,11262,11377,11491,11597,11706,11765,11820,11900,12067,12146,12228" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-it/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "131", + "endOffsets": "326" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5516", + "endColumns": "135", + "endOffsets": "5647" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-it/values-it.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,210,313,422,506,611,730,808,883,975,1069,1162,1256,1357,1451,1548,1643,1735,1827,1908,2014,2121,2219,2323,2429,2536,2699,2799", + "endColumns": "104,102,108,83,104,118,77,74,91,93,92,93,100,93,96,94,91,91,80,105,106,97,103,105,106,162,99,81", + "endOffsets": "205,308,417,501,606,725,803,878,970,1064,1157,1251,1352,1446,1543,1638,1730,1822,1903,2009,2116,2214,2318,2424,2531,2694,2794,2876" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "318,423,526,635,719,824,943,1021,1096,1188,1282,1375,1469,1570,1664,1761,1856,1948,2040,2121,2227,2334,2432,2536,2642,2749,2912,11905", + "endColumns": "104,102,108,83,104,118,77,74,91,93,92,93,100,93,96,94,91,91,80,105,106,97,103,105,106,162,99,81", + "endOffsets": "418,521,630,714,819,938,1016,1091,1183,1277,1370,1464,1565,1659,1756,1851,1943,2035,2116,2222,2329,2427,2531,2637,2744,2907,3007,11982" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-iw.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-iw.json new file mode 100644 index 0000000..c5d8f86 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-iw.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-iw/values-iw.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-iw/values-iw.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,210,310,418,502,604,720,799,877,968,1062,1156,1250,1350,1443,1538,1631,1722,1814,1895,2000,2103,2201,2306,2408,2510,2664,2761", + "endColumns": "104,99,107,83,101,115,78,77,90,93,93,93,99,92,94,92,90,91,80,104,102,97,104,101,101,153,96,81", + "endOffsets": "205,305,413,497,599,715,794,872,963,1057,1151,1245,1345,1438,1533,1626,1717,1809,1890,1995,2098,2196,2301,2403,2505,2659,2756,2838" + }, + "to": { + "startLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,131", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "361,466,566,674,758,860,976,1055,1133,1224,1318,1412,1506,1606,1699,1794,1887,1978,2070,2151,2256,2359,2457,2562,2664,2766,2920,11337", + "endColumns": "104,99,107,83,101,115,78,77,90,93,93,93,99,92,94,92,90,91,80,104,102,97,104,101,101,153,96,81", + "endOffsets": "461,561,669,753,855,971,1050,1128,1219,1313,1407,1501,1601,1694,1789,1882,1973,2065,2146,2251,2354,2452,2557,2659,2761,2915,3012,11414" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-iw/values-iw.xml", + "from": { + "startLines": "2,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,311,388,463,540,640,731,824,937,1017,1077,1142,1230,1300,1363,1455,1518,1578,1637,1700,1761,1815,1917,1974,2033,2087,2155,2266,2347,2422,2509,2589,2671,2803,2874,2947,3071,3159,3235,3288,3342,3408,3481,3557,3628,3706,3776,3851,3933,4001,4102,4187,4257,4347,4438,4512,4585,4674,4725,4806,4873,4955,5040,5102,5166,5229,5297,5391,5486,5576,5673,5730,5788,5863,5945,6020", + "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "endColumns": "12,76,74,76,99,90,92,112,79,59,64,87,69,62,91,62,59,58,62,60,53,101,56,58,53,67,110,80,74,86,79,81,131,70,72,123,87,75,52,53,65,72,75,70,77,69,74,81,67,100,84,69,89,90,73,72,88,50,80,66,81,84,61,63,62,67,93,94,89,96,56,57,74,81,74,75", + "endOffsets": "306,383,458,535,635,726,819,932,1012,1072,1137,1225,1295,1358,1450,1513,1573,1632,1695,1756,1810,1912,1969,2028,2082,2150,2261,2342,2417,2504,2584,2666,2798,2869,2942,3066,3154,3230,3283,3337,3403,3476,3552,3623,3701,3771,3846,3928,3996,4097,4182,4252,4342,4433,4507,4580,4669,4720,4801,4868,4950,5035,5097,5161,5224,5292,5386,5481,5571,5668,5725,5783,5858,5940,6015,6091" + }, + "to": { + "startLines": "2,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3017,3094,3169,3246,3346,4134,4227,4340,6491,6551,6616,6704,6774,6837,6929,6992,7052,7111,7174,7235,7289,7391,7448,7507,7561,7629,7740,7821,7896,7983,8063,8145,8277,8348,8421,8545,8633,8709,8762,8816,8882,8955,9031,9102,9180,9250,9325,9407,9475,9576,9661,9731,9821,9912,9986,10059,10148,10199,10280,10347,10429,10514,10576,10640,10703,10771,10865,10960,11050,11147,11204,11262,11419,11501,11576", + "endLines": "6,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "endColumns": "12,76,74,76,99,90,92,112,79,59,64,87,69,62,91,62,59,58,62,60,53,101,56,58,53,67,110,80,74,86,79,81,131,70,72,123,87,75,52,53,65,72,75,70,77,69,74,81,67,100,84,69,89,90,73,72,88,50,80,66,81,84,61,63,62,67,93,94,89,96,56,57,74,81,74,75", + "endOffsets": "356,3089,3164,3241,3341,3432,4222,4335,4415,6546,6611,6699,6769,6832,6924,6987,7047,7106,7169,7230,7284,7386,7443,7502,7556,7624,7735,7816,7891,7978,8058,8140,8272,8343,8416,8540,8628,8704,8757,8811,8877,8950,9026,9097,9175,9245,9320,9402,9470,9571,9656,9726,9816,9907,9981,10054,10143,10194,10275,10342,10424,10509,10571,10635,10698,10766,10860,10955,11045,11142,11199,11257,11332,11496,11571,11647" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-iw/values-iw.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,149,251,348,445,546,646,752", + "endColumns": "93,101,96,96,100,99,105,100", + "endOffsets": "144,246,343,440,541,641,747,848" + }, + "to": { + "startLines": "39,40,41,42,43,44,45,135", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3437,3531,3633,3730,3827,3928,4028,11652", + "endColumns": "93,101,96,96,100,99,105,100", + "endOffsets": "3526,3628,3725,3822,3923,4023,4129,11748" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-iw/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "113", + "endOffsets": "308" + }, + "to": { + "startLines": "57", + "startColumns": "4", + "startOffsets": "5385", + "endColumns": "117", + "endOffsets": "5498" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-iw/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,292,442,563,663,798,919,1027,1126,1258,1358,1499,1618,1748,1889,1945,2001", + "endColumns": "98,149,120,99,134,120,107,98,131,99,140,118,129,140,55,55,76", + "endOffsets": "291,441,562,662,797,918,1026,1125,1257,1357,1498,1617,1747,1888,1944,2000,2077" + }, + "to": { + "startLines": "49,50,51,52,53,54,55,56,58,59,60,61,62,63,64,65,66", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4420,4523,4677,4802,4906,5045,5170,5282,5503,5639,5743,5888,6011,6145,6290,6350,6410", + "endColumns": "102,153,124,103,138,124,111,102,135,103,144,122,133,144,59,59,80", + "endOffsets": "4518,4672,4797,4901,5040,5165,5277,5380,5634,5738,5883,6006,6140,6285,6345,6405,6486" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ja.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ja.json new file mode 100644 index 0000000..f5c0807 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ja.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-ja/values-ja.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ja/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,293,423,539,641,769,885,986,1081,1211,1308,1437,1552,1668,1784,1840,1895", + "endColumns": "99,129,115,101,127,115,100,94,129,96,128,114,115,115,55,54,66", + "endOffsets": "292,422,538,640,768,884,985,1080,1210,1307,1436,1551,1667,1783,1839,1894,1961" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4186,4290,4424,4544,4650,4782,4902,5007,5228,5362,5463,5596,5715,5835,5955,6015,6074", + "endColumns": "103,133,119,105,131,119,104,98,133,100,132,118,119,119,59,58,70", + "endOffsets": "4285,4419,4539,4645,4777,4897,5002,5101,5357,5458,5591,5710,5830,5950,6010,6069,6140" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ja/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "117", + "endOffsets": "312" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5106", + "endColumns": "121", + "endOffsets": "5223" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ja/values-ja.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,202,295,400,482,580,688,766,841,932,1025,1120,1214,1314,1407,1502,1596,1687,1778,1856,1958,2056,2151,2254,2350,2446,2594,2691", + "endColumns": "96,92,104,81,97,107,77,74,90,92,94,93,99,92,94,93,90,90,77,101,97,94,102,95,95,147,96,78", + "endOffsets": "197,290,395,477,575,683,761,836,927,1020,1115,1209,1309,1402,1497,1591,1682,1773,1851,1953,2051,2146,2249,2345,2441,2589,2686,2765" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "303,400,493,598,680,778,886,964,1039,1130,1223,1318,1412,1512,1605,1700,1794,1885,1976,2054,2156,2254,2349,2452,2548,2644,2792,10645", + "endColumns": "96,92,104,81,97,107,77,74,90,92,94,93,99,92,94,93,90,90,77,101,97,94,102,95,95,147,96,78", + "endOffsets": "395,488,593,675,773,881,959,1034,1125,1218,1313,1407,1507,1600,1695,1789,1880,1971,2049,2151,2249,2344,2447,2543,2639,2787,2884,10719" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ja/values-ja.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,253,320,384,453,534,616,701,805,881,934,997,1081,1145,1203,1284,1345,1409,1464,1523,1580,1634,1727,1783,1840,1894,1960,2060,2136,2207,2286,2359,2440,2562,2624,2686,2787,2866,2941,2994,3045,3111,3181,3251,3322,3392,3456,3527,3595,3658,3749,3828,3891,3971,4053,4125,4196,4268,4316,4388,4452,4527,4604,4666,4730,4793,4860,4946,5032,5113,5196,5253,5308,5381,5459,5532", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,66,63,68,80,81,84,103,75,52,62,83,63,57,80,60,63,54,58,56,53,92,55,56,53,65,99,75,70,78,72,80,121,61,61,100,78,74,52,50,65,69,69,70,69,63,70,67,62,90,78,62,79,81,71,70,71,47,71,63,74,76,61,63,62,66,85,85,80,82,56,54,72,77,72,70", + "endOffsets": "248,315,379,448,529,611,696,800,876,929,992,1076,1140,1198,1279,1340,1404,1459,1518,1575,1629,1722,1778,1835,1889,1955,2055,2131,2202,2281,2354,2435,2557,2619,2681,2782,2861,2936,2989,3040,3106,3176,3246,3317,3387,3451,3522,3590,3653,3744,3823,3886,3966,4048,4120,4191,4263,4311,4383,4447,4522,4599,4661,4725,4788,4855,4941,5027,5108,5191,5248,5303,5376,5454,5527,5598" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2889,2956,3020,3089,3170,3921,4006,4110,6145,6198,6261,6345,6409,6467,6548,6609,6673,6728,6787,6844,6898,6991,7047,7104,7158,7224,7324,7400,7471,7550,7623,7704,7826,7888,7950,8051,8130,8205,8258,8309,8375,8445,8515,8586,8656,8720,8791,8859,8922,9013,9092,9155,9235,9317,9389,9460,9532,9580,9652,9716,9791,9868,9930,9994,10057,10124,10210,10296,10377,10460,10517,10572,10724,10802,10875", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,66,63,68,80,81,84,103,75,52,62,83,63,57,80,60,63,54,58,56,53,92,55,56,53,65,99,75,70,78,72,80,121,61,61,100,78,74,52,50,65,69,69,70,69,63,70,67,62,90,78,62,79,81,71,70,71,47,71,63,74,76,61,63,62,66,85,85,80,82,56,54,72,77,72,70", + "endOffsets": "298,2951,3015,3084,3165,3247,4001,4105,4181,6193,6256,6340,6404,6462,6543,6604,6668,6723,6782,6839,6893,6986,7042,7099,7153,7219,7319,7395,7466,7545,7618,7699,7821,7883,7945,8046,8125,8200,8253,8304,8370,8440,8510,8581,8651,8715,8786,8854,8917,9008,9087,9150,9230,9312,9384,9455,9527,9575,9647,9711,9786,9863,9925,9989,10052,10119,10205,10291,10372,10455,10512,10567,10640,10797,10870,10941" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ja/values-ja.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,147,247,341,437,530,623,724", + "endColumns": "91,99,93,95,92,92,100,100", + "endOffsets": "142,242,336,432,525,618,719,820" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3252,3344,3444,3538,3634,3727,3820,10946", + "endColumns": "91,99,93,95,92,92,100,100", + "endOffsets": "3339,3439,3533,3629,3722,3815,3916,11042" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ka.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ka.json new file mode 100644 index 0000000..9c00793 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ka.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-ka/values-ka.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ka/values-ka.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,273,351,425,509,602,696,795,920,1008,1071,1138,1235,1304,1367,1454,1518,1584,1644,1713,1774,1828,1943,2002,2062,2116,2188,2318,2406,2485,2583,2671,2755,2893,2971,3047,3186,3280,3360,3416,3470,3536,3609,3687,3758,3842,3915,3993,4066,4141,4251,4341,4416,4510,4608,4682,4759,4859,4912,4996,5064,5153,5242,5304,5369,5432,5502,5609,5709,5809,5905,5965,6023,6103,6193,6268", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,77,73,83,92,93,98,124,87,62,66,96,68,62,86,63,65,59,68,60,53,114,58,59,53,71,129,87,78,97,87,83,137,77,75,138,93,79,55,53,65,72,77,70,83,72,77,72,74,109,89,74,93,97,73,76,99,52,83,67,88,88,61,64,62,69,106,99,99,95,59,57,79,89,74,80", + "endOffsets": "268,346,420,504,597,691,790,915,1003,1066,1133,1230,1299,1362,1449,1513,1579,1639,1708,1769,1823,1938,1997,2057,2111,2183,2313,2401,2480,2578,2666,2750,2888,2966,3042,3181,3275,3355,3411,3465,3531,3604,3682,3753,3837,3910,3988,4061,4136,4246,4336,4411,4505,4603,4677,4754,4854,4907,4991,5059,5148,5237,5299,5364,5427,5497,5604,5704,5804,5900,5960,6018,6098,6188,6263,6344" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3026,3104,3178,3262,3355,4173,4272,4397,6705,6768,6835,6932,7001,7064,7151,7215,7281,7341,7410,7471,7525,7640,7699,7759,7813,7885,8015,8103,8182,8280,8368,8452,8590,8668,8744,8883,8977,9057,9113,9167,9233,9306,9384,9455,9539,9612,9690,9763,9838,9948,10038,10113,10207,10305,10379,10456,10556,10609,10693,10761,10850,10939,11001,11066,11129,11199,11306,11406,11506,11602,11662,11720,11882,11972,12047", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,77,73,83,92,93,98,124,87,62,66,96,68,62,86,63,65,59,68,60,53,114,58,59,53,71,129,87,78,97,87,83,137,77,75,138,93,79,55,53,65,72,77,70,83,72,77,72,74,109,89,74,93,97,73,76,99,52,83,67,88,88,61,64,62,69,106,99,99,95,59,57,79,89,74,80", + "endOffsets": "318,3099,3173,3257,3350,3444,4267,4392,4480,6763,6830,6927,6996,7059,7146,7210,7276,7336,7405,7466,7520,7635,7694,7754,7808,7880,8010,8098,8177,8275,8363,8447,8585,8663,8739,8878,8972,9052,9108,9162,9228,9301,9379,9450,9534,9607,9685,9758,9833,9943,10033,10108,10202,10300,10374,10451,10551,10604,10688,10756,10845,10934,10996,11061,11124,11194,11301,11401,11501,11597,11657,11715,11795,11967,12042,12123" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ka/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "138", + "endOffsets": "333" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5495", + "endColumns": "142", + "endOffsets": "5633" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ka/values-ka.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,316,427,513,618,731,814,893,984,1077,1172,1266,1366,1459,1554,1649,1740,1831,1912,2025,2131,2229,2342,2447,2551,2709,2808", + "endColumns": "107,102,110,85,104,112,82,78,90,92,94,93,99,92,94,94,90,90,80,112,105,97,112,104,103,157,98,81", + "endOffsets": "208,311,422,508,613,726,809,888,979,1072,1167,1261,1361,1454,1549,1644,1735,1826,1907,2020,2126,2224,2337,2442,2546,2704,2803,2885" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "323,431,534,645,731,836,949,1032,1111,1202,1295,1390,1484,1584,1677,1772,1867,1958,2049,2130,2243,2349,2447,2560,2665,2769,2927,11800", + "endColumns": "107,102,110,85,104,112,82,78,90,92,94,93,99,92,94,94,90,90,80,112,105,97,112,104,103,157,98,81", + "endOffsets": "426,529,640,726,831,944,1027,1106,1197,1290,1385,1479,1579,1672,1767,1862,1953,2044,2125,2238,2344,2442,2555,2660,2764,2922,3021,11877" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ka/values-ka.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,352,451,557,661,779", + "endColumns": "95,101,98,98,105,103,117,100", + "endOffsets": "146,248,347,446,552,656,774,875" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3449,3545,3647,3746,3845,3951,4055,12128", + "endColumns": "95,101,98,98,105,103,117,100", + "endOffsets": "3540,3642,3741,3840,3946,4050,4168,12224" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ka/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,294,439,563,669,819,949,1067,1171,1340,1444,1595,1719,1876,2011,2073,2130", + "endColumns": "100,144,123,105,149,129,117,103,168,103,150,123,156,134,61,56,71", + "endOffsets": "293,438,562,668,818,948,1066,1170,1339,1443,1594,1718,1875,2010,2072,2129,2201" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4485,4590,4739,4867,4977,5131,5265,5387,5638,5811,5919,6074,6202,6363,6502,6568,6629", + "endColumns": "104,148,127,109,153,133,121,107,172,107,154,127,160,138,65,60,75", + "endOffsets": "4585,4734,4862,4972,5126,5260,5382,5490,5806,5914,6069,6197,6358,6497,6563,6624,6700" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-kk.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-kk.json new file mode 100644 index 0000000..866bf16 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-kk.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-kk/values-kk.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-kk/values-kk.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,150,252,354,457,561,658,769", + "endColumns": "94,101,101,102,103,96,110,100", + "endOffsets": "145,247,349,452,556,653,764,865" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3429,3524,3626,3728,3831,3935,4032,12036", + "endColumns": "94,101,101,102,103,96,110,100", + "endOffsets": "3519,3621,3723,3826,3930,4027,4138,12132" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-kk/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,292,441,563,665,801,923,1042,1147,1308,1410,1563,1688,1837,1990,2049,2104", + "endColumns": "98,148,121,101,135,121,118,104,160,101,152,124,148,152,58,54,73", + "endOffsets": "291,440,562,664,800,922,1041,1146,1307,1409,1562,1687,1836,1989,2048,2103,2177" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4429,4532,4685,4811,4917,5057,5183,5306,5579,5744,5850,6007,6136,6289,6446,6509,6568", + "endColumns": "102,152,125,105,139,125,122,108,164,105,156,128,152,156,62,58,77", + "endOffsets": "4527,4680,4806,4912,5052,5178,5301,5410,5739,5845,6002,6131,6284,6441,6504,6563,6641" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-kk/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "159", + "endOffsets": "354" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5415", + "endColumns": "163", + "endOffsets": "5574" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-kk/values-kk.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,318,428,513,619,738,818,895,986,1079,1174,1268,1368,1461,1556,1653,1744,1835,1916,2021,2124,2222,2329,2435,2535,2701,2796", + "endColumns": "107,104,109,84,105,118,79,76,90,92,94,93,99,92,94,96,90,90,80,104,102,97,106,105,99,165,94,81", + "endOffsets": "208,313,423,508,614,733,813,890,981,1074,1169,1263,1363,1456,1551,1648,1739,1830,1911,2016,2119,2217,2324,2430,2530,2696,2791,2873" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "323,431,536,646,731,837,956,1036,1113,1204,1297,1392,1486,1586,1679,1774,1871,1962,2053,2134,2239,2342,2440,2547,2653,2753,2919,11715", + "endColumns": "107,104,109,84,105,118,79,76,90,92,94,93,99,92,94,96,90,90,80,104,102,97,106,105,99,165,94,81", + "endOffsets": "426,531,641,726,832,951,1031,1108,1199,1292,1387,1481,1581,1674,1769,1866,1957,2048,2129,2234,2337,2435,2542,2648,2748,2914,3009,11792" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-kk/values-kk.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,273,351,427,506,600,688,780,892,974,1034,1098,1193,1263,1326,1433,1498,1565,1626,1693,1755,1809,1923,1982,2043,2097,2172,2298,2386,2472,2573,2663,2753,2895,2967,3040,3177,3266,3347,3404,3460,3526,3597,3674,3745,3825,3897,3973,4054,4124,4224,4311,4383,4474,4567,4641,4716,4808,4860,4942,5008,5092,5178,5240,5304,5367,5436,5540,5644,5738,5838,5899,5959,6043,6127,6203", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,77,75,78,93,87,91,111,81,59,63,94,69,62,106,64,66,60,66,61,53,113,58,60,53,74,125,87,85,100,89,89,141,71,72,136,88,80,56,55,65,70,76,70,79,71,75,80,69,99,86,71,90,92,73,74,91,51,81,65,83,85,61,63,62,68,103,103,93,99,60,59,83,83,75,78", + "endOffsets": "268,346,422,501,595,683,775,887,969,1029,1093,1188,1258,1321,1428,1493,1560,1621,1688,1750,1804,1918,1977,2038,2092,2167,2293,2381,2467,2568,2658,2748,2890,2962,3035,3172,3261,3342,3399,3455,3521,3592,3669,3740,3820,3892,3968,4049,4119,4219,4306,4378,4469,4562,4636,4711,4803,4855,4937,5003,5087,5173,5235,5299,5362,5431,5535,5639,5733,5833,5894,5954,6038,6122,6198,6277" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3014,3092,3168,3247,3341,4143,4235,4347,6646,6706,6770,6865,6935,6998,7105,7170,7237,7298,7365,7427,7481,7595,7654,7715,7769,7844,7970,8058,8144,8245,8335,8425,8567,8639,8712,8849,8938,9019,9076,9132,9198,9269,9346,9417,9497,9569,9645,9726,9796,9896,9983,10055,10146,10239,10313,10388,10480,10532,10614,10680,10764,10850,10912,10976,11039,11108,11212,11316,11410,11510,11571,11631,11797,11881,11957", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,77,75,78,93,87,91,111,81,59,63,94,69,62,106,64,66,60,66,61,53,113,58,60,53,74,125,87,85,100,89,89,141,71,72,136,88,80,56,55,65,70,76,70,79,71,75,80,69,99,86,71,90,92,73,74,91,51,81,65,83,85,61,63,62,68,103,103,93,99,60,59,83,83,75,78", + "endOffsets": "318,3087,3163,3242,3336,3424,4230,4342,4424,6701,6765,6860,6930,6993,7100,7165,7232,7293,7360,7422,7476,7590,7649,7710,7764,7839,7965,8053,8139,8240,8330,8420,8562,8634,8707,8844,8933,9014,9071,9127,9193,9264,9341,9412,9492,9564,9640,9721,9791,9891,9978,10050,10141,10234,10308,10383,10475,10527,10609,10675,10759,10845,10907,10971,11034,11103,11207,11311,11405,11505,11566,11626,11710,11876,11952,12031" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-km.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-km.json new file mode 100644 index 0000000..0a713c5 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-km.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-km/values-km.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-km/values-km.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,150,253,351,451,552,664,776", + "endColumns": "94,102,97,99,100,111,111,100", + "endOffsets": "145,248,346,446,547,659,771,872" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3399,3494,3597,3695,3795,3896,4008,12062", + "endColumns": "94,102,97,99,100,111,111,100", + "endOffsets": "3489,3592,3690,3790,3891,4003,4115,12158" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-km/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "144", + "endOffsets": "339" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5411", + "endColumns": "148", + "endOffsets": "5555" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-km/values-km.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,269,347,423,503,582,661,761,873,953,1019,1084,1178,1248,1310,1397,1460,1525,1584,1649,1710,1767,1886,1944,2005,2062,2133,2263,2349,2425,2510,2592,2670,2808,2883,2954,3104,3201,3279,3334,3390,3456,3536,3626,3697,3782,3861,3938,4008,4083,4195,4283,4356,4456,4555,4629,4705,4812,4866,4956,5029,5120,5216,5278,5342,5405,5476,5575,5673,5765,5861,5919,5979,6062,6144,6222", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,77,75,79,78,78,99,111,79,65,64,93,69,61,86,62,64,58,64,60,56,118,57,60,56,70,129,85,75,84,81,77,137,74,70,149,96,77,54,55,65,79,89,70,84,78,76,69,74,111,87,72,99,98,73,75,106,53,89,72,90,95,61,63,62,70,98,97,91,95,57,59,82,81,77,75", + "endOffsets": "264,342,418,498,577,656,756,868,948,1014,1079,1173,1243,1305,1392,1455,1520,1579,1644,1705,1762,1881,1939,2000,2057,2128,2258,2344,2420,2505,2587,2665,2803,2878,2949,3099,3196,3274,3329,3385,3451,3531,3621,3692,3777,3856,3933,4003,4078,4190,4278,4351,4451,4550,4624,4700,4807,4861,4951,5024,5115,5211,5273,5337,5400,5471,5570,5668,5760,5856,5914,5974,6057,6139,6217,6293" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3007,3085,3161,3241,3320,4120,4220,4332,6633,6699,6764,6858,6928,6990,7077,7140,7205,7264,7329,7390,7447,7566,7624,7685,7742,7813,7943,8029,8105,8190,8272,8350,8488,8563,8634,8784,8881,8959,9014,9070,9136,9216,9306,9377,9462,9541,9618,9688,9763,9875,9963,10036,10136,10235,10309,10385,10492,10546,10636,10709,10800,10896,10958,11022,11085,11156,11255,11353,11445,11541,11599,11659,11826,11908,11986", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,77,75,79,78,78,99,111,79,65,64,93,69,61,86,62,64,58,64,60,56,118,57,60,56,70,129,85,75,84,81,77,137,74,70,149,96,77,54,55,65,79,89,70,84,78,76,69,74,111,87,72,99,98,73,75,106,53,89,72,90,95,61,63,62,70,98,97,91,95,57,59,82,81,77,75", + "endOffsets": "314,3080,3156,3236,3315,3394,4215,4327,4407,6694,6759,6853,6923,6985,7072,7135,7200,7259,7324,7385,7442,7561,7619,7680,7737,7808,7938,8024,8100,8185,8267,8345,8483,8558,8629,8779,8876,8954,9009,9065,9131,9211,9301,9372,9457,9536,9613,9683,9758,9870,9958,10031,10131,10230,10304,10380,10487,10541,10631,10704,10795,10891,10953,11017,11080,11151,11250,11348,11440,11536,11594,11654,11737,11903,11981,12057" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-km/values-km.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,207,306,416,503,606,727,805,881,972,1065,1157,1251,1351,1444,1539,1633,1724,1815,1898,2002,2106,2206,2315,2424,2533,2695,2793", + "endColumns": "101,98,109,86,102,120,77,75,90,92,91,93,99,92,94,93,90,90,82,103,103,99,108,108,108,161,97,83", + "endOffsets": "202,301,411,498,601,722,800,876,967,1060,1152,1246,1346,1439,1534,1628,1719,1810,1893,1997,2101,2201,2310,2419,2528,2690,2788,2872" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "319,421,520,630,717,820,941,1019,1095,1186,1279,1371,1465,1565,1658,1753,1847,1938,2029,2112,2216,2320,2420,2529,2638,2747,2909,11742", + "endColumns": "101,98,109,86,102,120,77,75,90,92,91,93,99,92,94,93,90,90,82,103,103,99,108,108,108,161,97,83", + "endOffsets": "416,515,625,712,815,936,1014,1090,1181,1274,1366,1460,1560,1653,1748,1842,1933,2024,2107,2211,2315,2415,2524,2633,2742,2904,3002,11821" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-km/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,291,442,559,660,818,938,1055,1160,1314,1427,1594,1715,1856,2010,2070,2124", + "endColumns": "97,150,116,100,157,119,116,104,153,112,166,120,140,153,59,53,72", + "endOffsets": "290,441,558,659,817,937,1054,1159,1313,1426,1593,1714,1855,2009,2069,2123,2196" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4412,4514,4669,4790,4895,5057,5181,5302,5560,5718,5835,6006,6131,6276,6434,6498,6556", + "endColumns": "101,154,120,104,161,123,120,108,157,116,170,124,144,157,63,57,76", + "endOffsets": "4509,4664,4785,4890,5052,5176,5297,5406,5713,5830,6001,6126,6271,6429,6493,6551,6628" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-kn.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-kn.json new file mode 100644 index 0000000..ac74d96 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-kn.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-kn/values-kn.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-kn/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,300,466,595,706,845,970,1074,1169,1315,1424,1585,1716,1857,2010,2075,2134", + "endColumns": "106,165,128,110,138,124,103,94,145,108,160,130,140,152,64,58,80", + "endOffsets": "299,465,594,705,844,969,1073,1168,1314,1423,1584,1715,1856,2009,2074,2133,2214" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4587,4698,4868,5001,5116,5259,5388,5496,5741,5891,6004,6169,6304,6449,6606,6675,6738", + "endColumns": "110,169,132,114,142,128,107,98,149,112,164,134,144,156,68,62,84", + "endOffsets": "4693,4863,4996,5111,5254,5383,5491,5590,5886,5999,6164,6299,6444,6601,6670,6733,6818" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-kn/values-kn.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,219,331,444,529,636,762,840,916,1007,1100,1195,1289,1389,1482,1577,1671,1762,1853,1935,2051,2161,2260,2373,2478,2592,2756,2856", + "endColumns": "113,111,112,84,106,125,77,75,90,92,94,93,99,92,94,93,90,90,81,115,109,98,112,104,113,163,99,82", + "endOffsets": "214,326,439,524,631,757,835,911,1002,1095,1190,1284,1384,1477,1572,1666,1757,1848,1930,2046,2156,2255,2368,2473,2587,2751,2851,2934" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "327,441,553,666,751,858,984,1062,1138,1229,1322,1417,1511,1611,1704,1799,1893,1984,2075,2157,2273,2383,2482,2595,2700,2814,2978,11952", + "endColumns": "113,111,112,84,106,125,77,75,90,92,94,93,99,92,94,93,90,90,81,115,109,98,112,104,113,163,99,82", + "endOffsets": "436,548,661,746,853,979,1057,1133,1224,1317,1412,1506,1606,1699,1794,1888,1979,2070,2152,2268,2378,2477,2590,2695,2809,2973,3073,12030" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-kn/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "141", + "endOffsets": "336" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5595", + "endColumns": "145", + "endOffsets": "5736" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-kn/values-kn.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,256,357,463,564,672,800", + "endColumns": "97,102,100,105,100,107,127,100", + "endOffsets": "148,251,352,458,559,667,795,896" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3537,3635,3738,3839,3945,4046,4154,12280", + "endColumns": "97,102,100,105,100,107,127,100", + "endOffsets": "3630,3733,3834,3940,4041,4149,4277,12376" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-kn/values-kn.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,277,361,444,526,641,736,843,956,1041,1098,1161,1255,1321,1383,1486,1552,1623,1682,1758,1823,1877,1990,2048,2109,2163,2242,2358,2444,2527,2622,2708,2799,2941,3020,3099,3228,3316,3400,3457,3509,3575,3655,3745,3816,3895,3972,4049,4126,4195,4312,4411,4488,4581,4676,4750,4831,4927,4978,5062,5130,5216,5304,5367,5432,5495,5563,5668,5773,5868,5971,6032,6088,6170,6262,6341", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,83,82,81,114,94,106,112,84,56,62,93,65,61,102,65,70,58,75,64,53,112,57,60,53,78,115,85,82,94,85,90,141,78,78,128,87,83,56,51,65,79,89,70,78,76,76,76,68,116,98,76,92,94,73,80,95,50,83,67,85,87,62,64,62,67,104,104,94,102,60,55,81,91,78,73", + "endOffsets": "272,356,439,521,636,731,838,951,1036,1093,1156,1250,1316,1378,1481,1547,1618,1677,1753,1818,1872,1985,2043,2104,2158,2237,2353,2439,2522,2617,2703,2794,2936,3015,3094,3223,3311,3395,3452,3504,3570,3650,3740,3811,3890,3967,4044,4121,4190,4307,4406,4483,4576,4671,4745,4826,4922,4973,5057,5125,5211,5299,5362,5427,5490,5558,5663,5768,5863,5966,6027,6083,6165,6257,6336,6410" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3078,3162,3245,3327,3442,4282,4389,4502,6823,6880,6943,7037,7103,7165,7268,7334,7405,7464,7540,7605,7659,7772,7830,7891,7945,8024,8140,8226,8309,8404,8490,8581,8723,8802,8881,9010,9098,9182,9239,9291,9357,9437,9527,9598,9677,9754,9831,9908,9977,10094,10193,10270,10363,10458,10532,10613,10709,10760,10844,10912,10998,11086,11149,11214,11277,11345,11450,11555,11650,11753,11814,11870,12035,12127,12206", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,83,82,81,114,94,106,112,84,56,62,93,65,61,102,65,70,58,75,64,53,112,57,60,53,78,115,85,82,94,85,90,141,78,78,128,87,83,56,51,65,79,89,70,78,76,76,76,68,116,98,76,92,94,73,80,95,50,83,67,85,87,62,64,62,67,104,104,94,102,60,55,81,91,78,73", + "endOffsets": "322,3157,3240,3322,3437,3532,4384,4497,4582,6875,6938,7032,7098,7160,7263,7329,7400,7459,7535,7600,7654,7767,7825,7886,7940,8019,8135,8221,8304,8399,8485,8576,8718,8797,8876,9005,9093,9177,9234,9286,9352,9432,9522,9593,9672,9749,9826,9903,9972,10089,10188,10265,10358,10453,10527,10608,10704,10755,10839,10907,10993,11081,11144,11209,11272,11340,11445,11550,11645,11748,11809,11865,11947,12122,12201,12275" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ko.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ko.json new file mode 100644 index 0000000..5c4424b --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ko.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-ko/values-ko.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ko/values-ko.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,147,247,341,438,534,632,732", + "endColumns": "91,99,93,96,95,97,99,100", + "endOffsets": "142,242,336,433,529,627,727,828" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3230,3322,3422,3516,3613,3709,3807,10922", + "endColumns": "91,99,93,96,95,97,99,100", + "endOffsets": "3317,3417,3511,3608,3704,3802,3902,11018" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ko/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,293,428,540,638,749,862,965,1056,1197,1296,1428,1542,1656,1771,1826,1880", + "endColumns": "99,134,111,97,110,112,102,90,140,98,131,113,113,114,54,53,70", + "endOffsets": "292,427,539,637,748,861,964,1055,1196,1295,1427,1541,1655,1770,1825,1879,1950" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4171,4275,4414,4530,4632,4747,4864,4971,5187,5332,5435,5571,5689,5807,5926,5985,6043", + "endColumns": "103,138,115,101,114,116,106,94,144,102,135,117,117,118,58,57,74", + "endOffsets": "4270,4409,4525,4627,4742,4859,4966,5061,5327,5430,5566,5684,5802,5921,5980,6038,6113" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ko/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "116", + "endOffsets": "311" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5066", + "endColumns": "120", + "endOffsets": "5182" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ko/values-ko.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,249,314,378,447,521,600,683,789,864,917,979,1060,1122,1179,1266,1326,1384,1442,1501,1558,1612,1707,1763,1820,1874,1940,2044,2119,2191,2272,2350,2427,2548,2613,2678,2778,2857,2932,2982,3033,3099,3163,3233,3304,3375,3443,3514,3586,3656,3749,3829,3903,3983,4065,4137,4202,4274,4322,4395,4459,4534,4611,4673,4737,4800,4867,4951,5029,5109,5187,5241,5296,5368,5445,5518", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,64,63,68,73,78,82,105,74,52,61,80,61,56,86,59,57,57,58,56,53,94,55,56,53,65,103,74,71,80,77,76,120,64,64,99,78,74,49,50,65,63,69,70,70,67,70,71,69,92,79,73,79,81,71,64,71,47,72,63,74,76,61,63,62,66,83,77,79,77,53,54,71,76,72,70", + "endOffsets": "244,309,373,442,516,595,678,784,859,912,974,1055,1117,1174,1261,1321,1379,1437,1496,1553,1607,1702,1758,1815,1869,1935,2039,2114,2186,2267,2345,2422,2543,2608,2673,2773,2852,2927,2977,3028,3094,3158,3228,3299,3370,3438,3509,3581,3651,3744,3824,3898,3978,4060,4132,4197,4269,4317,4390,4454,4529,4606,4668,4732,4795,4862,4946,5024,5104,5182,5236,5291,5363,5440,5513,5584" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2879,2944,3008,3077,3151,3907,3990,4096,6118,6171,6233,6314,6376,6433,6520,6580,6638,6696,6755,6812,6866,6961,7017,7074,7128,7194,7298,7373,7445,7526,7604,7681,7802,7867,7932,8032,8111,8186,8236,8287,8353,8417,8487,8558,8629,8697,8768,8840,8910,9003,9083,9157,9237,9319,9391,9456,9528,9576,9649,9713,9788,9865,9927,9991,10054,10121,10205,10283,10363,10441,10495,10550,10701,10778,10851", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,64,63,68,73,78,82,105,74,52,61,80,61,56,86,59,57,57,58,56,53,94,55,56,53,65,103,74,71,80,77,76,120,64,64,99,78,74,49,50,65,63,69,70,70,67,70,71,69,92,79,73,79,81,71,64,71,47,72,63,74,76,61,63,62,66,83,77,79,77,53,54,71,76,72,70", + "endOffsets": "294,2939,3003,3072,3146,3225,3985,4091,4166,6166,6228,6309,6371,6428,6515,6575,6633,6691,6750,6807,6861,6956,7012,7069,7123,7189,7293,7368,7440,7521,7599,7676,7797,7862,7927,8027,8106,8181,8231,8282,8348,8412,8482,8553,8624,8692,8763,8835,8905,8998,9078,9152,9232,9314,9386,9451,9523,9571,9644,9708,9783,9860,9922,9986,10049,10116,10200,10278,10358,10436,10490,10545,10617,10773,10846,10917" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ko/values-ko.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,202,296,397,479,577,683,763,838,929,1022,1117,1211,1311,1404,1499,1593,1684,1775,1855,1953,2047,2142,2242,2339,2439,2591,2685", + "endColumns": "96,93,100,81,97,105,79,74,90,92,94,93,99,92,94,93,90,90,79,97,93,94,99,96,99,151,93,78", + "endOffsets": "197,291,392,474,572,678,758,833,924,1017,1112,1206,1306,1399,1494,1588,1679,1770,1850,1948,2042,2137,2237,2334,2434,2586,2680,2759" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "299,396,490,591,673,771,877,957,1032,1123,1216,1311,1405,1505,1598,1693,1787,1878,1969,2049,2147,2241,2336,2436,2533,2633,2785,10622", + "endColumns": "96,93,100,81,97,105,79,74,90,92,94,93,99,92,94,93,90,90,79,97,93,94,99,96,99,151,93,78", + "endOffsets": "391,485,586,668,766,872,952,1027,1118,1211,1306,1400,1500,1593,1688,1782,1873,1964,2044,2142,2236,2331,2431,2528,2628,2780,2874,10696" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ky.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ky.json new file mode 100644 index 0000000..5190538 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ky.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-ky/values-ky.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ky/values-ky.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,265,348,433,518,633,743,844,985,1069,1129,1193,1287,1357,1418,1505,1568,1632,1691,1765,1827,1881,1998,2056,2117,2171,2245,2367,2451,2530,2630,2716,2812,2944,3022,3100,3229,3318,3398,3459,3514,3580,3649,3726,3797,3878,3952,4028,4118,4191,4293,4378,4457,4547,4639,4713,4798,4888,4940,5024,5089,5174,5259,5321,5385,5448,5517,5634,5742,5842,5946,6011,6070,6152,6238,6314", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,82,84,84,114,109,100,140,83,59,63,93,69,60,86,62,63,58,73,61,53,116,57,60,53,73,121,83,78,99,85,95,131,77,77,128,88,79,60,54,65,68,76,70,80,73,75,89,72,101,84,78,89,91,73,84,89,51,83,64,84,84,61,63,62,68,116,107,99,103,64,58,81,85,75,82", + "endOffsets": "260,343,428,513,628,738,839,980,1064,1124,1188,1282,1352,1413,1500,1563,1627,1686,1760,1822,1876,1993,2051,2112,2166,2240,2362,2446,2525,2625,2711,2807,2939,3017,3095,3224,3313,3393,3454,3509,3575,3644,3721,3792,3873,3947,4023,4113,4186,4288,4373,4452,4542,4634,4708,4793,4883,4935,5019,5084,5169,5254,5316,5380,5443,5512,5629,5737,5837,5941,6006,6065,6147,6233,6309,6392" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3027,3110,3195,3280,3395,4236,4337,4478,6766,6826,6890,6984,7054,7115,7202,7265,7329,7388,7462,7524,7578,7695,7753,7814,7868,7942,8064,8148,8227,8327,8413,8509,8641,8719,8797,8926,9015,9095,9156,9211,9277,9346,9423,9494,9575,9649,9725,9815,9888,9990,10075,10154,10244,10336,10410,10495,10585,10637,10721,10786,10871,10956,11018,11082,11145,11214,11331,11439,11539,11643,11708,11767,11931,12017,12093", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,82,84,84,114,109,100,140,83,59,63,93,69,60,86,62,63,58,73,61,53,116,57,60,53,73,121,83,78,99,85,95,131,77,77,128,88,79,60,54,65,68,76,70,80,73,75,89,72,101,84,78,89,91,73,84,89,51,83,64,84,84,61,63,62,68,116,107,99,103,64,58,81,85,75,82", + "endOffsets": "310,3105,3190,3275,3390,3500,4332,4473,4557,6821,6885,6979,7049,7110,7197,7260,7324,7383,7457,7519,7573,7690,7748,7809,7863,7937,8059,8143,8222,8322,8408,8504,8636,8714,8792,8921,9010,9090,9151,9206,9272,9341,9418,9489,9570,9644,9720,9810,9883,9985,10070,10149,10239,10331,10405,10490,10580,10632,10716,10781,10866,10951,11013,11077,11140,11209,11326,11434,11534,11638,11703,11762,11844,12012,12088,12171" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ky/values-ky.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,216,325,437,522,627,744,823,901,992,1085,1180,1274,1374,1467,1562,1657,1748,1839,1920,2026,2131,2229,2336,2439,2554,2715,2817", + "endColumns": "110,108,111,84,104,116,78,77,90,92,94,93,99,92,94,94,90,90,80,105,104,97,106,102,114,160,101,81", + "endOffsets": "211,320,432,517,622,739,818,896,987,1080,1175,1269,1369,1462,1557,1652,1743,1834,1915,2021,2126,2224,2331,2434,2549,2710,2812,2894" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "315,426,535,647,732,837,954,1033,1111,1202,1295,1390,1484,1584,1677,1772,1867,1958,2049,2130,2236,2341,2439,2546,2649,2764,2925,11849", + "endColumns": "110,108,111,84,104,116,78,77,90,92,94,93,99,92,94,94,90,90,80,105,104,97,106,102,114,160,101,81", + "endOffsets": "421,530,642,727,832,949,1028,1106,1197,1290,1385,1479,1579,1672,1767,1862,1953,2044,2125,2231,2336,2434,2541,2644,2759,2920,3022,11926" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ky/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "153", + "endOffsets": "348" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5549", + "endColumns": "157", + "endOffsets": "5702" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ky/values-ky.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,155,257,360,467,571,675,786", + "endColumns": "99,101,102,106,103,103,110,100", + "endOffsets": "150,252,355,462,566,670,781,882" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3505,3605,3707,3810,3917,4021,4125,12176", + "endColumns": "99,101,102,106,103,103,110,100", + "endOffsets": "3600,3702,3805,3912,4016,4120,4231,12272" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ky/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,440,565,668,809,932,1043,1148,1313,1416,1562,1688,1821,1981,2041,2097", + "endColumns": "101,144,124,102,140,122,110,104,164,102,145,125,132,159,59,55,73", + "endOffsets": "294,439,564,667,808,931,1042,1147,1312,1415,1561,1687,1820,1980,2040,2096,2170" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4562,4668,4817,4946,5053,5198,5325,5440,5707,5876,5983,6133,6263,6400,6564,6628,6688", + "endColumns": "105,148,128,106,144,126,114,108,168,106,149,129,136,163,63,59,77", + "endOffsets": "4663,4812,4941,5048,5193,5320,5435,5544,5871,5978,6128,6258,6395,6559,6623,6683,6761" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-land.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-land.json new file mode 100644 index 0000000..9e6c97d --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-land.json @@ -0,0 +1,38 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-land/values-land.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-land/values-land.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,26,35,40", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,130,204,277,347,419,489,554,621,691,763,832,901,983,1073,1149,1217,1284,1362,1427,1494,1666,2235,2504", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,25,34,39,42", + "endColumns": "74,73,72,69,71,69,64,66,69,71,68,68,81,89,75,67,66,77,64,66,10,10,10,10", + "endOffsets": "125,199,272,342,414,484,549,616,686,758,827,896,978,1068,1144,1212,1279,1357,1422,1489,1661,2230,2499,2727" + }, + "to": { + "startLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,29,38,43", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "264,339,413,486,556,628,698,763,830,900,972,1041,1110,1192,1282,1358,1426,1493,1571,1636,1703,1875,2444,2713", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,28,37,42,45", + "endColumns": "74,73,72,69,71,69,64,66,69,71,68,68,81,89,75,67,66,77,64,66,10,10,10,10", + "endOffsets": "334,408,481,551,623,693,758,825,895,967,1036,1105,1187,1277,1353,1421,1488,1566,1631,1698,1870,2439,2708,2936" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-land/values-land.xml", + "from": { + "startLines": "2,3,4", + "startColumns": "4,4,4", + "startOffsets": "55,125,196", + "endColumns": "69,70,67", + "endOffsets": "120,191,259" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-large-v4.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-large-v4.json new file mode 100644 index 0000000..99855bd --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-large-v4.json @@ -0,0 +1,36 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-large-v4/values-large-v4.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-large-v4/values-large-v4.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10", + "startColumns": "4,4,4,4,4,4,4,4,4", + "startOffsets": "55,114,185,256,326,396,464,532,636", + "endColumns": "58,70,70,69,69,67,67,103,115", + "endOffsets": "109,180,251,321,391,459,527,631,747" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-large-v4/values-large-v4.xml", + "from": { + "startLines": "2,3,4,5", + "startColumns": "4,4,4,4", + "startOffsets": "55,169,285,407", + "endColumns": "113,115,121,133", + "endOffsets": "164,280,402,536" + }, + "to": { + "startLines": "11,12,13,14", + "startColumns": "4,4,4,4", + "startOffsets": "752,866,982,1104", + "endColumns": "113,115,121,133", + "endOffsets": "861,977,1099,1233" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ldltr-v21.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ldltr-v21.json new file mode 100644 index 0000000..a6b1716 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ldltr-v21.json @@ -0,0 +1,19 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-ldltr-v21/values-ldltr-v21.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ldltr-v21/values-ldltr-v21.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "112", + "endOffsets": "163" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ldrtl-v17.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ldrtl-v17.json new file mode 100644 index 0000000..2cae9f2 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ldrtl-v17.json @@ -0,0 +1,19 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-ldrtl-v17/values-ldrtl-v17.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ldrtl-v17/values-ldrtl-v17.xml", + "from": { + "startLines": "2,3", + "startColumns": "4,4", + "startOffsets": "55,191", + "endColumns": "135,140", + "endOffsets": "186,327" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-lo.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-lo.json new file mode 100644 index 0000000..3325e7e --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-lo.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-lo/values-lo.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-lo/values-lo.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,254,353,451,552,650,761", + "endColumns": "95,102,98,97,100,97,110,100", + "endOffsets": "146,249,348,446,547,645,756,857" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3381,3477,3580,3679,3777,3878,3976,11936", + "endColumns": "95,102,98,97,100,97,110,100", + "endOffsets": "3472,3575,3674,3772,3873,3971,4082,12032" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-lo/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,463,589,692,840,961,1065,1177,1325,1426,1588,1713,1880,2037,2101,2166", + "endColumns": "103,165,125,102,147,120,103,111,147,100,161,124,166,156,63,64,80", + "endOffsets": "296,462,588,691,839,960,1064,1176,1324,1425,1587,1712,1879,2036,2100,2165,2246" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4404,4512,4682,4812,4919,5071,5196,5304,5552,5704,5809,5975,6104,6275,6436,6504,6573", + "endColumns": "107,169,129,106,151,124,107,115,151,104,165,128,170,160,67,68,84", + "endOffsets": "4507,4677,4807,4914,5066,5191,5299,5415,5699,5804,5970,6099,6270,6431,6499,6568,6653" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-lo/values-lo.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,269,343,414,495,581,664,779,898,981,1048,1114,1203,1272,1331,1426,1492,1557,1615,1680,1741,1801,1907,1968,2028,2086,2157,2276,2362,2439,2529,2614,2696,2839,2914,2990,3121,3211,3289,3344,3399,3465,3534,3608,3679,3758,3831,3908,3977,4047,4144,4229,4304,4397,4490,4564,4633,4727,4779,4862,4929,5013,5097,5159,5223,5286,5356,5455,5553,5648,5742,5801,5860,5939,6024,6101", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,73,70,80,85,82,114,118,82,66,65,88,68,58,94,65,64,57,64,60,59,105,60,59,57,70,118,85,76,89,84,81,142,74,75,130,89,77,54,54,65,68,73,70,78,72,76,68,69,96,84,74,92,92,73,68,93,51,82,66,83,83,61,63,62,69,98,97,94,93,58,58,78,84,76,75", + "endOffsets": "264,338,409,490,576,659,774,893,976,1043,1109,1198,1267,1326,1421,1487,1552,1610,1675,1736,1796,1902,1963,2023,2081,2152,2271,2357,2434,2524,2609,2691,2834,2909,2985,3116,3206,3284,3339,3394,3460,3529,3603,3674,3753,3826,3903,3972,4042,4139,4224,4299,4392,4485,4559,4628,4722,4774,4857,4924,5008,5092,5154,5218,5281,5351,5450,5548,5643,5737,5796,5855,5934,6019,6096,6172" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2986,3060,3131,3212,3298,4087,4202,4321,6658,6725,6791,6880,6949,7008,7103,7169,7234,7292,7357,7418,7478,7584,7645,7705,7763,7834,7953,8039,8116,8206,8291,8373,8516,8591,8667,8798,8888,8966,9021,9076,9142,9211,9285,9356,9435,9508,9585,9654,9724,9821,9906,9981,10074,10167,10241,10310,10404,10456,10539,10606,10690,10774,10836,10900,10963,11033,11132,11230,11325,11419,11478,11537,11698,11783,11860", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,73,70,80,85,82,114,118,82,66,65,88,68,58,94,65,64,57,64,60,59,105,60,59,57,70,118,85,76,89,84,81,142,74,75,130,89,77,54,54,65,68,73,70,78,72,76,68,69,96,84,74,92,92,73,68,93,51,82,66,83,83,61,63,62,69,98,97,94,93,58,58,78,84,76,75", + "endOffsets": "314,3055,3126,3207,3293,3376,4197,4316,4399,6720,6786,6875,6944,7003,7098,7164,7229,7287,7352,7413,7473,7579,7640,7700,7758,7829,7948,8034,8111,8201,8286,8368,8511,8586,8662,8793,8883,8961,9016,9071,9137,9206,9280,9351,9430,9503,9580,9649,9719,9816,9901,9976,10069,10162,10236,10305,10399,10451,10534,10601,10685,10769,10831,10895,10958,11028,11127,11225,11320,11414,11473,11532,11611,11778,11855,11931" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-lo/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "127", + "endOffsets": "322" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5420", + "endColumns": "131", + "endOffsets": "5547" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-lo/values-lo.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,208,311,424,509,613,724,802,879,970,1063,1155,1249,1349,1442,1537,1633,1724,1815,1896,2003,2107,2205,2308,2412,2516,2673,2772", + "endColumns": "102,102,112,84,103,110,77,76,90,92,91,93,99,92,94,95,90,90,80,106,103,97,102,103,103,156,98,81", + "endOffsets": "203,306,419,504,608,719,797,874,965,1058,1150,1244,1344,1437,1532,1628,1719,1810,1891,1998,2102,2200,2303,2407,2511,2668,2767,2849" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "319,422,525,638,723,827,938,1016,1093,1184,1277,1369,1463,1563,1656,1751,1847,1938,2029,2110,2217,2321,2419,2522,2626,2730,2887,11616", + "endColumns": "102,102,112,84,103,110,77,76,90,92,91,93,99,92,94,95,90,90,80,106,103,97,102,103,103,156,98,81", + "endOffsets": "417,520,633,718,822,933,1011,1088,1179,1272,1364,1458,1558,1651,1746,1842,1933,2024,2105,2212,2316,2414,2517,2621,2725,2882,2981,11693" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-lt.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-lt.json new file mode 100644 index 0000000..7260bc6 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-lt.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-lt/values-lt.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-lt/values-lt.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,221,325,438,525,627,749,832,912,1006,1102,1199,1295,1398,1494,1592,1688,1782,1876,1959,2068,2176,2276,2386,2491,2597,2773,2874", + "endColumns": "115,103,112,86,101,121,82,79,93,95,96,95,102,95,97,95,93,93,82,108,107,99,109,104,105,175,100,83", + "endOffsets": "216,320,433,520,622,744,827,907,1001,1097,1194,1290,1393,1489,1587,1683,1777,1871,1954,2063,2171,2271,2381,2486,2592,2768,2869,2953" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,132", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "425,541,645,758,845,947,1069,1152,1232,1326,1422,1519,1615,1718,1814,1912,2008,2102,2196,2279,2388,2496,2596,2706,2811,2917,3093,12114", + "endColumns": "115,103,112,86,101,121,82,79,93,95,96,95,102,95,97,95,93,93,82,108,107,99,109,104,105,175,100,83", + "endOffsets": "536,640,753,840,942,1064,1147,1227,1321,1417,1514,1610,1713,1809,1907,2003,2097,2191,2274,2383,2491,2591,2701,2806,2912,3088,3189,12193" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-lt/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,444,572,675,824,950,1065,1167,1329,1434,1595,1725,1874,2020,2084,2146", + "endColumns": "102,147,127,102,148,125,114,101,161,104,160,129,148,145,63,61,85", + "endOffsets": "295,443,571,674,823,949,1064,1166,1328,1433,1594,1724,1873,2019,2083,2145,2231" + }, + "to": { + "startLines": "50,51,52,53,54,55,56,57,59,60,61,62,63,64,65,66,67", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4667,4774,4926,5058,5165,5318,5448,5567,5832,5998,6107,6272,6406,6559,6709,6777,6843", + "endColumns": "106,151,131,106,152,129,118,105,165,108,164,133,152,149,67,65,89", + "endOffsets": "4769,4921,5053,5160,5313,5443,5562,5668,5993,6102,6267,6401,6554,6704,6772,6838,6928" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-lt/values-lt.xml", + "from": { + "startLines": "2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,375,454,532,615,709,799,895,1013,1097,1160,1226,1325,1403,1468,1578,1641,1713,1772,1846,1907,1961,2085,2146,2208,2262,2340,2474,2562,2639,2732,2813,2897,3038,3117,3201,3344,3441,3518,3574,3628,3694,3769,3848,3919,3999,4075,4153,4226,4303,4410,4497,4578,4668,4760,4832,4913,5005,5060,5142,5208,5293,5380,5442,5506,5569,5641,5752,5868,5969,6078,6138,6196,6278,6364,6440", + "endLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "endColumns": "12,78,77,82,93,89,95,117,83,62,65,98,77,64,109,62,71,58,73,60,53,123,60,61,53,77,133,87,76,92,80,83,140,78,83,142,96,76,55,53,65,74,78,70,79,75,77,72,76,106,86,80,89,91,71,80,91,54,81,65,84,86,61,63,62,71,110,115,100,108,59,57,81,85,75,77", + "endOffsets": "370,449,527,610,704,794,890,1008,1092,1155,1221,1320,1398,1463,1573,1636,1708,1767,1841,1902,1956,2080,2141,2203,2257,2335,2469,2557,2634,2727,2808,2892,3033,3112,3196,3339,3436,3513,3569,3623,3689,3764,3843,3914,3994,4070,4148,4221,4298,4405,4492,4573,4663,4755,4827,4908,5000,5055,5137,5203,5288,5375,5437,5501,5564,5636,5747,5863,5964,6073,6133,6191,6273,6359,6435,6513" + }, + "to": { + "startLines": "2,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3194,3273,3351,3434,3528,4369,4465,4583,6933,6996,7062,7161,7239,7304,7414,7477,7549,7608,7682,7743,7797,7921,7982,8044,8098,8176,8310,8398,8475,8568,8649,8733,8874,8953,9037,9180,9277,9354,9410,9464,9530,9605,9684,9755,9835,9911,9989,10062,10139,10246,10333,10414,10504,10596,10668,10749,10841,10896,10978,11044,11129,11216,11278,11342,11405,11477,11588,11704,11805,11914,11974,12032,12198,12284,12360", + "endLines": "7,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "endColumns": "12,78,77,82,93,89,95,117,83,62,65,98,77,64,109,62,71,58,73,60,53,123,60,61,53,77,133,87,76,92,80,83,140,78,83,142,96,76,55,53,65,74,78,70,79,75,77,72,76,106,86,80,89,91,71,80,91,54,81,65,84,86,61,63,62,71,110,115,100,108,59,57,81,85,75,77", + "endOffsets": "420,3268,3346,3429,3523,3613,4460,4578,4662,6991,7057,7156,7234,7299,7409,7472,7544,7603,7677,7738,7792,7916,7977,8039,8093,8171,8305,8393,8470,8563,8644,8728,8869,8948,9032,9175,9272,9349,9405,9459,9525,9600,9679,9750,9830,9906,9984,10057,10134,10241,10328,10409,10499,10591,10663,10744,10836,10891,10973,11039,11124,11211,11273,11337,11400,11472,11583,11699,11800,11909,11969,12027,12109,12279,12355,12433" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-lt/values-lt.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,263,362,465,576,686,806", + "endColumns": "97,109,98,102,110,109,119,100", + "endOffsets": "148,258,357,460,571,681,801,902" + }, + "to": { + "startLines": "40,41,42,43,44,45,46,136", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3618,3716,3826,3925,4028,4139,4249,12438", + "endColumns": "97,109,98,102,110,109,119,100", + "endOffsets": "3711,3821,3920,4023,4134,4244,4364,12534" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-lt/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "154", + "endOffsets": "349" + }, + "to": { + "startLines": "58", + "startColumns": "4", + "startOffsets": "5673", + "endColumns": "158", + "endOffsets": "5827" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-lv.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-lv.json new file mode 100644 index 0000000..0cf2786 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-lv.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-lv/values-lv.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-lv/values-lv.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,355,456,563,671,786", + "endColumns": "97,101,99,100,106,107,114,100", + "endOffsets": "148,250,350,451,558,666,781,882" + }, + "to": { + "startLines": "39,40,41,42,43,44,45,135", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3704,3802,3904,4004,4105,4212,4320,12503", + "endColumns": "97,101,99,100,106,107,114,100", + "endOffsets": "3797,3899,3999,4100,4207,4315,4430,12599" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-lv/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "161", + "endOffsets": "356" + }, + "to": { + "startLines": "57", + "startColumns": "4", + "startOffsets": "5758", + "endColumns": "165", + "endOffsets": "5919" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-lv/values-lv.xml", + "from": { + "startLines": "2,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,324,411,496,577,682,770,871,1005,1088,1149,1214,1308,1381,1442,1567,1633,1701,1762,1834,1894,1948,2068,2128,2190,2244,2321,2451,2538,2615,2705,2788,2870,3011,3091,3176,3303,3394,3470,3524,3577,3643,3717,3798,3869,3949,4022,4099,4176,4250,4360,4453,4528,4618,4709,4781,4859,4950,5004,5087,5155,5239,5326,5388,5452,5515,5587,5697,5810,5913,6022,6080,6137,6214,6299,6377", + "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "endColumns": "12,86,84,80,104,87,100,133,82,60,64,93,72,60,124,65,67,60,71,59,53,119,59,61,53,76,129,86,76,89,82,81,140,79,84,126,90,75,53,52,65,73,80,70,79,72,76,76,73,109,92,74,89,90,71,77,90,53,82,67,83,86,61,63,62,71,109,112,102,108,57,56,76,84,77,73", + "endOffsets": "319,406,491,572,677,765,866,1000,1083,1144,1209,1303,1376,1437,1562,1628,1696,1757,1829,1889,1943,2063,2123,2185,2239,2316,2446,2533,2610,2700,2783,2865,3006,3086,3171,3298,3389,3465,3519,3572,3638,3712,3793,3864,3944,4017,4094,4171,4245,4355,4448,4523,4613,4704,4776,4854,4945,4999,5082,5150,5234,5321,5383,5447,5510,5582,5692,5805,5908,6017,6075,6132,6209,6294,6372,6446" + }, + "to": { + "startLines": "2,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3258,3345,3430,3511,3616,4435,4536,4670,7057,7118,7183,7277,7350,7411,7536,7602,7670,7731,7803,7863,7917,8037,8097,8159,8213,8290,8420,8507,8584,8674,8757,8839,8980,9060,9145,9272,9363,9439,9493,9546,9612,9686,9767,9838,9918,9991,10068,10145,10219,10329,10422,10497,10587,10678,10750,10828,10919,10973,11056,11124,11208,11295,11357,11421,11484,11556,11666,11779,11882,11991,12049,12106,12266,12351,12429", + "endLines": "6,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "endColumns": "12,86,84,80,104,87,100,133,82,60,64,93,72,60,124,65,67,60,71,59,53,119,59,61,53,76,129,86,76,89,82,81,140,79,84,126,90,75,53,52,65,73,80,70,79,72,76,76,73,109,92,74,89,90,71,77,90,53,82,67,83,86,61,63,62,71,109,112,102,108,57,56,76,84,77,73", + "endOffsets": "369,3340,3425,3506,3611,3699,4531,4665,4748,7113,7178,7272,7345,7406,7531,7597,7665,7726,7798,7858,7912,8032,8092,8154,8208,8285,8415,8502,8579,8669,8752,8834,8975,9055,9140,9267,9358,9434,9488,9541,9607,9681,9762,9833,9913,9986,10063,10140,10214,10324,10417,10492,10582,10673,10745,10823,10914,10968,11051,11119,11203,11290,11352,11416,11479,11551,11661,11774,11877,11986,12044,12101,12178,12346,12424,12498" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-lv/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,453,582,686,824,951,1064,1166,1337,1442,1607,1738,1903,2054,2114,2178", + "endColumns": "102,156,128,103,137,126,112,101,170,104,164,130,164,150,59,63,84", + "endOffsets": "295,452,581,685,823,950,1063,1165,1336,1441,1606,1737,1902,2053,2113,2177,2262" + }, + "to": { + "startLines": "49,50,51,52,53,54,55,56,58,59,60,61,62,63,64,65,66", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4753,4860,5021,5154,5262,5404,5535,5652,5924,6099,6208,6377,6512,6681,6836,6900,6968", + "endColumns": "106,160,132,107,141,130,116,105,174,108,168,134,168,154,63,67,88", + "endOffsets": "4855,5016,5149,5257,5399,5530,5647,5753,6094,6203,6372,6507,6676,6831,6895,6963,7052" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-lv/values-lv.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,225,335,444,530,634,756,838,918,1028,1136,1242,1351,1462,1565,1677,1784,1889,1989,2074,2183,2294,2393,2504,2611,2716,2890,2989", + "endColumns": "119,109,108,85,103,121,81,79,109,107,105,108,110,102,111,106,104,99,84,108,110,98,110,106,104,173,98,82", + "endOffsets": "220,330,439,525,629,751,833,913,1023,1131,1237,1346,1457,1560,1672,1779,1884,1984,2069,2178,2289,2388,2499,2606,2711,2885,2984,3067" + }, + "to": { + "startLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,131", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "374,494,604,713,799,903,1025,1107,1187,1297,1405,1511,1620,1731,1834,1946,2053,2158,2258,2343,2452,2563,2662,2773,2880,2985,3159,12183", + "endColumns": "119,109,108,85,103,121,81,79,109,107,105,108,110,102,111,106,104,99,84,108,110,98,110,106,104,173,98,82", + "endOffsets": "489,599,708,794,898,1020,1102,1182,1292,1400,1506,1615,1726,1829,1941,2048,2153,2253,2338,2447,2558,2657,2768,2875,2980,3154,3253,12261" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-mk.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-mk.json new file mode 100644 index 0000000..5b224f6 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-mk.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-mk/values-mk.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-mk/values-mk.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,317,425,511,619,738,822,903,994,1087,1183,1277,1377,1470,1565,1661,1752,1843,1930,2036,2142,2243,2350,2462,2566,2722,2820", + "endColumns": "107,103,107,85,107,118,83,80,90,92,95,93,99,92,94,95,90,90,86,105,105,100,106,111,103,155,97,87", + "endOffsets": "208,312,420,506,614,733,817,898,989,1082,1178,1272,1372,1465,1560,1656,1747,1838,1925,2031,2137,2238,2345,2457,2561,2717,2815,2903" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "321,429,533,641,727,835,954,1038,1119,1210,1303,1399,1493,1593,1686,1781,1877,1968,2059,2146,2252,2358,2459,2566,2678,2782,2938,11859", + "endColumns": "107,103,107,85,107,118,83,80,90,92,95,93,99,92,94,95,90,90,86,105,105,100,106,111,103,155,97,87", + "endOffsets": "424,528,636,722,830,949,1033,1114,1205,1298,1394,1488,1588,1681,1776,1872,1963,2054,2141,2247,2353,2454,2561,2673,2777,2933,3031,11942" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-mk/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,453,582,688,829,958,1074,1180,1333,1436,1598,1727,1876,2031,2096,2156", + "endColumns": "102,156,128,105,140,128,115,105,152,102,161,128,148,154,64,59,74", + "endOffsets": "295,452,581,687,828,957,1073,1179,1332,1435,1597,1726,1875,2030,2095,2155,2230" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4491,4598,4759,4892,5002,5147,5280,5400,5647,5804,5911,6077,6210,6363,6522,6591,6655", + "endColumns": "106,160,132,109,144,132,119,109,156,106,165,132,152,158,68,63,78", + "endOffsets": "4593,4754,4887,4997,5142,5275,5395,5505,5799,5906,6072,6205,6358,6517,6586,6650,6729" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-mk/values-mk.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,352,450,555,658,774", + "endColumns": "97,101,96,97,104,102,115,100", + "endOffsets": "148,250,347,445,550,653,769,870" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3465,3563,3665,3762,3860,3965,4068,12199", + "endColumns": "97,101,96,97,104,102,115,100", + "endOffsets": "3558,3660,3757,3855,3960,4063,4179,12295" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-mk/values-mk.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,271,352,432,514,611,700,796,920,1007,1070,1136,1227,1297,1361,1464,1527,1592,1652,1720,1783,1838,1966,2023,2085,2140,2215,2355,2442,2521,2614,2700,2783,2916,2998,3083,3229,3316,3393,3447,3502,3568,3641,3717,3788,3866,3939,4015,4090,4160,4269,4357,4432,4524,4616,4690,4764,4856,4909,4991,5058,5141,5228,5290,5354,5417,5487,5601,5716,5818,5930,5988,6047,6132,6221,6305", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,80,79,81,96,88,95,123,86,62,65,90,69,63,102,62,64,59,67,62,54,127,56,61,54,74,139,86,78,92,85,82,132,81,84,145,86,76,53,54,65,72,75,70,77,72,75,74,69,108,87,74,91,91,73,73,91,52,81,66,82,86,61,63,62,69,113,114,101,111,57,58,84,88,83,78", + "endOffsets": "266,347,427,509,606,695,791,915,1002,1065,1131,1222,1292,1356,1459,1522,1587,1647,1715,1778,1833,1961,2018,2080,2135,2210,2350,2437,2516,2609,2695,2778,2911,2993,3078,3224,3311,3388,3442,3497,3563,3636,3712,3783,3861,3934,4010,4085,4155,4264,4352,4427,4519,4611,4685,4759,4851,4904,4986,5053,5136,5223,5285,5349,5412,5482,5596,5711,5813,5925,5983,6042,6127,6216,6300,6379" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3036,3117,3197,3279,3376,4184,4280,4404,6734,6797,6863,6954,7024,7088,7191,7254,7319,7379,7447,7510,7565,7693,7750,7812,7867,7942,8082,8169,8248,8341,8427,8510,8643,8725,8810,8956,9043,9120,9174,9229,9295,9368,9444,9515,9593,9666,9742,9817,9887,9996,10084,10159,10251,10343,10417,10491,10583,10636,10718,10785,10868,10955,11017,11081,11144,11214,11328,11443,11545,11657,11715,11774,11947,12036,12120", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,80,79,81,96,88,95,123,86,62,65,90,69,63,102,62,64,59,67,62,54,127,56,61,54,74,139,86,78,92,85,82,132,81,84,145,86,76,53,54,65,72,75,70,77,72,75,74,69,108,87,74,91,91,73,73,91,52,81,66,82,86,61,63,62,69,113,114,101,111,57,58,84,88,83,78", + "endOffsets": "316,3112,3192,3274,3371,3460,4275,4399,4486,6792,6858,6949,7019,7083,7186,7249,7314,7374,7442,7505,7560,7688,7745,7807,7862,7937,8077,8164,8243,8336,8422,8505,8638,8720,8805,8951,9038,9115,9169,9224,9290,9363,9439,9510,9588,9661,9737,9812,9882,9991,10079,10154,10246,10338,10412,10486,10578,10631,10713,10780,10863,10950,11012,11076,11139,11209,11323,11438,11540,11652,11710,11769,11854,12031,12115,12194" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-mk/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "132", + "endOffsets": "327" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5510", + "endColumns": "136", + "endOffsets": "5642" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ml.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ml.json new file mode 100644 index 0000000..cbbd007 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ml.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-ml/values-ml.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ml/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "155", + "endOffsets": "350" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5616", + "endColumns": "159", + "endOffsets": "5771" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ml/values-ml.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,271,351,434,521,627,726,820,930,1022,1084,1149,1248,1314,1374,1476,1538,1614,1672,1750,1815,1869,1986,2050,2114,2168,2248,2382,2468,2555,2658,2754,2843,2979,3064,3152,3304,3399,3482,3540,3592,3658,3737,3819,3890,3977,4053,4130,4207,4278,4388,4495,4575,4672,4772,4846,4927,5032,5090,5178,5245,5336,5428,5490,5554,5617,5686,5789,5896,6001,6106,6168,6224,6308,6402,6480", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,79,82,86,105,98,93,109,91,61,64,98,65,59,101,61,75,57,77,64,53,116,63,63,53,79,133,85,86,102,95,88,135,84,87,151,94,82,57,51,65,78,81,70,86,75,76,76,70,109,106,79,96,99,73,80,104,57,87,66,90,91,61,63,62,68,102,106,104,104,61,55,83,93,77,75", + "endOffsets": "266,346,429,516,622,721,815,925,1017,1079,1144,1243,1309,1369,1471,1533,1609,1667,1745,1810,1864,1981,2045,2109,2163,2243,2377,2463,2550,2653,2749,2838,2974,3059,3147,3299,3394,3477,3535,3587,3653,3732,3814,3885,3972,4048,4125,4202,4273,4383,4490,4570,4667,4767,4841,4922,5027,5085,5173,5240,5331,5423,5485,5549,5612,5681,5784,5891,5996,6101,6163,6219,6303,6397,6475,6551" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3070,3150,3233,3320,3426,4262,4356,4466,6919,6981,7046,7145,7211,7271,7373,7435,7511,7569,7647,7712,7766,7883,7947,8011,8065,8145,8279,8365,8452,8555,8651,8740,8876,8961,9049,9201,9296,9379,9437,9489,9555,9634,9716,9787,9874,9950,10027,10104,10175,10285,10392,10472,10569,10669,10743,10824,10929,10987,11075,11142,11233,11325,11387,11451,11514,11583,11686,11793,11898,12003,12065,12121,12288,12382,12460", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,79,82,86,105,98,93,109,91,61,64,98,65,59,101,61,75,57,77,64,53,116,63,63,53,79,133,85,86,102,95,88,135,84,87,151,94,82,57,51,65,78,81,70,86,75,76,76,70,109,106,79,96,99,73,80,104,57,87,66,90,91,61,63,62,68,102,106,104,104,61,55,83,93,77,75", + "endOffsets": "316,3145,3228,3315,3421,3520,4351,4461,4553,6976,7041,7140,7206,7266,7368,7430,7506,7564,7642,7707,7761,7878,7942,8006,8060,8140,8274,8360,8447,8550,8646,8735,8871,8956,9044,9196,9291,9374,9432,9484,9550,9629,9711,9782,9869,9945,10022,10099,10170,10280,10387,10467,10564,10664,10738,10819,10924,10982,11070,11137,11228,11320,11382,11446,11509,11578,11681,11788,11893,11998,12060,12116,12200,12377,12455,12531" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ml/values-ml.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,157,260,362,466,569,670,792", + "endColumns": "101,102,101,103,102,100,121,100", + "endOffsets": "152,255,357,461,564,665,787,888" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3525,3627,3730,3832,3936,4039,4140,12536", + "endColumns": "101,102,101,103,102,100,121,100", + "endOffsets": "3622,3725,3827,3931,4034,4135,4257,12632" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ml/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,308,483,618,735,895,1016,1117,1219,1397,1509,1679,1811,1956,2113,2173,2238", + "endColumns": "114,174,134,116,159,120,100,101,177,111,169,131,144,156,59,64,87", + "endOffsets": "307,482,617,734,894,1015,1116,1218,1396,1508,1678,1810,1955,2112,2172,2237,2325" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4558,4677,4856,4995,5116,5280,5405,5510,5776,5958,6074,6248,6384,6533,6694,6758,6827", + "endColumns": "118,178,138,120,163,124,104,105,181,115,173,135,148,160,63,68,91", + "endOffsets": "4672,4851,4990,5111,5275,5400,5505,5611,5953,6069,6243,6379,6528,6689,6753,6822,6914" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ml/values-ml.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,212,318,429,520,625,747,825,900,991,1084,1185,1279,1379,1473,1568,1667,1758,1849,1931,2040,2144,2243,2355,2467,2588,2753,2854", + "endColumns": "106,105,110,90,104,121,77,74,90,92,100,93,99,93,94,98,90,90,81,108,103,98,111,111,120,164,100,82", + "endOffsets": "207,313,424,515,620,742,820,895,986,1079,1180,1274,1374,1468,1563,1662,1753,1844,1926,2035,2139,2238,2350,2462,2583,2748,2849,2932" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "321,428,534,645,736,841,963,1041,1116,1207,1300,1401,1495,1595,1689,1784,1883,1974,2065,2147,2256,2360,2459,2571,2683,2804,2969,12205", + "endColumns": "106,105,110,90,104,121,77,74,90,92,100,93,99,93,94,98,90,90,81,108,103,98,111,111,120,164,100,82", + "endOffsets": "423,529,640,731,836,958,1036,1111,1202,1295,1396,1490,1590,1684,1779,1878,1969,2060,2142,2251,2355,2454,2566,2678,2799,2964,3065,12283" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-mn.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-mn.json new file mode 100644 index 0000000..ff94182 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-mn.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-mn/values-mn.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-mn/values-mn.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,265,344,421,500,587,672,770,889,974,1035,1100,1198,1279,1338,1431,1493,1556,1614,1685,1747,1801,1922,1979,2040,2094,2165,2298,2382,2462,2558,2641,2724,2857,2939,3017,3149,3239,3319,3373,3424,3490,3561,3639,3710,3789,3864,3942,4022,4105,4210,4298,4377,4467,4560,4634,4704,4795,4849,4929,4996,5080,5165,5227,5291,5354,5425,5529,5644,5741,5855,5913,5968,6052,6139,6215", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,78,76,78,86,84,97,118,84,60,64,97,80,58,92,61,62,57,70,61,53,120,56,60,53,70,132,83,79,95,82,82,132,81,77,131,89,79,53,50,65,70,77,70,78,74,77,79,82,104,87,78,89,92,73,69,90,53,79,66,83,84,61,63,62,70,103,114,96,113,57,54,83,86,75,81", + "endOffsets": "260,339,416,495,582,667,765,884,969,1030,1095,1193,1274,1333,1426,1488,1551,1609,1680,1742,1796,1917,1974,2035,2089,2160,2293,2377,2457,2553,2636,2719,2852,2934,3012,3144,3234,3314,3368,3419,3485,3556,3634,3705,3784,3859,3937,4017,4100,4205,4293,4372,4462,4555,4629,4699,4790,4844,4924,4991,5075,5160,5222,5286,5349,5420,5524,5639,5736,5850,5908,5963,6047,6134,6210,6292" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3007,3086,3163,3242,3329,4149,4247,4366,6666,6727,6792,6890,6971,7030,7123,7185,7248,7306,7377,7439,7493,7614,7671,7732,7786,7857,7990,8074,8154,8250,8333,8416,8549,8631,8709,8841,8931,9011,9065,9116,9182,9253,9331,9402,9481,9556,9634,9714,9797,9902,9990,10069,10159,10252,10326,10396,10487,10541,10621,10688,10772,10857,10919,10983,11046,11117,11221,11336,11433,11547,11605,11660,11825,11912,11988", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,78,76,78,86,84,97,118,84,60,64,97,80,58,92,61,62,57,70,61,53,120,56,60,53,70,132,83,79,95,82,82,132,81,77,131,89,79,53,50,65,70,77,70,78,74,77,79,82,104,87,78,89,92,73,69,90,53,79,66,83,84,61,63,62,70,103,114,96,113,57,54,83,86,75,81", + "endOffsets": "310,3081,3158,3237,3324,3409,4242,4361,4446,6722,6787,6885,6966,7025,7118,7180,7243,7301,7372,7434,7488,7609,7666,7727,7781,7852,7985,8069,8149,8245,8328,8411,8544,8626,8704,8836,8926,9006,9060,9111,9177,9248,9326,9397,9476,9551,9629,9709,9792,9897,9985,10064,10154,10247,10321,10391,10482,10536,10616,10683,10767,10852,10914,10978,11041,11112,11216,11331,11428,11542,11600,11655,11739,11907,11983,12065" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-mn/values-mn.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,356,454,559,671,790", + "endColumns": "97,101,100,97,104,111,118,100", + "endOffsets": "148,250,351,449,554,666,785,886" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3414,3512,3614,3715,3813,3918,4030,12070", + "endColumns": "97,101,100,97,104,111,118,100", + "endOffsets": "3507,3609,3710,3808,3913,4025,4144,12166" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-mn/values-mn.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,219,319,428,514,620,734,817,898,989,1082,1177,1273,1370,1463,1557,1649,1740,1830,1910,2017,2120,2217,2324,2426,2539,2698,2797", + "endColumns": "113,99,108,85,105,113,82,80,90,92,94,95,96,92,93,91,90,89,79,106,102,96,106,101,112,158,98,80", + "endOffsets": "214,314,423,509,615,729,812,893,984,1077,1172,1268,1365,1458,1552,1644,1735,1825,1905,2012,2115,2212,2319,2421,2534,2693,2792,2873" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "315,429,529,638,724,830,944,1027,1108,1199,1292,1387,1483,1580,1673,1767,1859,1950,2040,2120,2227,2330,2427,2534,2636,2749,2908,11744", + "endColumns": "113,99,108,85,105,113,82,80,90,92,94,95,96,92,93,91,90,89,79,106,102,96,106,101,112,158,98,80", + "endOffsets": "424,524,633,719,825,939,1022,1103,1194,1287,1382,1478,1575,1668,1762,1854,1945,2035,2115,2222,2325,2422,2529,2631,2744,2903,3002,11820" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-mn/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "145", + "endOffsets": "340" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5459", + "endColumns": "149", + "endOffsets": "5604" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-mn/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,299,452,580,683,816,938,1063,1169,1309,1412,1576,1701,1838,2002,2059,2117", + "endColumns": "105,152,127,102,132,121,124,105,139,102,163,124,136,163,56,57,72", + "endOffsets": "298,451,579,682,815,937,1062,1168,1308,1411,1575,1700,1837,2001,2058,2116,2189" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4451,4561,4718,4850,4957,5094,5220,5349,5609,5753,5860,6028,6157,6298,6466,6527,6589", + "endColumns": "109,156,131,106,136,125,128,109,143,106,167,128,140,167,60,61,76", + "endOffsets": "4556,4713,4845,4952,5089,5215,5344,5454,5748,5855,6023,6152,6293,6461,6522,6584,6661" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-mr.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-mr.json new file mode 100644 index 0000000..6a205ba --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-mr.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-mr/values-mr.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-mr/values-mr.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,259,344,431,514,607,691,791,907,989,1046,1109,1200,1265,1324,1412,1474,1536,1596,1663,1726,1780,1894,1951,2012,2066,2136,2255,2336,2413,2502,2584,2669,2804,2881,2958,3099,3185,3269,3325,3377,3443,3513,3591,3662,3744,3814,3890,3961,4030,4144,4240,4314,4412,4508,4582,4652,4754,4809,4897,4964,5051,5144,5207,5271,5334,5400,5500,5609,5703,5810,5870,5926,6004,6088,6166", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,84,86,82,92,83,99,115,81,56,62,90,64,58,87,61,61,59,66,62,53,113,56,60,53,69,118,80,76,88,81,84,134,76,76,140,85,83,55,51,65,69,77,70,81,69,75,70,68,113,95,73,97,95,73,69,101,54,87,66,86,92,62,63,62,65,99,108,93,106,59,55,77,83,77,72", + "endOffsets": "254,339,426,509,602,686,786,902,984,1041,1104,1195,1260,1319,1407,1469,1531,1591,1658,1721,1775,1889,1946,2007,2061,2131,2250,2331,2408,2497,2579,2664,2799,2876,2953,3094,3180,3264,3320,3372,3438,3508,3586,3657,3739,3809,3885,3956,4025,4139,4235,4309,4407,4503,4577,4647,4749,4804,4892,4959,5046,5139,5202,5266,5329,5395,5495,5604,5698,5805,5865,5921,5999,6083,6161,6234" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2999,3084,3171,3254,3347,4163,4263,4379,6620,6677,6740,6831,6896,6955,7043,7105,7167,7227,7294,7357,7411,7525,7582,7643,7697,7767,7886,7967,8044,8133,8215,8300,8435,8512,8589,8730,8816,8900,8956,9008,9074,9144,9222,9293,9375,9445,9521,9592,9661,9775,9871,9945,10043,10139,10213,10283,10385,10440,10528,10595,10682,10775,10838,10902,10965,11031,11131,11240,11334,11441,11501,11557,11715,11799,11877", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,84,86,82,92,83,99,115,81,56,62,90,64,58,87,61,61,59,66,62,53,113,56,60,53,69,118,80,76,88,81,84,134,76,76,140,85,83,55,51,65,69,77,70,81,69,75,70,68,113,95,73,97,95,73,69,101,54,87,66,86,92,62,63,62,65,99,108,93,106,59,55,77,83,77,72", + "endOffsets": "304,3079,3166,3249,3342,3426,4258,4374,4456,6672,6735,6826,6891,6950,7038,7100,7162,7222,7289,7352,7406,7520,7577,7638,7692,7762,7881,7962,8039,8128,8210,8295,8430,8507,8584,8725,8811,8895,8951,9003,9069,9139,9217,9288,9370,9440,9516,9587,9656,9770,9866,9940,10038,10134,10208,10278,10380,10435,10523,10590,10677,10770,10833,10897,10960,11026,11126,11235,11329,11436,11496,11552,11630,11794,11872,11945" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-mr/values-mr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,155,259,360,463,565,670,787", + "endColumns": "99,103,100,102,101,104,116,100", + "endOffsets": "150,254,355,458,560,665,782,883" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3431,3531,3635,3736,3839,3941,4046,11950", + "endColumns": "99,103,100,102,101,104,116,100", + "endOffsets": "3526,3630,3731,3834,3936,4041,4158,12046" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-mr/values-mr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,216,322,429,519,620,732,810,887,978,1071,1164,1261,1361,1454,1549,1643,1734,1825,1905,2012,2113,2210,2319,2421,2535,2692,2795", + "endColumns": "110,105,106,89,100,111,77,76,90,92,92,96,99,92,94,93,90,90,79,106,100,96,108,101,113,156,102,79", + "endOffsets": "211,317,424,514,615,727,805,882,973,1066,1159,1256,1356,1449,1544,1638,1729,1820,1900,2007,2108,2205,2314,2416,2530,2687,2790,2870" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "309,420,526,633,723,824,936,1014,1091,1182,1275,1368,1465,1565,1658,1753,1847,1938,2029,2109,2216,2317,2414,2523,2625,2739,2896,11635", + "endColumns": "110,105,106,89,100,111,77,76,90,92,92,96,99,92,94,93,90,90,79,106,100,96,108,101,113,156,102,79", + "endOffsets": "415,521,628,718,819,931,1009,1086,1177,1270,1363,1460,1560,1653,1748,1842,1933,2024,2104,2211,2312,2409,2518,2620,2734,2891,2994,11710" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-mr/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,460,579,687,828,945,1049,1142,1288,1392,1542,1662,1797,1946,2002,2064", + "endColumns": "102,163,118,107,140,116,103,92,145,103,149,119,134,148,55,61,76", + "endOffsets": "295,459,578,686,827,944,1048,1141,1287,1391,1541,1661,1796,1945,2001,2063,2140" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4461,4568,4736,4859,4971,5116,5237,5345,5585,5735,5843,5997,6121,6260,6413,6473,6539", + "endColumns": "106,167,122,111,144,120,107,96,149,107,153,123,138,152,59,65,80", + "endOffsets": "4563,4731,4854,4966,5111,5232,5340,5437,5730,5838,5992,6116,6255,6408,6468,6534,6615" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-mr/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "138", + "endOffsets": "333" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5442", + "endColumns": "142", + "endOffsets": "5580" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ms.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ms.json new file mode 100644 index 0000000..9fd08ca --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ms.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-ms/values-ms.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ms/values-ms.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,150,252,349,459,565,683,798", + "endColumns": "94,101,96,109,105,117,114,100", + "endOffsets": "145,247,344,454,560,678,793,894" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3449,3544,3646,3743,3853,3959,4077,12185", + "endColumns": "94,101,96,109,105,117,114,100", + "endOffsets": "3539,3641,3738,3848,3954,4072,4187,12281" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ms/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,464,590,692,860,988,1104,1207,1388,1493,1664,1795,1962,2133,2196,2256", + "endColumns": "101,168,125,101,167,127,115,102,180,104,170,130,166,170,62,59,78", + "endOffsets": "294,463,589,691,859,987,1103,1206,1387,1492,1663,1794,1961,2132,2195,2255,2334" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4494,4600,4773,4903,5009,5181,5313,5433,5686,5871,5980,6155,6290,6461,6636,6703,6767", + "endColumns": "105,172,129,105,171,131,119,106,184,108,174,134,170,174,66,63,82", + "endOffsets": "4595,4768,4898,5004,5176,5308,5428,5535,5866,5975,6150,6285,6456,6631,6698,6762,6845" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ms/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "141", + "endOffsets": "336" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5540", + "endColumns": "145", + "endOffsets": "5681" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ms/values-ms.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,279,359,438,525,617,704,807,923,1006,1068,1133,1226,1291,1350,1437,1499,1561,1621,1687,1749,1803,1911,1968,2029,2084,2155,2275,2366,2443,2540,2625,2711,2859,2945,3031,3159,3247,3325,3378,3429,3495,3566,3644,3715,3794,3867,3943,4016,4087,4194,4286,4359,4449,4542,4616,4687,4778,4830,4910,4978,5062,5147,5209,5273,5336,5408,5512,5620,5716,5822,5879,5934,6020,6105,6183", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,79,78,86,91,86,102,115,82,61,64,92,64,58,86,61,61,59,65,61,53,107,56,60,54,70,119,90,76,96,84,85,147,85,85,127,87,77,52,50,65,70,77,70,78,72,75,72,70,106,91,72,89,92,73,70,90,51,79,67,83,84,61,63,62,71,103,107,95,105,56,54,85,84,77,76", + "endOffsets": "274,354,433,520,612,699,802,918,1001,1063,1128,1221,1286,1345,1432,1494,1556,1616,1682,1744,1798,1906,1963,2024,2079,2150,2270,2361,2438,2535,2620,2706,2854,2940,3026,3154,3242,3320,3373,3424,3490,3561,3639,3710,3789,3862,3938,4011,4082,4189,4281,4354,4444,4537,4611,4682,4773,4825,4905,4973,5057,5142,5204,5268,5331,5403,5507,5615,5711,5817,5874,5929,6015,6100,6178,6255" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3024,3104,3183,3270,3362,4192,4295,4411,6850,6912,6977,7070,7135,7194,7281,7343,7405,7465,7531,7593,7647,7755,7812,7873,7928,7999,8119,8210,8287,8384,8469,8555,8703,8789,8875,9003,9091,9169,9222,9273,9339,9410,9488,9559,9638,9711,9787,9860,9931,10038,10130,10203,10293,10386,10460,10531,10622,10674,10754,10822,10906,10991,11053,11117,11180,11252,11356,11464,11560,11666,11723,11778,11945,12030,12108", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,79,78,86,91,86,102,115,82,61,64,92,64,58,86,61,61,59,65,61,53,107,56,60,54,70,119,90,76,96,84,85,147,85,85,127,87,77,52,50,65,70,77,70,78,72,75,72,70,106,91,72,89,92,73,70,90,51,79,67,83,84,61,63,62,71,103,107,95,105,56,54,85,84,77,76", + "endOffsets": "324,3099,3178,3265,3357,3444,4290,4406,4489,6907,6972,7065,7130,7189,7276,7338,7400,7460,7526,7588,7642,7750,7807,7868,7923,7994,8114,8205,8282,8379,8464,8550,8698,8784,8870,8998,9086,9164,9217,9268,9334,9405,9483,9554,9633,9706,9782,9855,9926,10033,10125,10198,10288,10381,10455,10526,10617,10669,10749,10817,10901,10986,11048,11112,11175,11247,11351,11459,11555,11661,11718,11773,11859,12025,12103,12180" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ms/values-ms.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,216,321,429,516,620,731,810,888,979,1072,1167,1261,1359,1452,1547,1641,1732,1823,1903,2015,2123,2220,2329,2433,2540,2699,2800", + "endColumns": "110,104,107,86,103,110,78,77,90,92,94,93,97,92,94,93,90,90,79,111,107,96,108,103,106,158,100,80", + "endOffsets": "211,316,424,511,615,726,805,883,974,1067,1162,1256,1354,1447,1542,1636,1727,1818,1898,2010,2118,2215,2324,2428,2535,2694,2795,2876" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "329,440,545,653,740,844,955,1034,1112,1203,1296,1391,1485,1583,1676,1771,1865,1956,2047,2127,2239,2347,2444,2553,2657,2764,2923,11864", + "endColumns": "110,104,107,86,103,110,78,77,90,92,94,93,97,92,94,93,90,90,79,111,107,96,108,103,106,158,100,80", + "endOffsets": "435,540,648,735,839,950,1029,1107,1198,1291,1386,1480,1578,1671,1766,1860,1951,2042,2122,2234,2342,2439,2548,2652,2759,2918,3019,11940" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-my.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-my.json new file mode 100644 index 0000000..34cd586 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-my.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-my/values-my.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-my/values-my.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,158,262,365,467,572,678,797", + "endColumns": "102,103,102,101,104,105,118,100", + "endOffsets": "153,257,360,462,567,673,792,893" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3547,3650,3754,3857,3959,4064,4170,12388", + "endColumns": "102,103,102,101,104,105,118,100", + "endOffsets": "3645,3749,3852,3954,4059,4165,4284,12484" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-my/values-my.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,285,386,485,561,652,736,842,971,1056,1119,1184,1274,1349,1408,1499,1562,1627,1686,1757,1819,1876,1995,2053,2114,2169,2242,2374,2465,2549,2649,2735,2824,2965,3043,3120,3243,3335,3412,3470,3521,3587,3659,3741,3812,3890,3965,4039,4111,4190,4298,4395,4476,4562,4654,4728,4807,4893,4947,5023,5091,5174,5255,5317,5381,5444,5512,5624,5735,5839,5952,6013,6068,6150,6237,6317", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,100,98,75,90,83,105,128,84,62,64,89,74,58,90,62,64,58,70,61,56,118,57,60,54,72,131,90,83,99,85,88,140,77,76,122,91,76,57,50,65,71,81,70,77,74,73,71,78,107,96,80,85,91,73,78,85,53,75,67,82,80,61,63,62,67,111,110,103,112,60,54,81,86,79,77", + "endOffsets": "280,381,480,556,647,731,837,966,1051,1114,1179,1269,1344,1403,1494,1557,1622,1681,1752,1814,1871,1990,2048,2109,2164,2237,2369,2460,2544,2644,2730,2819,2960,3038,3115,3238,3330,3407,3465,3516,3582,3654,3736,3807,3885,3960,4034,4106,4185,4293,4390,4471,4557,4649,4723,4802,4888,4942,5018,5086,5169,5250,5312,5376,5439,5507,5619,5730,5834,5947,6008,6063,6145,6232,6312,6390" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3096,3197,3296,3372,3463,4289,4395,4524,6963,7026,7091,7181,7256,7315,7406,7469,7534,7593,7664,7726,7783,7902,7960,8021,8076,8149,8281,8372,8456,8556,8642,8731,8872,8950,9027,9150,9242,9319,9377,9428,9494,9566,9648,9719,9797,9872,9946,10018,10097,10205,10302,10383,10469,10561,10635,10714,10800,10854,10930,10998,11081,11162,11224,11288,11351,11419,11531,11642,11746,11859,11920,11975,12143,12230,12310", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,100,98,75,90,83,105,128,84,62,64,89,74,58,90,62,64,58,70,61,56,118,57,60,54,72,131,90,83,99,85,88,140,77,76,122,91,76,57,50,65,71,81,70,77,74,73,71,78,107,96,80,85,91,73,78,85,53,75,67,82,80,61,63,62,67,111,110,103,112,60,54,81,86,79,77", + "endOffsets": "330,3192,3291,3367,3458,3542,4390,4519,4604,7021,7086,7176,7251,7310,7401,7464,7529,7588,7659,7721,7778,7897,7955,8016,8071,8144,8276,8367,8451,8551,8637,8726,8867,8945,9022,9145,9237,9314,9372,9423,9489,9561,9643,9714,9792,9867,9941,10013,10092,10200,10297,10378,10464,10556,10630,10709,10795,10849,10925,10993,11076,11157,11219,11283,11346,11414,11526,11637,11741,11854,11915,11970,12052,12225,12305,12383" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-my/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,456,586,693,836,964,1083,1189,1361,1463,1629,1768,1922,2105,2171,2240", + "endColumns": "102,159,129,106,142,127,118,105,171,101,165,138,153,182,65,68,84", + "endOffsets": "295,455,585,692,835,963,1082,1188,1360,1462,1628,1767,1921,2104,2170,2239,2324" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4609,4716,4880,5014,5125,5272,5404,5527,5791,5967,6073,6243,6386,6544,6731,6801,6874", + "endColumns": "106,163,133,110,146,131,122,109,175,105,169,142,157,186,69,72,88", + "endOffsets": "4711,4875,5009,5120,5267,5399,5522,5632,5962,6068,6238,6381,6539,6726,6796,6869,6958" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-my/values-my.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,218,325,441,528,637,760,839,917,1008,1101,1196,1290,1390,1483,1578,1672,1763,1854,1939,2054,2163,2262,2388,2495,2603,2763,2866", + "endColumns": "112,106,115,86,108,122,78,77,90,92,94,93,99,92,94,93,90,90,84,114,108,98,125,106,107,159,102,85", + "endOffsets": "213,320,436,523,632,755,834,912,1003,1096,1191,1285,1385,1478,1573,1667,1758,1849,1934,2049,2158,2257,2383,2490,2598,2758,2861,2947" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "335,448,555,671,758,867,990,1069,1147,1238,1331,1426,1520,1620,1713,1808,1902,1993,2084,2169,2284,2393,2492,2618,2725,2833,2993,12057", + "endColumns": "112,106,115,86,108,122,78,77,90,92,94,93,99,92,94,93,90,90,84,114,108,98,125,106,107,159,102,85", + "endOffsets": "443,550,666,753,862,985,1064,1142,1233,1326,1421,1515,1615,1708,1803,1897,1988,2079,2164,2279,2388,2487,2613,2720,2828,2988,3091,12138" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-my/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "149", + "endOffsets": "344" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5637", + "endColumns": "153", + "endOffsets": "5786" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-nb.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-nb.json new file mode 100644 index 0000000..ee68046 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-nb.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-nb/values-nb.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-nb/values-nb.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,208,303,417,503,603,716,793,868,959,1052,1146,1240,1340,1433,1528,1626,1717,1808,1886,1989,2087,2183,2287,2386,2487,2640,2737", + "endColumns": "102,94,113,85,99,112,76,74,90,92,93,93,99,92,94,97,90,90,77,102,97,95,103,98,100,152,96,79", + "endOffsets": "203,298,412,498,598,711,788,863,954,1047,1141,1235,1335,1428,1523,1621,1712,1803,1881,1984,2082,2178,2282,2381,2482,2635,2732,2812" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "311,414,509,623,709,809,922,999,1074,1165,1258,1352,1446,1546,1639,1734,1832,1923,2014,2092,2195,2293,2389,2493,2592,2693,2846,11494", + "endColumns": "102,94,113,85,99,112,76,74,90,92,93,93,99,92,94,97,90,90,77,102,97,95,103,98,100,152,96,79", + "endOffsets": "409,504,618,704,804,917,994,1069,1160,1253,1347,1441,1541,1634,1729,1827,1918,2009,2087,2190,2288,2384,2488,2587,2688,2841,2938,11569" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-nb/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,450,572,677,829,955,1071,1170,1320,1423,1580,1704,1842,2014,2077,2135", + "endColumns": "101,154,121,104,151,125,115,98,149,102,156,123,137,171,62,57,73", + "endOffsets": "294,449,571,676,828,954,1070,1169,1319,1422,1579,1703,1841,2013,2076,2134,2208" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4374,4480,4639,4765,4874,5030,5160,5280,5513,5667,5774,5935,6063,6205,6381,6448,6510", + "endColumns": "105,158,125,108,155,129,119,102,153,106,160,127,141,175,66,61,77", + "endOffsets": "4475,4634,4760,4869,5025,5155,5275,5378,5662,5769,5930,6058,6200,6376,6443,6505,6583" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-nb/values-nb.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,149,251,348,447,555,661,781", + "endColumns": "93,101,96,98,107,105,119,100", + "endOffsets": "144,246,343,442,550,656,776,877" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3348,3442,3544,3641,3740,3848,3954,11808", + "endColumns": "93,101,96,98,107,105,119,100", + "endOffsets": "3437,3539,3636,3735,3843,3949,4069,11904" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-nb/values-nb.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,261,338,411,498,586,666,765,884,966,1025,1089,1181,1249,1309,1396,1460,1522,1586,1654,1719,1773,1882,1940,2002,2056,2131,2251,2333,2410,2500,2584,2664,2798,2876,2956,3079,3167,3245,3299,3350,3416,3484,3558,3629,3705,3776,3854,3924,3994,4094,4183,4261,4349,4439,4511,4583,4667,4718,4796,4862,4943,5026,5088,5152,5215,5284,5384,5488,5581,5681,5739,5794,5872,5956,6034", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,76,72,86,87,79,98,118,81,58,63,91,67,59,86,63,61,63,67,64,53,108,57,61,53,74,119,81,76,89,83,79,133,77,79,122,87,77,53,50,65,67,73,70,75,70,77,69,69,99,88,77,87,89,71,71,83,50,77,65,80,82,61,63,62,68,99,103,92,99,57,54,77,83,77,71", + "endOffsets": "256,333,406,493,581,661,760,879,961,1020,1084,1176,1244,1304,1391,1455,1517,1581,1649,1714,1768,1877,1935,1997,2051,2126,2246,2328,2405,2495,2579,2659,2793,2871,2951,3074,3162,3240,3294,3345,3411,3479,3553,3624,3700,3771,3849,3919,3989,4089,4178,4256,4344,4434,4506,4578,4662,4713,4791,4857,4938,5021,5083,5147,5210,5279,5379,5483,5576,5676,5734,5789,5867,5951,6029,6101" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2943,3020,3093,3180,3268,4074,4173,4292,6588,6647,6711,6803,6871,6931,7018,7082,7144,7208,7276,7341,7395,7504,7562,7624,7678,7753,7873,7955,8032,8122,8206,8286,8420,8498,8578,8701,8789,8867,8921,8972,9038,9106,9180,9251,9327,9398,9476,9546,9616,9716,9805,9883,9971,10061,10133,10205,10289,10340,10418,10484,10565,10648,10710,10774,10837,10906,11006,11110,11203,11303,11361,11416,11574,11658,11736", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,76,72,86,87,79,98,118,81,58,63,91,67,59,86,63,61,63,67,64,53,108,57,61,53,74,119,81,76,89,83,79,133,77,79,122,87,77,53,50,65,67,73,70,75,70,77,69,69,99,88,77,87,89,71,71,83,50,77,65,80,82,61,63,62,68,99,103,92,99,57,54,77,83,77,71", + "endOffsets": "306,3015,3088,3175,3263,3343,4168,4287,4369,6642,6706,6798,6866,6926,7013,7077,7139,7203,7271,7336,7390,7499,7557,7619,7673,7748,7868,7950,8027,8117,8201,8281,8415,8493,8573,8696,8784,8862,8916,8967,9033,9101,9175,9246,9322,9393,9471,9541,9611,9711,9800,9878,9966,10056,10128,10200,10284,10335,10413,10479,10560,10643,10705,10769,10832,10901,11001,11105,11198,11298,11356,11411,11489,11653,11731,11803" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-nb/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "125", + "endOffsets": "320" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5383", + "endColumns": "129", + "endOffsets": "5508" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ne.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ne.json new file mode 100644 index 0000000..3f02bb3 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ne.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-ne/values-ne.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ne/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,300,454,584,697,864,996,1102,1203,1379,1489,1649,1778,1922,2070,2132,2200", + "endColumns": "106,153,129,112,166,131,105,100,175,109,159,128,143,147,61,67,87", + "endOffsets": "299,453,583,696,863,995,1101,1202,1378,1488,1648,1777,1921,2069,2131,2199,2287" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4541,4652,4810,4944,5061,5232,5368,5478,5747,5927,6041,6205,6338,6486,6638,6704,6776", + "endColumns": "110,157,133,116,170,135,109,104,179,113,163,132,147,151,65,71,91", + "endOffsets": "4647,4805,4939,5056,5227,5363,5473,5578,5922,6036,6200,6333,6481,6633,6699,6771,6863" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ne/values-ne.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,262,351,439,521,616,705,807,917,1004,1064,1130,1226,1292,1353,1458,1522,1594,1652,1726,1788,1842,1955,2015,2076,2135,2213,2337,2418,2500,2600,2685,2770,2906,2987,3070,3201,3284,3370,3432,3486,3552,3629,3708,3779,3862,3931,4007,4088,4156,4260,4351,4429,4522,4619,4693,4772,4870,4930,5018,5084,5172,5260,5322,5390,5453,5519,5624,5730,5825,5930,5996,6054,6138,6227,6303", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,88,87,81,94,88,101,109,86,59,65,95,65,60,104,63,71,57,73,61,53,112,59,60,58,77,123,80,81,99,84,84,135,80,82,130,82,85,61,53,65,76,78,70,82,68,75,80,67,103,90,77,92,96,73,78,97,59,87,65,87,87,61,67,62,65,104,105,94,104,65,57,83,88,75,72", + "endOffsets": "257,346,434,516,611,700,802,912,999,1059,1125,1221,1287,1348,1453,1517,1589,1647,1721,1783,1837,1950,2010,2071,2130,2208,2332,2413,2495,2595,2680,2765,2901,2982,3065,3196,3279,3365,3427,3481,3547,3624,3703,3774,3857,3926,4002,4083,4151,4255,4346,4424,4517,4614,4688,4767,4865,4925,5013,5079,5167,5255,5317,5385,5448,5514,5619,5725,5820,5925,5991,6049,6133,6222,6298,6371" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3079,3168,3256,3338,3433,4242,4344,4454,6868,6928,6994,7090,7156,7217,7322,7386,7458,7516,7590,7652,7706,7819,7879,7940,7999,8077,8201,8282,8364,8464,8549,8634,8770,8851,8934,9065,9148,9234,9296,9350,9416,9493,9572,9643,9726,9795,9871,9952,10020,10124,10215,10293,10386,10483,10557,10636,10734,10794,10882,10948,11036,11124,11186,11254,11317,11383,11488,11594,11689,11794,11860,11918,12082,12171,12247", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,88,87,81,94,88,101,109,86,59,65,95,65,60,104,63,71,57,73,61,53,112,59,60,58,77,123,80,81,99,84,84,135,80,82,130,82,85,61,53,65,76,78,70,82,68,75,80,67,103,90,77,92,96,73,78,97,59,87,65,87,87,61,67,62,65,104,105,94,104,65,57,83,88,75,72", + "endOffsets": "307,3163,3251,3333,3428,3517,4339,4449,4536,6923,6989,7085,7151,7212,7317,7381,7453,7511,7585,7647,7701,7814,7874,7935,7994,8072,8196,8277,8359,8459,8544,8629,8765,8846,8929,9060,9143,9229,9291,9345,9411,9488,9567,9638,9721,9790,9866,9947,10015,10119,10210,10288,10381,10478,10552,10631,10729,10789,10877,10943,11031,11119,11181,11249,11312,11378,11483,11589,11684,11789,11855,11913,11997,12166,12242,12315" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ne/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "159", + "endOffsets": "354" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5583", + "endColumns": "163", + "endOffsets": "5742" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ne/values-ne.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,158,261,363,469,567,667,775", + "endColumns": "102,102,101,105,97,99,107,100", + "endOffsets": "153,256,358,464,562,662,770,871" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3522,3625,3728,3830,3936,4034,4134,12320", + "endColumns": "102,102,101,105,97,99,107,100", + "endOffsets": "3620,3723,3825,3931,4029,4129,4237,12416" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ne/values-ne.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,214,325,433,524,631,751,835,914,1005,1098,1193,1287,1387,1480,1575,1669,1760,1851,1937,2050,2151,2254,2367,2477,2594,2761,2872", + "endColumns": "108,110,107,90,106,119,83,78,90,92,94,93,99,92,94,93,90,90,85,112,100,102,112,109,116,166,110,79", + "endOffsets": "209,320,428,519,626,746,830,909,1000,1093,1188,1282,1382,1475,1570,1664,1755,1846,1932,2045,2146,2249,2362,2472,2589,2756,2867,2947" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "312,421,532,640,731,838,958,1042,1121,1212,1305,1400,1494,1594,1687,1782,1876,1967,2058,2144,2257,2358,2461,2574,2684,2801,2968,12002", + "endColumns": "108,110,107,90,106,119,83,78,90,92,94,93,99,92,94,93,90,90,85,112,100,102,112,109,116,166,110,79", + "endOffsets": "416,527,635,726,833,953,1037,1116,1207,1300,1395,1489,1589,1682,1777,1871,1962,2053,2139,2252,2353,2456,2569,2679,2796,2963,3074,12077" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-night-v8.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-night-v8.json new file mode 100644 index 0000000..751c438 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-night-v8.json @@ -0,0 +1,60 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-night-v8/values-night-v8.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-night-v8/values-night-v8.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,125,209,293,389,491,593,687", + "endColumns": "69,83,83,95,101,101,93,88", + "endOffsets": "120,204,288,384,486,588,682,771" + }, + "to": { + "startLines": "7,8,9,10,11,12,13,40", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "365,435,519,603,699,801,903,3885", + "endColumns": "69,83,83,95,101,101,93,88", + "endOffsets": "430,514,598,694,796,898,992,3969" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values-night/colors.xml", + "from": { + "startLines": "7,4,3,6,5", + "startColumns": "4,4,4,4,4", + "startOffsets": "361,180,113,302,245", + "endColumns": "61,64,66,58,56", + "endOffsets": "418,240,175,356,297" + }, + "to": { + "startLines": "2,3,4,5,6", + "startColumns": "4,4,4,4,4", + "startOffsets": "55,117,182,249,308", + "endColumns": "61,64,66,58,56", + "endOffsets": "112,177,244,303,360" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-night-v8/values-night-v8.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,130,241,330,431,538,645,744,851,954,1081,1169,1293,1395,1497,1613,1715,1829,1957,2073,2195,2331,2451,2585,2705,2817,2943,3060,3184,3314,3436,3574,3708,3824", + "endColumns": "74,110,88,100,106,106,98,106,102,126,87,123,101,101,115,101,113,127,115,121,135,119,133,119,111,125,116,123,129,121,137,133,115,119", + "endOffsets": "125,236,325,426,533,640,739,846,949,1076,1164,1288,1390,1492,1608,1710,1824,1952,2068,2190,2326,2446,2580,2700,2812,2938,3055,3179,3309,3431,3569,3703,3819,3939" + }, + "to": { + "startLines": "14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,41,42,43,44,45,46,47,48", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "997,1072,1183,1272,1373,1480,1587,1686,1793,1896,2023,2111,2235,2337,2439,2555,2657,2771,2899,3015,3137,3273,3393,3527,3647,3759,3974,4091,4215,4345,4467,4605,4739,4855", + "endColumns": "74,110,88,100,106,106,98,106,102,126,87,123,101,101,115,101,113,127,115,121,135,119,133,119,111,125,116,123,129,121,137,133,115,119", + "endOffsets": "1067,1178,1267,1368,1475,1582,1681,1788,1891,2018,2106,2230,2332,2434,2550,2652,2766,2894,3010,3132,3268,3388,3522,3642,3754,3880,4086,4210,4340,4462,4600,4734,4850,4970" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-nl.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-nl.json new file mode 100644 index 0000000..fc13c19 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-nl.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-nl/values-nl.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-nl/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,444,568,675,838,961,1080,1182,1356,1458,1623,1745,1904,2082,2146,2205", + "endColumns": "103,146,123,106,162,122,118,101,173,101,164,121,158,177,63,58,74", + "endOffsets": "296,443,567,674,837,960,1079,1181,1355,1457,1622,1744,1903,2081,2145,2204,2279" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4512,4620,4771,4899,5010,5177,5304,5427,5676,5854,5960,6129,6255,6418,6600,6668,6731", + "endColumns": "107,150,127,110,166,126,122,105,177,105,168,125,162,181,67,62,78", + "endOffsets": "4615,4766,4894,5005,5172,5299,5422,5528,5849,5955,6124,6250,6413,6595,6663,6726,6805" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-nl/values-nl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,157,259,359,459,566,670,789", + "endColumns": "101,101,99,99,106,103,118,100", + "endOffsets": "152,254,354,454,561,665,784,885" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3478,3580,3682,3782,3882,3989,4093,12217", + "endColumns": "101,101,99,99,106,103,118,100", + "endOffsets": "3575,3677,3777,3877,3984,4088,4207,12313" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-nl/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "138", + "endOffsets": "333" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5533", + "endColumns": "142", + "endOffsets": "5671" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-nl/values-nl.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,269,355,437,514,612,706,803,925,1006,1066,1130,1219,1298,1361,1454,1516,1582,1640,1713,1777,1833,1955,2012,2074,2130,2206,2340,2425,2504,2602,2688,2774,2912,2993,3072,3196,3286,3363,3420,3471,3537,3615,3698,3769,3845,3920,3999,4072,4143,4252,4346,4424,4513,4603,4677,4758,4845,4898,4977,5044,5125,5209,5271,5335,5398,5469,5577,5689,5791,5902,5963,6018,6099,6182,6258", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,85,81,76,97,93,96,121,80,59,63,88,78,62,92,61,65,57,72,63,55,121,56,61,55,75,133,84,78,97,85,85,137,80,78,123,89,76,56,50,65,77,82,70,75,74,78,72,70,108,93,77,88,89,73,80,86,52,78,66,80,83,61,63,62,70,107,111,101,110,60,54,80,82,75,71", + "endOffsets": "264,350,432,509,607,701,798,920,1001,1061,1125,1214,1293,1356,1449,1511,1577,1635,1708,1772,1828,1950,2007,2069,2125,2201,2335,2420,2499,2597,2683,2769,2907,2988,3067,3191,3281,3358,3415,3466,3532,3610,3693,3764,3840,3915,3994,4067,4138,4247,4341,4419,4508,4598,4672,4753,4840,4893,4972,5039,5120,5204,5266,5330,5393,5464,5572,5684,5786,5897,5958,6013,6094,6177,6253,6325" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3041,3127,3209,3286,3384,4212,4309,4431,6810,6870,6934,7023,7102,7165,7258,7320,7386,7444,7517,7581,7637,7759,7816,7878,7934,8010,8144,8229,8308,8406,8492,8578,8716,8797,8876,9000,9090,9167,9224,9275,9341,9419,9502,9573,9649,9724,9803,9876,9947,10056,10150,10228,10317,10407,10481,10562,10649,10702,10781,10848,10929,11013,11075,11139,11202,11273,11381,11493,11595,11706,11767,11822,11986,12069,12145", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,85,81,76,97,93,96,121,80,59,63,88,78,62,92,61,65,57,72,63,55,121,56,61,55,75,133,84,78,97,85,85,137,80,78,123,89,76,56,50,65,77,82,70,75,74,78,72,70,108,93,77,88,89,73,80,86,52,78,66,80,83,61,63,62,70,107,111,101,110,60,54,80,82,75,71", + "endOffsets": "314,3122,3204,3281,3379,3473,4304,4426,4507,6865,6929,7018,7097,7160,7253,7315,7381,7439,7512,7576,7632,7754,7811,7873,7929,8005,8139,8224,8303,8401,8487,8573,8711,8792,8871,8995,9085,9162,9219,9270,9336,9414,9497,9568,9644,9719,9798,9871,9942,10051,10145,10223,10312,10402,10476,10557,10644,10697,10776,10843,10924,11008,11070,11134,11197,11268,11376,11488,11590,11701,11762,11817,11898,12064,12140,12212" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-nl/values-nl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,223,328,435,520,624,744,822,898,990,1084,1179,1273,1373,1467,1563,1658,1750,1842,1924,2035,2138,2237,2352,2466,2569,2724,2827", + "endColumns": "117,104,106,84,103,119,77,75,91,93,94,93,99,93,95,94,91,91,81,110,102,98,114,113,102,154,102,82", + "endOffsets": "218,323,430,515,619,739,817,893,985,1079,1174,1268,1368,1462,1558,1653,1745,1837,1919,2030,2133,2232,2347,2461,2564,2719,2822,2905" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "319,437,542,649,734,838,958,1036,1112,1204,1298,1393,1487,1587,1681,1777,1872,1964,2056,2138,2249,2352,2451,2566,2680,2783,2938,11903", + "endColumns": "117,104,106,84,103,119,77,75,91,93,94,93,99,93,95,94,91,91,81,110,102,98,114,113,102,154,102,82", + "endOffsets": "432,537,644,729,833,953,1031,1107,1199,1293,1388,1482,1582,1676,1772,1867,1959,2051,2133,2244,2347,2446,2561,2675,2778,2933,3036,11981" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-or.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-or.json new file mode 100644 index 0000000..d86b310 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-or.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-or/values-or.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-or/values-or.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,272,354,432,509,595,679,773,878,957,1017,1082,1171,1236,1295,1381,1445,1509,1572,1645,1709,1763,1875,1933,1995,2049,2121,2243,2330,2406,2498,2580,2666,2806,2883,2964,3091,3182,3259,3313,3364,3430,3500,3577,3648,3723,3794,3871,3940,4009,4116,4207,4279,4368,4457,4531,4603,4689,4739,4818,4884,4964,5048,5110,5174,5237,5306,5406,5501,5593,5685,5743,5798,5882,5963,6038", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,81,77,76,85,83,93,104,78,59,64,88,64,58,85,63,63,62,72,63,53,111,57,61,53,71,121,86,75,91,81,85,139,76,80,126,90,76,53,50,65,69,76,70,74,70,76,68,68,106,90,71,88,88,73,71,85,49,78,65,79,83,61,63,62,68,99,94,91,91,57,54,83,80,74,74", + "endOffsets": "267,349,427,504,590,674,768,873,952,1012,1077,1166,1231,1290,1376,1440,1504,1567,1640,1704,1758,1870,1928,1990,2044,2116,2238,2325,2401,2493,2575,2661,2801,2878,2959,3086,3177,3254,3308,3359,3425,3495,3572,3643,3718,3789,3866,3935,4004,4111,4202,4274,4363,4452,4526,4598,4684,4734,4813,4879,4959,5043,5105,5169,5232,5301,5401,5496,5588,5680,5738,5793,5877,5958,6033,6108" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3074,3156,3234,3311,3397,4216,4310,4415,6774,6834,6899,6988,7053,7112,7198,7262,7326,7389,7462,7526,7580,7692,7750,7812,7866,7938,8060,8147,8223,8315,8397,8483,8623,8700,8781,8908,8999,9076,9130,9181,9247,9317,9394,9465,9540,9611,9688,9757,9826,9933,10024,10096,10185,10274,10348,10420,10506,10556,10635,10701,10781,10865,10927,10991,11054,11123,11223,11318,11410,11502,11560,11615,11789,11870,11945", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,81,77,76,85,83,93,104,78,59,64,88,64,58,85,63,63,62,72,63,53,111,57,61,53,71,121,86,75,91,81,85,139,76,80,126,90,76,53,50,65,69,76,70,74,70,76,68,68,106,90,71,88,88,73,71,85,49,78,65,79,83,61,63,62,68,99,94,91,91,57,54,83,80,74,74", + "endOffsets": "317,3151,3229,3306,3392,3476,4305,4410,4489,6829,6894,6983,7048,7107,7193,7257,7321,7384,7457,7521,7575,7687,7745,7807,7861,7933,8055,8142,8218,8310,8392,8478,8618,8695,8776,8903,8994,9071,9125,9176,9242,9312,9389,9460,9535,9606,9683,9752,9821,9928,10019,10091,10180,10269,10343,10415,10501,10551,10630,10696,10776,10860,10922,10986,11049,11118,11218,11313,11405,11497,11555,11610,11694,11865,11940,12015" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-or/values-or.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,216,326,433,519,623,743,822,903,994,1087,1188,1283,1383,1476,1571,1667,1758,1848,1937,2047,2151,2257,2368,2470,2588,2751,2857", + "endColumns": "110,109,106,85,103,119,78,80,90,92,100,94,99,92,94,95,90,89,88,109,103,105,110,101,117,162,105,89", + "endOffsets": "211,321,428,514,618,738,817,898,989,1082,1183,1278,1378,1471,1566,1662,1753,1843,1932,2042,2146,2252,2363,2465,2583,2746,2852,2942" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "322,433,543,650,736,840,960,1039,1120,1211,1304,1405,1500,1600,1693,1788,1884,1975,2065,2154,2264,2368,2474,2585,2687,2805,2968,11699", + "endColumns": "110,109,106,85,103,119,78,80,90,92,100,94,99,92,94,95,90,89,88,109,103,105,110,101,117,162,105,89", + "endOffsets": "428,538,645,731,835,955,1034,1115,1206,1299,1400,1495,1595,1688,1783,1879,1970,2060,2149,2259,2363,2469,2580,2682,2800,2963,3069,11784" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-or/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,300,457,585,698,849,980,1090,1196,1359,1468,1625,1754,1900,2053,2114,2182", + "endColumns": "106,156,127,112,150,130,109,105,162,108,156,128,145,152,60,67,82", + "endOffsets": "299,456,584,697,848,979,1089,1195,1358,1467,1624,1753,1899,2052,2113,2181,2264" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4494,4605,4766,4898,5015,5170,5305,5419,5669,5836,5949,6110,6243,6393,6550,6615,6687", + "endColumns": "110,160,131,116,154,134,113,109,166,112,160,132,149,156,64,71,86", + "endOffsets": "4600,4761,4893,5010,5165,5300,5414,5524,5831,5944,6105,6238,6388,6545,6610,6682,6769" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-or/values-or.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,158,260,363,468,569,671,790", + "endColumns": "102,101,102,104,100,101,118,100", + "endOffsets": "153,255,358,463,564,666,785,886" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3481,3584,3686,3789,3894,3995,4097,12020", + "endColumns": "102,101,102,104,100,101,118,100", + "endOffsets": "3579,3681,3784,3889,3990,4092,4211,12116" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-or/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "135", + "endOffsets": "330" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5529", + "endColumns": "139", + "endOffsets": "5664" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-pa.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-pa.json new file mode 100644 index 0000000..d30607b --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-pa.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-pa/values-pa.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-pa/values-pa.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,358,459,561,659,788", + "endColumns": "97,101,102,100,101,97,128,100", + "endOffsets": "148,250,353,454,556,654,783,884" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3400,3498,3600,3703,3804,3906,4004,11984", + "endColumns": "97,101,102,100,101,97,128,100", + "endOffsets": "3493,3595,3698,3799,3901,3999,4128,12080" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-pa/values-pa.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,208,305,410,496,596,709,787,864,955,1048,1142,1236,1336,1429,1524,1618,1709,1800,1879,1989,2092,2188,2299,2401,2511,2670,2767", + "endColumns": "102,96,104,85,99,112,77,76,90,92,93,93,99,92,94,93,90,90,78,109,102,95,110,101,109,158,96,79", + "endOffsets": "203,300,405,491,591,704,782,859,950,1043,1137,1231,1331,1424,1519,1613,1704,1795,1874,1984,2087,2183,2294,2396,2506,2665,2762,2842" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "313,416,513,618,704,804,917,995,1072,1163,1256,1350,1444,1544,1637,1732,1826,1917,2008,2087,2197,2300,2396,2507,2609,2719,2878,11670", + "endColumns": "102,96,104,85,99,112,77,76,90,92,93,93,99,92,94,93,90,90,78,109,102,95,110,101,109,158,96,79", + "endOffsets": "411,508,613,699,799,912,990,1067,1158,1251,1345,1439,1539,1632,1727,1821,1912,2003,2082,2192,2295,2391,2502,2604,2714,2873,2970,11745" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-pa/values-pa.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,263,340,419,500,599,688,796,908,991,1047,1111,1203,1272,1331,1416,1479,1541,1599,1663,1724,1778,1892,1950,2010,2064,2134,2261,2342,2432,2531,2628,2707,2842,2918,2995,3124,3208,3290,3345,3400,3466,3535,3612,3683,3762,3830,3906,3976,4041,4143,4238,4311,4405,4498,4572,4641,4735,4791,4874,4941,5025,5113,5175,5239,5302,5369,5466,5572,5663,5765,5824,5883,5960,6045,6121", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,76,78,80,98,88,107,111,82,55,63,91,68,58,84,62,61,57,63,60,53,113,57,59,53,69,126,80,89,98,96,78,134,75,76,128,83,81,54,54,65,68,76,70,78,67,75,69,64,101,94,72,93,92,73,68,93,55,82,66,83,87,61,63,62,66,96,105,90,101,58,58,76,84,75,72", + "endOffsets": "258,335,414,495,594,683,791,903,986,1042,1106,1198,1267,1326,1411,1474,1536,1594,1658,1719,1773,1887,1945,2005,2059,2129,2256,2337,2427,2526,2623,2702,2837,2913,2990,3119,3203,3285,3340,3395,3461,3530,3607,3678,3757,3825,3901,3971,4036,4138,4233,4306,4400,4493,4567,4636,4730,4786,4869,4936,5020,5108,5170,5234,5297,5364,5461,5567,5658,5760,5819,5878,5955,6040,6116,6189" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2975,3052,3131,3212,3311,4133,4241,4353,6701,6757,6821,6913,6982,7041,7126,7189,7251,7309,7373,7434,7488,7602,7660,7720,7774,7844,7971,8052,8142,8241,8338,8417,8552,8628,8705,8834,8918,9000,9055,9110,9176,9245,9322,9393,9472,9540,9616,9686,9751,9853,9948,10021,10115,10208,10282,10351,10445,10501,10584,10651,10735,10823,10885,10949,11012,11079,11176,11282,11373,11475,11534,11593,11750,11835,11911", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,76,78,80,98,88,107,111,82,55,63,91,68,58,84,62,61,57,63,60,53,113,57,59,53,69,126,80,89,98,96,78,134,75,76,128,83,81,54,54,65,68,76,70,78,67,75,69,64,101,94,72,93,92,73,68,93,55,82,66,83,87,61,63,62,66,96,105,90,101,58,58,76,84,75,72", + "endOffsets": "308,3047,3126,3207,3306,3395,4236,4348,4431,6752,6816,6908,6977,7036,7121,7184,7246,7304,7368,7429,7483,7597,7655,7715,7769,7839,7966,8047,8137,8236,8333,8412,8547,8623,8700,8829,8913,8995,9050,9105,9171,9240,9317,9388,9467,9535,9611,9681,9746,9848,9943,10016,10110,10203,10277,10346,10440,10496,10579,10646,10730,10818,10880,10944,11007,11074,11171,11277,11368,11470,11529,11588,11665,11830,11906,11979" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-pa/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "146", + "endOffsets": "341" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5447", + "endColumns": "150", + "endOffsets": "5593" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-pa/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,465,591,696,839,964,1073,1172,1330,1435,1604,1732,1881,2038,2099,2161", + "endColumns": "102,168,125,104,142,124,108,98,157,104,168,127,148,156,60,61,77", + "endOffsets": "295,464,590,695,838,963,1072,1171,1329,1434,1603,1731,1880,2037,2098,2160,2238" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4436,4543,4716,4846,4955,5102,5231,5344,5598,5760,5869,6042,6174,6327,6488,6553,6619", + "endColumns": "106,172,129,108,146,128,112,102,161,108,172,131,152,160,64,65,81", + "endOffsets": "4538,4711,4841,4950,5097,5226,5339,5442,5755,5864,6037,6169,6322,6483,6548,6614,6696" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-pl.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-pl.json new file mode 100644 index 0000000..2da80a0 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-pl.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-pl/values-pl.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-pl/values-pl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,220,322,430,516,623,742,821,897,988,1081,1176,1270,1371,1464,1559,1654,1745,1836,1918,2027,2127,2226,2335,2447,2558,2721,2817", + "endColumns": "114,101,107,85,106,118,78,75,90,92,94,93,100,92,94,94,90,90,81,108,99,98,108,111,110,162,95,82", + "endOffsets": "215,317,425,511,618,737,816,892,983,1076,1171,1265,1366,1459,1554,1649,1740,1831,1913,2022,2122,2221,2330,2442,2553,2716,2812,2895" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,132", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "436,551,653,761,847,954,1073,1152,1228,1319,1412,1507,1601,1702,1795,1890,1985,2076,2167,2249,2358,2458,2557,2666,2778,2889,3052,11945", + "endColumns": "114,101,107,85,106,118,78,75,90,92,94,93,100,92,94,94,90,90,81,108,99,98,108,111,110,162,95,82", + "endOffsets": "546,648,756,842,949,1068,1147,1223,1314,1407,1502,1596,1697,1790,1885,1980,2071,2162,2244,2353,2453,2552,2661,2773,2884,3047,3143,12023" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-pl/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,293,457,575,681,828,949,1056,1151,1318,1423,1594,1718,1873,2030,2095,2157", + "endColumns": "99,163,117,105,146,120,106,94,166,104,170,123,154,156,64,61,79", + "endOffsets": "292,456,574,680,827,948,1055,1150,1317,1422,1593,1717,1872,2029,2094,2156,2236" + }, + "to": { + "startLines": "50,51,52,53,54,55,56,57,59,60,61,62,63,64,65,66,67", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4597,4701,4869,4991,5101,5252,5377,5488,5727,5898,6007,6182,6310,6469,6630,6699,6765", + "endColumns": "103,167,121,109,150,124,110,98,170,108,174,127,158,160,68,65,83", + "endOffsets": "4696,4864,4986,5096,5247,5372,5483,5582,5893,6002,6177,6305,6464,6625,6694,6760,6844" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-pl/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "135", + "endOffsets": "330" + }, + "to": { + "startLines": "58", + "startColumns": "4", + "startOffsets": "5587", + "endColumns": "139", + "endOffsets": "5722" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-pl/values-pl.xml", + "from": { + "startLines": "2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,386,461,536,615,719,814,899,1016,1098,1163,1227,1308,1372,1433,1544,1608,1676,1730,1799,1861,1915,2026,2087,2149,2203,2275,2404,2493,2572,2667,2752,2834,2983,3065,3148,3285,3372,3449,3503,3554,3620,3691,3767,3838,3921,3998,4076,4154,4230,4338,4428,4501,4596,4693,4765,4839,4939,4991,5076,5142,5230,5320,5382,5446,5509,5580,5687,5799,5898,6005,6063,6118,6194,6278,6355", + "endLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "endColumns": "12,74,74,78,103,94,84,116,81,64,63,80,63,60,110,63,67,53,68,61,53,110,60,61,53,71,128,88,78,94,84,81,148,81,82,136,86,76,53,50,65,70,75,70,82,76,77,77,75,107,89,72,94,96,71,73,99,51,84,65,87,89,61,63,62,70,106,111,98,106,57,54,75,83,76,77", + "endOffsets": "381,456,531,610,714,809,894,1011,1093,1158,1222,1303,1367,1428,1539,1603,1671,1725,1794,1856,1910,2021,2082,2144,2198,2270,2399,2488,2567,2662,2747,2829,2978,3060,3143,3280,3367,3444,3498,3549,3615,3686,3762,3833,3916,3993,4071,4149,4225,4333,4423,4496,4591,4688,4760,4834,4934,4986,5071,5137,5225,5315,5377,5441,5504,5575,5682,5794,5893,6000,6058,6113,6189,6273,6350,6428" + }, + "to": { + "startLines": "2,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3148,3223,3298,3377,3481,4313,4398,4515,6849,6914,6978,7059,7123,7184,7295,7359,7427,7481,7550,7612,7666,7777,7838,7900,7954,8026,8155,8244,8323,8418,8503,8585,8734,8816,8899,9036,9123,9200,9254,9305,9371,9442,9518,9589,9672,9749,9827,9905,9981,10089,10179,10252,10347,10444,10516,10590,10690,10742,10827,10893,10981,11071,11133,11197,11260,11331,11438,11550,11649,11756,11814,11869,12028,12112,12189", + "endLines": "7,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "endColumns": "12,74,74,78,103,94,84,116,81,64,63,80,63,60,110,63,67,53,68,61,53,110,60,61,53,71,128,88,78,94,84,81,148,81,82,136,86,76,53,50,65,70,75,70,82,76,77,77,75,107,89,72,94,96,71,73,99,51,84,65,87,89,61,63,62,70,106,111,98,106,57,54,75,83,76,77", + "endOffsets": "431,3218,3293,3372,3476,3571,4393,4510,4592,6909,6973,7054,7118,7179,7290,7354,7422,7476,7545,7607,7661,7772,7833,7895,7949,8021,8150,8239,8318,8413,8498,8580,8729,8811,8894,9031,9118,9195,9249,9300,9366,9437,9513,9584,9667,9744,9822,9900,9976,10084,10174,10247,10342,10439,10511,10585,10685,10737,10822,10888,10976,11066,11128,11192,11255,11326,11433,11545,11644,11751,11809,11864,11940,12107,12184,12262" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-pl/values-pl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,352,451,565,670,792", + "endColumns": "96,101,97,98,113,104,121,100", + "endOffsets": "147,249,347,446,560,665,787,888" + }, + "to": { + "startLines": "40,41,42,43,44,45,46,136", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3576,3673,3775,3873,3972,4086,4191,12267", + "endColumns": "96,101,97,98,113,104,121,100", + "endOffsets": "3668,3770,3868,3967,4081,4186,4308,12363" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-port.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-port.json new file mode 100644 index 0000000..647bf7b --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-port.json @@ -0,0 +1,19 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-port/values-port.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-port/values-port.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "55", + "endOffsets": "106" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-pt-rBR.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-pt-rBR.json new file mode 100644 index 0000000..3577015 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-pt-rBR.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-pt-rBR/values-pt-rBR.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-pt-rBR/values-pt-rBR.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,225,331,438,527,628,747,832,912,1003,1096,1191,1285,1385,1478,1573,1668,1759,1850,1935,2042,2153,2255,2363,2471,2581,2743,2843", + "endColumns": "119,105,106,88,100,118,84,79,90,92,94,93,99,92,94,94,90,90,84,106,110,101,107,107,109,161,99,85", + "endOffsets": "220,326,433,522,623,742,827,907,998,1091,1186,1280,1380,1473,1568,1663,1754,1845,1930,2037,2148,2250,2358,2466,2576,2738,2838,2924" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "323,443,549,656,745,846,965,1050,1130,1221,1314,1409,1503,1603,1696,1791,1886,1977,2068,2153,2260,2371,2473,2581,2689,2799,2961,11918", + "endColumns": "119,105,106,88,100,118,84,79,90,92,94,93,99,92,94,94,90,90,84,106,110,101,107,107,109,161,99,85", + "endOffsets": "438,544,651,740,841,960,1045,1125,1216,1309,1404,1498,1598,1691,1786,1881,1972,2063,2148,2255,2366,2468,2576,2684,2794,2956,3056,11999" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-pt-rBR/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "197,298,442,565,669,832,958,1076,1177,1343,1447,1607,1733,1886,2039,2104,2166", + "endColumns": "100,143,122,103,162,125,117,100,165,103,159,125,152,152,64,61,79", + "endOffsets": "297,441,564,668,831,957,1075,1176,1342,1446,1606,1732,1885,2038,2103,2165,2245" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4525,4630,4778,4905,5013,5180,5310,5432,5682,5852,5960,6124,6254,6411,6568,6637,6703", + "endColumns": "104,147,126,107,166,129,121,104,169,107,163,129,156,156,68,65,83", + "endOffsets": "4625,4773,4900,5008,5175,5305,5427,5532,5847,5955,6119,6249,6406,6563,6632,6698,6782" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-pt-rBR/values-pt-rBR.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,353,453,560,670,790", + "endColumns": "96,101,98,99,106,109,119,100", + "endOffsets": "147,249,348,448,555,665,785,886" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3488,3585,3687,3786,3886,3993,4103,12243", + "endColumns": "96,101,98,99,106,109,119,100", + "endOffsets": "3580,3682,3781,3881,3988,4098,4218,12339" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-pt-rBR/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "199", + "endColumns": "140", + "endOffsets": "339" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5537", + "endColumns": "144", + "endOffsets": "5677" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-pt-rBR/values-pt-rBR.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,273,354,432,516,611,700,801,921,1002,1062,1126,1218,1297,1357,1447,1511,1582,1645,1720,1784,1838,1965,2023,2085,2139,2218,2359,2446,2522,2617,2698,2780,2919,3002,3086,3225,3312,3392,3448,3499,3565,3639,3719,3790,3873,3946,4023,4092,4166,4268,4356,4433,4526,4622,4696,4776,4873,4925,5009,5075,5162,5250,5312,5376,5439,5507,5616,5727,5831,5941,6001,6056,6133,6216,6293", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,80,77,83,94,88,100,119,80,59,63,91,78,59,89,63,70,62,74,63,53,126,57,61,53,78,140,86,75,94,80,81,138,82,83,138,86,79,55,50,65,73,79,70,82,72,76,68,73,101,87,76,92,95,73,79,96,51,83,65,86,87,61,63,62,67,108,110,103,109,59,54,76,82,76,78", + "endOffsets": "268,349,427,511,606,695,796,916,997,1057,1121,1213,1292,1352,1442,1506,1577,1640,1715,1779,1833,1960,2018,2080,2134,2213,2354,2441,2517,2612,2693,2775,2914,2997,3081,3220,3307,3387,3443,3494,3560,3634,3714,3785,3868,3941,4018,4087,4161,4263,4351,4428,4521,4617,4691,4771,4868,4920,5004,5070,5157,5245,5307,5371,5434,5502,5611,5722,5826,5936,5996,6051,6128,6211,6288,6367" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3061,3142,3220,3304,3399,4223,4324,4444,6787,6847,6911,7003,7082,7142,7232,7296,7367,7430,7505,7569,7623,7750,7808,7870,7924,8003,8144,8231,8307,8402,8483,8565,8704,8787,8871,9010,9097,9177,9233,9284,9350,9424,9504,9575,9658,9731,9808,9877,9951,10053,10141,10218,10311,10407,10481,10561,10658,10710,10794,10860,10947,11035,11097,11161,11224,11292,11401,11512,11616,11726,11786,11841,12004,12087,12164", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,80,77,83,94,88,100,119,80,59,63,91,78,59,89,63,70,62,74,63,53,126,57,61,53,78,140,86,75,94,80,81,138,82,83,138,86,79,55,50,65,73,79,70,82,72,76,68,73,101,87,76,92,95,73,79,96,51,83,65,86,87,61,63,62,67,108,110,103,109,59,54,76,82,76,78", + "endOffsets": "318,3137,3215,3299,3394,3483,4319,4439,4520,6842,6906,6998,7077,7137,7227,7291,7362,7425,7500,7564,7618,7745,7803,7865,7919,7998,8139,8226,8302,8397,8478,8560,8699,8782,8866,9005,9092,9172,9228,9279,9345,9419,9499,9570,9653,9726,9803,9872,9946,10048,10136,10213,10306,10402,10476,10556,10653,10705,10789,10855,10942,11030,11092,11156,11219,11287,11396,11507,11611,11721,11781,11836,11913,12082,12159,12238" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-pt-rPT.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-pt-rPT.json new file mode 100644 index 0000000..0988331 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-pt-rPT.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-pt-rPT/values-pt-rPT.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-pt-rPT/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "197,298,457,581,685,849,973,1091,1196,1380,1484,1650,1777,1932,2106,2170,2235", + "endColumns": "100,158,123,103,163,123,117,104,183,103,165,126,154,173,63,64,82", + "endOffsets": "297,456,580,684,848,972,1090,1195,1379,1483,1649,1776,1931,2105,2169,2234,2317" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4528,4633,4796,4924,5032,5200,5328,5450,5704,5892,6000,6170,6301,6460,6638,6706,6775", + "endColumns": "104,162,127,107,167,127,121,108,187,107,169,130,158,177,67,68,86", + "endOffsets": "4628,4791,4919,5027,5195,5323,5445,5554,5887,5995,6165,6296,6455,6633,6701,6770,6857" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-pt-rPT/values-pt-rPT.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,273,354,434,516,615,711,814,934,1015,1075,1139,1231,1310,1375,1465,1529,1597,1659,1732,1796,1850,1976,2034,2096,2150,2226,2369,2456,2536,2635,2721,2803,2942,3024,3106,3242,3329,3409,3465,3516,3582,3657,3737,3808,3887,3960,4037,4106,4180,4287,4380,4457,4550,4648,4722,4803,4902,4955,5039,5105,5194,5282,5344,5408,5471,5539,5655,5763,5870,5972,6032,6087,6173,6256,6335", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,80,79,81,98,95,102,119,80,59,63,91,78,64,89,63,67,61,72,63,53,125,57,61,53,75,142,86,79,98,85,81,138,81,81,135,86,79,55,50,65,74,79,70,78,72,76,68,73,106,92,76,92,97,73,80,98,52,83,65,88,87,61,63,62,67,115,107,106,101,59,54,85,82,78,78", + "endOffsets": "268,349,429,511,610,706,809,929,1010,1070,1134,1226,1305,1370,1460,1524,1592,1654,1727,1791,1845,1971,2029,2091,2145,2221,2364,2451,2531,2630,2716,2798,2937,3019,3101,3237,3324,3404,3460,3511,3577,3652,3732,3803,3882,3955,4032,4101,4175,4282,4375,4452,4545,4643,4717,4798,4897,4950,5034,5100,5189,5277,5339,5403,5466,5534,5650,5758,5865,5967,6027,6082,6168,6251,6330,6409" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3054,3135,3215,3297,3396,4224,4327,4447,6862,6922,6986,7078,7157,7222,7312,7376,7444,7506,7579,7643,7697,7823,7881,7943,7997,8073,8216,8303,8383,8482,8568,8650,8789,8871,8953,9089,9176,9256,9312,9363,9429,9504,9584,9655,9734,9807,9884,9953,10027,10134,10227,10304,10397,10495,10569,10650,10749,10802,10886,10952,11041,11129,11191,11255,11318,11386,11502,11610,11717,11819,11879,11934,12106,12189,12268", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,80,79,81,98,95,102,119,80,59,63,91,78,64,89,63,67,61,72,63,53,125,57,61,53,75,142,86,79,98,85,81,138,81,81,135,86,79,55,50,65,74,79,70,78,72,76,68,73,106,92,76,92,97,73,80,98,52,83,65,88,87,61,63,62,67,115,107,106,101,59,54,85,82,78,78", + "endOffsets": "318,3130,3210,3292,3391,3487,4322,4442,4523,6917,6981,7073,7152,7217,7307,7371,7439,7501,7574,7638,7692,7818,7876,7938,7992,8068,8211,8298,8378,8477,8563,8645,8784,8866,8948,9084,9171,9251,9307,9358,9424,9499,9579,9650,9729,9802,9879,9948,10022,10129,10222,10299,10392,10490,10564,10645,10744,10797,10881,10947,11036,11124,11186,11250,11313,11381,11497,11605,11712,11814,11874,11929,12015,12184,12263,12342" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-pt-rPT/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "199", + "endColumns": "140", + "endOffsets": "339" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5559", + "endColumns": "144", + "endOffsets": "5699" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-pt-rPT/values-pt-rPT.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,319,426,515,616,734,819,899,991,1085,1182,1276,1375,1469,1565,1660,1752,1844,1929,2036,2147,2249,2357,2465,2572,2737,2836", + "endColumns": "107,105,106,88,100,117,84,79,91,93,96,93,98,93,95,94,91,91,84,106,110,101,107,107,106,164,98,85", + "endOffsets": "208,314,421,510,611,729,814,894,986,1080,1177,1271,1370,1464,1560,1655,1747,1839,1924,2031,2142,2244,2352,2460,2567,2732,2831,2917" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "323,431,537,644,733,834,952,1037,1117,1209,1303,1400,1494,1593,1687,1783,1878,1970,2062,2147,2254,2365,2467,2575,2683,2790,2955,12020", + "endColumns": "107,105,106,88,100,117,84,79,91,93,96,93,98,93,95,94,91,91,84,106,110,101,107,107,106,164,98,85", + "endOffsets": "426,532,639,728,829,947,1032,1112,1204,1298,1395,1489,1588,1682,1778,1873,1965,2057,2142,2249,2360,2462,2570,2678,2785,2950,3049,12101" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-pt-rPT/values-pt-rPT.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,353,453,560,666,787", + "endColumns": "96,101,98,99,106,105,120,100", + "endOffsets": "147,249,348,448,555,661,782,883" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3492,3589,3691,3790,3890,3997,4103,12347", + "endColumns": "96,101,98,99,106,105,120,100", + "endOffsets": "3584,3686,3785,3885,3992,4098,4219,12443" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-pt.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-pt.json new file mode 100644 index 0000000..18db09d --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-pt.json @@ -0,0 +1,43 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-pt/values-pt.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-pt/values-pt.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,353,453,560,670,790", + "endColumns": "96,101,98,99,106,109,119,100", + "endOffsets": "147,249,348,448,555,665,785,886" + }, + "to": { + "startLines": "29,30,31,32,33,34,35,37", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "2843,2940,3042,3141,3241,3348,3458,3664", + "endColumns": "96,101,98,99,106,109,119,100", + "endOffsets": "2935,3037,3136,3236,3343,3453,3573,3760" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-pt/values-pt.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,225,331,438,527,628,747,832,912,1003,1096,1191,1285,1385,1478,1573,1668,1759,1850,1935,2042,2153,2255,2363,2471,2581,2743,2843", + "endColumns": "119,105,106,88,100,118,84,79,90,92,94,93,99,92,94,94,90,90,84,106,110,101,107,107,109,161,99,85", + "endOffsets": "220,326,433,522,623,742,827,907,998,1091,1186,1280,1380,1473,1568,1663,1754,1845,1930,2037,2148,2250,2358,2466,2576,2738,2838,2924" + }, + "to": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,36", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,225,331,438,527,628,747,832,912,1003,1096,1191,1285,1385,1478,1573,1668,1759,1850,1935,2042,2153,2255,2363,2471,2581,2743,3578", + "endColumns": "119,105,106,88,100,118,84,79,90,92,94,93,99,92,94,94,90,90,84,106,110,101,107,107,109,161,99,85", + "endOffsets": "220,326,433,522,623,742,827,907,998,1091,1186,1280,1380,1473,1568,1663,1754,1845,1930,2037,2148,2250,2358,2466,2576,2738,2838,3659" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ro.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ro.json new file mode 100644 index 0000000..bb7f977 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ro.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-ro/values-ro.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ro/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "139", + "endOffsets": "334" + }, + "to": { + "startLines": "57", + "startColumns": "4", + "startOffsets": "5613", + "endColumns": "143", + "endOffsets": "5752" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ro/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,453,579,685,832,958,1077,1182,1340,1447,1602,1731,1873,2035,2100,2164", + "endColumns": "103,155,125,105,146,125,118,104,157,106,154,128,141,161,64,63,78", + "endOffsets": "296,452,578,684,831,957,1076,1181,1339,1446,1601,1730,1872,2034,2099,2163,2242" + }, + "to": { + "startLines": "49,50,51,52,53,54,55,56,58,59,60,61,62,63,64,65,66", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4592,4700,4860,4990,5100,5251,5381,5504,5757,5919,6030,6189,6322,6468,6634,6703,6771", + "endColumns": "107,159,129,109,150,129,122,108,161,110,158,132,145,165,68,67,82", + "endOffsets": "4695,4855,4985,5095,5246,5376,5499,5608,5914,6025,6184,6317,6463,6629,6698,6766,6849" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ro/values-ro.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,228,334,447,531,636,755,840,920,1011,1104,1199,1293,1393,1486,1581,1675,1766,1858,1939,2049,2157,2255,2367,2473,2577,2739,2840", + "endColumns": "122,105,112,83,104,118,84,79,90,92,94,93,99,92,94,93,90,91,80,109,107,97,111,105,103,161,100,81", + "endOffsets": "223,329,442,526,631,750,835,915,1006,1099,1194,1288,1388,1481,1576,1670,1761,1853,1934,2044,2152,2250,2362,2468,2572,2734,2835,2917" + }, + "to": { + "startLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,131", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "371,494,600,713,797,902,1021,1106,1186,1277,1370,1465,1559,1659,1752,1847,1941,2032,2124,2205,2315,2423,2521,2633,2739,2843,3005,11981", + "endColumns": "122,105,112,83,104,118,84,79,90,92,94,93,99,92,94,93,90,91,80,109,107,97,111,105,103,161,100,81", + "endOffsets": "489,595,708,792,897,1016,1101,1181,1272,1365,1460,1554,1654,1747,1842,1936,2027,2119,2200,2310,2418,2516,2628,2734,2838,3000,3101,12058" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ro/values-ro.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,355,454,556,665,782", + "endColumns": "97,101,99,98,101,108,116,100", + "endOffsets": "148,250,350,449,551,660,777,878" + }, + "to": { + "startLines": "39,40,41,42,43,44,45,135", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3559,3657,3759,3859,3958,4060,4169,12305", + "endColumns": "97,101,99,98,101,108,116,100", + "endOffsets": "3652,3754,3854,3953,4055,4164,4281,12401" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ro/values-ro.xml", + "from": { + "startLines": "2,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,321,413,501,588,684,774,875,996,1080,1142,1208,1303,1377,1437,1521,1583,1649,1707,1780,1843,1899,2018,2075,2136,2192,2266,2411,2497,2572,2661,2740,2824,2957,3039,3122,3268,3358,3438,3493,3544,3610,3683,3761,3832,3917,3988,4065,4139,4211,4317,4408,4482,4577,4675,4749,4829,4930,4983,5069,5135,5224,5314,5376,5440,5503,5577,5689,5799,5909,6014,6073,6128,6207,6293,6370", + "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "endColumns": "12,91,87,86,95,89,100,120,83,61,65,94,73,59,83,61,65,57,72,62,55,118,56,60,55,73,144,85,74,88,78,83,132,81,82,145,89,79,54,50,65,72,77,70,84,70,76,73,71,105,90,73,94,97,73,79,100,52,85,65,88,89,61,63,62,73,111,109,109,104,58,54,78,85,76,78", + "endOffsets": "316,408,496,583,679,769,870,991,1075,1137,1203,1298,1372,1432,1516,1578,1644,1702,1775,1838,1894,2013,2070,2131,2187,2261,2406,2492,2567,2656,2735,2819,2952,3034,3117,3263,3353,3433,3488,3539,3605,3678,3756,3827,3912,3983,4060,4134,4206,4312,4403,4477,4572,4670,4744,4824,4925,4978,5064,5130,5219,5309,5371,5435,5498,5572,5684,5794,5904,6009,6068,6123,6202,6288,6365,6444" + }, + "to": { + "startLines": "2,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3106,3198,3286,3373,3469,4286,4387,4508,6854,6916,6982,7077,7151,7211,7295,7357,7423,7481,7554,7617,7673,7792,7849,7910,7966,8040,8185,8271,8346,8435,8514,8598,8731,8813,8896,9042,9132,9212,9267,9318,9384,9457,9535,9606,9691,9762,9839,9913,9985,10091,10182,10256,10351,10449,10523,10603,10704,10757,10843,10909,10998,11088,11150,11214,11277,11351,11463,11573,11683,11788,11847,11902,12063,12149,12226", + "endLines": "6,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "endColumns": "12,91,87,86,95,89,100,120,83,61,65,94,73,59,83,61,65,57,72,62,55,118,56,60,55,73,144,85,74,88,78,83,132,81,82,145,89,79,54,50,65,72,77,70,84,70,76,73,71,105,90,73,94,97,73,79,100,52,85,65,88,89,61,63,62,73,111,109,109,104,58,54,78,85,76,78", + "endOffsets": "366,3193,3281,3368,3464,3554,4382,4503,4587,6911,6977,7072,7146,7206,7290,7352,7418,7476,7549,7612,7668,7787,7844,7905,7961,8035,8180,8266,8341,8430,8509,8593,8726,8808,8891,9037,9127,9207,9262,9313,9379,9452,9530,9601,9686,9757,9834,9908,9980,10086,10177,10251,10346,10444,10518,10598,10699,10752,10838,10904,10993,11083,11145,11209,11272,11346,11458,11568,11678,11783,11842,11897,11976,12144,12221,12300" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ru.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ru.json new file mode 100644 index 0000000..a023c7a --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ru.json @@ -0,0 +1,211 @@ +{ + "logs": [ + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-mergeDebugResources-36:/values-ru/values-ru.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ru/values-ru.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,220,322,421,507,612,733,812,888,980,1074,1169,1262,1357,1451,1547,1642,1734,1826,1915,2021,2128,2226,2335,2442,2556,2722,2822", + "endColumns": "114,101,98,85,104,120,78,75,91,93,94,92,94,93,95,94,91,91,88,105,106,97,108,106,113,165,99,81", + "endOffsets": "215,317,416,502,607,728,807,883,975,1069,1164,1257,1352,1446,1542,1637,1729,1821,1910,2016,2123,2221,2330,2437,2551,2717,2817,2899" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,340", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "431,546,648,747,833,938,1059,1138,1214,1306,1400,1495,1588,1683,1777,1873,1968,2060,2152,2241,2347,2454,2552,2661,2768,2882,3048,27486", + "endColumns": "114,101,98,85,104,120,78,75,91,93,94,92,94,93,95,94,91,91,88,105,106,97,108,106,113,165,99,81", + "endOffsets": "541,643,742,828,933,1054,1133,1209,1301,1395,1490,1583,1678,1772,1868,1963,2055,2147,2236,2342,2449,2547,2656,2763,2877,3043,3143,27563" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ru/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,458,580,686,824,949,1060,1160,1337,1440,1599,1721,1884,2038,2103,2159", + "endColumns": "102,161,121,105,137,124,110,99,176,102,158,121,162,153,64,55,81", + "endOffsets": "295,457,579,685,823,948,1059,1159,1336,1439,1598,1720,1883,2037,2102,2158,2240" + }, + "to": { + "startLines": "102,103,104,105,106,107,108,109,111,112,113,114,115,116,117,118,119", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "8566,8673,8839,8965,9075,9217,9346,9461,9722,9903,10010,10173,10299,10466,10624,10693,10753", + "endColumns": "106,165,125,109,141,128,114,103,180,106,162,125,166,157,68,59,85", + "endOffsets": "8668,8834,8960,9070,9212,9341,9456,9560,9898,10005,10168,10294,10461,10619,10688,10748,10834" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ru/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "152", + "endOffsets": "347" + }, + "to": { + "startLines": "110", + "startColumns": "4", + "startOffsets": "9565", + "endColumns": "156", + "endOffsets": "9717" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values-ru/strings.xml", + "from": { + "startLines": "85,84,83,2,124,126,123,125,76,127,128,26,25,110,151,197,193,194,32,33,156,37,36,155,35,34,75,20,21,22,168,132,111,38,39,80,81,129,77,233,237,236,68,69,154,231,232,235,70,71,229,234,108,109,27,222,214,211,210,209,213,208,203,212,205,206,204,207,226,227,228,219,220,218,216,215,217,225,224,202,201,221,200,120,121,246,74,116,113,114,112,115,78,88,57,192,191,190,189,188,23,230,24,58,18,19,175,157,59,16,93,139,244,17,137,142,174,15,136,56,179,177,178,176,199,198,5,89,90,86,87,150,149,131,60,65,67,61,153,152,64,62,66,63,243,103,102,101,138,8,165,164,166,241,240,238,242,239,97,95,96,118,119,99,98,91,100,162,161,160,158,159,185,144,147,145,146,148,42,40,41,4,141,140,105,245,79,104,7,163,9,10,82,195,196,46,44,49,55,54,47,48,43,45,52,51,53,50,12,73,3,117,6,186,167,187,133,135,134,14,11,94,92,143,107,173,184,181,183,182,180,122,72,30,29,28,223,31,169,170,172,171,130,13,106", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "6038,5966,5893,55,9032,9197,8962,9133,5382,9255,9325,1718,1653,7851,10969,14165,13852,13902,2271,2337,11293,2741,2614,11232,2486,2397,5300,1208,1267,1360,12200,9599,7904,2854,2932,5704,5764,9399,5503,17041,17253,17173,4810,4861,11114,16925,16983,17129,4913,4985,16803,17083,7737,7789,1910,16111,15309,15099,15037,14971,15232,14896,14526,15176,14726,14781,14667,14839,16472,16561,16638,15756,15869,15673,15485,15394,15567,16371,16268,14466,14411,16035,14340,8741,8812,18091,5253,8418,8078,8176,7981,8247,5567,6265,4128,13800,13748,13695,13638,13584,1468,16867,1561,4205,1045,1117,12780,11357,4260,922,6573,10089,17853,989,9927,10288,12729,868,9880,4070,13001,12895,12948,12828,14264,14212,223,6340,6396,6129,6194,10898,10791,9547,4326,4611,4752,4386,11070,11028,4532,4430,4670,4482,17763,7390,7334,7252,10011,487,11967,11903,12081,17536,17475,17303,17638,17367,6895,6754,6831,8594,8678,7057,6974,6471,7159,11732,11667,11576,11401,11506,13347,10498,10666,10552,10617,10725,3155,3005,3072,156,10210,10151,7538,17915,5636,7464,427,11803,528,573,5844,13971,14074,3386,3278,3589,3986,3909,3454,3523,3223,3331,3797,3741,3853,3677,692,5184,105,8499,375,13445,12137,13519,9670,9809,9738,808,635,6668,6535,10371,7673,12630,13278,13130,13219,13174,13066,8882,5080,2125,2054,1984,16195,2193,12301,12389,12525,12469,9472,748,7598", + "endColumns": "90,71,72,49,100,57,69,63,120,69,73,191,64,52,58,46,49,68,65,59,63,112,126,60,127,88,81,58,92,107,100,70,76,77,72,59,79,72,63,41,49,79,50,51,117,57,57,43,71,94,63,45,51,61,73,83,84,76,61,65,76,74,140,55,54,57,58,56,88,76,164,112,165,82,81,90,105,100,102,59,54,75,70,70,69,59,46,80,97,70,96,170,68,74,76,51,51,52,56,53,92,57,91,54,71,90,47,43,65,66,94,61,61,55,83,82,50,53,46,57,64,52,52,66,75,51,151,55,74,64,70,70,106,51,59,58,57,43,43,41,78,51,81,49,89,73,55,81,77,40,113,63,55,101,60,63,124,107,78,76,63,83,62,101,82,63,92,70,64,90,104,69,97,53,58,64,48,65,67,66,82,66,77,58,59,175,67,73,59,99,44,61,48,102,90,67,52,87,83,76,68,65,54,54,55,55,55,63,55,68,50,94,51,73,62,64,67,70,70,59,56,85,37,126,63,98,68,43,58,44,63,79,103,67,70,69,72,77,87,79,104,55,74,59,74", + "endOffsets": "6124,6033,5961,100,9128,9250,9027,9192,5498,9320,9394,1905,1713,7899,11023,14207,13897,13966,2332,2392,11352,2849,2736,11288,2609,2481,5377,1262,1355,1463,12296,9665,7976,2927,3000,5759,5839,9467,5562,17078,17298,17248,4856,4908,11227,16978,17036,17168,4980,5075,16862,17124,7784,7846,1979,16190,15389,15171,15094,15032,15304,14966,14662,15227,14776,14834,14721,14891,16556,16633,16798,15864,16030,15751,15562,15480,15668,16467,16366,14521,14461,16106,14406,8807,8877,18146,5295,8494,8171,8242,8073,8413,5631,6335,4200,13847,13795,13743,13690,13633,1556,16920,1648,4255,1112,1203,12823,11396,4321,984,6663,10146,17910,1040,10006,10366,12775,917,9922,4123,13061,12943,12996,12890,14335,14259,370,6391,6466,6189,6260,10964,10893,9594,4381,4665,4805,4425,11109,11065,4606,4477,4747,4527,17848,7459,7385,7329,10084,523,12076,11962,12132,17633,17531,17362,17758,17470,6969,6826,6890,8673,8736,7154,7052,6530,7247,11798,11727,11662,11501,11571,13440,10547,10720,10612,10661,10786,3218,3067,3150,218,10283,10205,7593,18086,5699,7533,482,11898,568,630,5888,14069,14160,3449,3326,3672,4065,3981,3518,3584,3273,3381,3848,3792,3904,3736,743,5248,151,8589,422,13514,12195,13579,9733,9875,9804,863,687,6749,6568,10493,7732,12724,13342,13169,13273,13214,13125,8957,5179,2188,2120,2049,16263,2266,12384,12464,12625,12520,9542,803,7668" + }, + "to": { + "startLines": "35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,55,56,57,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,89,90,91,92,93,94,95,96,97,98,99,100,101,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,156,158,159,160,161,163,164,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,262,263,264,265,266,267,268,269,270,271,272,273,274,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,341,344,345,346,347,348,349,350,351,352,353,354,356,357,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "3148,3239,3311,3384,3434,3535,3593,3663,3727,3848,3918,3992,4184,4249,4302,4790,4837,4887,5683,5749,5809,5873,5986,6113,6174,6302,6391,6473,6532,6625,6733,6834,6905,6982,7060,7133,7193,7273,7346,7736,7778,7828,7908,7959,8011,8129,8187,8245,8289,8361,8456,8520,10839,10891,10953,11027,11111,11196,11273,11335,11401,11478,11553,11694,11750,11805,11863,11922,11979,12068,12145,12310,12423,12589,12672,12754,12845,12951,13052,13155,13215,13270,13346,13417,13488,13558,13618,13740,13887,13985,14056,14153,14423,14492,14707,14784,14836,14888,14941,14998,15052,15145,15203,15295,15350,15422,15513,15561,15605,15671,15738,15833,15895,15957,16013,16097,16180,16231,16285,16332,16390,16455,16508,16561,16628,16704,16756,16908,16964,17039,17104,21832,21903,22010,22062,22122,22181,22239,22283,22327,22369,22448,22500,22582,22712,22802,22876,22932,23014,23092,23133,23247,23311,23367,23469,23530,23594,23719,23827,23906,23983,24047,24131,24194,24296,24379,24443,24536,24607,24672,24763,24868,24938,25036,25090,25149,25214,25263,25329,25397,25464,25547,25614,25692,25751,25811,25987,26055,26129,26189,26289,26334,26396,26445,26548,26639,26707,26760,26848,26932,27009,27078,27144,27199,27254,27310,27366,27422,27568,27794,27863,27914,28009,28061,28135,28198,28263,28331,28402,28473,28612,28669,28856,28894,29021,29085,29184,29253,29297,29356,29401,29465,29545,29649,29717,29788,29858,29931,30009,30097,30177,30282,30338,30413,30473", + "endColumns": "90,71,72,49,100,57,69,63,120,69,73,191,64,52,58,46,49,68,65,59,63,112,126,60,127,88,81,58,92,107,100,70,76,77,72,59,79,72,63,41,49,79,50,51,117,57,57,43,71,94,63,45,51,61,73,83,84,76,61,65,76,74,140,55,54,57,58,56,88,76,164,112,165,82,81,90,105,100,102,59,54,75,70,70,69,59,46,80,97,70,96,170,68,74,76,51,51,52,56,53,92,57,91,54,71,90,47,43,65,66,94,61,61,55,83,82,50,53,46,57,64,52,52,66,75,51,151,55,74,64,70,70,106,51,59,58,57,43,43,41,78,51,81,49,89,73,55,81,77,40,113,63,55,101,60,63,124,107,78,76,63,83,62,101,82,63,92,70,64,90,104,69,97,53,58,64,48,65,67,66,82,66,77,58,59,175,67,73,59,99,44,61,48,102,90,67,52,87,83,76,68,65,54,54,55,55,55,63,55,68,50,94,51,73,62,64,67,70,70,59,56,85,37,126,63,98,68,43,58,44,63,79,103,67,70,69,72,77,87,79,104,55,74,59,74", + "endOffsets": "3234,3306,3379,3429,3530,3588,3658,3722,3843,3913,3987,4179,4244,4297,4356,4832,4882,4951,5744,5804,5868,5981,6108,6169,6297,6386,6468,6527,6620,6728,6829,6900,6977,7055,7128,7188,7268,7341,7405,7773,7823,7903,7954,8006,8124,8182,8240,8284,8356,8451,8515,8561,10886,10948,11022,11106,11191,11268,11330,11396,11473,11548,11689,11745,11800,11858,11917,11974,12063,12140,12305,12418,12584,12667,12749,12840,12946,13047,13150,13210,13265,13341,13412,13483,13553,13613,13660,13816,13980,14051,14148,14319,14487,14562,14779,14831,14883,14936,14993,15047,15140,15198,15290,15345,15417,15508,15556,15600,15666,15733,15828,15890,15952,16008,16092,16175,16226,16280,16327,16385,16450,16503,16556,16623,16699,16751,16903,16959,17034,17099,17170,21898,22005,22057,22117,22176,22234,22278,22322,22364,22443,22495,22577,22627,22797,22871,22927,23009,23087,23128,23242,23306,23362,23464,23525,23589,23714,23822,23901,23978,24042,24126,24189,24291,24374,24438,24531,24602,24667,24758,24863,24933,25031,25085,25144,25209,25258,25324,25392,25459,25542,25609,25687,25746,25806,25982,26050,26124,26184,26284,26329,26391,26440,26543,26634,26702,26755,26843,26927,27004,27073,27139,27194,27249,27305,27361,27417,27481,27619,27858,27909,28004,28056,28130,28193,28258,28326,28397,28468,28528,28664,28750,28889,29016,29080,29179,29248,29292,29351,29396,29460,29540,29644,29712,29783,29853,29926,30004,30092,30172,30277,30333,30408,30468,30543" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ru/values-ru.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,356,457,562,665,782", + "endColumns": "97,101,100,100,104,102,116,100", + "endOffsets": "148,250,351,452,557,660,777,878" + }, + "to": { + "startLines": "58,59,60,61,62,63,64,358", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "4956,5054,5156,5257,5358,5463,5566,28755", + "endColumns": "97,101,100,100,104,102,116,100", + "endOffsets": "5049,5151,5252,5353,5458,5561,5678,28851" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ru/values-ru.xml", + "from": { + "startLines": "2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,381,459,537,621,719,810,907,1044,1136,1211,1277,1376,1453,1516,1634,1695,1760,1817,1887,1948,2002,2118,2175,2237,2291,2365,2493,2581,2668,2771,2863,2949,3086,3170,3255,3389,3480,3556,3610,3661,3727,3799,3877,3948,4030,4110,4186,4263,4340,4447,4536,4609,4699,4794,4868,4949,5042,5097,5178,5244,5330,5415,5477,5541,5604,5676,5774,5873,5968,6060,6118,6173,6253,6347,6423", + "endLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "endColumns": "12,77,77,83,97,90,96,136,91,74,65,98,76,62,117,60,64,56,69,60,53,115,56,61,53,73,127,87,86,102,91,85,136,83,84,133,90,75,53,50,65,71,77,70,81,79,75,76,76,106,88,72,89,94,73,80,92,54,80,65,85,84,61,63,62,71,97,98,94,91,57,54,79,93,75,78", + "endOffsets": "376,454,532,616,714,805,902,1039,1131,1206,1272,1371,1448,1511,1629,1690,1755,1812,1882,1943,1997,2113,2170,2232,2286,2360,2488,2576,2663,2766,2858,2944,3081,3165,3250,3384,3475,3551,3605,3656,3722,3794,3872,3943,4025,4105,4181,4258,4335,4442,4531,4604,4694,4789,4863,4944,5037,5092,5173,5239,5325,5410,5472,5536,5599,5671,5769,5868,5963,6055,6113,6168,6248,6342,6418,6497" + }, + "to": { + "startLines": "2,50,51,52,53,54,86,87,88,155,157,162,165,166,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,275,342,343,355", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,4361,4439,4517,4601,4699,7410,7507,7644,13665,13821,14324,14567,14644,17175,17293,17354,17419,17476,17546,17607,17661,17777,17834,17896,17950,18024,18152,18240,18327,18430,18522,18608,18745,18829,18914,19048,19139,19215,19269,19320,19386,19458,19536,19607,19689,19769,19845,19922,19999,20106,20195,20268,20358,20453,20527,20608,20701,20756,20837,20903,20989,21074,21136,21200,21263,21335,21433,21532,21627,21719,21777,22632,27624,27718,28533", + "endLines": "7,50,51,52,53,54,86,87,88,155,157,162,165,166,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,275,342,343,355", + "endColumns": "12,77,77,83,97,90,96,136,91,74,65,98,76,62,117,60,64,56,69,60,53,115,56,61,53,73,127,87,86,102,91,85,136,83,84,133,90,75,53,50,65,71,77,70,81,79,75,76,76,106,88,72,89,94,73,80,92,54,80,65,85,84,61,63,62,71,97,98,94,91,57,54,79,93,75,78", + "endOffsets": "426,4434,4512,4596,4694,4785,7502,7639,7731,13735,13882,14418,14639,14702,17288,17349,17414,17471,17541,17602,17656,17772,17829,17891,17945,18019,18147,18235,18322,18425,18517,18603,18740,18824,18909,19043,19134,19210,19264,19315,19381,19453,19531,19602,19684,19764,19840,19917,19994,20101,20190,20263,20353,20448,20522,20603,20696,20751,20832,20898,20984,21069,21131,21195,21258,21330,21428,21527,21622,21714,21772,21827,22707,27713,27789,28607" + } + } + ] + }, + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-ru/values-ru.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ru/values-ru.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,340", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "431,546,648,747,833,938,1059,1138,1214,1306,1400,1495,1588,1683,1777,1873,1968,2060,2152,2241,2347,2454,2552,2661,2768,2882,3048,27455", + "endColumns": "114,101,98,85,104,120,78,75,91,93,94,92,94,93,95,94,91,91,88,105,106,97,108,106,113,165,99,81", + "endOffsets": "541,643,742,828,933,1054,1133,1209,1301,1395,1490,1583,1678,1772,1868,1963,2055,2147,2236,2342,2449,2547,2656,2763,2877,3043,3143,27532" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ru/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "102,103,104,105,106,107,108,109,111,112,113,114,115,116,117,118,119", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "8566,8673,8839,8965,9075,9217,9346,9461,9722,9903,10010,10173,10299,10466,10624,10693,10753", + "endColumns": "106,165,125,109,141,128,114,103,180,106,162,125,166,157,68,59,85", + "endOffsets": "8668,8834,8960,9070,9212,9341,9456,9560,9898,10005,10168,10294,10461,10619,10688,10748,10834" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ru/values.xml", + "from": { + "startLines": "-1", + "startColumns": "-1", + "startOffsets": "-1" + }, + "to": { + "startLines": "110", + "startColumns": "4", + "startOffsets": "9565", + "endColumns": "156", + "endOffsets": "9717" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values-ru/strings.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,156,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "endColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,43,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "endOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,195,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,55,56,57,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,89,90,91,92,93,94,95,96,97,98,99,100,101,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,156,158,159,160,161,163,164,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,262,263,264,265,266,267,268,269,270,271,272,273,274,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,341,344,345,346,347,348,349,350,351,352,353,354,356,357,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "3148,3239,3311,3384,3434,3535,3593,3663,3727,3848,3918,3992,4184,4249,4302,4790,4837,4887,5683,5749,5809,5873,5986,6113,6174,6302,6391,6473,6532,6625,6733,6834,6905,6982,7060,7133,7193,7273,7346,7736,7778,7828,7908,7959,8011,8129,8187,8245,8289,8361,8456,8520,10839,10891,10953,11027,11111,11196,11273,11335,11401,11478,11553,11694,11750,11805,11863,11922,11979,12068,12145,12310,12423,12589,12672,12754,12845,12951,13052,13155,13215,13270,13346,13417,13488,13558,13618,13740,13887,13985,14056,14153,14423,14492,14707,14784,14836,14888,14941,14998,15052,15145,15203,15295,15350,15422,15513,15561,15605,15671,15738,15833,15895,15957,16013,16097,16180,16231,16285,16332,16390,16455,16508,16561,16628,16704,16756,16908,16964,17039,17104,21832,21903,22010,22062,22122,22181,22239,22283,22327,22369,22448,22500,22582,22712,22802,22876,22932,23014,23092,23133,23247,23311,23367,23469,23530,23594,23719,23827,23906,23983,24047,24131,24194,24296,24379,24443,24536,24607,24672,24763,24868,24938,25036,25090,25149,25214,25263,25329,25397,25464,25547,25583,25661,25720,25780,25956,26024,26098,26158,26258,26303,26365,26414,26517,26608,26676,26729,26817,26901,26978,27047,27113,27168,27223,27279,27335,27391,27537,27763,27832,27883,27978,28030,28104,28167,28232,28300,28371,28442,28581,28638,28825,28863,28990,29054,29153,29222,29266,29325,29370,29434,29514,29618,29686,29757,29827,29900,29978,30066,30146,30251,30307,30382,30442", + "endColumns": "90,71,72,49,100,57,69,63,120,69,73,191,64,52,58,46,49,68,65,59,63,112,126,60,127,88,81,58,92,107,100,70,76,77,72,59,79,72,63,41,49,79,50,51,117,57,57,43,71,94,63,45,51,61,73,83,84,76,61,65,76,74,140,55,54,57,58,56,88,76,164,112,165,82,81,90,105,100,102,59,54,75,70,70,69,59,46,80,97,70,96,170,68,74,76,51,51,52,56,53,92,57,91,54,71,90,47,43,65,66,94,61,61,55,83,82,50,53,46,57,64,52,52,66,75,51,151,55,74,64,70,70,106,51,59,58,57,43,43,41,78,51,81,49,89,73,55,81,77,40,113,63,55,101,60,63,124,107,78,76,63,83,62,101,82,63,92,70,64,90,104,69,97,53,58,64,48,65,67,66,82,35,77,58,59,175,67,73,59,99,44,61,48,102,90,67,52,87,83,76,68,65,54,54,55,55,55,63,55,68,50,94,51,73,62,64,67,70,70,59,56,85,37,126,63,98,68,43,58,44,63,79,103,67,70,69,72,77,87,79,104,55,74,59,74", + "endOffsets": "3234,3306,3379,3429,3530,3588,3658,3722,3843,3913,3987,4179,4244,4297,4356,4832,4882,4951,5744,5804,5868,5981,6108,6169,6297,6386,6468,6527,6620,6728,6829,6900,6977,7055,7128,7188,7268,7341,7405,7773,7823,7903,7954,8006,8124,8182,8240,8284,8356,8451,8515,8561,10886,10948,11022,11106,11191,11268,11330,11396,11473,11548,11689,11745,11800,11858,11917,11974,12063,12140,12305,12418,12584,12667,12749,12840,12946,13047,13150,13210,13265,13341,13412,13483,13553,13613,13660,13816,13980,14051,14148,14319,14487,14562,14779,14831,14883,14936,14993,15047,15140,15198,15290,15345,15417,15508,15556,15600,15666,15733,15828,15890,15952,16008,16092,16175,16226,16280,16327,16385,16450,16503,16556,16623,16699,16751,16903,16959,17034,17099,17170,21898,22005,22057,22117,22176,22234,22278,22322,22364,22443,22495,22577,22627,22797,22871,22927,23009,23087,23128,23242,23306,23362,23464,23525,23589,23714,23822,23901,23978,24042,24126,24189,24291,24374,24438,24531,24602,24667,24758,24863,24933,25031,25085,25144,25209,25258,25324,25392,25459,25542,25578,25656,25715,25775,25951,26019,26093,26153,26253,26298,26360,26409,26512,26603,26671,26724,26812,26896,26973,27042,27108,27163,27218,27274,27330,27386,27450,27588,27827,27878,27973,28025,28099,28162,28227,28295,28366,28437,28497,28633,28719,28858,28985,29049,29148,29217,29261,29320,29365,29429,29509,29613,29681,29752,29822,29895,29973,30061,30141,30246,30302,30377,30437,30512" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ru/values-ru.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "58,59,60,61,62,63,64,358", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "4956,5054,5156,5257,5358,5463,5566,28724", + "endColumns": "97,101,100,100,104,102,116,100", + "endOffsets": "5049,5151,5252,5353,5458,5561,5678,28820" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ru/values-ru.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "2,50,51,52,53,54,86,87,88,155,157,162,165,166,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,275,342,343,355", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,4361,4439,4517,4601,4699,7410,7507,7644,13665,13821,14324,14567,14644,17175,17293,17354,17419,17476,17546,17607,17661,17777,17834,17896,17950,18024,18152,18240,18327,18430,18522,18608,18745,18829,18914,19048,19139,19215,19269,19320,19386,19458,19536,19607,19689,19769,19845,19922,19999,20106,20195,20268,20358,20453,20527,20608,20701,20756,20837,20903,20989,21074,21136,21200,21263,21335,21433,21532,21627,21719,21777,22632,27593,27687,28502", + "endLines": "7,50,51,52,53,54,86,87,88,155,157,162,165,166,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,275,342,343,355", + "endColumns": "12,77,77,83,97,90,96,136,91,74,65,98,76,62,117,60,64,56,69,60,53,115,56,61,53,73,127,87,86,102,91,85,136,83,84,133,90,75,53,50,65,71,77,70,81,79,75,76,76,106,88,72,89,94,73,80,92,54,80,65,85,84,61,63,62,71,97,98,94,91,57,54,79,93,75,78", + "endOffsets": "426,4434,4512,4596,4694,4785,7502,7639,7731,13735,13882,14418,14639,14702,17288,17349,17414,17471,17541,17602,17656,17772,17829,17891,17945,18019,18147,18235,18322,18425,18517,18603,18740,18824,18909,19043,19134,19210,19264,19315,19381,19453,19531,19602,19684,19764,19840,19917,19994,20101,20190,20263,20353,20448,20522,20603,20696,20751,20832,20898,20984,21069,21131,21195,21258,21330,21428,21527,21622,21714,21772,21827,22707,27682,27758,28576" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-si.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-si.json new file mode 100644 index 0000000..1870d31 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-si.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-si/values-si.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-si/values-si.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,157,260,365,470,569,673,787", + "endColumns": "101,102,104,104,98,103,113,100", + "endOffsets": "152,255,360,465,564,668,782,883" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3442,3544,3647,3752,3857,3956,4060,11982", + "endColumns": "101,102,104,104,98,103,113,100", + "endOffsets": "3539,3642,3747,3852,3951,4055,4169,12078" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-si/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "134", + "endOffsets": "329" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5453", + "endColumns": "138", + "endOffsets": "5587" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-si/values-si.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,269,345,422,500,591,676,778,893,976,1037,1101,1190,1257,1317,1411,1475,1538,1594,1664,1731,1786,1905,1962,2026,2080,2153,2275,2358,2441,2534,2620,2705,2837,2915,2995,3117,3203,3287,3347,3399,3465,3535,3608,3679,3756,3828,3905,3977,4047,4160,4253,4326,4416,4509,4583,4655,4746,4800,4880,4946,5030,5115,5177,5241,5304,5370,5475,5580,5675,5776,5840,5896,5976,6061,6136", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,75,76,77,90,84,101,114,82,60,63,88,66,59,93,63,62,55,69,66,54,118,56,63,53,72,121,82,82,92,85,84,131,77,79,121,85,83,59,51,65,69,72,70,76,71,76,71,69,112,92,72,89,92,73,71,90,53,79,65,83,84,61,63,62,65,104,104,94,100,63,55,79,84,74,75", + "endOffsets": "264,340,417,495,586,671,773,888,971,1032,1096,1185,1252,1312,1406,1470,1533,1589,1659,1726,1781,1900,1957,2021,2075,2148,2270,2353,2436,2529,2615,2700,2832,2910,2990,3112,3198,3282,3342,3394,3460,3530,3603,3674,3751,3823,3900,3972,4042,4155,4248,4321,4411,4504,4578,4650,4741,4795,4875,4941,5025,5110,5172,5236,5299,5365,5470,5575,5670,5771,5835,5891,5971,6056,6131,6207" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3035,3111,3188,3266,3357,4174,4276,4391,6664,6725,6789,6878,6945,7005,7099,7163,7226,7282,7352,7419,7474,7593,7650,7714,7768,7841,7963,8046,8129,8222,8308,8393,8525,8603,8683,8805,8891,8975,9035,9087,9153,9223,9296,9367,9444,9516,9593,9665,9735,9848,9941,10014,10104,10197,10271,10343,10434,10488,10568,10634,10718,10803,10865,10929,10992,11058,11163,11268,11363,11464,11528,11584,11746,11831,11906", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,75,76,77,90,84,101,114,82,60,63,88,66,59,93,63,62,55,69,66,54,118,56,63,53,72,121,82,82,92,85,84,131,77,79,121,85,83,59,51,65,69,72,70,76,71,76,71,69,112,92,72,89,92,73,71,90,53,79,65,83,84,61,63,62,65,104,104,94,100,63,55,79,84,74,75", + "endOffsets": "314,3106,3183,3261,3352,3437,4271,4386,4469,6720,6784,6873,6940,7000,7094,7158,7221,7277,7347,7414,7469,7588,7645,7709,7763,7836,7958,8041,8124,8217,8303,8388,8520,8598,8678,8800,8886,8970,9030,9082,9148,9218,9291,9362,9439,9511,9588,9660,9730,9843,9936,10009,10099,10192,10266,10338,10429,10483,10563,10629,10713,10798,10860,10924,10987,11053,11158,11263,11358,11459,11523,11579,11659,11826,11901,11977" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-si/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,447,567,676,814,934,1046,1140,1287,1398,1550,1677,1817,1974,2043,2100", + "endColumns": "103,149,119,108,137,119,111,93,146,110,151,126,139,156,68,56,75", + "endOffsets": "296,446,566,675,813,933,1045,1139,1286,1397,1549,1676,1816,1973,2042,2099,2175" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4474,4582,4736,4860,4973,5115,5239,5355,5592,5743,5858,6014,6145,6289,6450,6523,6584", + "endColumns": "107,153,123,112,141,123,115,97,150,114,155,130,143,160,72,60,79", + "endOffsets": "4577,4731,4855,4968,5110,5234,5350,5448,5738,5853,6009,6140,6284,6445,6518,6579,6659" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-si/values-si.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,221,328,435,518,623,739,829,915,1006,1099,1193,1287,1387,1480,1575,1669,1760,1851,1935,2044,2148,2246,2356,2456,2563,2722,2821", + "endColumns": "115,106,106,82,104,115,89,85,90,92,93,93,99,92,94,93,90,90,83,108,103,97,109,99,106,158,98,81", + "endOffsets": "216,323,430,513,618,734,824,910,1001,1094,1188,1282,1382,1475,1570,1664,1755,1846,1930,2039,2143,2241,2351,2451,2558,2717,2816,2898" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "319,435,542,649,732,837,953,1043,1129,1220,1313,1407,1501,1601,1694,1789,1883,1974,2065,2149,2258,2362,2460,2570,2670,2777,2936,11664", + "endColumns": "115,106,106,82,104,115,89,85,90,92,93,93,99,92,94,93,90,90,83,108,103,97,109,99,106,158,98,81", + "endOffsets": "430,537,644,727,832,948,1038,1124,1215,1308,1402,1496,1596,1689,1784,1878,1969,2060,2144,2253,2357,2455,2565,2665,2772,2931,3030,11741" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sk.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sk.json new file mode 100644 index 0000000..fe952d9 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sk.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-sk/values-sk.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-sk/values-sk.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,253,354,452,562,670,792", + "endColumns": "95,101,100,97,109,107,121,100", + "endOffsets": "146,248,349,447,557,665,787,888" + }, + "to": { + "startLines": "40,41,42,43,44,45,46,136", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3543,3639,3741,3842,3940,4050,4158,12222", + "endColumns": "95,101,100,97,109,107,121,100", + "endOffsets": "3634,3736,3837,3935,4045,4153,4275,12318" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-sk/values-sk.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,212,313,424,510,618,736,815,892,983,1076,1174,1268,1368,1461,1556,1654,1745,1836,1920,2025,2133,2232,2338,2450,2553,2719,2817", + "endColumns": "106,100,110,85,107,117,78,76,90,92,97,93,99,92,94,97,90,90,83,104,107,98,105,111,102,165,97,82", + "endOffsets": "207,308,419,505,613,731,810,887,978,1071,1169,1263,1363,1456,1551,1649,1740,1831,1915,2020,2128,2227,2333,2445,2548,2714,2812,2895" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,132", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "428,535,636,747,833,941,1059,1138,1215,1306,1399,1497,1591,1691,1784,1879,1977,2068,2159,2243,2348,2456,2555,2661,2773,2876,3042,11905", + "endColumns": "106,100,110,85,107,117,78,76,90,92,97,93,99,92,94,97,90,90,83,104,107,98,105,111,102,165,97,82", + "endOffsets": "530,631,742,828,936,1054,1133,1210,1301,1394,1492,1586,1686,1779,1874,1972,2063,2154,2238,2343,2451,2550,2656,2768,2871,3037,3135,11983" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-sk/values-sk.xml", + "from": { + "startLines": "2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,378,453,528,606,698,781,873,1001,1082,1143,1208,1307,1383,1448,1538,1602,1668,1722,1791,1851,1905,2022,2082,2144,2198,2270,2400,2487,2567,2663,2747,2839,2978,3047,3125,3256,3344,3424,3478,3529,3595,3667,3744,3815,3897,3969,4046,4119,4190,4295,4383,4455,4547,4643,4717,4791,4887,4939,5021,5088,5175,5262,5324,5388,5451,5519,5625,5732,5830,5947,6005,6060,6139,6222,6297", + "endLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "endColumns": "12,74,74,77,91,82,91,127,80,60,64,98,75,64,89,63,65,53,68,59,53,116,59,61,53,71,129,86,79,95,83,91,138,68,77,130,87,79,53,50,65,71,76,70,81,71,76,72,70,104,87,71,91,95,73,73,95,51,81,66,86,86,61,63,62,67,105,106,97,116,57,54,78,82,74,75", + "endOffsets": "373,448,523,601,693,776,868,996,1077,1138,1203,1302,1378,1443,1533,1597,1663,1717,1786,1846,1900,2017,2077,2139,2193,2265,2395,2482,2562,2658,2742,2834,2973,3042,3120,3251,3339,3419,3473,3524,3590,3662,3739,3810,3892,3964,4041,4114,4185,4290,4378,4450,4542,4638,4712,4786,4882,4934,5016,5083,5170,5257,5319,5383,5446,5514,5620,5727,5825,5942,6000,6055,6134,6217,6292,6368" + }, + "to": { + "startLines": "2,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3140,3215,3290,3368,3460,4280,4372,4500,6848,6909,6974,7073,7149,7214,7304,7368,7434,7488,7557,7617,7671,7788,7848,7910,7964,8036,8166,8253,8333,8429,8513,8605,8744,8813,8891,9022,9110,9190,9244,9295,9361,9433,9510,9581,9663,9735,9812,9885,9956,10061,10149,10221,10313,10409,10483,10557,10653,10705,10787,10854,10941,11028,11090,11154,11217,11285,11391,11498,11596,11713,11771,11826,11988,12071,12146", + "endLines": "7,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "endColumns": "12,74,74,77,91,82,91,127,80,60,64,98,75,64,89,63,65,53,68,59,53,116,59,61,53,71,129,86,79,95,83,91,138,68,77,130,87,79,53,50,65,71,76,70,81,71,76,72,70,104,87,71,91,95,73,73,95,51,81,66,86,86,61,63,62,67,105,106,97,116,57,54,78,82,74,75", + "endOffsets": "423,3210,3285,3363,3455,3538,4367,4495,4576,6904,6969,7068,7144,7209,7299,7363,7429,7483,7552,7612,7666,7783,7843,7905,7959,8031,8161,8248,8328,8424,8508,8600,8739,8808,8886,9017,9105,9185,9239,9290,9356,9428,9505,9576,9658,9730,9807,9880,9951,10056,10144,10216,10308,10404,10478,10552,10648,10700,10782,10849,10936,11023,11085,11149,11212,11280,11386,11493,11591,11708,11766,11821,11900,12066,12141,12217" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-sk/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "134", + "endOffsets": "329" + }, + "to": { + "startLines": "58", + "startColumns": "4", + "startOffsets": "5580", + "endColumns": "138", + "endOffsets": "5714" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-sk/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,451,571,677,829,953,1062,1160,1325,1432,1598,1724,1883,2043,2107,2170", + "endColumns": "101,155,119,105,151,123,108,97,164,106,165,125,158,159,63,62,82", + "endOffsets": "294,450,570,676,828,952,1061,1159,1324,1431,1597,1723,1882,2042,2106,2169,2252" + }, + "to": { + "startLines": "50,51,52,53,54,55,56,57,59,60,61,62,63,64,65,66,67", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4581,4687,4847,4971,5081,5237,5365,5478,5719,5888,5999,6169,6299,6462,6626,6694,6761", + "endColumns": "105,159,123,109,155,127,112,101,168,110,169,129,162,163,67,66,86", + "endOffsets": "4682,4842,4966,5076,5232,5360,5473,5575,5883,5994,6164,6294,6457,6621,6689,6756,6843" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sl.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sl.json new file mode 100644 index 0000000..dd736d4 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sl.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-sl/values-sl.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-sl/values-sl.xml", + "from": { + "startLines": "2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,367,456,545,633,731,822,928,1054,1138,1202,1268,1362,1438,1501,1613,1673,1738,1792,1862,1922,1978,2090,2147,2209,2265,2338,2472,2557,2634,2723,2804,2889,3032,3116,3199,3333,3422,3499,3555,3610,3676,3749,3826,3897,3976,4050,4126,4201,4274,4379,4467,4540,4630,4721,4793,4867,4958,5010,5092,5159,5243,5330,5392,5456,5519,5588,5691,5799,5897,6001,6061,6120,6197,6284,6360", + "endLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "endColumns": "12,88,88,87,97,90,105,125,83,63,65,93,75,62,111,59,64,53,69,59,55,111,56,61,55,72,133,84,76,88,80,84,142,83,82,133,88,76,55,54,65,72,76,70,78,73,75,74,72,104,87,72,89,90,71,73,90,51,81,66,83,86,61,63,62,68,102,107,97,103,59,58,76,86,75,77", + "endOffsets": "362,451,540,628,726,817,923,1049,1133,1197,1263,1357,1433,1496,1608,1668,1733,1787,1857,1917,1973,2085,2142,2204,2260,2333,2467,2552,2629,2718,2799,2884,3027,3111,3194,3328,3417,3494,3550,3605,3671,3744,3821,3892,3971,4045,4121,4196,4269,4374,4462,4535,4625,4716,4788,4862,4953,5005,5087,5154,5238,5325,5387,5451,5514,5583,5686,5794,5892,5996,6056,6115,6192,6279,6355,6433" + }, + "to": { + "startLines": "2,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3157,3246,3335,3423,3521,4335,4441,4567,6875,6939,7005,7099,7175,7238,7350,7410,7475,7529,7599,7659,7715,7827,7884,7946,8002,8075,8209,8294,8371,8460,8541,8626,8769,8853,8936,9070,9159,9236,9292,9347,9413,9486,9563,9634,9713,9787,9863,9938,10011,10116,10204,10277,10367,10458,10530,10604,10695,10747,10829,10896,10980,11067,11129,11193,11256,11325,11428,11536,11634,11738,11798,11857,12018,12105,12181", + "endLines": "7,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "endColumns": "12,88,88,87,97,90,105,125,83,63,65,93,75,62,111,59,64,53,69,59,55,111,56,61,55,72,133,84,76,88,80,84,142,83,82,133,88,76,55,54,65,72,76,70,78,73,75,74,72,104,87,72,89,90,71,73,90,51,81,66,83,86,61,63,62,68,102,107,97,103,59,58,76,86,75,77", + "endOffsets": "412,3241,3330,3418,3516,3607,4436,4562,4646,6934,7000,7094,7170,7233,7345,7405,7470,7524,7594,7654,7710,7822,7879,7941,7997,8070,8204,8289,8366,8455,8536,8621,8764,8848,8931,9065,9154,9231,9287,9342,9408,9481,9558,9629,9708,9782,9858,9933,10006,10111,10199,10272,10362,10453,10525,10599,10690,10742,10824,10891,10975,11062,11124,11188,11251,11320,11423,11531,11629,11733,11793,11852,11929,12100,12176,12254" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-sl/values-sl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,352,456,559,661,778", + "endColumns": "96,101,97,103,102,101,116,100", + "endOffsets": "147,249,347,451,554,656,773,874" + }, + "to": { + "startLines": "40,41,42,43,44,45,46,136", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3612,3709,3811,3909,4013,4116,4218,12259", + "endColumns": "96,101,97,103,102,101,116,100", + "endOffsets": "3704,3806,3904,4008,4111,4213,4330,12355" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-sl/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "135", + "endOffsets": "330" + }, + "to": { + "startLines": "58", + "startColumns": "4", + "startOffsets": "5653", + "endColumns": "139", + "endOffsets": "5788" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-sl/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,456,581,684,827,953,1063,1163,1317,1420,1583,1709,1857,2005,2071,2129", + "endColumns": "101,160,124,102,142,125,109,99,153,102,162,125,147,147,65,57,79", + "endOffsets": "294,455,580,683,826,952,1062,1162,1316,1419,1582,1708,1856,2004,2070,2128,2208" + }, + "to": { + "startLines": "50,51,52,53,54,55,56,57,59,60,61,62,63,64,65,66,67", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4651,4757,4922,5051,5158,5305,5435,5549,5793,5951,6058,6225,6355,6507,6659,6729,6791", + "endColumns": "105,164,128,106,146,129,113,103,157,106,166,129,151,151,69,61,83", + "endOffsets": "4752,4917,5046,5153,5300,5430,5544,5648,5946,6053,6220,6350,6502,6654,6724,6786,6870" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-sl/values-sl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,217,319,427,514,617,736,817,895,987,1081,1176,1270,1365,1459,1555,1655,1747,1839,1923,2031,2139,2239,2352,2460,2565,2745,2845", + "endColumns": "111,101,107,86,102,118,80,77,91,93,94,93,94,93,95,99,91,91,83,107,107,99,112,107,104,179,99,83", + "endOffsets": "212,314,422,509,612,731,812,890,982,1076,1171,1265,1360,1454,1550,1650,1742,1834,1918,2026,2134,2234,2347,2455,2560,2740,2840,2924" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,132", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "417,529,631,739,826,929,1048,1129,1207,1299,1393,1488,1582,1677,1771,1867,1967,2059,2151,2235,2343,2451,2551,2664,2772,2877,3057,11934", + "endColumns": "111,101,107,86,102,118,80,77,91,93,94,93,94,93,95,99,91,91,83,107,107,99,112,107,104,179,99,83", + "endOffsets": "524,626,734,821,924,1043,1124,1202,1294,1388,1483,1577,1672,1766,1862,1962,2054,2146,2230,2338,2446,2546,2659,2767,2872,3052,3152,12013" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-small-v4.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-small-v4.json new file mode 100644 index 0000000..e72095e --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-small-v4.json @@ -0,0 +1,19 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-small-v4/values-small-v4.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-small-v4/values-small-v4.xml", + "from": { + "startLines": "2,3,4,5", + "startColumns": "4,4,4,4", + "startOffsets": "55,128,198,270", + "endColumns": "72,69,71,69", + "endOffsets": "123,193,265,335" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sq.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sq.json new file mode 100644 index 0000000..f3d6ace --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sq.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-sq/values-sq.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-sq/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "124", + "endOffsets": "319" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5556", + "endColumns": "128", + "endOffsets": "5680" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-sq/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,465,598,701,858,988,1110,1222,1388,1492,1663,1797,1955,2135,2196,2259", + "endColumns": "102,168,132,102,156,129,121,111,165,103,170,133,157,179,60,62,77", + "endOffsets": "295,464,597,700,857,987,1109,1221,1387,1491,1662,1796,1954,2134,2195,2258,2336" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4495,4602,4775,4912,5019,5180,5314,5440,5685,5855,5963,6138,6276,6438,6622,6687,6754", + "endColumns": "106,172,136,106,160,133,125,115,169,107,174,137,161,183,64,66,81", + "endOffsets": "4597,4770,4907,5014,5175,5309,5435,5551,5850,5958,6133,6271,6433,6617,6682,6749,6831" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-sq/values-sq.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,219,319,431,517,623,746,828,906,997,1090,1185,1279,1380,1473,1568,1665,1756,1849,1930,2036,2140,2238,2344,2448,2550,2704,2801", + "endColumns": "113,99,111,85,105,122,81,77,90,92,94,93,100,92,94,96,90,92,80,105,103,97,105,103,101,153,96,81", + "endOffsets": "214,314,426,512,618,741,823,901,992,1085,1180,1274,1375,1468,1563,1660,1751,1844,1925,2031,2135,2233,2339,2443,2545,2699,2796,2878" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "317,431,531,643,729,835,958,1040,1118,1209,1302,1397,1491,1592,1685,1780,1877,1968,2061,2142,2248,2352,2450,2556,2660,2762,2916,11974", + "endColumns": "113,99,111,85,105,122,81,77,90,92,94,93,100,92,94,96,90,92,80,105,103,97,105,103,101,153,96,81", + "endOffsets": "426,526,638,724,830,953,1035,1113,1204,1297,1392,1486,1587,1680,1775,1872,1963,2056,2137,2243,2347,2445,2551,2655,2757,2911,3008,12051" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-sq/values-sq.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,267,346,424,510,610,702,803,929,1012,1077,1142,1242,1312,1371,1469,1531,1595,1654,1726,1789,1843,1960,2017,2079,2133,2205,2340,2423,2502,2598,2681,2759,2900,2984,3066,3214,3304,3382,3435,3494,3560,3631,3710,3781,3864,3940,4018,4090,4163,4267,4356,4428,4522,4621,4695,4767,4868,4918,5003,5069,5159,5248,5310,5374,5437,5504,5620,5733,5842,5947,6004,6067,6150,6235,6309", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,78,77,85,99,91,100,125,82,64,64,99,69,58,97,61,63,58,71,62,53,116,56,61,53,71,134,82,78,95,82,77,140,83,81,147,89,77,52,58,65,70,78,70,82,75,77,71,72,103,88,71,93,98,73,71,100,49,84,65,89,88,61,63,62,66,115,112,108,104,56,62,82,84,73,77", + "endOffsets": "262,341,419,505,605,697,798,924,1007,1072,1137,1237,1307,1366,1464,1526,1590,1649,1721,1784,1838,1955,2012,2074,2128,2200,2335,2418,2497,2593,2676,2754,2895,2979,3061,3209,3299,3377,3430,3489,3555,3626,3705,3776,3859,3935,4013,4085,4158,4262,4351,4423,4517,4616,4690,4762,4863,4913,4998,5064,5154,5243,5305,5369,5432,5499,5615,5728,5837,5942,5999,6062,6145,6230,6304,6382" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3013,3092,3170,3256,3356,4185,4286,4412,6836,6901,6966,7066,7136,7195,7293,7355,7419,7478,7550,7613,7667,7784,7841,7903,7957,8029,8164,8247,8326,8422,8505,8583,8724,8808,8890,9038,9128,9206,9259,9318,9384,9455,9534,9605,9688,9764,9842,9914,9987,10091,10180,10252,10346,10445,10519,10591,10692,10742,10827,10893,10983,11072,11134,11198,11261,11328,11444,11557,11666,11771,11828,11891,12056,12141,12215", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,78,77,85,99,91,100,125,82,64,64,99,69,58,97,61,63,58,71,62,53,116,56,61,53,71,134,82,78,95,82,77,140,83,81,147,89,77,52,58,65,70,78,70,82,75,77,71,72,103,88,71,93,98,73,71,100,49,84,65,89,88,61,63,62,66,115,112,108,104,56,62,82,84,73,77", + "endOffsets": "312,3087,3165,3251,3351,3443,4281,4407,4490,6896,6961,7061,7131,7190,7288,7350,7414,7473,7545,7608,7662,7779,7836,7898,7952,8024,8159,8242,8321,8417,8500,8578,8719,8803,8885,9033,9123,9201,9254,9313,9379,9450,9529,9600,9683,9759,9837,9909,9982,10086,10175,10247,10341,10440,10514,10586,10687,10737,10822,10888,10978,11067,11129,11193,11256,11323,11439,11552,11661,11766,11823,11886,11969,12136,12210,12288" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-sq/values-sq.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,154,256,354,451,559,670,792", + "endColumns": "98,101,97,96,107,110,121,100", + "endOffsets": "149,251,349,446,554,665,787,888" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3448,3547,3649,3747,3844,3952,4063,12293", + "endColumns": "98,101,97,96,107,110,121,100", + "endOffsets": "3542,3644,3742,3839,3947,4058,4180,12389" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sr.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sr.json new file mode 100644 index 0000000..f3b7a95 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sr.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-sr/values-sr.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-sr/values-sr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,212,313,419,505,609,731,815,896,987,1080,1175,1269,1369,1462,1557,1662,1753,1844,1930,2035,2141,2244,2350,2459,2566,2736,2833", + "endColumns": "106,100,105,85,103,121,83,80,90,92,94,93,99,92,94,104,90,90,85,104,105,102,105,108,106,169,96,86", + "endOffsets": "207,308,414,500,604,726,810,891,982,1075,1170,1264,1364,1457,1552,1657,1748,1839,1925,2030,2136,2239,2345,2454,2561,2731,2828,2915" + }, + "to": { + "startLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,131", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "371,478,579,685,771,875,997,1081,1162,1253,1346,1441,1535,1635,1728,1823,1928,2019,2110,2196,2301,2407,2510,2616,2725,2832,3002,11792", + "endColumns": "106,100,105,85,103,121,83,80,90,92,94,93,99,92,94,104,90,90,85,104,105,102,105,108,106,169,96,86", + "endOffsets": "473,574,680,766,870,992,1076,1157,1248,1341,1436,1530,1630,1723,1818,1923,2014,2105,2191,2296,2402,2505,2611,2720,2827,2997,3094,11874" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-sr/values-sr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,352,456,560,665,781", + "endColumns": "97,101,96,103,103,104,115,100", + "endOffsets": "148,250,347,451,555,660,776,877" + }, + "to": { + "startLines": "39,40,41,42,43,44,45,135", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3531,3629,3731,3828,3932,4036,4141,12115", + "endColumns": "97,101,96,103,103,104,115,100", + "endOffsets": "3624,3726,3823,3927,4031,4136,4252,12211" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-sr/values-sr.xml", + "from": { + "startLines": "2,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,321,397,473,553,660,753,847,978,1059,1121,1187,1279,1347,1410,1513,1573,1639,1695,1766,1826,1880,1992,2049,2110,2164,2240,2365,2451,2528,2621,2705,2788,2926,3007,3090,3221,3309,3387,3441,3497,3563,3637,3715,3786,3868,3943,4019,4094,4165,4272,4362,4435,4527,4623,4695,4771,4867,4920,5002,5069,5156,5243,5305,5369,5432,5501,5606,5716,5812,5920,5978,6038,6118,6201,6277", + "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81", + "endColumns": "12,75,75,79,106,92,93,130,80,61,65,91,67,62,102,59,65,55,70,59,53,111,56,60,53,75,124,85,76,92,83,82,137,80,82,130,87,77,53,55,65,73,77,70,81,74,75,74,70,106,89,72,91,95,71,75,95,52,81,66,86,86,61,63,62,68,104,109,95,107,57,59,79,82,75,76", + "endOffsets": "316,392,468,548,655,748,842,973,1054,1116,1182,1274,1342,1405,1508,1568,1634,1690,1761,1821,1875,1987,2044,2105,2159,2235,2360,2446,2523,2616,2700,2783,2921,3002,3085,3216,3304,3382,3436,3492,3558,3632,3710,3781,3863,3938,4014,4089,4160,4267,4357,4430,4522,4618,4690,4766,4862,4915,4997,5064,5151,5238,5300,5364,5427,5496,5601,5711,5807,5915,5973,6033,6113,6196,6272,6349" + }, + "to": { + "startLines": "2,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3099,3175,3251,3331,3438,4257,4351,4482,6733,6795,6861,6953,7021,7084,7187,7247,7313,7369,7440,7500,7554,7666,7723,7784,7838,7914,8039,8125,8202,8295,8379,8462,8600,8681,8764,8895,8983,9061,9115,9171,9237,9311,9389,9460,9542,9617,9693,9768,9839,9946,10036,10109,10201,10297,10369,10445,10541,10594,10676,10743,10830,10917,10979,11043,11106,11175,11280,11390,11486,11594,11652,11712,11879,11962,12038", + "endLines": "6,34,35,36,37,38,46,47,48,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134", + "endColumns": "12,75,75,79,106,92,93,130,80,61,65,91,67,62,102,59,65,55,70,59,53,111,56,60,53,75,124,85,76,92,83,82,137,80,82,130,87,77,53,55,65,73,77,70,81,74,75,74,70,106,89,72,91,95,71,75,95,52,81,66,86,86,61,63,62,68,104,109,95,107,57,59,79,82,75,76", + "endOffsets": "366,3170,3246,3326,3433,3526,4346,4477,4558,6790,6856,6948,7016,7079,7182,7242,7308,7364,7435,7495,7549,7661,7718,7779,7833,7909,8034,8120,8197,8290,8374,8457,8595,8676,8759,8890,8978,9056,9110,9166,9232,9306,9384,9455,9537,9612,9688,9763,9834,9941,10031,10104,10196,10292,10364,10440,10536,10589,10671,10738,10825,10912,10974,11038,11101,11170,11275,11385,11481,11589,11647,11707,11787,11957,12033,12110" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-sr/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,447,569,675,825,948,1056,1154,1299,1402,1558,1681,1826,1964,2028,2089", + "endColumns": "101,151,121,105,149,122,107,97,144,102,155,122,144,137,63,60,75", + "endOffsets": "294,446,568,674,824,947,1055,1153,1298,1401,1557,1680,1825,1963,2027,2088,2164" + }, + "to": { + "startLines": "49,50,51,52,53,54,55,56,58,59,60,61,62,63,64,65,66", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4563,4669,4825,4951,5061,5215,5342,5454,5686,5835,5942,6102,6229,6378,6520,6588,6653", + "endColumns": "105,155,125,109,153,126,111,101,148,106,159,126,148,141,67,64,79", + "endOffsets": "4664,4820,4946,5056,5210,5337,5449,5551,5830,5937,6097,6224,6373,6515,6583,6648,6728" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-sr/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "125", + "endOffsets": "320" + }, + "to": { + "startLines": "57", + "startColumns": "4", + "startOffsets": "5556", + "endColumns": "129", + "endOffsets": "5681" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sv.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sv.json new file mode 100644 index 0000000..b196051 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sv.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-sv/values-sv.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-sv/values-sv.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,150,252,350,449,557,662,783", + "endColumns": "94,101,97,98,107,104,120,100", + "endOffsets": "145,247,345,444,552,657,778,879" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3441,3536,3638,3736,3835,3943,4048,11929", + "endColumns": "94,101,97,98,107,104,120,100", + "endOffsets": "3531,3633,3731,3830,3938,4043,4164,12025" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-sv/values-sv.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,266,365,457,538,640,720,818,940,1019,1078,1141,1233,1297,1357,1449,1514,1577,1639,1706,1770,1824,1929,1988,2049,2103,2172,2291,2374,2451,2541,2625,2709,2845,2924,3008,3130,3216,3294,3348,3399,3465,3534,3608,3679,3755,3827,3904,3975,4049,4160,4251,4330,4417,4505,4577,4651,4736,4787,4866,4933,5014,5098,5160,5224,5287,5355,5462,5561,5660,5755,5813,5868,5946,6027,6106", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,98,91,80,101,79,97,121,78,58,62,91,63,59,91,64,62,61,66,63,53,104,58,60,53,68,118,82,76,89,83,83,135,78,83,121,85,77,53,50,65,68,73,70,75,71,76,70,73,110,90,78,86,87,71,73,84,50,78,66,80,83,61,63,62,67,106,98,98,94,57,54,77,80,78,87", + "endOffsets": "261,360,452,533,635,715,813,935,1014,1073,1136,1228,1292,1352,1444,1509,1572,1634,1701,1765,1819,1924,1983,2044,2098,2167,2286,2369,2446,2536,2620,2704,2840,2919,3003,3125,3211,3289,3343,3394,3460,3529,3603,3674,3750,3822,3899,3970,4044,4155,4246,4325,4412,4500,4572,4646,4731,4782,4861,4928,5009,5093,5155,5219,5282,5350,5457,5556,5655,5750,5808,5863,5941,6022,6101,6189" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2987,3086,3178,3259,3361,4169,4267,4389,6674,6733,6796,6888,6952,7012,7104,7169,7232,7294,7361,7425,7479,7584,7643,7704,7758,7827,7946,8029,8106,8196,8280,8364,8500,8579,8663,8785,8871,8949,9003,9054,9120,9189,9263,9334,9410,9482,9559,9630,9704,9815,9906,9985,10072,10160,10232,10306,10391,10442,10521,10588,10669,10753,10815,10879,10942,11010,11117,11216,11315,11410,11468,11523,11681,11762,11841", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,98,91,80,101,79,97,121,78,58,62,91,63,59,91,64,62,61,66,63,53,104,58,60,53,68,118,82,76,89,83,83,135,78,83,121,85,77,53,50,65,68,73,70,75,71,76,70,73,110,90,78,86,87,71,73,84,50,78,66,80,83,61,63,62,67,106,98,98,94,57,54,77,80,78,87", + "endOffsets": "311,3081,3173,3254,3356,3436,4262,4384,4463,6728,6791,6883,6947,7007,7099,7164,7227,7289,7356,7420,7474,7579,7638,7699,7753,7822,7941,8024,8101,8191,8275,8359,8495,8574,8658,8780,8866,8944,8998,9049,9115,9184,9258,9329,9405,9477,9554,9625,9699,9810,9901,9980,10067,10155,10227,10301,10386,10437,10516,10583,10664,10748,10810,10874,10937,11005,11112,11211,11310,11405,11463,11518,11596,11757,11836,11924" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-sv/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,449,572,678,815,936,1055,1155,1299,1403,1561,1685,1835,1987,2049,2108", + "endColumns": "102,152,122,105,136,120,118,99,143,103,157,123,149,151,61,58,74", + "endOffsets": "295,448,571,677,814,935,1054,1154,1298,1402,1560,1684,1834,1986,2048,2107,2182" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4468,4575,4732,4859,4969,5110,5235,5358,5610,5758,5866,6028,6156,6310,6466,6532,6595", + "endColumns": "106,156,126,109,140,124,122,103,147,107,161,127,153,155,65,62,78", + "endOffsets": "4570,4727,4854,4964,5105,5230,5353,5457,5753,5861,6023,6151,6305,6461,6527,6590,6669" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-sv/values-sv.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,208,311,422,506,606,719,796,871,964,1059,1154,1248,1350,1445,1542,1640,1736,1829,1909,2015,2114,2210,2315,2418,2520,2674,2776", + "endColumns": "102,102,110,83,99,112,76,74,92,94,94,93,101,94,96,97,95,92,79,105,98,95,104,102,101,153,101,79", + "endOffsets": "203,306,417,501,601,714,791,866,959,1054,1149,1243,1345,1440,1537,1635,1731,1824,1904,2010,2109,2205,2310,2413,2515,2669,2771,2851" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "316,419,522,633,717,817,930,1007,1082,1175,1270,1365,1459,1561,1656,1753,1851,1947,2040,2120,2226,2325,2421,2526,2629,2731,2885,11601", + "endColumns": "102,102,110,83,99,112,76,74,92,94,94,93,101,94,96,97,95,92,79,105,98,95,104,102,101,153,101,79", + "endOffsets": "414,517,628,712,812,925,1002,1077,1170,1265,1360,1454,1556,1651,1748,1846,1942,2035,2115,2221,2320,2416,2521,2624,2726,2880,2982,11676" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-sv/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "143", + "endOffsets": "338" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5462", + "endColumns": "147", + "endOffsets": "5605" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sw.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sw.json new file mode 100644 index 0000000..751afa3 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sw.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-sw/values-sw.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-sw/values-sw.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,259,335,409,482,579,668,767,896,979,1044,1112,1204,1277,1340,1426,1488,1551,1616,1684,1747,1801,1933,1990,2052,2106,2180,2318,2399,2479,2582,2666,2746,2878,2963,3050,3191,3279,3358,3412,3465,3531,3603,3685,3756,3841,3913,3988,4059,4132,4238,4335,4409,4504,4601,4675,4760,4860,4913,4998,5066,5154,5244,5306,5370,5433,5500,5617,5729,5840,5951,6009,6066,6147,6232,6313", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,75,73,72,96,88,98,128,82,64,67,91,72,62,85,61,62,64,67,62,53,131,56,61,53,73,137,80,79,102,83,79,131,84,86,140,87,78,53,52,65,71,81,70,84,71,74,70,72,105,96,73,94,96,73,84,99,52,84,67,87,89,61,63,62,66,116,111,110,110,57,56,80,84,80,79", + "endOffsets": "254,330,404,477,574,663,762,891,974,1039,1107,1199,1272,1335,1421,1483,1546,1611,1679,1742,1796,1928,1985,2047,2101,2175,2313,2394,2474,2577,2661,2741,2873,2958,3045,3186,3274,3353,3407,3460,3526,3598,3680,3751,3836,3908,3983,4054,4127,4233,4330,4404,4499,4596,4670,4755,4855,4908,4993,5061,5149,5239,5301,5365,5428,5495,5612,5724,5835,5946,6004,6061,6142,6227,6308,6388" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3005,3081,3155,3228,3325,4137,4236,4365,6709,6774,6842,6934,7007,7070,7156,7218,7281,7346,7414,7477,7531,7663,7720,7782,7836,7910,8048,8129,8209,8312,8396,8476,8608,8693,8780,8921,9009,9088,9142,9195,9261,9333,9415,9486,9571,9643,9718,9789,9862,9968,10065,10139,10234,10331,10405,10490,10590,10643,10728,10796,10884,10974,11036,11100,11163,11230,11347,11459,11570,11681,11739,11796,11960,12045,12126", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,75,73,72,96,88,98,128,82,64,67,91,72,62,85,61,62,64,67,62,53,131,56,61,53,73,137,80,79,102,83,79,131,84,86,140,87,78,53,52,65,71,81,70,84,71,74,70,72,105,96,73,94,96,73,84,99,52,84,67,87,89,61,63,62,66,116,111,110,110,57,56,80,84,80,79", + "endOffsets": "304,3076,3150,3223,3320,3409,4231,4360,4443,6769,6837,6929,7002,7065,7151,7213,7276,7341,7409,7472,7526,7658,7715,7777,7831,7905,8043,8124,8204,8307,8391,8471,8603,8688,8775,8916,9004,9083,9137,9190,9256,9328,9410,9481,9566,9638,9713,9784,9857,9963,10060,10134,10229,10326,10400,10485,10585,10638,10723,10791,10879,10969,11031,11095,11158,11225,11342,11454,11565,11676,11734,11791,11872,12040,12121,12201" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-sw/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "141", + "endOffsets": "336" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5463", + "endColumns": "145", + "endOffsets": "5604" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-sw/values-sw.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,149,251,348,449,556,663,778", + "endColumns": "93,101,96,100,106,106,114,100", + "endOffsets": "144,246,343,444,551,658,773,874" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3414,3508,3610,3707,3808,3915,4022,12206", + "endColumns": "93,101,96,100,106,106,114,100", + "endOffsets": "3503,3605,3702,3803,3910,4017,4132,12302" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-sw/values-sw.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,208,307,415,505,610,727,810,892,983,1076,1171,1265,1365,1458,1553,1647,1738,1829,1911,2012,2120,2219,2326,2438,2542,2704,2801", + "endColumns": "102,98,107,89,104,116,82,81,90,92,94,93,99,92,94,93,90,90,81,100,107,98,106,111,103,161,96,82", + "endOffsets": "203,302,410,500,605,722,805,887,978,1071,1166,1260,1360,1453,1548,1642,1733,1824,1906,2007,2115,2214,2321,2433,2537,2699,2796,2879" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "309,412,511,619,709,814,931,1014,1096,1187,1280,1375,1469,1569,1662,1757,1851,1942,2033,2115,2216,2324,2423,2530,2642,2746,2908,11877", + "endColumns": "102,98,107,89,104,116,82,81,90,92,94,93,99,92,94,93,90,90,81,100,107,98,106,111,103,161,96,82", + "endOffsets": "407,506,614,704,809,926,1009,1091,1182,1275,1370,1464,1564,1657,1752,1846,1937,2028,2110,2211,2319,2418,2525,2637,2741,2903,3000,11955" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-sw/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,293,445,566,671,830,951,1066,1176,1337,1439,1589,1712,1858,2013,2077,2148", + "endColumns": "99,151,120,104,158,120,114,109,160,101,149,122,145,154,63,70,91", + "endOffsets": "292,444,565,670,829,950,1065,1175,1336,1438,1588,1711,1857,2012,2076,2147,2239" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4448,4552,4708,4833,4942,5105,5230,5349,5609,5774,5880,6034,6161,6311,6470,6538,6613", + "endColumns": "103,155,124,108,162,124,118,113,164,105,153,126,149,158,67,74,95", + "endOffsets": "4547,4703,4828,4937,5100,5225,5344,5458,5769,5875,6029,6156,6306,6465,6533,6608,6704" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sw600dp-v13.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sw600dp-v13.json new file mode 100644 index 0000000..8a4686c --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-sw600dp-v13.json @@ -0,0 +1,38 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-sw600dp-v13/values-sw600dp-v13.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-sw600dp-v13/values-sw600dp-v13.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,124,193,263,337,413,472,543", + "endColumns": "68,68,69,73,75,58,70,67", + "endOffsets": "119,188,258,332,408,467,538,606" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-sw600dp-v13/values-sw600dp-v13.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,10,11,12,13,14", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,115,185,256,328,386,444,553,617,673,732,795", + "endLines": "2,3,4,5,6,7,9,10,11,12,13,17", + "endColumns": "59,69,70,71,57,57,10,63,55,58,62,10", + "endOffsets": "110,180,251,323,381,439,548,612,668,727,790,962" + }, + "to": { + "startLines": "10,11,12,13,14,15,16,18,19,20,21,22", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "611,671,741,812,884,942,1000,1109,1173,1229,1288,1351", + "endLines": "10,11,12,13,14,15,17,18,19,20,21,25", + "endColumns": "59,69,70,71,57,57,10,63,55,58,62,10", + "endOffsets": "666,736,807,879,937,995,1104,1168,1224,1283,1346,1518" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ta.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ta.json new file mode 100644 index 0000000..d56626a --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ta.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-ta/values-ta.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ta/values-ta.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,272,360,446,530,633,727,836,954,1038,1097,1161,1269,1337,1398,1506,1573,1659,1717,1801,1868,1922,2045,2107,2170,2224,2312,2440,2526,2618,2721,2813,2895,3027,3107,3188,3344,3433,3517,3574,3626,3692,3777,3865,3936,4016,4085,4162,4242,4310,4425,4524,4607,4699,4793,4867,4953,5047,5097,5180,5246,5331,5418,5481,5546,5609,5678,5786,5884,5982,6079,6140,6196,6282,6374,6457", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,87,85,83,102,93,108,117,83,58,63,107,67,60,107,66,85,57,83,66,53,122,61,62,53,87,127,85,91,102,91,81,131,79,80,155,88,83,56,51,65,84,87,70,79,68,76,79,67,114,98,82,91,93,73,85,93,49,82,65,84,86,62,64,62,68,107,97,97,96,60,55,85,91,82,81", + "endOffsets": "267,355,441,525,628,722,831,949,1033,1092,1156,1264,1332,1393,1501,1568,1654,1712,1796,1863,1917,2040,2102,2165,2219,2307,2435,2521,2613,2716,2808,2890,3022,3102,3183,3339,3428,3512,3569,3621,3687,3772,3860,3931,4011,4080,4157,4237,4305,4420,4519,4602,4694,4788,4862,4948,5042,5092,5175,5241,5326,5413,5476,5541,5604,5673,5781,5879,5977,6074,6135,6191,6277,6369,6452,6534" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3088,3176,3262,3346,3449,4289,4398,4516,6836,6895,6959,7067,7135,7196,7304,7371,7457,7515,7599,7666,7720,7843,7905,7968,8022,8110,8238,8324,8416,8519,8611,8693,8825,8905,8986,9142,9231,9315,9372,9424,9490,9575,9663,9734,9814,9883,9960,10040,10108,10223,10322,10405,10497,10591,10665,10751,10845,10895,10978,11044,11129,11216,11279,11344,11407,11476,11584,11682,11780,11877,11938,11994,12162,12254,12337", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,87,85,83,102,93,108,117,83,58,63,107,67,60,107,66,85,57,83,66,53,122,61,62,53,87,127,85,91,102,91,81,131,79,80,155,88,83,56,51,65,84,87,70,79,68,76,79,67,114,98,82,91,93,73,85,93,49,82,65,84,86,62,64,62,68,107,97,97,96,60,55,85,91,82,81", + "endOffsets": "317,3171,3257,3341,3444,3538,4393,4511,4595,6890,6954,7062,7130,7191,7299,7366,7452,7510,7594,7661,7715,7838,7900,7963,8017,8105,8233,8319,8411,8514,8606,8688,8820,8900,8981,9137,9226,9310,9367,9419,9485,9570,9658,9729,9809,9878,9955,10035,10103,10218,10317,10400,10492,10586,10660,10746,10840,10890,10973,11039,11124,11211,11274,11339,11402,11471,11579,11677,11775,11872,11933,11989,12075,12249,12332,12414" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ta/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,294,442,565,667,815,939,1048,1145,1321,1424,1573,1704,1854,2006,2064,2123", + "endColumns": "100,147,122,101,147,123,108,96,175,102,148,130,149,151,57,58,76", + "endOffsets": "293,441,564,666,814,938,1047,1144,1320,1423,1572,1703,1853,2005,2063,2122,2199" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4600,4705,4857,4984,5090,5242,5370,5483,5745,5925,6032,6185,6320,6474,6630,6692,6755", + "endColumns": "104,151,126,105,151,127,112,100,179,106,152,134,153,155,61,62,80", + "endOffsets": "4700,4852,4979,5085,5237,5365,5478,5579,5920,6027,6180,6315,6469,6625,6687,6750,6831" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ta/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "156", + "endOffsets": "351" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5584", + "endColumns": "160", + "endOffsets": "5740" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ta/values-ta.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,254,353,451,558,673,801", + "endColumns": "95,102,98,97,106,114,127,100", + "endOffsets": "146,249,348,446,553,668,796,897" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3543,3639,3742,3841,3939,4046,4161,12419", + "endColumns": "95,102,98,97,106,114,127,100", + "endOffsets": "3634,3737,3836,3934,4041,4156,4284,12515" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ta/values-ta.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,218,320,435,524,635,756,835,911,1009,1109,1204,1298,1405,1505,1607,1701,1799,1897,1978,2086,2189,2288,2404,2507,2612,2769,2871", + "endColumns": "112,101,114,88,110,120,78,75,97,99,94,93,106,99,101,93,97,97,80,107,102,98,115,102,104,156,101,81", + "endOffsets": "213,315,430,519,630,751,830,906,1004,1104,1199,1293,1400,1500,1602,1696,1794,1892,1973,2081,2184,2283,2399,2502,2607,2764,2866,2948" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "322,435,537,652,741,852,973,1052,1128,1226,1326,1421,1515,1622,1722,1824,1918,2016,2114,2195,2303,2406,2505,2621,2724,2829,2986,12080", + "endColumns": "112,101,114,88,110,120,78,75,97,99,94,93,106,99,101,93,97,97,80,107,102,98,115,102,104,156,101,81", + "endOffsets": "430,532,647,736,847,968,1047,1123,1221,1321,1416,1510,1617,1717,1819,1913,2011,2109,2190,2298,2401,2500,2616,2719,2824,2981,3083,12157" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-te.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-te.json new file mode 100644 index 0000000..e0e94be --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-te.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-te/values-te.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-te/values-te.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,276,365,455,541,639,726,830,946,1037,1098,1164,1258,1325,1387,1480,1544,1612,1675,1749,1814,1868,1989,2046,2108,2162,2241,2369,2457,2538,2636,2719,2811,2956,3036,3118,3243,3331,3413,3473,3525,3591,3666,3744,3815,3894,3967,4043,4124,4193,4313,4418,4495,4586,4679,4753,4830,4922,4979,5060,5126,5210,5296,5359,5424,5488,5557,5667,5775,5874,5980,6044,6100,6183,6280,6358", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,88,89,85,97,86,103,115,90,60,65,93,66,61,92,63,67,62,73,64,53,120,56,61,53,78,127,87,80,97,82,91,144,79,81,124,87,81,59,51,65,74,77,70,78,72,75,80,68,119,104,76,90,92,73,76,91,56,80,65,83,85,62,64,63,68,109,107,98,105,63,55,82,96,77,73", + "endOffsets": "271,360,450,536,634,721,825,941,1032,1093,1159,1253,1320,1382,1475,1539,1607,1670,1744,1809,1863,1984,2041,2103,2157,2236,2364,2452,2533,2631,2714,2806,2951,3031,3113,3238,3326,3408,3468,3520,3586,3661,3739,3810,3889,3962,4038,4119,4188,4308,4413,4490,4581,4674,4748,4825,4917,4974,5055,5121,5205,5291,5354,5419,5483,5552,5662,5770,5869,5975,6039,6095,6178,6275,6353,6427" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3080,3169,3259,3345,3443,4280,4384,4500,6785,6846,6912,7006,7073,7135,7228,7292,7360,7423,7497,7562,7616,7737,7794,7856,7910,7989,8117,8205,8286,8384,8467,8559,8704,8784,8866,8991,9079,9161,9221,9273,9339,9414,9492,9563,9642,9715,9791,9872,9941,10061,10166,10243,10334,10427,10501,10578,10670,10727,10808,10874,10958,11044,11107,11172,11236,11305,11415,11523,11622,11728,11792,11848,12014,12111,12189", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,88,89,85,97,86,103,115,90,60,65,93,66,61,92,63,67,62,73,64,53,120,56,61,53,78,127,87,80,97,82,91,144,79,81,124,87,81,59,51,65,74,77,70,78,72,75,80,68,119,104,76,90,92,73,76,91,56,80,65,83,85,62,64,63,68,109,107,98,105,63,55,82,96,77,73", + "endOffsets": "321,3164,3254,3340,3438,3525,4379,4495,4586,6841,6907,7001,7068,7130,7223,7287,7355,7418,7492,7557,7611,7732,7789,7851,7905,7984,8112,8200,8281,8379,8462,8554,8699,8779,8861,8986,9074,9156,9216,9268,9334,9409,9487,9558,9637,9710,9786,9867,9936,10056,10161,10238,10329,10422,10496,10573,10665,10722,10803,10869,10953,11039,11102,11167,11231,11300,11410,11518,11617,11723,11787,11843,11926,12106,12184,12258" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-te/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "133", + "endOffsets": "328" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5569", + "endColumns": "137", + "endOffsets": "5702" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-te/values-te.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,157,265,367,468,574,681,805", + "endColumns": "101,107,101,100,105,106,123,100", + "endOffsets": "152,260,362,463,569,676,800,901" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3530,3632,3740,3842,3943,4049,4156,12263", + "endColumns": "101,107,101,100,105,106,123,100", + "endOffsets": "3627,3735,3837,3938,4044,4151,4275,12359" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-te/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,301,451,577,688,821,942,1043,1139,1284,1392,1541,1669,1816,1975,2035,2101", + "endColumns": "107,149,125,110,132,120,100,95,144,107,148,127,146,158,59,65,79", + "endOffsets": "300,450,576,687,820,941,1042,1138,1283,1391,1540,1668,1815,1974,2034,2100,2180" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4591,4703,4857,4987,5102,5239,5364,5469,5707,5856,5968,6121,6253,6404,6567,6631,6701", + "endColumns": "111,153,129,114,136,124,104,99,148,111,152,131,150,162,63,69,83", + "endOffsets": "4698,4852,4982,5097,5234,5359,5464,5564,5851,5963,6116,6248,6399,6562,6626,6696,6780" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-te/values-te.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,222,334,447,537,642,761,839,915,1006,1099,1194,1288,1388,1481,1576,1671,1762,1853,1942,2056,2160,2259,2374,2479,2594,2756,2859", + "endColumns": "116,111,112,89,104,118,77,75,90,92,94,93,99,92,94,94,90,90,88,113,103,98,114,104,114,161,102,82", + "endOffsets": "217,329,442,532,637,756,834,910,1001,1094,1189,1283,1383,1476,1571,1666,1757,1848,1937,2051,2155,2254,2369,2474,2589,2751,2854,2937" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "326,443,555,668,758,863,982,1060,1136,1227,1320,1415,1509,1609,1702,1797,1892,1983,2074,2163,2277,2381,2480,2595,2700,2815,2977,11931", + "endColumns": "116,111,112,89,104,118,77,75,90,92,94,93,99,92,94,94,90,90,88,113,103,98,114,104,114,161,102,82", + "endOffsets": "438,550,663,753,858,977,1055,1131,1222,1315,1410,1504,1604,1697,1792,1887,1978,2069,2158,2272,2376,2475,2590,2695,2810,2972,3075,12009" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-th.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-th.json new file mode 100644 index 0000000..d4c5150 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-th.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-th/values-th.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-th/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "124", + "endOffsets": "319" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5340", + "endColumns": "128", + "endOffsets": "5464" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-th/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,295,438,557,660,792,912,1027,1131,1271,1372,1515,1633,1769,1916,1976,2040", + "endColumns": "101,142,118,102,131,119,114,103,139,100,142,117,135,146,59,63,79", + "endOffsets": "294,437,556,659,791,911,1026,1130,1270,1371,1514,1632,1768,1915,1975,2039,2119" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4370,4476,4623,4746,4853,4989,5113,5232,5469,5613,5718,5865,5987,6127,6278,6342,6410", + "endColumns": "105,146,122,106,135,123,118,107,143,104,146,121,139,150,63,67,83", + "endOffsets": "4471,4618,4741,4848,4984,5108,5227,5335,5608,5713,5860,5982,6122,6273,6337,6405,6489" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-th/values-th.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,285,358,430,513,598,684,783,896,976,1044,1114,1204,1274,1334,1421,1487,1552,1613,1677,1738,1792,1893,1954,2014,2068,2138,2249,2336,2413,2500,2582,2663,2806,2885,2967,3099,3191,3269,3323,3376,3442,3512,3590,3661,3741,3813,3891,3960,4029,4127,4209,4297,4390,4484,4558,4627,4722,4774,4857,4925,5010,5098,5160,5224,5287,5357,5457,5553,5650,5743,5801,5858,5935,6017,6092", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,72,71,82,84,85,98,112,79,67,69,89,69,59,86,65,64,60,63,60,53,100,60,59,53,69,110,86,76,86,81,80,142,78,81,131,91,77,53,52,65,69,77,70,79,71,77,68,68,97,81,87,92,93,73,68,94,51,82,67,84,87,61,63,62,69,99,95,96,92,57,56,76,81,74,75", + "endOffsets": "280,353,425,508,593,679,778,891,971,1039,1109,1199,1269,1329,1416,1482,1547,1608,1672,1733,1787,1888,1949,2009,2063,2133,2244,2331,2408,2495,2577,2658,2801,2880,2962,3094,3186,3264,3318,3371,3437,3507,3585,3656,3736,3808,3886,3955,4024,4122,4204,4292,4385,4479,4553,4622,4717,4769,4852,4920,5005,5093,5155,5219,5282,5352,5452,5548,5645,5738,5796,5853,5930,6012,6087,6163" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2964,3037,3109,3192,3277,4078,4177,4290,6494,6562,6632,6722,6792,6852,6939,7005,7070,7131,7195,7256,7310,7411,7472,7532,7586,7656,7767,7854,7931,8018,8100,8181,8324,8403,8485,8617,8709,8787,8841,8894,8960,9030,9108,9179,9259,9331,9409,9478,9547,9645,9727,9815,9908,10002,10076,10145,10240,10292,10375,10443,10528,10616,10678,10742,10805,10875,10975,11071,11168,11261,11319,11376,11535,11617,11692", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,72,71,82,84,85,98,112,79,67,69,89,69,59,86,65,64,60,63,60,53,100,60,59,53,69,110,86,76,86,81,80,142,78,81,131,91,77,53,52,65,69,77,70,79,71,77,68,68,97,81,87,92,93,73,68,94,51,82,67,84,87,61,63,62,69,99,95,96,92,57,56,76,81,74,75", + "endOffsets": "330,3032,3104,3187,3272,3358,4172,4285,4365,6557,6627,6717,6787,6847,6934,7000,7065,7126,7190,7251,7305,7406,7467,7527,7581,7651,7762,7849,7926,8013,8095,8176,8319,8398,8480,8612,8704,8782,8836,8889,8955,9025,9103,9174,9254,9326,9404,9473,9542,9640,9722,9810,9903,9997,10071,10140,10235,10287,10370,10438,10523,10611,10673,10737,10800,10870,10970,11066,11163,11256,11314,11371,11448,11612,11687,11763" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-th/values-th.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,151,254,352,450,553,658,770", + "endColumns": "95,102,97,97,102,104,111,100", + "endOffsets": "146,249,347,445,548,653,765,866" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3363,3459,3562,3660,3758,3861,3966,11768", + "endColumns": "95,102,97,97,102,104,111,100", + "endOffsets": "3454,3557,3655,3753,3856,3961,4073,11864" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-th/values-th.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,210,303,411,496,598,708,786,863,954,1047,1138,1232,1332,1425,1520,1614,1705,1796,1877,1980,2078,2176,2279,2385,2486,2639,2734", + "endColumns": "104,92,107,84,101,109,77,76,90,92,90,93,99,92,94,93,90,90,80,102,97,97,102,105,100,152,94,81", + "endOffsets": "205,298,406,491,593,703,781,858,949,1042,1133,1227,1327,1420,1515,1609,1700,1791,1872,1975,2073,2171,2274,2380,2481,2634,2729,2811" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "335,440,533,641,726,828,938,1016,1093,1184,1277,1368,1462,1562,1655,1750,1844,1935,2026,2107,2210,2308,2406,2509,2615,2716,2869,11453", + "endColumns": "104,92,107,84,101,109,77,76,90,92,90,93,99,92,94,93,90,90,80,102,97,97,102,105,100,152,94,81", + "endOffsets": "435,528,636,721,823,933,1011,1088,1179,1272,1363,1457,1557,1650,1745,1839,1930,2021,2102,2205,2303,2401,2504,2610,2711,2864,2959,11530" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-tl.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-tl.json new file mode 100644 index 0000000..a78707a --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-tl.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-tl/values-tl.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-tl/values-tl.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,280,364,444,530,627,717,822,958,1043,1103,1168,1267,1335,1394,1483,1551,1618,1681,1756,1824,1878,1998,2056,2118,2172,2247,2389,2479,2557,2651,2734,2819,2964,3048,3131,3277,3373,3450,3508,3559,3625,3699,3777,3848,3934,4008,4087,4160,4232,4348,4452,4525,4624,4724,4798,4873,4980,5032,5121,5188,5279,5373,5435,5499,5562,5632,5751,5856,5965,6065,6127,6182,6267,6354,6432", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,83,79,85,96,89,104,135,84,59,64,98,67,58,88,67,66,62,74,67,53,119,57,61,53,74,141,89,77,93,82,84,144,83,82,145,95,76,57,50,65,73,77,70,85,73,78,72,71,115,103,72,98,99,73,74,106,51,88,66,90,93,61,63,62,69,118,104,108,99,61,54,84,86,77,74", + "endOffsets": "275,359,439,525,622,712,817,953,1038,1098,1163,1262,1330,1389,1478,1546,1613,1676,1751,1819,1873,1993,2051,2113,2167,2242,2384,2474,2552,2646,2729,2814,2959,3043,3126,3272,3368,3445,3503,3554,3620,3694,3772,3843,3929,4003,4082,4155,4227,4343,4447,4520,4619,4719,4793,4868,4975,5027,5116,5183,5274,5368,5430,5494,5557,5627,5746,5851,5960,6060,6122,6177,6262,6349,6427,6502" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3070,3154,3234,3320,3417,4241,4346,4482,6929,6989,7054,7153,7221,7280,7369,7437,7504,7567,7642,7710,7764,7884,7942,8004,8058,8133,8275,8365,8443,8537,8620,8705,8850,8934,9017,9163,9259,9336,9394,9445,9511,9585,9663,9734,9820,9894,9973,10046,10118,10234,10338,10411,10510,10610,10684,10759,10866,10918,11007,11074,11165,11259,11321,11385,11448,11518,11637,11742,11851,11951,12013,12068,12238,12325,12403", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,83,79,85,96,89,104,135,84,59,64,98,67,58,88,67,66,62,74,67,53,119,57,61,53,74,141,89,77,93,82,84,144,83,82,145,95,76,57,50,65,73,77,70,85,73,78,72,71,115,103,72,98,99,73,74,106,51,88,66,90,93,61,63,62,69,118,104,108,99,61,54,84,86,77,74", + "endOffsets": "325,3149,3229,3315,3412,3502,4341,4477,4562,6984,7049,7148,7216,7275,7364,7432,7499,7562,7637,7705,7759,7879,7937,7999,8053,8128,8270,8360,8438,8532,8615,8700,8845,8929,9012,9158,9254,9331,9389,9440,9506,9580,9658,9729,9815,9889,9968,10041,10113,10229,10333,10406,10505,10605,10679,10754,10861,10913,11002,11069,11160,11254,11316,11380,11443,11513,11632,11737,11846,11946,12008,12063,12148,12320,12398,12473" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-tl/values-tl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,355,452,559,667,789", + "endColumns": "96,101,100,96,106,107,121,100", + "endOffsets": "147,249,350,447,554,662,784,885" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3507,3604,3706,3807,3904,4011,4119,12478", + "endColumns": "96,101,100,96,106,107,121,100", + "endOffsets": "3599,3701,3802,3899,4006,4114,4236,12574" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-tl/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "140", + "endOffsets": "335" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5626", + "endColumns": "144", + "endOffsets": "5766" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-tl/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,296,468,602,707,861,993,1111,1220,1395,1498,1672,1806,1964,2139,2203,2265", + "endColumns": "102,171,133,104,153,131,117,108,174,102,173,133,157,174,63,61,76", + "endOffsets": "295,467,601,706,860,992,1110,1219,1394,1497,1671,1805,1963,2138,2202,2264,2341" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4567,4674,4850,4988,5097,5255,5391,5513,5771,5950,6057,6235,6373,6535,6714,6782,6848", + "endColumns": "106,175,137,108,157,135,121,112,178,106,177,137,161,178,67,65,80", + "endOffsets": "4669,4845,4983,5092,5250,5386,5508,5621,5945,6052,6230,6368,6530,6709,6777,6843,6924" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-tl/values-tl.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,216,324,437,525,631,746,826,903,994,1087,1182,1276,1376,1469,1564,1658,1749,1840,1924,2033,2143,2244,2354,2472,2580,2743,2845", + "endColumns": "110,107,112,87,105,114,79,76,90,92,94,93,99,92,94,93,90,90,83,108,109,100,109,117,107,162,101,84", + "endOffsets": "211,319,432,520,626,741,821,898,989,1082,1177,1271,1371,1464,1559,1653,1744,1835,1919,2028,2138,2239,2349,2467,2575,2738,2840,2925" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "330,441,549,662,750,856,971,1051,1128,1219,1312,1407,1501,1601,1694,1789,1883,1974,2065,2149,2258,2368,2469,2579,2697,2805,2968,12153", + "endColumns": "110,107,112,87,105,114,79,76,90,92,94,93,99,92,94,93,90,90,83,108,109,100,109,117,107,162,101,84", + "endOffsets": "436,544,657,745,851,966,1046,1123,1214,1307,1402,1496,1596,1689,1784,1878,1969,2060,2144,2253,2363,2464,2574,2692,2800,2963,3065,12233" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-tr.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-tr.json new file mode 100644 index 0000000..1835fdf --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-tr.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-tr/values-tr.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-tr/values-tr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,219,318,430,515,621,741,821,896,987,1080,1172,1266,1366,1459,1561,1656,1747,1838,1917,2024,2128,2224,2331,2434,2543,2699,2797", + "endColumns": "113,98,111,84,105,119,79,74,90,92,91,93,99,92,101,94,90,90,78,106,103,95,106,102,108,155,97,79", + "endOffsets": "214,313,425,510,616,736,816,891,982,1075,1167,1261,1361,1454,1556,1651,1742,1833,1912,2019,2123,2219,2326,2429,2538,2694,2792,2872" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "315,429,528,640,725,831,951,1031,1106,1197,1290,1382,1476,1576,1669,1771,1866,1957,2048,2127,2234,2338,2434,2541,2644,2753,2909,11680", + "endColumns": "113,98,111,84,105,119,79,74,90,92,91,93,99,92,101,94,90,90,78,106,103,95,106,102,108,155,97,79", + "endOffsets": "424,523,635,720,826,946,1026,1101,1192,1285,1377,1471,1571,1664,1766,1861,1952,2043,2122,2229,2333,2429,2536,2639,2748,2904,3002,11755" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-tr/values-tr.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,352,449,551,657,768", + "endColumns": "96,101,97,96,101,105,110,100", + "endOffsets": "147,249,347,444,546,652,763,864" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3424,3521,3623,3721,3818,3920,4026,11993", + "endColumns": "96,101,97,96,101,105,110,100", + "endOffsets": "3516,3618,3716,3813,3915,4021,4132,12089" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-tr/values-tr.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,265,340,415,492,591,682,778,890,972,1032,1096,1187,1264,1325,1416,1479,1542,1601,1670,1733,1787,1895,1953,2015,2069,2142,2263,2347,2427,2526,2610,2701,2841,2918,2994,3125,3212,3288,3341,3395,3461,3531,3608,3679,3759,3830,3905,3983,4054,4155,4240,4329,4424,4517,4589,4661,4757,4809,4895,4962,5046,5136,5198,5262,5325,5395,5489,5591,5680,5780,5837,5895,5974,6058,6133", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,74,74,76,98,90,95,111,81,59,63,90,76,60,90,62,62,58,68,62,53,107,57,61,53,72,120,83,79,98,83,90,139,76,75,130,86,75,52,53,65,69,76,70,79,70,74,77,70,100,84,88,94,92,71,71,95,51,85,66,83,89,61,63,62,69,93,101,88,99,56,57,78,83,74,73", + "endOffsets": "260,335,410,487,586,677,773,885,967,1027,1091,1182,1259,1320,1411,1474,1537,1596,1665,1728,1782,1890,1948,2010,2064,2137,2258,2342,2422,2521,2605,2696,2836,2913,2989,3120,3207,3283,3336,3390,3456,3526,3603,3674,3754,3825,3900,3978,4049,4150,4235,4324,4419,4512,4584,4656,4752,4804,4890,4957,5041,5131,5193,5257,5320,5390,5484,5586,5675,5775,5832,5890,5969,6053,6128,6202" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3007,3082,3157,3234,3333,4137,4233,4345,6678,6738,6802,6893,6970,7031,7122,7185,7248,7307,7376,7439,7493,7601,7659,7721,7775,7848,7969,8053,8133,8232,8316,8407,8547,8624,8700,8831,8918,8994,9047,9101,9167,9237,9314,9385,9465,9536,9611,9689,9760,9861,9946,10035,10130,10223,10295,10367,10463,10515,10601,10668,10752,10842,10904,10968,11031,11101,11195,11297,11386,11486,11543,11601,11760,11844,11919", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,74,74,76,98,90,95,111,81,59,63,90,76,60,90,62,62,58,68,62,53,107,57,61,53,72,120,83,79,98,83,90,139,76,75,130,86,75,52,53,65,69,76,70,79,70,74,77,70,100,84,88,94,92,71,71,95,51,85,66,83,89,61,63,62,69,93,101,88,99,56,57,78,83,74,73", + "endOffsets": "310,3077,3152,3229,3328,3419,4228,4340,4422,6733,6797,6888,6965,7026,7117,7180,7243,7302,7371,7434,7488,7596,7654,7716,7770,7843,7964,8048,8128,8227,8311,8402,8542,8619,8695,8826,8913,8989,9042,9096,9162,9232,9309,9380,9460,9531,9606,9684,9755,9856,9941,10030,10125,10218,10290,10362,10458,10510,10596,10663,10747,10837,10899,10963,11026,11096,11190,11292,11381,11481,11538,11596,11675,11839,11914,11988" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-tr/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,299,450,582,683,826,952,1075,1177,1345,1448,1601,1731,1872,2035,2093,2153", + "endColumns": "105,150,131,100,142,125,122,101,167,102,152,129,140,162,57,59,75", + "endOffsets": "298,449,581,682,825,951,1074,1176,1344,1447,1600,1730,1871,2034,2092,2152,2228" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4427,4537,4692,4828,4933,5080,5210,5337,5590,5762,5869,6026,6160,6305,6472,6534,6598", + "endColumns": "109,154,135,104,146,129,126,105,171,106,156,133,144,166,61,63,79", + "endOffsets": "4532,4687,4823,4928,5075,5205,5332,5438,5757,5864,6021,6155,6300,6467,6529,6593,6673" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-tr/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "142", + "endOffsets": "337" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5443", + "endColumns": "146", + "endOffsets": "5585" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-uk.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-uk.json new file mode 100644 index 0000000..0712483 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-uk.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-uk/values-uk.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-uk/values-uk.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,214,316,424,510,615,733,816,898,989,1082,1177,1271,1371,1464,1559,1654,1745,1836,1935,2041,2147,2245,2352,2459,2564,2734,2834", + "endColumns": "108,101,107,85,104,117,82,81,90,92,94,93,99,92,94,94,90,90,98,105,105,97,106,106,104,169,99,81", + "endOffsets": "209,311,419,505,610,728,811,893,984,1077,1172,1266,1366,1459,1554,1649,1740,1831,1930,2036,2142,2240,2347,2454,2559,2729,2829,2911" + }, + "to": { + "startLines": "8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,132", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "424,533,635,743,829,934,1052,1135,1217,1308,1401,1496,1590,1690,1783,1878,1973,2064,2155,2254,2360,2466,2564,2671,2778,2883,3053,11925", + "endColumns": "108,101,107,85,104,117,82,81,90,92,94,93,99,92,94,94,90,90,98,105,105,97,106,106,104,169,99,81", + "endOffsets": "528,630,738,824,929,1047,1130,1212,1303,1396,1491,1585,1685,1778,1873,1968,2059,2150,2249,2355,2461,2559,2666,2773,2878,3048,3148,12002" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-uk/values-uk.xml", + "from": { + "startLines": "2,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,374,452,530,618,726,817,913,1029,1112,1184,1251,1342,1408,1471,1559,1621,1688,1746,1817,1876,1930,2044,2104,2167,2221,2294,2413,2499,2575,2666,2747,2830,2969,3054,3141,3274,3362,3440,3497,3548,3614,3686,3762,3833,3916,3989,4066,4148,4222,4331,4421,4500,4591,4687,4761,4842,4937,4991,5073,5139,5226,5312,5374,5438,5501,5574,5681,5791,5889,5995,6056,6111,6193,6278,6354", + "endLines": "7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82", + "endColumns": "12,77,77,87,107,90,95,115,82,71,66,90,65,62,87,61,66,57,70,58,53,113,59,62,53,72,118,85,75,90,80,82,138,84,86,132,87,77,56,50,65,71,75,70,82,72,76,81,73,108,89,78,90,95,73,80,94,53,81,65,86,85,61,63,62,72,106,109,97,105,60,54,81,84,75,76", + "endOffsets": "369,447,525,613,721,812,908,1024,1107,1179,1246,1337,1403,1466,1554,1616,1683,1741,1812,1871,1925,2039,2099,2162,2216,2289,2408,2494,2570,2661,2742,2825,2964,3049,3136,3269,3357,3435,3492,3543,3609,3681,3757,3828,3911,3984,4061,4143,4217,4326,4416,4495,4586,4682,4756,4837,4932,4986,5068,5134,5221,5307,5369,5433,5496,5569,5676,5786,5884,5990,6051,6106,6188,6273,6349,6426" + }, + "to": { + "startLines": "2,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3153,3231,3309,3397,3505,4323,4419,4535,6844,6916,6983,7074,7140,7203,7291,7353,7420,7478,7549,7608,7662,7776,7836,7899,7953,8026,8145,8231,8307,8398,8479,8562,8701,8786,8873,9006,9094,9172,9229,9280,9346,9418,9494,9565,9648,9721,9798,9880,9954,10063,10153,10232,10323,10419,10493,10574,10669,10723,10805,10871,10958,11044,11106,11170,11233,11306,11413,11523,11621,11727,11788,11843,12007,12092,12168", + "endLines": "7,35,36,37,38,39,47,48,49,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,133,134,135", + "endColumns": "12,77,77,87,107,90,95,115,82,71,66,90,65,62,87,61,66,57,70,58,53,113,59,62,53,72,118,85,75,90,80,82,138,84,86,132,87,77,56,50,65,71,75,70,82,72,76,81,73,108,89,78,90,95,73,80,94,53,81,65,86,85,61,63,62,72,106,109,97,105,60,54,81,84,75,76", + "endOffsets": "419,3226,3304,3392,3500,3591,4414,4530,4613,6911,6978,7069,7135,7198,7286,7348,7415,7473,7544,7603,7657,7771,7831,7894,7948,8021,8140,8226,8302,8393,8474,8557,8696,8781,8868,9001,9089,9167,9224,9275,9341,9413,9489,9560,9643,9716,9793,9875,9949,10058,10148,10227,10318,10414,10488,10569,10664,10718,10800,10866,10953,11039,11101,11165,11228,11301,11408,11518,11616,11722,11783,11838,11920,12087,12163,12240" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-uk/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,456,579,685,835,960,1071,1172,1336,1438,1596,1717,1860,1998,2064,2121", + "endColumns": "103,158,122,105,149,124,110,100,163,101,157,120,142,137,65,56,83", + "endOffsets": "296,455,578,684,834,959,1070,1171,1335,1437,1595,1716,1859,1997,2063,2120,2204" + }, + "to": { + "startLines": "50,51,52,53,54,55,56,57,59,60,61,62,63,64,65,66,67", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4618,4726,4889,5016,5126,5280,5409,5524,5775,5943,6049,6211,6336,6483,6625,6695,6756", + "endColumns": "107,162,126,109,153,128,114,104,167,105,161,124,146,141,69,60,87", + "endOffsets": "4721,4884,5011,5121,5275,5404,5519,5624,5938,6044,6206,6331,6478,6620,6690,6751,6839" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-uk/values-uk.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,155,257,358,459,564,669,782", + "endColumns": "99,101,100,100,104,104,112,100", + "endOffsets": "150,252,353,454,559,664,777,878" + }, + "to": { + "startLines": "40,41,42,43,44,45,46,136", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3596,3696,3798,3899,4000,4105,4210,12245", + "endColumns": "99,101,100,100,104,104,112,100", + "endOffsets": "3691,3793,3894,3995,4100,4205,4318,12341" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-uk/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "141", + "endOffsets": "336" + }, + "to": { + "startLines": "58", + "startColumns": "4", + "startOffsets": "5629", + "endColumns": "145", + "endOffsets": "5770" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ur.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ur.json new file mode 100644 index 0000000..303da64 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-ur.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-ur/values-ur.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-ur/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "147", + "endOffsets": "342" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5472", + "endColumns": "151", + "endOffsets": "5619" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-ur/values-ur.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,255,357,461,564,662,776", + "endColumns": "97,101,101,103,102,97,113,100", + "endOffsets": "148,250,352,456,559,657,771,872" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3457,3555,3657,3759,3863,3966,4064,12066", + "endColumns": "97,101,101,103,102,97,113,100", + "endOffsets": "3550,3652,3754,3858,3961,4059,4173,12162" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-ur/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,297,457,579,686,822,945,1053,1153,1301,1407,1575,1699,1841,2006,2065,2128", + "endColumns": "103,159,121,106,135,122,107,99,147,105,167,123,141,164,58,62,83", + "endOffsets": "296,456,578,685,821,944,1052,1152,1300,1406,1574,1698,1840,2005,2064,2127,2211" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4480,4588,4752,4878,4989,5129,5256,5368,5624,5776,5886,6058,6186,6332,6501,6564,6631", + "endColumns": "107,163,125,110,139,126,111,103,151,109,171,127,145,168,62,66,87", + "endOffsets": "4583,4747,4873,4984,5124,5251,5363,5467,5771,5881,6053,6181,6327,6496,6559,6626,6714" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-ur/values-ur.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,259,337,415,493,591,680,780,899,982,1038,1103,1197,1267,1326,1416,1480,1549,1607,1676,1736,1800,1912,1971,2030,2085,2160,2283,2363,2446,2540,2627,2711,2844,2926,3007,3138,3225,3307,3365,3421,3487,3562,3642,3713,3792,3859,3934,4011,4075,4182,4276,4346,4435,4528,4602,4677,4767,4823,4902,4969,5053,5137,5199,5263,5326,5392,5492,5599,5693,5801,5863,5923,6003,6088,6169", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,77,77,77,97,88,99,118,82,55,64,93,69,58,89,63,68,57,68,59,63,111,58,58,54,74,122,79,82,93,86,83,132,81,80,130,86,81,57,55,65,74,79,70,78,66,74,76,63,106,93,69,88,92,73,74,89,55,78,66,83,83,61,63,62,65,99,106,93,107,61,59,79,84,80,73", + "endOffsets": "254,332,410,488,586,675,775,894,977,1033,1098,1192,1262,1321,1411,1475,1544,1602,1671,1731,1795,1907,1966,2025,2080,2155,2278,2358,2441,2535,2622,2706,2839,2921,3002,3133,3220,3302,3360,3416,3482,3557,3637,3708,3787,3854,3929,4006,4070,4177,4271,4341,4430,4523,4597,4672,4762,4818,4897,4964,5048,5132,5194,5258,5321,5387,5487,5594,5688,5796,5858,5918,5998,6083,6164,6238" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3036,3114,3192,3270,3368,4178,4278,4397,6719,6775,6840,6934,7004,7063,7153,7217,7286,7344,7413,7473,7537,7649,7708,7767,7822,7897,8020,8100,8183,8277,8364,8448,8581,8663,8744,8875,8962,9044,9102,9158,9224,9299,9379,9450,9529,9596,9671,9748,9812,9919,10013,10083,10172,10265,10339,10414,10504,10560,10639,10706,10790,10874,10936,11000,11063,11129,11229,11336,11430,11538,11600,11660,11826,11911,11992", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,77,77,77,97,88,99,118,82,55,64,93,69,58,89,63,68,57,68,59,63,111,58,58,54,74,122,79,82,93,86,83,132,81,80,130,86,81,57,55,65,74,79,70,78,66,74,76,63,106,93,69,88,92,73,74,89,55,78,66,83,83,61,63,62,65,99,106,93,107,61,59,79,84,80,73", + "endOffsets": "304,3109,3187,3265,3363,3452,4273,4392,4475,6770,6835,6929,6999,7058,7148,7212,7281,7339,7408,7468,7532,7644,7703,7762,7817,7892,8015,8095,8178,8272,8359,8443,8576,8658,8739,8870,8957,9039,9097,9153,9219,9294,9374,9445,9524,9591,9666,9743,9807,9914,10008,10078,10167,10260,10334,10409,10499,10555,10634,10701,10785,10869,10931,10995,11058,11124,11224,11331,11425,11533,11595,11655,11735,11906,11987,12061" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-ur/values-ur.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,219,325,434,520,624,744,821,896,988,1082,1177,1271,1372,1466,1562,1656,1748,1840,1925,2033,2139,2241,2352,2453,2569,2734,2832", + "endColumns": "113,105,108,85,103,119,76,74,91,93,94,93,100,93,95,93,91,91,84,107,105,101,110,100,115,164,97,85", + "endOffsets": "214,320,429,515,619,739,816,891,983,1077,1172,1266,1367,1461,1557,1651,1743,1835,1920,2028,2134,2236,2347,2448,2564,2729,2827,2913" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "309,423,529,638,724,828,948,1025,1100,1192,1286,1381,1475,1576,1670,1766,1860,1952,2044,2129,2237,2343,2445,2556,2657,2773,2938,11740", + "endColumns": "113,105,108,85,103,119,76,74,91,93,94,93,100,93,95,93,91,91,84,107,105,101,110,100,115,164,97,85", + "endOffsets": "418,524,633,719,823,943,1020,1095,1187,1281,1376,1470,1571,1665,1761,1855,1947,2039,2124,2232,2338,2440,2551,2652,2768,2933,3031,11821" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-uz.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-uz.json new file mode 100644 index 0000000..886c196 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-uz.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-uz/values-uz.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-uz/values-uz.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,157,259,360,460,568,672,791", + "endColumns": "101,101,100,99,107,103,118,100", + "endOffsets": "152,254,355,455,563,667,786,887" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3425,3527,3629,3730,3830,3938,4042,12142", + "endColumns": "101,101,100,99,107,103,118,100", + "endOffsets": "3522,3624,3725,3825,3933,4037,4156,12238" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-uz/values-uz.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,210,305,405,487,587,704,789,867,958,1051,1146,1240,1334,1427,1522,1617,1708,1800,1884,1994,2100,2200,2308,2414,2516,2677,2776", + "endColumns": "104,94,99,81,99,116,84,77,90,92,94,93,93,92,94,94,90,91,83,109,105,99,107,105,101,160,98,83", + "endOffsets": "205,300,400,482,582,699,784,862,953,1046,1141,1235,1329,1422,1517,1612,1703,1795,1879,1989,2095,2195,2303,2409,2511,2672,2771,2855" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "333,438,533,633,715,815,932,1017,1095,1186,1279,1374,1468,1562,1655,1750,1845,1936,2028,2112,2222,2328,2428,2536,2642,2744,2905,11821", + "endColumns": "104,94,99,81,99,116,84,77,90,92,94,93,93,92,94,94,90,91,83,109,105,99,107,105,101,160,98,83", + "endOffsets": "433,528,628,710,810,927,1012,1090,1181,1274,1369,1463,1557,1650,1745,1840,1931,2023,2107,2217,2323,2423,2531,2637,2739,2900,2999,11900" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-uz/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "145", + "endOffsets": "340" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5464", + "endColumns": "149", + "endOffsets": "5609" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-uz/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,294,440,565,670,811,940,1056,1158,1326,1430,1585,1713,1863,2021,2083,2140", + "endColumns": "100,145,124,104,140,128,115,101,167,103,154,127,149,157,61,56,75", + "endOffsets": "293,439,564,669,810,939,1055,1157,1325,1429,1584,1712,1862,2020,2082,2139,2215" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4467,4572,4722,4851,4960,5105,5238,5358,5614,5786,5894,6053,6185,6339,6501,6567,6628", + "endColumns": "104,149,128,108,144,132,119,105,171,107,158,131,153,161,65,60,79", + "endOffsets": "4567,4717,4846,4955,5100,5233,5353,5459,5781,5889,6048,6180,6334,6496,6562,6623,6703" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-uz/values-uz.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,283,360,440,523,617,704,799,926,1010,1070,1134,1237,1307,1374,1483,1546,1613,1672,1746,1809,1863,1978,2036,2098,2152,2227,2356,2446,2526,2619,2703,2792,2933,3015,3097,3236,3322,3406,3466,3517,3583,3656,3734,3805,3886,3958,4035,4110,4181,4282,4376,4455,4551,4645,4719,4795,4881,4934,5021,5087,5172,5263,5325,5389,5452,5521,5623,5724,5820,5921,5985,6040,6123,6209,6286", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,76,79,82,93,86,94,126,83,59,63,102,69,66,108,62,66,58,73,62,53,114,57,61,53,74,128,89,79,92,83,88,140,81,81,138,85,83,59,50,65,72,77,70,80,71,76,74,70,100,93,78,95,93,73,75,85,52,86,65,84,90,61,63,62,68,101,100,95,100,63,54,82,85,76,73", + "endOffsets": "278,355,435,518,612,699,794,921,1005,1065,1129,1232,1302,1369,1478,1541,1608,1667,1741,1804,1858,1973,2031,2093,2147,2222,2351,2441,2521,2614,2698,2787,2928,3010,3092,3231,3317,3401,3461,3512,3578,3651,3729,3800,3881,3953,4030,4105,4176,4277,4371,4450,4546,4640,4714,4790,4876,4929,5016,5082,5167,5258,5320,5384,5447,5516,5618,5719,5815,5916,5980,6035,6118,6204,6281,6355" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3004,3081,3161,3244,3338,4161,4256,4383,6708,6768,6832,6935,7005,7072,7181,7244,7311,7370,7444,7507,7561,7676,7734,7796,7850,7925,8054,8144,8224,8317,8401,8490,8631,8713,8795,8934,9020,9104,9164,9215,9281,9354,9432,9503,9584,9656,9733,9808,9879,9980,10074,10153,10249,10343,10417,10493,10579,10632,10719,10785,10870,10961,11023,11087,11150,11219,11321,11422,11518,11619,11683,11738,11905,11991,12068", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,76,79,82,93,86,94,126,83,59,63,102,69,66,108,62,66,58,73,62,53,114,57,61,53,74,128,89,79,92,83,88,140,81,81,138,85,83,59,50,65,72,77,70,80,71,76,74,70,100,93,78,95,93,73,75,85,52,86,65,84,90,61,63,62,68,101,100,95,100,63,54,82,85,76,73", + "endOffsets": "328,3076,3156,3239,3333,3420,4251,4378,4462,6763,6827,6930,7000,7067,7176,7239,7306,7365,7439,7502,7556,7671,7729,7791,7845,7920,8049,8139,8219,8312,8396,8485,8626,8708,8790,8929,9015,9099,9159,9210,9276,9349,9427,9498,9579,9651,9728,9803,9874,9975,10069,10148,10244,10338,10412,10488,10574,10627,10714,10780,10865,10956,11018,11082,11145,11214,11316,11417,11513,11614,11678,11733,11816,11986,12063,12137" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v16.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v16.json new file mode 100644 index 0000000..bc6db94 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v16.json @@ -0,0 +1,20 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-v16/values-v16.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v16/values-v16.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endLines": "5", + "endColumns": "12", + "endOffsets": "223" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v17.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v17.json new file mode 100644 index 0000000..5fb0299 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v17.json @@ -0,0 +1,20 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-v17/values-v17.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v17/values-v17.xml", + "from": { + "startLines": "2,5,9,12,15,18,22,25,29,33,37,40,43,46,50,53,57", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,228,456,614,764,936,1161,1331,1559,1783,2025,2196,2370,2539,2812,3012,3216", + "endLines": "4,8,11,14,17,21,24,28,32,36,39,42,45,49,52,56,60", + "endColumns": "12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12", + "endOffsets": "223,451,609,759,931,1156,1326,1554,1778,2020,2191,2365,2534,2807,3007,3211,3540" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v18.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v18.json new file mode 100644 index 0000000..fce45d4 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v18.json @@ -0,0 +1,19 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-v18/values-v18.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v18/values-v18.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "48", + "endOffsets": "99" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v21.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v21.json new file mode 100644 index 0000000..4756fdf --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v21.json @@ -0,0 +1,66 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-v21/values-v21.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-v21/values-v21.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,13", + "startColumns": "4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,173,237,304,368,484,610,736,864,1036", + "endLines": "2,3,4,5,6,7,8,9,12,17", + "endColumns": "117,63,66,63,115,125,125,127,12,12", + "endOffsets": "168,232,299,363,479,605,731,859,1031,1383" + }, + "to": { + "startLines": "2,17,18,19,347,348,349,350,537,540", + "startColumns": "4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,1406,1470,1537,25556,25672,25798,25924,37215,37387", + "endLines": "2,17,18,19,347,348,349,350,539,544", + "endColumns": "117,63,66,63,115,125,125,127,12,12", + "endOffsets": "168,1465,1532,1596,25667,25793,25919,26047,37382,37734" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-v21/values-v21.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,29,32,35,38,41,44,47,50,53,56,59,60,63,68,79,85,94,103,112,121,130,139,148,157,166,175,184,193,202,211,220,226,232,238,244,248,252,253,254,255,259,262,265,268,271,272,275,278,282,286", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,153,248,344,441,509,588,676,764,852,940,1027,1114,1201,1288,1384,1474,1570,1660,1753,1860,1965,2084,2209,2330,2543,2802,3073,3291,3523,3759,4009,4222,4431,4662,4863,4979,5149,5470,6499,6956,7460,7968,8477,8991,9496,10000,10505,11011,11513,12019,12528,13036,13535,14042,14550,14842,15136,15436,15736,16065,16406,16544,16688,16844,17237,17455,17677,17903,18119,18229,18399,18589,18830,19089", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,28,31,34,37,40,43,46,49,52,55,58,59,62,67,78,84,93,102,111,120,129,138,147,156,165,174,183,192,201,210,219,225,231,237,243,247,251,252,253,254,258,261,264,267,270,271,274,277,281,285,288", + "endColumns": "97,94,95,96,67,78,87,87,87,87,86,86,86,86,95,89,95,89,92,106,104,118,124,120,10,10,10,10,10,10,10,10,10,10,10,115,10,12,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,137,143,155,10,10,10,10,10,109,10,10,10,10,10", + "endOffsets": "148,243,339,436,504,583,671,759,847,935,1022,1109,1196,1283,1379,1469,1565,1655,1748,1855,1960,2079,2204,2325,2538,2797,3068,3286,3518,3754,4004,4217,4426,4657,4858,4974,5144,5465,6494,6951,7455,7963,8472,8986,9491,9995,10500,11006,11508,12014,12523,13031,13530,14037,14545,14837,15131,15431,15731,16060,16401,16539,16683,16839,17232,17450,17672,17898,18114,18224,18394,18584,18825,19084,19261" + }, + "to": { + "startLines": "3,4,5,6,7,8,9,10,11,12,13,14,15,16,20,21,22,23,84,85,86,87,89,90,91,94,97,192,195,198,201,207,210,213,280,283,284,287,292,303,351,360,369,378,387,396,405,414,423,432,441,450,459,468,477,486,492,498,504,510,514,518,519,520,521,525,528,531,534,545,546,549,552,556,560", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "173,271,366,462,559,627,706,794,882,970,1058,1145,1232,1319,1601,1697,1787,1883,7340,7433,7540,7645,7867,7992,8113,8326,8585,14766,14984,15216,15452,15901,16114,16323,21110,21311,21427,21597,21918,22947,26052,26556,27064,27573,28087,28592,29096,29601,30107,30609,31115,31624,32132,32631,33138,33646,33938,34232,34532,34832,35161,35502,35640,35784,35940,36333,36551,36773,36999,37739,37849,38019,38209,38450,38709", + "endLines": "3,4,5,6,7,8,9,10,11,12,13,14,15,16,20,21,22,23,84,85,86,87,89,90,93,96,99,194,197,200,203,209,212,215,282,283,286,291,302,308,359,368,377,386,395,404,413,422,431,440,449,458,467,476,485,491,497,503,509,513,517,518,519,520,524,527,530,533,536,545,548,551,555,559,562", + "endColumns": "97,94,95,96,67,78,87,87,87,87,86,86,86,86,95,89,95,89,92,106,104,118,124,120,10,10,10,10,10,10,10,10,10,10,10,115,10,12,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,137,143,155,10,10,10,10,10,109,10,10,10,10,10", + "endOffsets": "266,361,457,554,622,701,789,877,965,1053,1140,1227,1314,1401,1692,1782,1878,1968,7428,7535,7640,7759,7987,8108,8321,8580,8851,14979,15211,15447,15697,16109,16318,16549,21306,21422,21592,21913,22942,23399,26551,27059,27568,28082,28587,29091,29596,30102,30604,31110,31619,32127,32626,33133,33641,33933,34227,34527,34827,35156,35497,35635,35779,35935,36328,36546,36768,36994,37210,37844,38014,38204,38445,38704,38881" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v21/values-v21.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,19,20,21,22,24,26,27,28,29,30,32,34,36,38,40,42,43,48,50,52,53,54,56,58,59,60,61,62,63,106,109,152,155,158,160,162,164,167,171,174,175,176,179,180,181,182,183,184,187,188,190,192,194,196,200,202,203,204,205,207,211,213,215,216,217,218,219,220,222,223,224,234,235,236,248", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,146,249,352,457,564,673,782,891,1000,1109,1216,1319,1438,1593,1748,1853,1974,2075,2222,2363,2466,2585,2692,2795,2950,3121,3270,3435,3592,3743,3862,4213,4362,4511,4623,4770,4923,5070,5145,5234,5321,5422,5525,8283,8468,11238,11435,11634,11757,11880,11993,12176,12431,12632,12721,12832,13065,13166,13261,13384,13513,13630,13807,13906,14041,14184,14319,14438,14639,14758,14851,14962,15018,15125,15320,15431,15564,15659,15750,15841,15934,16051,16190,16261,16344,16967,17024,17082,17706", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,19,20,21,23,25,26,27,28,29,31,33,35,37,39,41,42,47,49,51,52,53,55,57,58,59,60,61,62,105,108,151,154,157,159,161,163,166,170,173,174,175,178,179,180,181,182,183,186,187,189,191,193,195,199,201,202,203,204,206,210,212,214,215,216,217,218,219,221,222,223,233,234,235,247,259", + "endColumns": "90,102,102,104,106,108,108,108,108,108,106,102,118,12,12,104,120,100,12,12,102,118,106,102,12,12,12,12,12,12,118,12,12,12,111,146,12,12,74,88,86,100,102,12,12,12,12,12,12,12,12,12,12,12,88,110,12,100,94,122,128,116,12,98,12,12,12,12,12,12,92,110,55,12,12,12,12,94,90,90,92,116,12,70,82,12,56,57,12,12", + "endOffsets": "141,244,347,452,559,668,777,886,995,1104,1211,1314,1433,1588,1743,1848,1969,2070,2217,2358,2461,2580,2687,2790,2945,3116,3265,3430,3587,3738,3857,4208,4357,4506,4618,4765,4918,5065,5140,5229,5316,5417,5520,8278,8463,11233,11430,11629,11752,11875,11988,12171,12426,12627,12716,12827,13060,13161,13256,13379,13508,13625,13802,13901,14036,14179,14314,14433,14634,14753,14846,14957,15013,15120,15315,15426,15559,15654,15745,15836,15929,16046,16185,16256,16339,16962,17019,17077,17701,18337" + }, + "to": { + "startLines": "24,25,26,27,28,29,30,31,32,33,34,35,36,37,39,41,42,43,44,46,48,49,50,51,52,54,56,58,60,62,64,65,70,72,74,75,76,78,80,81,82,83,88,100,143,146,189,204,216,218,220,222,225,229,232,233,234,237,238,239,240,241,242,245,246,248,250,252,254,258,260,261,262,263,265,269,271,273,274,275,276,277,278,309,310,311,321,322,323,335", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "1973,2064,2167,2270,2375,2482,2591,2700,2809,2918,3027,3134,3237,3356,3511,3666,3771,3892,3993,4140,4281,4384,4503,4610,4713,4868,5039,5188,5353,5510,5661,5780,6131,6280,6429,6541,6688,6841,6988,7063,7152,7239,7764,8856,11614,11799,14569,15702,16554,16677,16800,16913,17096,17351,17552,17641,17752,17985,18086,18181,18304,18433,18550,18727,18826,18961,19104,19239,19358,19559,19678,19771,19882,19938,20045,20240,20351,20484,20579,20670,20761,20854,20971,23404,23475,23558,24181,24238,24296,24920", + "endLines": "24,25,26,27,28,29,30,31,32,33,34,35,36,38,40,41,42,43,45,47,48,49,50,51,53,55,57,59,61,63,64,69,71,73,74,75,77,79,80,81,82,83,88,142,145,188,191,206,217,219,221,224,228,231,232,233,236,237,238,239,240,241,244,245,247,249,251,253,257,259,260,261,262,264,268,270,272,273,274,275,276,277,279,309,310,320,321,322,334,346", + "endColumns": "90,102,102,104,106,108,108,108,108,108,106,102,118,12,12,104,120,100,12,12,102,118,106,102,12,12,12,12,12,12,118,12,12,12,111,146,12,12,74,88,86,100,102,12,12,12,12,12,12,12,12,12,12,12,88,110,12,100,94,122,128,116,12,98,12,12,12,12,12,12,92,110,55,12,12,12,12,94,90,90,92,116,12,70,82,12,56,57,12,12", + "endOffsets": "2059,2162,2265,2370,2477,2586,2695,2804,2913,3022,3129,3232,3351,3506,3661,3766,3887,3988,4135,4276,4379,4498,4605,4708,4863,5034,5183,5348,5505,5656,5775,6126,6275,6424,6536,6683,6836,6983,7058,7147,7234,7335,7862,11609,11794,14564,14761,15896,16672,16795,16908,17091,17346,17547,17636,17747,17980,18081,18176,18299,18428,18545,18722,18821,18956,19099,19234,19353,19554,19673,19766,19877,19933,20040,20235,20346,20479,20574,20665,20756,20849,20966,21105,23470,23553,24176,24233,24291,24915,25551" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v22.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v22.json new file mode 100644 index 0000000..ba219a3 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v22.json @@ -0,0 +1,20 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-v22/values-v22.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v22/values-v22.xml", + "from": { + "startLines": "2,3,4,9", + "startColumns": "4,4,4,4", + "startOffsets": "55,130,217,487", + "endLines": "2,3,8,13", + "endColumns": "74,86,12,12", + "endOffsets": "125,212,482,764" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v23.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v23.json new file mode 100644 index 0000000..6d9ba15 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v23.json @@ -0,0 +1,58 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-v23/values-v23.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-v23/values-v23.xml", + "from": { + "startLines": "2,5,9,13,16,19,22,25,28,32", + "startColumns": "4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,271,413,574,784,991,1198,1401,1603,1868", + "endLines": "4,8,12,15,18,21,24,27,31,35", + "endColumns": "10,10,10,10,10,10,10,10,10,10", + "endOffsets": "266,408,569,779,986,1193,1396,1598,1863,2136" + }, + "to": { + "startLines": "53,56,60,64,67,70,73,76,79,83", + "startColumns": "4,4,4,4,4,4,4,4,4,4", + "startOffsets": "3382,3598,3740,3901,4111,4318,4525,4728,4930,5195", + "endLines": "55,59,63,66,69,72,75,78,82,86", + "endColumns": "10,10,10,10,10,10,10,10,10,10", + "endOffsets": "3593,3735,3896,4106,4313,4520,4723,4925,5190,5463" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v23/values-v23.xml", + "from": { + "startLines": "2,3,4,5,6,20,34,35,36,39,43,44,45,46", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,190,325,400,487,1225,1975,2094,2221,2443,2667,2782,2889,3002", + "endLines": "2,3,4,5,19,33,34,35,38,42,43,44,45,49", + "endColumns": "134,134,74,86,12,12,118,126,12,12,114,106,112,12", + "endOffsets": "185,320,395,482,1220,1970,2089,2216,2438,2662,2777,2884,2997,3227" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/30d4e98469639d69ad240eb0afa9d087/transformed/cardview-1.0.0/res/values-v23/values-v23.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endLines": "4", + "endColumns": "12", + "endOffsets": "200" + }, + "to": { + "startLines": "50", + "startColumns": "4", + "startOffsets": "3232", + "endLines": "52", + "endColumns": "12", + "endOffsets": "3377" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v24.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v24.json new file mode 100644 index 0000000..704ef3e --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v24.json @@ -0,0 +1,38 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-v24/values-v24.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v24/values-v24.xml", + "from": { + "startLines": "2,3", + "startColumns": "4,4", + "startOffsets": "55,212", + "endColumns": "156,134", + "endOffsets": "207,342" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-v24/values-v24.xml", + "from": { + "startLines": "2,3,4,5,6,9,12,15", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,140,239,326,427,626,839,1040", + "endLines": "2,3,4,5,8,11,14,17", + "endColumns": "84,98,86,100,10,10,10,10", + "endOffsets": "135,234,321,422,621,834,1035,1250" + }, + "to": { + "startLines": "4,5,6,7,8,11,14,17", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "347,432,531,618,719,918,1131,1332", + "endLines": "4,5,6,7,10,13,16,19", + "endColumns": "84,98,86,100,10,10,10,10", + "endOffsets": "427,526,613,714,913,1126,1327,1542" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v25.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v25.json new file mode 100644 index 0000000..761361c --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v25.json @@ -0,0 +1,20 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-v25/values-v25.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v25/values-v25.xml", + "from": { + "startLines": "2,3,4,6", + "startColumns": "4,4,4,4", + "startOffsets": "55,126,209,308", + "endLines": "2,3,5,7", + "endColumns": "70,82,12,12", + "endOffsets": "121,204,303,414" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v26.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v26.json new file mode 100644 index 0000000..48e55ec --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v26.json @@ -0,0 +1,20 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-v26/values-v26.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v26/values-v26.xml", + "from": { + "startLines": "2,3,4,8,12,16", + "startColumns": "4,4,4,4,4,4", + "startOffsets": "55,130,217,381,557,796", + "endLines": "2,3,7,11,15,16", + "endColumns": "74,86,12,12,12,92", + "endOffsets": "125,212,376,552,791,884" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v28.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v28.json new file mode 100644 index 0000000..954beeb --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v28.json @@ -0,0 +1,47 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-v28/values-v28.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-v28/values-v28.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,153,249,344,441,529,617,705,793,880,967,1054,1141", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,17", + "endColumns": "97,95,94,96,87,87,87,87,86,86,86,86,10", + "endOffsets": "148,244,339,436,524,612,700,788,875,962,1049,1136,1423" + }, + "to": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,24", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,153,249,344,441,529,617,705,793,880,967,1054,1675", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,27", + "endColumns": "97,95,94,96,87,87,87,87,86,86,86,86,10", + "endOffsets": "148,244,339,436,524,612,700,788,875,962,1049,1136,1957" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-v28/values-v28.xml", + "from": { + "startLines": "2,3,4,8", + "startColumns": "4,4,4,4", + "startOffsets": "55,130,217,397", + "endLines": "2,3,7,11", + "endColumns": "74,86,12,12", + "endOffsets": "125,212,392,584" + }, + "to": { + "startLines": "14,15,16,20", + "startColumns": "4,4,4,4", + "startOffsets": "1141,1216,1303,1483", + "endLines": "14,15,19,23", + "endColumns": "74,86,12,12", + "endOffsets": "1211,1298,1478,1670" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v31.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v31.json new file mode 100644 index 0000000..9e39500 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v31.json @@ -0,0 +1,20 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-v31/values-v31.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-v31/values-v31.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,277,342,408", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,149,243,336,430,524,618,712,806,900,994,1088,1181,1274,1376,1478,1579,1681,1783,1885,1987,2089,2191,2293,2395,2496,2597,2690,2783,2875,2968,3061,3154,3247,3340,3433,3526,3619,3711,3803,3898,3993,4087,4182,4277,4372,4467,4562,4657,4752,4847,4941,5035,5129,5223,5316,5410,5504,5598,5692,5786,5880,5974,6068,6161,6254,6364,6475,6583,6691,6797,6900,7013,7120,7237,7340,7459,7564,7679,7787,7903,8003,8113,8217,8331,8438,8553,8671,8794,8920,9042,9166,9277,9393,9495,9607,9719,9831,9940,10049,10156,10261,10375,10484,10602,10706,10826,10933,11049,11158,11275,11376,11487,11592,11707,11816,11932,12051,12175,12302,12425,12552,12665,12782,12885,12998,13102,13214,13322,13438,13544,13658,13759,13864,13969,14078,14181,14288,14379,14490,14587,14704,14797,14910,15009,15128,15219,15312,15407,15500,15593,15686,15779,15872,15965,16058,16151,16244,16337,16444,16553,16664,16773,16882,16991,17100,17209,17318,17427,17536,17645,17754,17845,17938,18033,18126,18219,18312,18405,18498,18591,18684,18777,18870,18963,19058,19155,19254,19351,19448,19545,19642,19739,19836,19933,20030,20127,20224,20317,20412,20509,20604,20699,20794,20889,20984,21079,21174,21269,21364,21459,27071,32713,38445", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,276,341,407,473", + "endColumns": "93,93,92,93,93,93,93,93,93,93,93,92,92,101,101,100,101,101,101,101,101,101,101,101,100,100,92,92,91,92,92,92,92,92,92,92,92,91,91,94,94,93,94,94,94,94,94,94,94,94,93,93,93,93,92,93,93,93,93,93,93,93,93,92,92,109,110,107,107,105,102,112,106,116,102,118,104,114,107,115,99,109,103,113,106,114,117,122,125,121,123,110,115,101,111,111,111,108,108,106,104,113,108,117,103,119,106,115,108,116,100,110,104,114,108,115,118,123,126,122,126,112,116,102,112,103,111,107,115,105,113,100,104,104,108,102,106,90,110,96,116,92,112,98,118,90,92,94,92,92,92,92,92,92,92,92,92,92,106,108,110,108,108,108,108,108,108,108,108,108,108,90,92,94,92,92,92,92,92,92,92,92,92,92,94,96,98,96,96,96,96,96,96,96,96,96,96,92,94,96,94,94,94,94,94,94,94,94,94,94,10,10,10,10", + "endOffsets": "144,238,331,425,519,613,707,801,895,989,1083,1176,1269,1371,1473,1574,1676,1778,1880,1982,2084,2186,2288,2390,2491,2592,2685,2778,2870,2963,3056,3149,3242,3335,3428,3521,3614,3706,3798,3893,3988,4082,4177,4272,4367,4462,4557,4652,4747,4842,4936,5030,5124,5218,5311,5405,5499,5593,5687,5781,5875,5969,6063,6156,6249,6359,6470,6578,6686,6792,6895,7008,7115,7232,7335,7454,7559,7674,7782,7898,7998,8108,8212,8326,8433,8548,8666,8789,8915,9037,9161,9272,9388,9490,9602,9714,9826,9935,10044,10151,10256,10370,10479,10597,10701,10821,10928,11044,11153,11270,11371,11482,11587,11702,11811,11927,12046,12170,12297,12420,12547,12660,12777,12880,12993,13097,13209,13317,13433,13539,13653,13754,13859,13964,14073,14176,14283,14374,14485,14582,14699,14792,14905,15004,15123,15214,15307,15402,15495,15588,15681,15774,15867,15960,16053,16146,16239,16332,16439,16548,16659,16768,16877,16986,17095,17204,17313,17422,17531,17640,17749,17840,17933,18028,18121,18214,18307,18400,18493,18586,18679,18772,18865,18958,19053,19150,19249,19346,19443,19540,19637,19734,19831,19928,20025,20122,20219,20312,20407,20504,20599,20694,20789,20884,20979,21074,21169,21264,21359,21454,27066,32708,38440,44202" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v34.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v34.json new file mode 100644 index 0000000..866bd3d --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-v34.json @@ -0,0 +1,19 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-v34/values-v34.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-v34/values-v34.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,156,247,358,468,572,676,783,880,997,1098,1219,1324,1449,1550,1667,1770,1893,1988,2099,2194,2309,2408,2527,2622,2731,2846,2971,3102,3225,3354,3457,3568,3665,3782,3885,3978,4091,4201,4305,4409,4518,4617,4736,4839,4962,5069,5196,5299,5418,5523,5648,5745,5858,5955,6072,6173,6294,6391,6502,6619,6746,6879,7004,7135,7240,7353,7452,7571,7674,7793,7900,8023,8128,8249,8346,8451,8552,8661,8760,8867,8966,9085,9190,9315,9416,9537,9644", + "endColumns": "100,90,110,109,103,103,106,96,116,100,120,104,124,100,116,102,122,94,110,94,114,98,118,94,108,114,124,130,122,128,102,110,96,116,102,92,112,109,103,103,108,98,118,102,122,106,126,102,118,104,124,96,112,96,116,100,120,96,110,116,126,132,124,130,104,112,98,118,102,118,106,122,104,120,96,104,100,108,98,106,98,118,104,124,100,120,106,126", + "endOffsets": "151,242,353,463,567,671,778,875,992,1093,1214,1319,1444,1545,1662,1765,1888,1983,2094,2189,2304,2403,2522,2617,2726,2841,2966,3097,3220,3349,3452,3563,3660,3777,3880,3973,4086,4196,4300,4404,4513,4612,4731,4834,4957,5064,5191,5294,5413,5518,5643,5740,5853,5950,6067,6168,6289,6386,6497,6614,6741,6874,6999,7130,7235,7348,7447,7566,7669,7788,7895,8018,8123,8244,8341,8446,8547,8656,8755,8862,8961,9080,9185,9310,9411,9532,9639,9766" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-vi.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-vi.json new file mode 100644 index 0000000..85c0306 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-vi.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-vi/values-vi.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-vi/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "123", + "endOffsets": "318" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5441", + "endColumns": "127", + "endOffsets": "5564" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-vi/values-vi.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,212,314,423,507,610,729,807,883,974,1067,1162,1256,1356,1449,1544,1638,1729,1820,1904,2008,2116,2217,2322,2437,2542,2699,2798", + "endColumns": "106,101,108,83,102,118,77,75,90,92,94,93,99,92,94,93,90,90,83,103,107,100,104,114,104,156,98,84", + "endOffsets": "207,309,418,502,605,724,802,878,969,1062,1157,1251,1351,1444,1539,1633,1724,1815,1899,2003,2111,2212,2317,2432,2537,2694,2793,2878" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "315,422,524,633,717,820,939,1017,1093,1184,1277,1372,1466,1566,1659,1754,1848,1939,2030,2114,2218,2326,2427,2532,2647,2752,2909,11649", + "endColumns": "106,101,108,83,102,118,77,75,90,92,94,93,99,92,94,93,90,90,83,103,107,100,104,114,104,156,98,84", + "endOffsets": "417,519,628,712,815,934,1012,1088,1179,1272,1367,1461,1561,1654,1749,1843,1934,2025,2109,2213,2321,2422,2527,2642,2747,2904,3003,11729" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-vi/values-vi.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,152,254,353,453,556,669,785", + "endColumns": "96,101,98,99,102,112,115,100", + "endOffsets": "147,249,348,448,551,664,780,881" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3402,3499,3601,3700,3800,3903,4016,11969", + "endColumns": "96,101,98,99,102,112,115,100", + "endOffsets": "3494,3596,3695,3795,3898,4011,4127,12065" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-vi/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,291,449,570,675,836,962,1077,1177,1346,1449,1602,1728,1883,2028,2092,2152", + "endColumns": "97,157,120,104,160,125,114,99,168,102,152,125,154,144,63,59,78", + "endOffsets": "290,448,569,674,835,961,1076,1176,1345,1448,1601,1727,1882,2027,2091,2151,2230" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4425,4527,4689,4814,4923,5088,5218,5337,5569,5742,5849,6006,6136,6295,6444,6512,6576", + "endColumns": "101,161,124,108,164,129,118,103,172,106,156,129,158,148,67,63,82", + "endOffsets": "4522,4684,4809,4918,5083,5213,5332,5436,5737,5844,6001,6131,6290,6439,6507,6571,6654" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-vi/values-vi.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,265,344,421,499,579,659,758,872,952,1015,1078,1172,1246,1305,1391,1453,1514,1572,1636,1697,1751,1868,1925,1985,2039,2114,2241,2325,2405,2500,2584,2662,2792,2876,2954,3088,3179,3260,3311,3362,3428,3496,3572,3643,3723,3802,3877,3950,4026,4132,4221,4298,4389,4483,4557,4627,4720,4769,4850,4916,5001,5087,5149,5213,5276,5347,5446,5551,5649,5754,5809,5864,5942,6024,6103", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,78,76,77,79,79,98,113,79,62,62,93,73,58,85,61,60,57,63,60,53,116,56,59,53,74,126,83,79,94,83,77,129,83,77,133,90,80,50,50,65,67,75,70,79,78,74,72,75,105,88,76,90,93,73,69,92,48,80,65,84,85,61,63,62,70,98,104,97,104,54,54,77,81,78,73", + "endOffsets": "260,339,416,494,574,654,753,867,947,1010,1073,1167,1241,1300,1386,1448,1509,1567,1631,1692,1746,1863,1920,1980,2034,2109,2236,2320,2400,2495,2579,2657,2787,2871,2949,3083,3174,3255,3306,3357,3423,3491,3567,3638,3718,3797,3872,3945,4021,4127,4216,4293,4384,4478,4552,4622,4715,4764,4845,4911,4996,5082,5144,5208,5271,5342,5441,5546,5644,5749,5804,5859,5937,6019,6098,6172" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3008,3087,3164,3242,3322,4132,4231,4345,6659,6722,6785,6879,6953,7012,7098,7160,7221,7279,7343,7404,7458,7575,7632,7692,7746,7821,7948,8032,8112,8207,8291,8369,8499,8583,8661,8795,8886,8967,9018,9069,9135,9203,9279,9350,9430,9509,9584,9657,9733,9839,9928,10005,10096,10190,10264,10334,10427,10476,10557,10623,10708,10794,10856,10920,10983,11054,11153,11258,11356,11461,11516,11571,11734,11816,11895", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,78,76,77,79,79,98,113,79,62,62,93,73,58,85,61,60,57,63,60,53,116,56,59,53,74,126,83,79,94,83,77,129,83,77,133,90,80,50,50,65,67,75,70,79,78,74,72,75,105,88,76,90,93,73,69,92,48,80,65,84,85,61,63,62,70,98,104,97,104,54,54,77,81,78,73", + "endOffsets": "310,3082,3159,3237,3317,3397,4226,4340,4420,6717,6780,6874,6948,7007,7093,7155,7216,7274,7338,7399,7453,7570,7627,7687,7741,7816,7943,8027,8107,8202,8286,8364,8494,8578,8656,8790,8881,8962,9013,9064,9130,9198,9274,9345,9425,9504,9579,9652,9728,9834,9923,10000,10091,10185,10259,10329,10422,10471,10552,10618,10703,10789,10851,10915,10978,11049,11148,11253,11351,11456,11511,11566,11644,11811,11890,11964" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-w320dp-land-v13.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-w320dp-land-v13.json new file mode 100644 index 0000000..50eb111 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-w320dp-land-v13.json @@ -0,0 +1,19 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-w320dp-land-v13/values-w320dp-land-v13.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-w320dp-land-v13/values-w320dp-land-v13.xml", + "from": { + "startLines": "2,3", + "startColumns": "4,4", + "startOffsets": "55,110", + "endColumns": "54,61", + "endOffsets": "105,167" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-w360dp-port-v13.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-w360dp-port-v13.json new file mode 100644 index 0000000..3c56aa0 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-w360dp-port-v13.json @@ -0,0 +1,19 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-w360dp-port-v13/values-w360dp-port-v13.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-w360dp-port-v13/values-w360dp-port-v13.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,114,170,226,293,358,413,478", + "endColumns": "58,55,55,66,64,54,64,68", + "endOffsets": "109,165,221,288,353,408,473,542" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-w400dp-port-v13.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-w400dp-port-v13.json new file mode 100644 index 0000000..2b445e2 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-w400dp-port-v13.json @@ -0,0 +1,19 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-w400dp-port-v13/values-w400dp-port-v13.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-w400dp-port-v13/values-w400dp-port-v13.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,114,170,226,293,358,413,478", + "endColumns": "58,55,55,66,64,54,64,68", + "endOffsets": "109,165,221,288,353,408,473,542" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-w600dp-land-v13.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-w600dp-land-v13.json new file mode 100644 index 0000000..3138cc1 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-w600dp-land-v13.json @@ -0,0 +1,19 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-w600dp-land-v13/values-w600dp-land-v13.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-w600dp-land-v13/values-w600dp-land-v13.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "54", + "endOffsets": "105" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-watch-v20.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-watch-v20.json new file mode 100644 index 0000000..dbe4e47 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-watch-v20.json @@ -0,0 +1,20 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-watch-v20/values-watch-v20.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-watch-v20/values-watch-v20.xml", + "from": { + "startLines": "2,5,8", + "startColumns": "4,4,4", + "startOffsets": "55,214,385", + "endLines": "4,7,10", + "endColumns": "12,12,12", + "endOffsets": "209,380,553" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-watch-v21.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-watch-v21.json new file mode 100644 index 0000000..2988d6c --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-watch-v21.json @@ -0,0 +1,20 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-watch-v21/values-watch-v21.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-watch-v21/values-watch-v21.xml", + "from": { + "startLines": "2,6,10", + "startColumns": "4,4,4", + "startOffsets": "55,271,499", + "endLines": "5,9,13", + "endColumns": "12,12,12", + "endOffsets": "266,494,724" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-xlarge-v4.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-xlarge-v4.json new file mode 100644 index 0000000..f64a969 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-xlarge-v4.json @@ -0,0 +1,19 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-xlarge-v4/values-xlarge-v4.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-xlarge-v4/values-xlarge-v4.xml", + "from": { + "startLines": "2,3,4,5,6,7", + "startColumns": "4,4,4,4,4,4", + "startOffsets": "55,126,197,267,337,405", + "endColumns": "70,70,69,69,67,67", + "endOffsets": "121,192,262,332,400,468" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-zh-rCN.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-zh-rCN.json new file mode 100644 index 0000000..f627f70 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-zh-rCN.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-zh-rCN/values-zh-rCN.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-zh-rCN/values-zh-rCN.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,200,295,395,477,574,680,757,832,923,1016,1113,1209,1303,1396,1491,1583,1674,1765,1843,1939,2034,2129,2226,2322,2420,2568,2662", + "endColumns": "94,94,99,81,96,105,76,74,90,92,96,95,93,92,94,91,90,90,77,95,94,94,96,95,97,147,93,78", + "endOffsets": "195,290,390,472,569,675,752,827,918,1011,1108,1204,1298,1391,1486,1578,1669,1760,1838,1934,2029,2124,2221,2317,2415,2563,2657,2736" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "297,392,487,587,669,766,872,949,1024,1115,1208,1305,1401,1495,1588,1683,1775,1866,1957,2035,2131,2226,2321,2418,2514,2612,2760,10356", + "endColumns": "94,94,99,81,96,105,76,74,90,92,96,95,93,92,94,91,90,90,77,95,94,94,96,95,97,147,93,78", + "endOffsets": "387,482,582,664,761,867,944,1019,1110,1203,1300,1396,1490,1583,1678,1770,1861,1952,2030,2126,2221,2316,2413,2509,2607,2755,2849,10430" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-zh-rCN/values-zh-rCN.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,247,311,373,443,513,590,681,787,860,911,973,1050,1109,1168,1246,1307,1364,1420,1479,1537,1591,1676,1732,1790,1844,1909,2001,2075,2147,2226,2300,2376,2498,2560,2622,2721,2800,2874,2924,2975,3041,3105,3174,3245,3316,3377,3448,3515,3575,3661,3740,3807,3890,3975,4049,4114,4190,4238,4311,4375,4451,4529,4591,4655,4718,4783,4863,4939,5017,5093,5147,5202,5271,5346,5419", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,63,61,69,69,76,90,105,72,50,61,76,58,58,77,60,56,55,58,57,53,84,55,57,53,64,91,73,71,78,73,75,121,61,61,98,78,73,49,50,65,63,68,70,70,60,70,66,59,85,78,66,82,84,73,64,75,47,72,63,75,77,61,63,62,64,79,75,77,75,53,54,68,74,72,69", + "endOffsets": "242,306,368,438,508,585,676,782,855,906,968,1045,1104,1163,1241,1302,1359,1415,1474,1532,1586,1671,1727,1785,1839,1904,1996,2070,2142,2221,2295,2371,2493,2555,2617,2716,2795,2869,2919,2970,3036,3100,3169,3240,3311,3372,3443,3510,3570,3656,3735,3802,3885,3970,4044,4109,4185,4233,4306,4370,4446,4524,4586,4650,4713,4778,4858,4934,5012,5088,5142,5197,5266,5341,5414,5484" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2854,2918,2980,3050,3120,3861,3952,4058,5945,5996,6058,6135,6194,6253,6331,6392,6449,6505,6564,6622,6676,6761,6817,6875,6929,6994,7086,7160,7232,7311,7385,7461,7583,7645,7707,7806,7885,7959,8009,8060,8126,8190,8259,8330,8401,8462,8533,8600,8660,8746,8825,8892,8975,9060,9134,9199,9275,9323,9396,9460,9536,9614,9676,9740,9803,9868,9948,10024,10102,10178,10232,10287,10435,10510,10583", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,63,61,69,69,76,90,105,72,50,61,76,58,58,77,60,56,55,58,57,53,84,55,57,53,64,91,73,71,78,73,75,121,61,61,98,78,73,49,50,65,63,68,70,70,60,70,66,59,85,78,66,82,84,73,64,75,47,72,63,75,77,61,63,62,64,79,75,77,75,53,54,68,74,72,69", + "endOffsets": "292,2913,2975,3045,3115,3192,3947,4053,4126,5991,6053,6130,6189,6248,6326,6387,6444,6500,6559,6617,6671,6756,6812,6870,6924,6989,7081,7155,7227,7306,7380,7456,7578,7640,7702,7801,7880,7954,8004,8055,8121,8185,8254,8325,8396,8457,8528,8595,8655,8741,8820,8887,8970,9055,9129,9194,9270,9318,9391,9455,9531,9609,9671,9735,9798,9863,9943,10019,10097,10173,10227,10282,10351,10505,10578,10648" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-zh-rCN/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "199", + "endColumns": "94", + "endOffsets": "293" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "4993", + "endColumns": "98", + "endOffsets": "5087" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-zh-rCN/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "197,294,419,530,628,729,841,939,1027,1131,1228,1354,1465,1565,1669,1721,1774", + "endColumns": "96,124,110,97,100,111,97,87,103,96,125,110,99,103,51,52,69", + "endOffsets": "293,418,529,627,728,840,938,1026,1130,1227,1353,1464,1564,1668,1720,1773,1843" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4131,4232,4361,4476,4578,4683,4799,4901,5092,5200,5301,5431,5546,5650,5758,5814,5871", + "endColumns": "100,128,114,101,104,115,101,91,107,100,129,114,103,107,55,56,73", + "endOffsets": "4227,4356,4471,4573,4678,4794,4896,4988,5195,5296,5426,5541,5645,5753,5809,5866,5940" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-zh-rCN/values-zh-rCN.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,147,248,342,436,529,623,719", + "endColumns": "91,100,93,93,92,93,95,100", + "endOffsets": "142,243,337,431,524,618,714,815" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3197,3289,3390,3484,3578,3671,3765,10653", + "endColumns": "91,100,93,93,92,93,95,100", + "endOffsets": "3284,3385,3479,3573,3666,3760,3856,10749" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-zh-rHK.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-zh-rHK.json new file mode 100644 index 0000000..b641ac6 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-zh-rHK.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-zh-rHK/values-zh-rHK.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-zh-rHK/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "199", + "endColumns": "103", + "endOffsets": "302" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "4990", + "endColumns": "107", + "endOffsets": "5093" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-zh-rHK/values-zh-rHK.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,147,246,340,434,527,620,716", + "endColumns": "91,98,93,93,92,92,95,100", + "endOffsets": "142,241,335,429,522,615,711,812" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3195,3287,3386,3480,3574,3667,3760,10671", + "endColumns": "91,98,93,93,92,92,95,100", + "endOffsets": "3282,3381,3475,3569,3662,3755,3851,10767" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-zh-rHK/values-zh-rHK.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,200,293,393,475,572,680,757,832,924,1018,1109,1205,1300,1394,1490,1582,1674,1766,1844,1940,2035,2130,2227,2323,2421,2572,2666", + "endColumns": "94,92,99,81,96,107,76,74,91,93,90,95,94,93,95,91,91,91,77,95,94,94,96,95,97,150,93,78", + "endOffsets": "195,288,388,470,567,675,752,827,919,1013,1104,1200,1295,1389,1485,1577,1669,1761,1839,1935,2030,2125,2222,2318,2416,2567,2661,2740" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "297,392,485,585,667,764,872,949,1024,1116,1210,1301,1397,1492,1586,1682,1774,1866,1958,2036,2132,2227,2322,2419,2515,2613,2764,10374", + "endColumns": "94,92,99,81,96,107,76,74,91,93,90,95,94,93,95,91,91,91,77,95,94,94,96,95,97,150,93,78", + "endOffsets": "387,480,580,662,759,867,944,1019,1111,1205,1296,1392,1487,1581,1677,1769,1861,1953,2031,2127,2222,2317,2414,2510,2608,2759,2853,10448" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-zh-rHK/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "197,294,418,529,627,730,842,940,1029,1135,1232,1357,1468,1571,1675,1726,1779", + "endColumns": "96,123,110,97,102,111,97,88,105,96,124,110,102,103,50,52,67", + "endOffsets": "293,417,528,626,729,841,939,1028,1134,1231,1356,1467,1570,1674,1725,1778,1846" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4126,4227,4355,4470,4572,4679,4795,4897,5098,5208,5309,5438,5553,5660,5768,5823,5880", + "endColumns": "100,127,114,101,106,115,101,92,109,100,128,114,106,107,54,56,71", + "endOffsets": "4222,4350,4465,4567,4674,4790,4892,4985,5203,5304,5433,5548,5655,5763,5818,5875,5947" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-zh-rHK/values-zh-rHK.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,247,310,371,438,507,584,674,781,854,905,967,1045,1104,1162,1240,1301,1358,1414,1473,1531,1585,1671,1727,1785,1839,1904,1997,2071,2143,2223,2297,2375,2495,2558,2621,2720,2797,2871,2921,2972,3038,3102,3170,3241,3313,3374,3445,3512,3572,3660,3740,3803,3886,3971,4045,4110,4186,4234,4308,4372,4448,4526,4588,4652,4715,4781,4861,4941,5017,5098,5152,5207,5276,5351,5424", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,62,60,66,68,76,89,106,72,50,61,77,58,57,77,60,56,55,58,57,53,85,55,57,53,64,92,73,71,79,73,77,119,62,62,98,76,73,49,50,65,63,67,70,71,60,70,66,59,87,79,62,82,84,73,64,75,47,73,63,75,77,61,63,62,65,79,79,75,80,53,54,68,74,72,69", + "endOffsets": "242,305,366,433,502,579,669,776,849,900,962,1040,1099,1157,1235,1296,1353,1409,1468,1526,1580,1666,1722,1780,1834,1899,1992,2066,2138,2218,2292,2370,2490,2553,2616,2715,2792,2866,2916,2967,3033,3097,3165,3236,3308,3369,3440,3507,3567,3655,3735,3798,3881,3966,4040,4105,4181,4229,4303,4367,4443,4521,4583,4647,4710,4776,4856,4936,5012,5093,5147,5202,5271,5346,5419,5489" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2858,2921,2982,3049,3118,3856,3946,4053,5952,6003,6065,6143,6202,6260,6338,6399,6456,6512,6571,6629,6683,6769,6825,6883,6937,7002,7095,7169,7241,7321,7395,7473,7593,7656,7719,7818,7895,7969,8019,8070,8136,8200,8268,8339,8411,8472,8543,8610,8670,8758,8838,8901,8984,9069,9143,9208,9284,9332,9406,9470,9546,9624,9686,9750,9813,9879,9959,10039,10115,10196,10250,10305,10453,10528,10601", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,62,60,66,68,76,89,106,72,50,61,77,58,57,77,60,56,55,58,57,53,85,55,57,53,64,92,73,71,79,73,77,119,62,62,98,76,73,49,50,65,63,67,70,71,60,70,66,59,87,79,62,82,84,73,64,75,47,73,63,75,77,61,63,62,65,79,79,75,80,53,54,68,74,72,69", + "endOffsets": "292,2916,2977,3044,3113,3190,3941,4048,4121,5998,6060,6138,6197,6255,6333,6394,6451,6507,6566,6624,6678,6764,6820,6878,6932,6997,7090,7164,7236,7316,7390,7468,7588,7651,7714,7813,7890,7964,8014,8065,8131,8195,8263,8334,8406,8467,8538,8605,8665,8753,8833,8896,8979,9064,9138,9203,9279,9327,9401,9465,9541,9619,9681,9745,9808,9874,9954,10034,10110,10191,10245,10300,10369,10523,10596,10666" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-zh-rTW.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-zh-rTW.json new file mode 100644 index 0000000..b63415d --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-zh-rTW.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-zh-rTW/values-zh-rTW.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-zh-rTW/values-zh-rTW.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,247,311,373,440,510,587,681,788,861,912,974,1052,1112,1172,1250,1311,1369,1425,1485,1543,1597,1682,1738,1796,1850,1915,2007,2081,2153,2235,2309,2386,2506,2569,2632,2731,2808,2882,2932,2983,3049,3112,3180,3251,3322,3383,3454,3521,3583,3670,3749,3814,3897,3982,4056,4120,4196,4244,4317,4381,4457,4535,4597,4661,4724,4790,4870,4948,5024,5103,5157,5212,5281,5356,5429", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,63,61,66,69,76,93,106,72,50,61,77,59,59,77,60,57,55,59,57,53,84,55,57,53,64,91,73,71,81,73,76,119,62,62,98,76,73,49,50,65,62,67,70,70,60,70,66,61,86,78,64,82,84,73,63,75,47,72,63,75,77,61,63,62,65,79,77,75,78,53,54,68,74,72,69", + "endOffsets": "242,306,368,435,505,582,676,783,856,907,969,1047,1107,1167,1245,1306,1364,1420,1480,1538,1592,1677,1733,1791,1845,1910,2002,2076,2148,2230,2304,2381,2501,2564,2627,2726,2803,2877,2927,2978,3044,3107,3175,3246,3317,3378,3449,3516,3578,3665,3744,3809,3892,3977,4051,4115,4191,4239,4312,4376,4452,4530,4592,4656,4719,4785,4865,4943,5019,5098,5152,5207,5276,5351,5424,5494" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,2863,2927,2989,3056,3126,3864,3958,4065,5957,6008,6070,6148,6208,6268,6346,6407,6465,6521,6581,6639,6693,6778,6834,6892,6946,7011,7103,7177,7249,7331,7405,7482,7602,7665,7728,7827,7904,7978,8028,8079,8145,8208,8276,8347,8418,8479,8550,8617,8679,8766,8845,8910,8993,9078,9152,9216,9292,9340,9413,9477,9553,9631,9693,9757,9820,9886,9966,10044,10120,10199,10253,10308,10456,10531,10604", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,63,61,66,69,76,93,106,72,50,61,77,59,59,77,60,57,55,59,57,53,84,55,57,53,64,91,73,71,81,73,76,119,62,62,98,76,73,49,50,65,62,67,70,70,60,70,66,61,86,78,64,82,84,73,63,75,47,72,63,75,77,61,63,62,65,79,77,75,78,53,54,68,74,72,69", + "endOffsets": "292,2922,2984,3051,3121,3198,3953,4060,4133,6003,6065,6143,6203,6263,6341,6402,6460,6516,6576,6634,6688,6773,6829,6887,6941,7006,7098,7172,7244,7326,7400,7477,7597,7660,7723,7822,7899,7973,8023,8074,8140,8203,8271,8342,8413,8474,8545,8612,8674,8761,8840,8905,8988,9073,9147,9211,9287,9335,9408,9472,9548,9626,9688,9752,9815,9881,9961,10039,10115,10194,10248,10303,10372,10526,10599,10669" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-zh-rTW/values-zh-rTW.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,200,293,393,475,572,680,757,832,924,1018,1115,1211,1306,1400,1496,1588,1680,1772,1850,1946,2041,2136,2233,2329,2427,2577,2671", + "endColumns": "94,92,99,81,96,107,76,74,91,93,96,95,94,93,95,91,91,91,77,95,94,94,96,95,97,149,93,78", + "endOffsets": "195,288,388,470,567,675,752,827,919,1013,1110,1206,1301,1395,1491,1583,1675,1767,1845,1941,2036,2131,2228,2324,2422,2572,2666,2745" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "297,392,485,585,667,764,872,949,1024,1116,1210,1307,1403,1498,1592,1688,1780,1872,1964,2042,2138,2233,2328,2425,2521,2619,2769,10377", + "endColumns": "94,92,99,81,96,107,76,74,91,93,96,95,94,93,95,91,91,91,77,95,94,94,96,95,97,149,93,78", + "endOffsets": "387,480,580,662,759,867,944,1019,1111,1205,1302,1398,1493,1587,1683,1775,1867,1959,2037,2133,2228,2323,2420,2516,2614,2764,2858,10451" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-zh-rTW/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "199", + "endColumns": "98", + "endOffsets": "297" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5002", + "endColumns": "102", + "endOffsets": "5100" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-zh-rTW/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "197,294,418,529,627,730,842,938,1029,1135,1232,1357,1468,1566,1670,1722,1775", + "endColumns": "96,123,110,97,102,111,95,90,105,96,124,110,97,103,51,52,69", + "endOffsets": "293,417,528,626,729,841,937,1028,1134,1231,1356,1467,1565,1669,1721,1774,1844" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4138,4239,4367,4482,4584,4691,4807,4907,5105,5215,5316,5445,5560,5662,5770,5826,5883", + "endColumns": "100,127,114,101,106,115,99,94,109,100,128,114,101,107,55,56,73", + "endOffsets": "4234,4362,4477,4579,4686,4802,4902,4997,5210,5311,5440,5555,5657,5765,5821,5878,5952" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-zh-rTW/values-zh-rTW.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,147,246,340,434,527,620,716", + "endColumns": "91,98,93,93,92,92,95,100", + "endOffsets": "142,241,335,429,522,615,711,812" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3203,3295,3394,3488,3582,3675,3768,10674", + "endColumns": "91,98,93,93,92,92,95,100", + "endOffsets": "3290,3389,3483,3577,3670,3763,3859,10770" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-zu.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-zu.json new file mode 100644 index 0000000..d4ddcbd --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values-zu.json @@ -0,0 +1,96 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values-zu/values-zu.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values-zu/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "193,300,472,603,703,867,992,1112,1218,1374,1480,1641,1768,1922,2075,2132,2197", + "endColumns": "106,171,130,99,163,124,119,105,155,105,160,126,153,152,56,64,80", + "endOffsets": "299,471,602,702,866,991,1111,1217,1373,1479,1640,1767,1921,2074,2131,2196,2277" + }, + "to": { + "startLines": "48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,64,65", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "4470,4581,4757,4892,4996,5164,5293,5417,5659,5819,5929,6094,6225,6383,6540,6601,6670", + "endColumns": "110,175,134,103,167,128,123,109,159,109,164,130,157,156,60,68,84", + "endOffsets": "4576,4752,4887,4991,5159,5288,5412,5522,5814,5924,6089,6220,6378,6535,6596,6665,6750" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values-zu/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "195", + "endColumns": "127", + "endOffsets": "322" + }, + "to": { + "startLines": "56", + "startColumns": "4", + "startOffsets": "5527", + "endColumns": "131", + "endOffsets": "5654" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values-zu/values-zu.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,213,320,432,520,623,738,817,894,985,1078,1173,1267,1367,1460,1555,1649,1740,1833,1914,2018,2121,2219,2326,2433,2538,2695,2791", + "endColumns": "107,106,111,87,102,114,78,76,90,92,94,93,99,92,94,93,90,92,80,103,102,97,106,106,104,156,95,81", + "endOffsets": "208,315,427,515,618,733,812,889,980,1073,1168,1262,1362,1455,1550,1644,1735,1828,1909,2013,2116,2214,2321,2428,2533,2690,2786,2868" + }, + "to": { + "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,130", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "321,429,536,648,736,839,954,1033,1110,1201,1294,1389,1483,1583,1676,1771,1865,1956,2049,2130,2234,2337,2435,2542,2649,2754,2911,11957", + "endColumns": "107,106,111,87,102,114,78,76,90,92,94,93,99,92,94,93,90,92,80,103,102,97,106,106,104,156,95,81", + "endOffsets": "424,531,643,731,834,949,1028,1105,1196,1289,1384,1478,1578,1671,1766,1860,1951,2044,2125,2229,2332,2430,2537,2644,2749,2906,3002,12034" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values-zu/values-zu.xml", + "from": { + "startLines": "2,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "100,271,349,426,503,597,685,797,923,1004,1075,1142,1245,1320,1383,1475,1546,1611,1678,1750,1822,1876,1997,2056,2120,2174,2251,2383,2468,2545,2635,2715,2796,2945,3032,3115,3257,3349,3427,3483,3541,3607,3679,3756,3827,3910,3990,4069,4144,4223,4327,4417,4490,4584,4681,4755,4828,4927,4982,5066,5134,5222,5311,5373,5437,5500,5571,5680,5791,5894,6002,6062,6124,6206,6289,6365", + "endLines": "5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80", + "endColumns": "12,77,76,76,93,87,111,125,80,70,66,102,74,62,91,70,64,66,71,71,53,120,58,63,53,76,131,84,76,89,79,80,148,86,82,141,91,77,55,57,65,71,76,70,82,79,78,74,78,103,89,72,93,96,73,72,98,54,83,67,87,88,61,63,62,70,108,110,102,107,59,61,81,82,75,82", + "endOffsets": "266,344,421,498,592,680,792,918,999,1070,1137,1240,1315,1378,1470,1541,1606,1673,1745,1817,1871,1992,2051,2115,2169,2246,2378,2463,2540,2630,2710,2791,2940,3027,3110,3252,3344,3422,3478,3536,3602,3674,3751,3822,3905,3985,4064,4139,4218,4322,4412,4485,4579,4676,4750,4823,4922,4977,5061,5129,5217,5306,5368,5432,5495,5566,5675,5786,5889,5997,6057,6119,6201,6284,6360,6443" + }, + "to": { + "startLines": "2,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,3007,3085,3162,3239,3333,4151,4263,4389,6755,6826,6893,6996,7071,7134,7226,7297,7362,7429,7501,7573,7627,7748,7807,7871,7925,8002,8134,8219,8296,8386,8466,8547,8696,8783,8866,9008,9100,9178,9234,9292,9358,9430,9507,9578,9661,9741,9820,9895,9974,10078,10168,10241,10335,10432,10506,10579,10678,10733,10817,10885,10973,11062,11124,11188,11251,11322,11431,11542,11645,11753,11813,11875,12039,12122,12198", + "endLines": "5,33,34,35,36,37,45,46,47,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133", + "endColumns": "12,77,76,76,93,87,111,125,80,70,66,102,74,62,91,70,64,66,71,71,53,120,58,63,53,76,131,84,76,89,79,80,148,86,82,141,91,77,55,57,65,71,76,70,82,79,78,74,78,103,89,72,93,96,73,72,98,54,83,67,87,88,61,63,62,70,108,110,102,107,59,61,81,82,75,82", + "endOffsets": "316,3080,3157,3234,3328,3416,4258,4384,4465,6821,6888,6991,7066,7129,7221,7292,7357,7424,7496,7568,7622,7743,7802,7866,7920,7997,8129,8214,8291,8381,8461,8542,8691,8778,8861,9003,9095,9173,9229,9287,9353,9425,9502,9573,9656,9736,9815,9890,9969,10073,10163,10236,10330,10427,10501,10574,10673,10728,10812,10880,10968,11057,11119,11183,11246,11317,11426,11537,11640,11748,11808,11870,11952,12117,12193,12276" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values-zu/values-zu.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "55,153,257,356,459,565,672,785", + "endColumns": "97,103,98,102,105,106,112,100", + "endOffsets": "148,252,351,454,560,667,780,881" + }, + "to": { + "startLines": "38,39,40,41,42,43,44,134", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "3421,3519,3623,3722,3825,3931,4038,12281", + "endColumns": "97,103,98,102,105,106,112,100", + "endOffsets": "3514,3618,3717,3820,3926,4033,4146,12377" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values.json new file mode 100644 index 0000000..7fb0ed3 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/multi-v2/values.json @@ -0,0 +1,854 @@ +{ + "logs": [ + { + "outputFile": "com.foxx.androidcast.app-mergeDebugResources-36:/values/values.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/6562528685bcf4f32771c81c31bdb251/transformed/recyclerview-1.3.2/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "508,1125,1126,1127,1135,1136,1137,1830", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "25699,67518,67577,67625,68292,68367,68443,122060", + "endColumns": "55,58,47,55,74,75,71,65", + "endOffsets": "25750,67572,67620,67676,68362,68438,68510,122121" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/cc91afd01cb4f955b418c94caa09925e/transformed/lifecycle-runtime-2.6.2/res/values/values.xml", + "from": { + "startLines": "-1", + "startColumns": "-1", + "startOffsets": "-1" + }, + "to": { + "startLines": "1899", + "startColumns": "4", + "startOffsets": "125643", + "endColumns": "42", + "endOffsets": "125681" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/451be4cb7f62a323593f851d2cb28156/transformed/fragment-1.5.4/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1", + "startColumns": "-1,-1,-1", + "startOffsets": "-1,-1,-1" + }, + "to": { + "startLines": "1825,1860,1903", + "startColumns": "4,4,4", + "startOffsets": "121828,123636,125850", + "endColumns": "56,64,63", + "endOffsets": "121880,123696,125909" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "137,227,230,574,627,628,630,631,632,633,634,635,636,639,640,641,642,643,644,645,646,647,648,649,650,702,703,704,705,706,707,708,709,710,711,886,887,888,889,890,891,892,893,894,895,896,897,954,955,956,957,958,959,960,961,962,963,964,965,966,967,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1123,1124,1128,1129,1130,1131,1132,1133,1134,1776,1777,1778,1779,1780,1781,1782,1783,1821,1822,1823,1824,1828,1851,1852,1861,1896,1904,1905,1908,1909,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2488,2548,2549,2550,2551,2552,2582,2590,2591,2595,2599,2610,2615,2644,2651,2655,2659,2664,2668,2672,2676,2680,2684,2688,2694,2698,2704,2708,2714,2718,2723,2727,2730,2734,2740,2744,2750,2754,2760,2763,2767,2771,2775,2779,2783,2784,2785,2786,2789,2792,2795,2798,2802,2803,2804,2805,2846,2849,2851,2853,2855,2860,2861,2865,2871,2875,2876,2878,2890,2891,2895,2901,2905,2982,2983,2987,3014,3018,3019,3023,4825,4997,5023,5194,5220,5251,5259,5265,5281,5303,5308,5313,5323,5332,5341,5345,5352,5371,5378,5379,5388,5391,5394,5398,5402,5406,5409,5410,5415,5420,5430,5435,5442,5448,5449,5452,5456,5461,5463,5465,5468,5471,5473,5477,5480,5487,5490,5493,5497,5499,5503,5505,5507,5509,5513,5521,5529,5541,5547,5556,5559,5570,5573,5574,5579,5580,6060,6129,6203,6204,6214,6223,6224,6226,6230,6233,6236,6239,6242,6245,6248,6251,6255,6258,6261,6264,6268,6271,6275,6423,6424,6425,6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443,6445,6447,6448,6449,6450,6451,6452,6453,6454,6456,6457,6459,6460,6462,6464,6465,6467,6468,6469,6470,6471,6472,6474,6475,6476,6477,6478,6763,6765,6767,6803,6804,6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6815,6817,6818,6819,6820,6821,6822,6823,6825,6829,7008,7009,7010,7011,7012,7013,7017,7018,7019,7560,7562,7564,7566,7568,7570,7571,7572,7573,7575,7577,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7593,7594,7595,7596,7598,7600,7601,7603,7604,7606,7608,7610,7611,7612,7613,7614,7615,7616,7617,7618,7619,7620,7621,7623,7624,7625,7626,7628,7629,7630,7631,7632,7634,7636,7638,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "6941,11486,11639,29595,31778,31833,31957,32021,32091,32152,32227,32303,32380,32618,32703,32785,32861,32937,33014,33092,33198,33304,33383,33463,33520,37164,37238,37313,37378,37444,37504,37565,37637,37710,37777,51103,51162,51221,51280,51339,51398,51452,51506,51559,51613,51667,51721,56113,56187,56266,56339,56413,56484,56556,56628,56701,56758,56816,56889,56963,57037,57559,57631,57704,57774,57845,57905,57966,58035,58104,58174,58248,58324,58388,58465,58541,58618,58683,58752,58829,58904,58973,59041,59118,59184,59245,59342,59407,59476,59575,59646,59705,59763,59820,59879,59943,60014,60086,60158,60230,60302,60369,60437,60505,60564,60627,60691,60781,60872,60932,60998,61065,61131,61201,61265,61318,61385,61446,61513,61626,61684,61747,61812,61877,61952,62025,62097,62141,62188,62234,62283,62344,62405,62466,62528,62592,62656,62720,62785,62848,62908,62969,63035,63094,63154,63216,63287,63347,67345,67431,67681,67771,67858,67946,68028,68111,68201,118770,118822,118880,118925,118991,119055,119112,119169,121623,121680,121728,121777,121972,123221,123268,123701,125518,125914,125978,126168,126228,130945,131019,131089,131167,131221,131291,131376,131424,131470,131531,131594,131660,131724,131795,131858,131923,131987,132048,132109,132161,132234,132308,132377,132452,132526,132600,132741,181509,186327,186405,186495,186583,186679,188488,189070,189159,189406,189687,190353,190638,192447,192924,193146,193368,193644,193871,194101,194331,194561,194791,195018,195437,195663,196088,196318,196746,196965,197248,197456,197587,197814,198240,198465,198892,199113,199538,199658,199934,200235,200559,200850,201164,201301,201432,201537,201779,201946,202150,202358,202629,202741,202853,202958,205051,205265,205411,205551,205637,205985,206073,206319,206737,206986,207068,207166,207823,207923,208175,208599,208854,214744,214833,215070,217094,217336,217438,217691,353260,363941,365457,376152,377680,379437,380063,380483,381744,383009,383265,383501,384048,384542,385147,385345,385925,387293,387668,387786,388324,388481,388677,388950,389206,389376,389517,389581,389946,390313,390989,391253,391591,391944,392038,392224,392530,392792,392917,393044,393283,393494,393613,393806,393983,394438,394619,394741,395000,395113,395300,395402,395509,395638,395913,396421,396917,397794,398088,398658,398807,399539,399711,399795,400131,400223,430961,436192,441907,441969,442547,443131,443222,443335,443564,443724,443876,444047,444213,444382,444549,444712,444955,445125,445298,445469,445743,445942,446147,455513,455597,455693,455789,455887,455987,456089,456191,456293,456395,456497,456597,456693,456805,456934,457057,457188,457319,457417,457531,457625,457765,457899,457995,458107,458207,458323,458419,458531,458631,458771,458907,459071,459201,459359,459509,459650,459794,459929,460041,460191,460319,460447,460583,460715,460845,460975,461087,478745,478891,479035,481103,481169,481259,481335,481439,481529,481631,481739,481847,481947,482027,482119,482217,482327,482379,482457,482563,482655,482759,482869,482991,483154,496639,496719,496819,496909,497019,497109,497350,497444,497550,537429,537529,537641,537755,537871,537987,538081,538195,538307,538409,538529,538651,538733,538837,538957,539083,539181,539275,539363,539475,539591,539713,539825,540000,540116,540202,540294,540406,540530,540597,540723,540791,540919,541063,541191,541260,541355,541470,541583,541682,541791,541902,542013,542114,542219,542319,542449,542540,542663,542757,542869,542955,543059,543155,543243,543361,543465,543569,543695,543783,543891,543991,544081,544191,544275,544377,544461,544515,544579,544685,544771,544881,544965", + "endLines": "137,227,230,574,627,628,630,631,632,633,634,635,636,639,640,641,642,643,644,645,646,647,648,649,650,702,703,704,705,706,707,708,709,710,711,886,887,888,889,890,891,892,893,894,895,896,897,954,955,956,957,958,959,960,961,962,963,964,965,966,967,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1123,1124,1128,1129,1130,1131,1132,1133,1134,1776,1777,1778,1779,1780,1781,1782,1783,1821,1822,1823,1824,1828,1851,1852,1861,1896,1904,1905,1908,1909,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2488,2548,2549,2550,2551,2552,2589,2590,2594,2598,2602,2614,2620,2650,2654,2658,2663,2667,2671,2675,2679,2683,2687,2693,2697,2703,2707,2713,2717,2722,2726,2729,2733,2739,2743,2749,2753,2759,2762,2766,2770,2774,2778,2782,2783,2784,2785,2788,2791,2794,2797,2801,2802,2803,2804,2805,2848,2850,2852,2854,2859,2860,2864,2870,2874,2875,2877,2889,2890,2894,2900,2904,2905,2982,2986,3013,3017,3018,3022,3050,4996,5022,5193,5219,5250,5258,5264,5280,5302,5307,5312,5322,5331,5340,5344,5351,5370,5377,5378,5387,5390,5393,5397,5401,5405,5408,5409,5414,5419,5429,5434,5441,5447,5448,5451,5455,5460,5462,5464,5467,5470,5472,5476,5479,5486,5489,5492,5496,5498,5502,5504,5506,5508,5512,5520,5528,5540,5546,5555,5558,5569,5572,5573,5578,5579,5584,6128,6198,6203,6213,6222,6223,6225,6229,6232,6235,6238,6241,6244,6247,6250,6254,6257,6260,6263,6267,6270,6274,6278,6423,6424,6425,6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6444,6446,6447,6448,6449,6450,6451,6452,6453,6455,6456,6458,6459,6461,6463,6464,6466,6467,6468,6469,6470,6471,6473,6474,6475,6476,6477,6478,6764,6766,6768,6803,6804,6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6816,6817,6818,6819,6820,6821,6822,6824,6828,6832,7008,7009,7010,7011,7012,7016,7017,7018,7019,7561,7563,7565,7567,7569,7570,7571,7572,7574,7576,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7592,7593,7594,7595,7597,7599,7600,7602,7603,7605,7607,7609,7610,7611,7612,7613,7614,7615,7616,7617,7618,7619,7620,7622,7623,7624,7625,7627,7628,7629,7630,7631,7633,7635,7637,7639,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654", + "endColumns": "54,44,48,40,54,61,63,69,60,74,75,76,77,84,81,75,75,76,77,105,105,78,79,56,57,73,74,64,65,59,60,71,72,66,67,58,58,58,58,58,53,53,52,53,53,53,53,73,78,72,73,70,71,71,72,56,57,72,73,73,74,71,72,69,70,59,60,68,68,69,73,75,63,76,75,76,64,68,76,74,68,67,76,65,60,96,64,68,98,70,58,57,56,58,63,70,71,71,71,71,66,67,67,58,62,63,89,90,59,65,66,65,69,63,52,66,60,66,112,57,62,64,64,74,72,71,43,46,45,48,60,60,60,61,63,63,63,64,62,59,60,65,58,59,61,70,59,67,85,86,89,86,87,81,82,89,90,51,57,44,65,63,56,56,53,56,47,48,50,33,46,48,45,31,63,61,59,56,73,69,77,53,69,84,47,45,60,62,65,63,70,62,64,63,60,60,51,72,73,68,74,73,73,140,69,52,77,89,87,95,89,12,88,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,136,130,104,12,12,12,12,12,111,111,104,116,12,12,12,12,12,87,12,12,12,81,12,12,99,12,12,12,93,88,12,12,12,101,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,117,12,12,12,12,12,12,12,63,12,12,12,12,12,12,93,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,12,91,12,12,12,61,12,12,90,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,95,95,97,99,101,101,101,101,101,99,95,111,128,122,130,130,97,113,93,12,12,95,111,99,115,95,111,99,12,135,12,129,12,12,140,12,134,111,149,127,127,12,131,129,129,111,139,12,12,12,65,89,75,103,89,101,107,107,99,79,91,97,12,51,77,105,91,103,109,12,12,12,79,99,89,109,89,12,93,105,91,12,12,12,12,12,93,113,111,12,12,12,81,103,119,125,97,93,87,111,115,121,111,12,115,85,91,12,12,66,12,67,12,12,12,68,94,114,112,98,108,110,110,100,104,99,12,90,122,93,12,85,103,95,87,12,12,12,12,87,107,99,89,109,83,101,83,53,63,105,85,109,83,119", + "endOffsets": "6991,11526,11683,29631,31828,31890,32016,32086,32147,32222,32298,32375,32453,32698,32780,32856,32932,33009,33087,33193,33299,33378,33458,33515,33573,37233,37308,37373,37439,37499,37560,37632,37705,37772,37840,51157,51216,51275,51334,51393,51447,51501,51554,51608,51662,51716,51770,56182,56261,56334,56408,56479,56551,56623,56696,56753,56811,56884,56958,57032,57107,57626,57699,57769,57840,57900,57961,58030,58099,58169,58243,58319,58383,58460,58536,58613,58678,58747,58824,58899,58968,59036,59113,59179,59240,59337,59402,59471,59570,59641,59700,59758,59815,59874,59938,60009,60081,60153,60225,60297,60364,60432,60500,60559,60622,60686,60776,60867,60927,60993,61060,61126,61196,61260,61313,61380,61441,61508,61621,61679,61742,61807,61872,61947,62020,62092,62136,62183,62229,62278,62339,62400,62461,62523,62587,62651,62715,62780,62843,62903,62964,63030,63089,63149,63211,63282,63342,63410,67426,67513,67766,67853,67941,68023,68106,68196,68287,118817,118875,118920,118986,119050,119107,119164,119218,121675,121723,121772,121823,122001,123263,123312,123742,125545,125973,126035,126223,126280,131014,131084,131162,131216,131286,131371,131419,131465,131526,131589,131655,131719,131790,131853,131918,131982,132043,132104,132156,132229,132303,132372,132447,132521,132595,132736,132806,181557,186400,186490,186578,186674,186764,189065,189154,189401,189682,189934,190633,191026,192919,193141,193363,193639,193866,194096,194326,194556,194786,195013,195432,195658,196083,196313,196741,196960,197243,197451,197582,197809,198235,198460,198887,199108,199533,199653,199929,200230,200554,200845,201159,201296,201427,201532,201774,201941,202145,202353,202624,202736,202848,202953,203070,205260,205406,205546,205632,205980,206068,206314,206732,206981,207063,207161,207818,207918,208170,208594,208849,208943,214828,215065,217089,217331,217433,217686,219842,363936,365452,376147,377675,379432,380058,380478,381739,383004,383260,383496,384043,384537,385142,385340,385920,387288,387663,387781,388319,388476,388672,388945,389201,389371,389512,389576,389941,390308,390984,391248,391586,391939,392033,392219,392525,392787,392912,393039,393278,393489,393608,393801,393978,394433,394614,394736,394995,395108,395295,395397,395504,395633,395908,396416,396912,397789,398083,398653,398802,399534,399706,399790,400126,400218,400496,436187,441558,441964,442542,443126,443217,443330,443559,443719,443871,444042,444208,444377,444544,444707,444950,445120,445293,445464,445738,445937,446142,446472,455592,455688,455784,455882,455982,456084,456186,456288,456390,456492,456592,456688,456800,456929,457052,457183,457314,457412,457526,457620,457760,457894,457990,458102,458202,458318,458414,458526,458626,458766,458902,459066,459196,459354,459504,459645,459789,459924,460036,460186,460314,460442,460578,460710,460840,460970,461082,461222,478886,479030,479168,481164,481254,481330,481434,481524,481626,481734,481842,481942,482022,482114,482212,482322,482374,482452,482558,482650,482754,482864,482986,483149,483306,496714,496814,496904,497014,497104,497345,497439,497545,497637,537524,537636,537750,537866,537982,538076,538190,538302,538404,538524,538646,538728,538832,538952,539078,539176,539270,539358,539470,539586,539708,539820,539995,540111,540197,540289,540401,540525,540592,540718,540786,540914,541058,541186,541255,541350,541465,541578,541677,541786,541897,542008,542109,542214,542314,542444,542535,542658,542752,542864,542950,543054,543150,543238,543356,543460,543564,543690,543778,543886,543986,544076,544186,544270,544372,544456,544510,544574,544680,544766,544876,544960,545080" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/8c994b5da60099950ae0b0677f9a0925/transformed/lifecycle-viewmodel-2.6.2/res/values/values.xml", + "from": { + "startLines": "-1", + "startColumns": "-1", + "startOffsets": "-1" + }, + "to": { + "startLines": "1902", + "startColumns": "4", + "startOffsets": "125800", + "endColumns": "49", + "endOffsets": "125845" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values/strings.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "2005,2006,2007,2009,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2028,2029,2030,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2215,2219,2221,2222,2223,2224,2228,2229,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2265,2282,2283,2284,2285,2286,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2408,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2487,2492,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2521,2522,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "132811,132885,132953,133108,133308,133413,133469,133534,133591,133725,133791,133860,134035,134098,134157,135302,135348,135398,135974,136052,136117,136181,136289,136428,136490,136625,136717,136793,136855,136938,137050,137142,137212,137284,137359,137424,137483,137555,137623,138060,138102,138152,138230,138281,138333,138437,138495,138553,138597,138663,138762,138826,138872,141320,141371,141433,141503,141575,141643,141977,142067,142146,142268,142344,142420,142504,142582,142654,142766,142836,142929,142992,143063,143140,143217,143278,143339,143401,143488,143718,143805,143876,143940,144016,144077,144157,144412,144497,144606,144708,144787,144883,144986,145153,145239,145323,145410,145491,145574,145637,145702,145777,145853,145993,146052,146106,146247,146327,146411,146500,146587,146675,146729,146782,146835,146932,147012,147091,147161,147442,147526,147593,147669,147758,147838,147914,148013,148083,148250,148324,148388,148579,148662,148743,148839,148921,149013,149098,149168,149268,149377,149462,149667,149753,149831,149941,150033,150228,150319,150409,150527,150593,150672,150779,150954,151040,151121,151210,151315,151413,151504,151590,151713,151773,151845,151899,152013,152241,152348,152427,152499,152571,152640,152698,152906,153051,153131,153190,153281,153836,153903,154350,154425,154478,154529,154582,154639,154694,154780,154838,154931,154986,155063,155157,155209,155253,155321,155387,155476,155538,155622,155686,155772,155852,155928,155974,156028,156080,156138,156206,156259,156312,156373,156450,158419,158578,158632,158703,158768,172430,172498,172601,172652,172707,172760,172815,172860,172903,172944,173014,173065,173134,173181,173252,173316,173416,173519,173589,173661,173727,173788,173861,173907,173990,174057,174186,174256,174451,174515,174583,174742,175606,175692,175758,175810,175883,175961,176002,176126,176186,176243,176370,176445,176502,176624,176719,176801,176879,176964,177038,177099,177182,177274,177339,177430,177503,177561,177637,177737,177802,177898,177952,178011,178076,178125,178214,178368,178538,178697,178766,178833,178946,179020,179090,179261,179320,179385,179449,179531,179600,179678,179751,179817,180002,180069,180142,180202,180302,180346,180407,180472,180560,180641,180716,180768,180849,180930,181005,181087,181166,181223,181277,181333,181389,181445,181720,182133,182201,182270,182368,182426,182566,182653,182770,182880,182945,183009,183070,183142,183200,183259,183343,183491,183558,183628,183686,183749,183821,183893,183961,184367,184417,184577,184615,184743,184808,184893,184955,184999,185051,185097,185155,185232,185323,185393,185459,185528,185603,185670,185745,185819,185924,185980,186060,186123,186199", + "endColumns": "73,67,71,49,104,55,64,56,133,65,68,174,62,58,55,45,49,64,77,64,63,107,138,61,134,91,75,61,82,111,91,69,71,74,64,58,71,67,59,41,49,77,50,51,103,57,57,43,65,98,63,45,114,50,61,69,71,67,333,89,78,121,75,75,83,77,71,111,69,92,62,70,76,76,60,60,61,86,229,86,70,63,75,60,79,254,84,108,101,78,95,102,166,85,83,86,80,82,62,64,74,75,139,58,53,140,79,83,88,86,87,53,52,52,96,79,78,69,280,83,66,75,88,79,75,98,69,166,73,63,190,82,80,95,81,91,84,69,99,108,84,204,85,77,109,91,194,90,89,117,65,78,106,174,85,80,88,104,97,90,85,122,59,71,53,113,227,106,78,71,71,68,57,47,79,79,58,90,151,66,80,74,52,50,52,56,54,85,57,92,54,76,93,51,43,67,65,88,61,83,63,85,79,75,45,53,51,57,67,52,52,60,76,51,158,53,70,64,65,67,102,50,54,52,54,44,42,40,69,50,68,46,70,63,99,102,69,71,65,60,72,45,82,66,128,69,194,63,67,158,61,85,65,51,72,77,40,123,59,56,126,74,56,121,94,81,77,84,73,60,82,91,64,90,72,57,75,99,64,95,53,58,64,48,88,153,169,158,68,66,112,73,69,170,58,64,63,81,68,77,72,65,184,66,72,59,99,43,60,64,87,80,74,51,80,80,74,81,78,56,53,55,55,55,63,62,67,68,97,57,139,86,116,109,64,63,60,71,57,58,83,147,66,69,57,62,71,71,67,57,49,88,37,127,64,84,61,43,51,45,57,76,90,69,65,68,74,66,74,73,104,55,79,62,75,127", + "endOffsets": "132880,132948,133020,133153,133408,133464,133529,133586,133720,133786,133855,134030,134093,134152,134208,135343,135393,135458,136047,136112,136176,136284,136423,136485,136620,136712,136788,136850,136933,137045,137137,137207,137279,137354,137419,137478,137550,137618,137678,138097,138147,138225,138276,138328,138432,138490,138548,138592,138658,138757,138821,138867,138982,141366,141428,141498,141570,141638,141972,142062,142141,142263,142339,142415,142499,142577,142649,142761,142831,142924,142987,143058,143135,143212,143273,143334,143396,143483,143713,143800,143871,143935,144011,144072,144152,144407,144492,144601,144703,144782,144878,144981,145148,145234,145318,145405,145486,145569,145632,145697,145772,145848,145988,146047,146101,146242,146322,146406,146495,146582,146670,146724,146777,146830,146927,147007,147086,147156,147437,147521,147588,147664,147753,147833,147909,148008,148078,148245,148319,148383,148574,148657,148738,148834,148916,149008,149093,149163,149263,149372,149457,149662,149748,149826,149936,150028,150223,150314,150404,150522,150588,150667,150774,150949,151035,151116,151205,151310,151408,151499,151585,151708,151768,151840,151894,152008,152236,152343,152422,152494,152566,152635,152693,152741,152981,153126,153185,153276,153428,153898,153979,154420,154473,154524,154577,154634,154689,154775,154833,154926,154981,155058,155152,155204,155248,155316,155382,155471,155533,155617,155681,155767,155847,155923,155969,156023,156075,156133,156201,156254,156307,156368,156445,156497,158573,158627,158698,158763,158829,172493,172596,172647,172702,172755,172810,172855,172898,172939,173009,173060,173129,173176,173247,173311,173411,173514,173584,173656,173722,173783,173856,173902,173985,174052,174181,174251,174446,174510,174578,174737,174799,175687,175753,175805,175878,175956,175997,176121,176181,176238,176365,176440,176497,176619,176714,176796,176874,176959,177033,177094,177177,177269,177334,177425,177498,177556,177632,177732,177797,177893,177947,178006,178071,178120,178209,178363,178533,178692,178761,178828,178941,179015,179085,179256,179315,179380,179444,179526,179595,179673,179746,179812,179997,180064,180137,180197,180297,180341,180402,180467,180555,180636,180711,180763,180844,180925,181000,181082,181161,181218,181272,181328,181384,181440,181504,181778,182196,182265,182363,182421,182561,182648,182765,182875,182940,183004,183065,183137,183195,183254,183338,183486,183553,183623,183681,183744,183816,183888,183956,184014,184412,184501,184610,184738,184803,184888,184950,184994,185046,185092,185150,185227,185318,185388,185454,185523,185598,185665,185740,185814,185919,185975,186055,186118,186194,186322" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/68e97725e1781378fe335998c8e500ec/transformed/core-common-2.0.4/res/values/values.xml", + "from": { + "startLines": "-1", + "startColumns": "-1", + "startOffsets": "-1" + }, + "to": { + "startLines": "7000", + "startColumns": "4", + "startOffsets": "496229", + "endLines": "7007", + "endColumns": "8", + "endOffsets": "496634" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/6be8cab6745c75787fdf6101b92e71af/transformed/drawerlayout-1.1.1/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1", + "startColumns": "-1,-1,-1", + "startOffsets": "-1,-1,-1" + }, + "to": { + "startLines": "138,141,1074", + "startColumns": "4,4,4", + "startOffsets": "6996,7160,64193", + "endColumns": "55,47,51", + "endOffsets": "7047,7203,64240" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/eb0c45dedd1b15a9e37e22fcf0bd537e/transformed/constraintlayout-2.2.0/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "2,9,11,17,18,26,28,29,36,42,44,45,46,47,48,105,106,107,108,110,114,115,116,119,129,139,167,168,173,174,179,184,185,186,191,192,197,198,203,204,205,211,212,213,218,224,225,239,240,246,247,248,249,252,255,258,259,262,265,266,267,268,269,272,275,276,277,278,284,289,292,295,296,297,302,303,304,307,310,311,314,317,320,323,324,325,328,331,332,337,338,344,349,352,355,356,357,358,359,360,361,362,363,364,365,366,382,463,464,465,466,471,478,486,487,488,491,496,498,506,507,528,535,572,573,577,578,589,590,591,597,600,606,610,611,612,613,614,623,1836,1898", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,434,546,781,842,1133,1240,1290,1692,1999,2119,2174,2234,2299,2358,5544,5596,5657,5719,5826,5959,6011,6061,6222,6629,7052,8994,9053,9250,9307,9502,9683,9737,9794,9986,10044,10240,10296,10490,10547,10598,10820,10872,10927,11117,11333,11383,12132,12188,12394,12455,12515,12585,12718,12849,12977,13045,13174,13300,13362,13425,13493,13560,13683,13808,13875,13940,14005,14294,14475,14596,14717,14783,14850,15060,15129,15195,15320,15446,15513,15639,15766,15891,16018,16074,16139,16265,16388,16453,16661,16728,17016,17196,17316,17436,17501,17563,17625,17689,17751,17810,17870,17931,17992,18051,18111,18771,23714,23765,23814,23862,24149,24441,24749,24796,24856,24962,25142,25254,25589,25643,26808,27155,29485,29536,29745,29797,30233,30292,30346,30584,30762,30964,31103,31149,31204,31249,31293,31641,122345,125598", + "endLines": "8,9,15,17,25,26,28,29,36,42,44,45,46,47,48,105,106,107,108,113,114,115,116,128,136,139,167,172,173,178,183,184,185,190,191,196,197,202,203,204,210,211,212,217,223,224,225,239,245,246,247,248,251,254,257,258,261,264,265,266,267,268,271,274,275,276,277,283,288,291,294,295,296,301,302,303,306,309,310,313,316,319,322,323,324,327,330,331,336,337,343,348,351,354,355,356,357,358,359,360,361,362,363,364,365,381,387,463,464,465,466,477,485,486,487,490,495,496,505,506,507,528,535,572,573,577,586,589,590,596,597,605,609,610,611,612,613,622,626,1836,1898", + "endColumns": "11,55,11,60,11,51,49,52,47,50,54,59,64,58,61,51,60,61,45,11,51,49,50,11,11,44,58,11,56,11,11,53,56,11,57,11,55,11,56,50,11,51,54,11,11,49,51,55,11,60,59,69,11,11,11,67,11,11,61,62,67,66,11,11,66,64,64,11,11,11,11,65,66,11,68,65,11,11,66,11,11,11,11,55,64,11,11,64,11,66,11,11,11,11,64,61,61,63,61,58,59,60,60,58,59,11,11,50,48,47,57,11,11,46,59,11,11,53,11,53,55,45,46,50,58,51,11,58,53,11,54,11,11,45,54,44,43,11,11,40,44", + "endOffsets": "429,485,727,837,1128,1180,1285,1338,1735,2045,2169,2229,2294,2353,2415,5591,5652,5714,5760,5954,6006,6056,6107,6624,6936,7092,9048,9245,9302,9497,9678,9732,9789,9981,10039,10235,10291,10485,10542,10593,10815,10867,10922,11112,11328,11378,11430,12183,12389,12450,12510,12580,12713,12844,12972,13040,13169,13295,13357,13420,13488,13555,13678,13803,13870,13935,14000,14289,14470,14591,14712,14778,14845,15055,15124,15190,15315,15441,15508,15634,15761,15886,16013,16069,16134,16260,16383,16448,16656,16723,17011,17191,17311,17431,17496,17558,17620,17684,17746,17805,17865,17926,17987,18046,18106,18766,19017,23760,23809,23857,23915,24436,24744,24791,24851,24957,25137,25191,25584,25638,25694,26849,27197,29531,29590,29792,30122,30287,30341,30579,30634,30959,31098,31144,31199,31244,31288,31636,31773,122381,125638" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/e38dc42c74688090728264f3b8aa0abf/transformed/play-services-cronet-18.1.0/res/values/values.xml", + "from": { + "startLines": "-1", + "startColumns": "-1", + "startOffsets": "-1" + }, + "to": { + "startLines": "1977", + "startColumns": "4", + "startOffsets": "130818", + "endColumns": "126", + "endOffsets": "130940" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "470,637,638,651,652,952,953,1067,1068,1069,1070,1071,1072,1073,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1831,1832,1862,1863,1864,1865,1866,1867,1868,1869,1873,1874,1875,1876,1877,1878,1879,1887,1972,2031,2032,2033,2034,2035,2036,2037,2523,6479,6480,6484,6485,6489,7655,7656", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "24089,32458,32530,33578,33643,55981,56050,63705,63775,63843,63915,63985,64046,64120,117792,117853,117914,117976,118040,118102,118163,118231,118331,118391,118457,118530,118599,118656,118708,119500,119572,119648,119713,119772,119831,119891,119951,120011,120071,120131,120191,120251,120311,120371,120431,120490,120550,120610,120670,120730,120790,120850,120910,120970,121030,121090,121149,121209,121269,121328,121387,121446,121505,121564,122126,122161,123747,123802,123865,123920,123978,124036,124097,124160,124363,124414,124464,124525,124582,124648,124682,125064,130428,135463,135530,135602,135671,135740,135814,135886,184506,461227,461344,461545,461655,461856,545085,545157", + "endLines": "470,637,638,651,652,952,953,1067,1068,1069,1070,1071,1072,1073,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1831,1832,1862,1863,1864,1865,1866,1867,1868,1869,1873,1874,1875,1876,1877,1878,1879,1887,1972,2031,2032,2033,2034,2035,2036,2037,2523,6479,6483,6484,6488,6489,7655,7656", + "endColumns": "59,71,87,64,65,68,62,69,67,71,69,60,73,72,60,60,61,63,61,60,67,99,59,65,72,68,56,51,61,71,75,64,58,58,59,59,59,59,59,59,59,59,59,59,58,59,59,59,59,59,59,59,59,59,59,58,59,59,58,58,58,58,58,58,34,34,54,62,54,57,57,60,62,56,50,49,60,56,65,33,34,34,69,66,71,68,68,73,71,87,70,116,12,109,12,128,71,66", + "endOffsets": "24144,32525,32613,33638,33704,56045,56108,63770,63838,63910,63980,64041,64115,64188,117848,117909,117971,118035,118097,118158,118226,118326,118386,118452,118525,118594,118651,118703,118765,119567,119643,119708,119767,119826,119886,119946,120006,120066,120126,120186,120246,120306,120366,120426,120485,120545,120605,120665,120725,120785,120845,120905,120965,121025,121085,121144,121204,121264,121323,121382,121441,121500,121559,121618,122156,122191,123797,123860,123915,123973,124031,124092,124155,124212,124409,124459,124520,124577,124643,124677,124712,125094,130493,135525,135597,135666,135735,135809,135881,135969,184572,461339,461540,461650,461851,461980,545152,545219" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/2e296852593701edd20e274ff098f368/transformed/savedstate-1.2.1/res/values/values.xml", + "from": { + "startLines": "-1", + "startColumns": "-1", + "startOffsets": "-1" + }, + "to": { + "startLines": "1901", + "startColumns": "4", + "startOffsets": "125746", + "endColumns": "53", + "endOffsets": "125795" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values/ids.xml", + "from": { + "startLines": "-1,-1,-1", + "startColumns": "-1,-1,-1", + "startOffsets": "-1,-1,-1" + }, + "to": { + "startLines": "1870,1871,1872", + "startColumns": "4,4,4", + "startOffsets": "124217,124263,124315", + "endColumns": "45,51,47", + "endOffsets": "124258,124310,124358" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/6c0e8749c44e3843f0401e2e78787c36/transformed/customview-poolingcontainer-1.0.0/res/values/values.xml", + "from": { + "startLines": "-1,-1", + "startColumns": "-1,-1", + "startOffsets": "-1,-1" + }, + "to": { + "startLines": "1829,1850", + "startColumns": "4,4", + "startOffsets": "122006,123154", + "endColumns": "53,66", + "endOffsets": "122055,123216" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "10,16,27,30,31,32,33,34,37,38,39,40,41,43,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,117,118,140,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,226,228,229,231,232,233,234,235,236,237,238,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,467,468,469,497,509,510,511,512,513,514,515,516,517,518,519,520,524,525,526,527,529,530,531,532,533,534,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,575,576,587,588,598,599,629,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,1062,1066,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1784,1785,1833,1834,1835,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1854,1857,1858,1859,1880,1881,1882,1883,1884,1885,1886,1897,1906,1907,1910,1911,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1973,2010,2022,2023,2024,2025,2026,2027,2059,2060,2061,2062,2216,2220,2225,2226,2227,2230,2231,2232,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2321,2324,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2409,2410,2411,2412,2413,2489,2493,2494,2519,2520,2553,2557,2561,2565,2569,2570,2621,2629,2636,2806,2809,2819,2828,2837,2906,2907,2908,2909,2915,2916,2917,2918,2919,2920,2926,2927,2928,2929,2930,2935,2936,2940,2941,2947,2951,2952,2953,2954,2964,2965,2966,2970,2971,2977,2981,3051,3054,3055,3060,3061,3064,3065,3066,3067,3331,3338,3599,3605,3869,3876,4137,4143,4206,4288,4340,4422,4484,4566,4630,4682,4764,4772,4778,4789,4793,4797,4810,5585,5601,5608,5614,5631,5644,5664,5681,5690,5695,5702,5722,5735,5752,5758,5764,5771,5775,5781,5795,5798,5808,5809,5810,5858,5862,5866,5870,5871,5872,5875,5891,5898,5912,5957,5966,5972,5976,5980,5985,5992,5998,5999,6002,6006,6011,6024,6028,6033,6038,6043,6046,6049,6052,6056,6199,6200,6201,6202,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6301,6305,6309,6313,6317,6321,6325,6326,6327,6328,6329,6330,6331,6332,6336,6340,6341,6345,6346,6349,6353,6356,6359,6362,6366,6369,6372,6376,6380,6384,6388,6391,6392,6393,6394,6397,6401,6404,6407,6410,6413,6416,6419,6490,6493,6494,6497,6500,6501,6504,6505,6506,6510,6511,6516,6523,6530,6537,6544,6551,6558,6565,6572,6579,6588,6597,6606,6613,6622,6631,6634,6637,6638,6639,6640,6641,6642,6643,6644,6645,6646,6647,6648,6649,6653,6658,6663,6666,6667,6668,6669,6670,6678,6686,6687,6695,6699,6707,6715,6723,6731,6739,6740,6748,6756,6757,6760,6833,6835,6840,6842,6847,6851,6855,6856,6857,6858,6862,6866,6867,6871,6872,6873,6874,6875,6876,6877,6878,6879,6880,6881,6885,6886,6887,6888,6892,6893,6894,6895,6899,6903,6904,6908,6909,6910,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6939,6940,6941,6947,6948,6952,6954,6955,6960,6961,6962,6963,6964,6965,6969,6970,6971,6977,6978,6982,6984,6988,6992,6996,7020,7021,7022,7023,7026,7029,7032,7035,7038,7043,7047,7050,7051,7056,7060,7065,7071,7077,7082,7086,7091,7095,7099,7140,7141,7142,7143,7144,7148,7149,7150,7151,7155,7159,7163,7167,7171,7175,7179,7183,7189,7190,7231,7245,7250,7276,7283,7286,7297,7302,7305,7308,7363,7369,7370,7373,7376,7379,7382,7385,7388,7391,7395,7398,7399,7400,7408,7416,7419,7424,7429,7434,7439,7443,7447,7448,7456,7457,7458,7459,7460,7468,7473,7478,7479,7480,7481,7506,7512,7517,7520,7524,7527,7531,7541,7544,7549,7552,7556,7657,7665,7679,7692,7696,7711,7722,7725,7736,7741,7745,7780,7781,7782,7794,7802,7810,7818,7826,7846,7849,7876,7881,7901,7904,7907,7914,7927,7936,7939,7959,7969,7973,7977,7990,7994,7998,8002,8008,8012,8029,8037,8041,8045,8049,8052,8056,8060,8064,8074,8081,8088,8092,8118,8128,8153,8162,8182,8192,8196,8206,8231,8241,8244,8251,8258,8265,8266,8267,8268,8269,8276,8280,8286,8292,8293,8306,8307,8308,8311,8314,8317,8320,8323,8326,8329,8332,8335,8338,8341,8344,8347,8350,8353,8356,8359,8362,8365,8368,8371,8372,8380,8388,8389,8402,8412,8416,8421,8426,8430,8433,8437,8441,8444,8448,8451,8455,8460,8465,8468,8475,8479,8483,8492,8497,8502,8503,8507,8510,8514,8527,8532,8540,8544,8548,8565,8569,8574,8592,8599,8603,8633,8636,8639,8642,8645,8648,8651,8670,8676,8684,8691,8703,8711,8716,8724,8728,8746,8753,8769,8773,8781,8784,8789,8790,8791,8792,8796,8800,8804,8808,8843,8846,8850,8854,8888,8891,8895,8899,8908,8914,8917,8927,8931,8932,8939,8943,8950,8951,8952,8955,8960,8965,8966,8970,8985,9004,9008,9009,9021,9031,9032,9044,9049,9073,9076,9082,9085,9094,9102,9106,9109,9112,9115,9119,9122,9139,9143,9146,9161,9164,9172,9177,9184,9189,9190,9195,9196,9202,9208,9214,9246,9257,9274,9281,9285,9288,9301,9310,9314,9319,9323,9327,9331,9335,9339,9343,9347,9352,9355,9367,9372,9381,9384,9391,9392,9396,9405,9411,9415,9416,9420,9441,9447,9451,9455,9456,9474,9475,9476,9477,9478,9483,9486,9487,9493,9494,9506,9518,9525,9526,9531,9536,9537,9541,9555,9560,9566,9572,9578,9583,9589,9595,9596,9602,9617,9622,9631,9640,9643,9657,9662,9673,9677,9686,9695,9696,9703,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "490,732,1185,1343,1399,1459,1520,1585,1740,1790,1840,1893,1951,2050,2420,2468,2539,2611,2683,2756,2823,2872,2926,2963,3014,3074,3121,3177,3226,3284,3338,3399,3455,3506,3566,3622,3685,3734,3790,3846,3896,3955,4010,4072,4119,4173,4229,4281,4336,4390,4444,4498,4547,4605,4659,4716,4772,4819,4872,4928,4988,5051,5110,5172,5222,5276,5330,5378,5435,5488,6112,6166,7097,7208,7270,7326,7386,7439,7500,7579,7660,7732,7811,7891,7967,8045,8114,8190,8267,8338,8411,8487,8565,8634,8710,8787,8851,8922,11435,11531,11584,11688,11755,11808,11860,11910,11968,12033,12081,19022,19089,19155,19213,19282,19340,19409,19479,19552,19626,19694,19761,19831,19897,19970,20030,20106,20166,20226,20301,20369,20435,20503,20563,20622,20679,20745,20807,20864,20932,21005,21075,21137,21198,21266,21328,21398,21467,21523,21582,21644,21706,21773,21830,21891,21952,22013,22074,22130,22186,22242,22298,22356,22414,22472,22530,22587,22644,22701,22758,22817,22876,22934,23017,23100,23173,23227,23296,23352,23433,23514,23585,23920,23973,24031,25196,25755,25801,25861,25915,25985,26055,26120,26186,26251,26319,26388,26456,26586,26639,26698,26756,26854,26904,26956,27002,27052,27108,27202,27260,27318,27380,27443,27505,27564,27624,27689,27755,27820,27882,27944,28006,28068,28130,28192,28258,28325,28391,28454,28518,28581,28649,28710,28772,28834,28897,28961,29024,29088,29166,29225,29291,29371,29432,29636,29694,30127,30172,30639,30703,31895,34629,34703,34774,34840,34914,34983,35054,35127,35198,35266,35339,35415,35485,35563,35631,35697,35758,35827,35891,35957,36025,36091,36154,36222,36293,36358,36431,36494,36575,36639,36705,36775,36845,36915,36985,38010,38067,38125,38184,38244,38303,38362,38421,38480,38539,38598,38657,38716,38775,38834,38894,38955,39017,39078,39139,39200,39261,39322,39383,39443,39504,39565,39625,39686,39747,39808,39869,39930,39991,40052,40113,40174,40235,40296,40364,40433,40503,40572,40641,40710,40779,40848,40917,40986,41055,41124,41193,41253,41314,41376,41437,41498,41559,41620,41681,41742,41803,41864,41925,41986,42048,42111,42175,42238,42301,42364,42427,42490,42553,42616,42679,42742,42805,42866,42928,42991,43053,43115,43177,43239,43301,43363,43425,43487,43549,43611,43668,43754,43834,43924,44019,44111,44203,44293,44376,44469,44556,44653,44744,44845,44932,45035,45124,45223,45315,45415,45499,45593,45681,45779,45862,45953,46047,46146,46248,46346,46446,46533,46633,46719,46815,46903,46984,47075,47171,47264,47357,47448,47533,47627,47716,47814,47907,48009,48097,48201,48292,48392,48485,48586,48671,48766,48855,48954,49039,49131,49226,49326,49429,49528,49631,49720,49821,49908,50005,50093,50189,50281,50381,50471,50569,50654,50743,50832,50925,51012,51775,51841,51917,51986,52065,52138,52218,52298,52375,52443,52521,52597,52668,52749,52822,52905,52980,53065,53138,53219,53300,53374,53458,53528,53606,53676,53756,53834,53906,53988,54058,54135,54215,54300,54388,54472,54559,54633,54711,54789,54860,54941,55032,55115,55211,55309,55416,55481,55547,55600,55676,55742,55829,55905,63415,63650,64245,64299,64378,64456,64529,64594,64657,64723,64794,64865,64935,64997,65066,65132,65192,65259,65326,65382,65433,65486,65538,65592,65663,65726,65785,65847,65906,65979,66046,66116,66176,66239,66314,66386,66482,66553,66609,66680,66737,66794,66860,66924,66995,67052,67105,67168,67220,67278,68515,68584,68650,68709,68792,68851,68908,68975,69045,69119,69181,69250,69320,69419,69516,69615,69701,69787,69868,69943,70032,70123,70207,70266,70312,70378,70435,70502,70559,70641,70706,70772,70895,70979,71100,71165,71227,71325,71399,71482,71571,71635,71714,71788,71850,71946,72011,72070,72126,72182,72242,72349,72396,72456,72517,72581,72642,72702,72760,72803,72852,72904,72955,73007,73056,73105,73170,73236,73296,73357,73413,73472,73521,73569,73627,73684,73786,73843,73918,73966,74017,74079,74144,74196,74270,74333,74396,74464,74514,74576,74636,74693,74753,74802,74870,74976,75078,75147,75218,75274,75323,75423,75494,75604,75695,75777,75875,75931,76032,76142,76241,76304,76410,76487,76599,76726,76838,76965,77035,77149,77280,77377,77445,77563,77666,77784,77845,77919,77986,78091,78213,78287,78354,78464,78563,78636,78733,78855,78973,79091,79152,79274,79391,79459,79565,79667,79747,79818,79914,79981,80055,80129,80215,80305,80383,80460,80560,80631,80752,80873,80937,81062,81136,81260,81384,81451,81560,81688,81800,81879,81957,82058,82129,82251,82373,82438,82564,82676,82782,82850,82949,83053,83116,83182,83266,83379,83492,83610,83688,83760,83896,84032,84117,84257,84395,84533,84675,84757,84843,84920,84993,85102,85213,85341,85469,85601,85731,85861,85995,86084,86146,86242,86309,86426,86547,86644,86726,86813,86900,87031,87162,87297,87374,87451,87562,87676,87750,87859,87971,88038,88111,88176,88278,88374,88478,88546,88611,88705,88777,88887,88993,89066,89157,89259,89362,89457,89564,89669,89791,89913,90039,90098,90156,90280,90404,90532,90650,90768,90890,90976,91073,91207,91341,91421,91559,91691,91823,91959,92034,92110,92213,92287,92400,92481,92538,92599,92658,92718,92776,92837,92895,92945,92994,93061,93120,93179,93228,93299,93383,93453,93524,93604,93673,93736,93804,93870,93938,94003,94069,94146,94224,94330,94436,94532,94661,94750,94877,94943,95013,95099,95165,95248,95322,95420,95516,95612,95710,95819,95914,96003,96065,96125,96190,96247,96328,96382,96439,96536,96646,96707,96822,96943,97038,97130,97223,97279,97338,97387,97479,97528,97582,97636,97690,97744,97798,97853,97963,98073,98181,98291,98401,98511,98621,98729,98835,98939,99043,99147,99242,99337,99430,99523,99627,99733,99837,99941,100034,100127,100220,100313,100421,100527,100633,100739,100836,100931,101026,101121,101227,101333,101439,101545,101643,101738,101834,101931,101996,102100,102158,102222,102283,102345,102405,102470,102532,102600,102658,102721,102784,102851,102926,102999,103065,103117,103170,103222,103279,103363,103458,103543,103624,103704,103781,103860,103937,104011,104085,104156,104236,104308,104383,104448,104509,104569,104644,104718,104791,104861,104933,105003,105076,105140,105210,105256,105325,105377,105462,105545,105602,105668,105735,105801,105882,105957,106013,106066,106127,106185,106235,106284,106333,106382,106444,106496,106541,106622,106673,106727,106780,106834,106885,106934,107000,107051,107112,107173,107235,107285,107326,107403,107462,107521,107580,107641,107697,107753,107820,107881,107946,108001,108066,108135,108203,108281,108350,108410,108481,108555,108620,108692,108762,108829,108913,108982,109049,109119,109182,109249,109317,109400,109479,109569,109646,109714,109781,109859,109916,109973,110041,110107,110163,110223,110282,110336,110386,110436,110484,110546,110597,110670,110750,110830,110894,110961,111032,111090,111151,111217,111276,111343,111403,111463,111526,111594,111655,111722,111800,111870,111919,111976,112045,112106,112194,112282,112370,112458,112545,112632,112719,112806,112864,112938,113008,113064,113135,113200,113262,113337,113410,113500,113566,113632,113693,113757,113819,113877,113948,114031,114090,114161,114227,114292,114353,114412,114483,114549,114614,114697,114773,114848,114929,114989,115058,115128,115197,115252,115308,115364,115425,115483,115539,115598,115652,115707,115769,115826,115920,115989,116090,116141,116211,116274,116330,116388,116447,116501,116587,116671,116741,116810,116880,116995,117116,117183,117250,117325,117392,117451,117505,117559,117613,117666,117718,119223,119360,122196,122245,122295,122386,122434,122490,122548,122610,122665,122723,122794,122858,122917,122979,123045,123359,123504,123548,123593,124717,124768,124815,124860,124911,124962,125013,125550,126040,126106,126285,126348,126488,126545,126599,126654,126712,126767,126826,126882,126951,127020,127089,127159,127222,127285,127348,127411,127476,127541,127606,127671,127734,127798,127862,127926,127977,128055,128133,128204,128276,128349,128421,128487,128553,128621,128689,128755,128822,128896,128959,129016,129076,129141,129208,129273,129330,129391,129449,129553,129663,129772,129876,129954,130019,130086,130152,130222,130269,130321,130371,130498,133158,134213,134344,134528,134706,134944,135133,137683,137781,137896,137981,152746,152986,153433,153522,153679,153984,154137,154291,156502,156689,156785,156875,156971,157061,157227,157350,157473,157643,157749,157864,157979,158081,158187,158304,158834,158916,159089,159257,159405,159564,159719,159892,160009,160126,160294,160406,160520,160692,160868,161026,161159,161271,161417,161569,161701,161844,161966,162144,162280,162376,162512,162607,162774,162867,162959,163146,163302,163480,163644,163826,164143,164325,164507,164697,164929,165119,165296,165458,165615,165725,165908,166045,166249,166433,166617,166777,166935,167119,167346,167549,167720,167940,168162,168317,168517,168701,168804,168994,169135,169300,169471,169671,169875,170077,170242,170447,170646,170845,171042,171133,171282,171432,171516,171665,171810,171962,172103,172269,174804,174882,175183,175349,175504,181562,181783,181947,184019,184242,186769,187046,187318,187596,187841,187903,191031,191482,191938,203075,203223,203737,204174,204608,208948,209033,209154,209253,209658,209755,209872,209959,210082,210183,210589,210688,210807,210900,211007,211350,211457,211702,211823,212232,212480,212580,212685,212804,213313,213460,213579,213830,213963,214378,214632,219847,220094,220219,220627,220748,220976,221097,221230,221377,242099,242591,263062,263486,284253,284747,305263,305689,310530,315947,320038,325469,330211,335588,339572,343564,348955,349502,349935,350691,350921,351164,352331,400501,401405,401989,402462,403892,404636,405829,406883,407361,407654,408037,409552,410317,411460,411901,412342,412938,413212,413623,414639,414817,415570,415707,415798,417992,418258,418580,418790,418899,419018,419202,420320,420790,421541,424124,424537,424913,425141,425397,425656,426232,426586,426708,426847,427139,427399,428327,428613,429016,429418,429761,429973,430174,430387,430676,441563,441636,441723,441808,446477,446589,446695,446818,446950,447073,447203,447327,447460,447591,447716,447833,447953,448085,448213,448327,448445,448558,448679,448867,449054,449235,449418,449602,449767,449949,450069,450189,450297,450407,450519,450627,450737,450902,451068,451220,451385,451486,451606,451777,451938,452101,452262,452429,452548,452665,452845,453027,453208,453391,453546,453691,453813,453948,454111,454304,454430,454582,454724,454894,455050,455222,461985,462180,462272,462445,462607,462702,462871,462965,463054,463297,463386,463679,464095,464515,464936,465362,465779,466195,466612,467030,467444,467914,468387,468859,469270,469741,470213,470403,470609,470715,470823,470929,471041,471155,471267,471381,471497,471611,471719,471829,471937,472199,472578,472982,473129,473237,473347,473455,473569,473978,474392,474508,474926,475167,475597,476032,476442,476864,477274,477396,477805,478221,478343,478561,483311,483379,483723,483803,484159,484309,484453,484529,484641,484731,484993,485258,485366,485518,485626,485702,485814,485904,486006,486114,486222,486322,486430,486515,486681,486785,486913,487000,487167,487245,487359,487451,487715,487982,488092,488245,488355,488439,488828,488926,489034,489128,489258,489366,489488,489624,489732,489852,489986,490108,490236,490378,490504,490644,490770,490888,491020,491118,491228,491528,491640,491758,492222,492338,492641,492767,492863,493264,493374,493498,493636,493746,493868,494180,494304,494434,494910,495038,495353,495491,495653,495869,496025,497642,497710,497794,497898,498101,498290,498491,498684,498889,499202,499414,499580,499696,499942,500158,500471,500897,501359,501596,501748,502008,502152,502294,505526,505640,505760,505876,505970,506291,506390,506508,506609,506888,507173,507452,507734,507987,508246,508499,508755,509179,509255,512505,513860,514304,516158,516733,516941,517951,518331,518497,518638,523658,524084,524196,524331,524484,524681,524852,525035,525210,525397,525669,525827,525911,526015,526502,527058,527216,527435,527666,527889,528124,528346,528612,528750,529349,529463,529601,529713,529837,530408,530903,531449,531594,531687,531779,533706,534276,534574,534763,534969,535162,535372,536256,536401,536793,536951,537168,545224,545656,546531,547151,547348,548296,549061,549184,549957,550178,550378,552355,552455,552545,553231,553984,554749,555512,556287,557500,557665,559278,559599,560662,560872,561042,561612,562507,563140,563306,564792,565408,565644,565865,566823,567088,567353,567600,568014,568250,569535,569984,570171,570420,570662,570838,571079,571312,571537,572132,572607,573131,573392,574743,575218,576444,576914,577962,578414,578658,579115,580360,580843,580993,581548,582000,582400,582553,582698,582841,582911,583339,583627,584131,584640,584756,585658,585780,585892,586069,586335,586605,586871,587139,587395,587655,587911,588169,588421,588677,588929,589183,589415,589651,589903,590159,590411,590665,590897,591131,591243,591895,592350,592474,593566,594381,594577,594901,595290,595642,595883,596097,596396,596588,596903,597110,597456,597756,598157,598376,598789,599026,599396,600120,600475,600744,600884,601138,601282,601559,602551,602960,603592,603938,604306,605380,605743,606143,607651,608236,608554,611089,611283,611501,611727,611939,612138,612345,613549,613844,614401,614791,615423,615900,616145,616632,616878,618074,618471,619477,619699,620122,620313,620692,620780,620888,620996,621309,621634,621953,622284,624987,625175,625436,625685,628269,628461,628726,628979,629511,629919,630118,630702,630937,631061,631473,631687,632089,632192,632322,632497,632749,632945,633085,633279,634290,635359,635647,635777,636554,637211,637357,638063,638301,639841,639991,640408,640573,641259,641729,641925,642016,642100,642244,642478,642645,643573,643859,644019,644634,644793,645121,645348,645860,646222,646301,646640,646745,647110,647481,647842,649716,650345,651421,651845,652098,652250,653298,654035,654238,654484,654731,654949,655191,655512,655776,656081,656304,656615,656804,657519,657788,658282,658508,658948,659107,659391,660136,660501,660806,660964,661202,662521,662919,663147,663367,663509,664799,664905,665035,665173,665297,665585,665754,665854,666139,666253,667136,667891,668330,668454,668700,668893,669027,669218,669997,670215,670506,670785,671102,671324,671619,671902,672006,672347,673163,673479,674040,674546,674751,675537,675942,676603,676792,677343,677909,678029,678431,814468,814563,814656,814719,814801,814894,814987,815074,815172,815263,815354,815442,815526,815622,815722,815828,815931,816032,816136,816242,816341,816447,816549,816656,816765,816876,817007,817127,817243,817361,817460,817567,817683,817802,817930,818019,818114,818191,818280,818371,818464,818538,818635,818730,818828,818927,819031,819127,819229,819332,819432,819535,819620,819721,819819,819909,820004,820091,820197,820299,820393,820484,820578,820654,820746,820835,820938,821049,821132,821218,821313,821410,821506,821594,821695,821796,821899,822005,822103,822200,822295,822393,822496,822596,822699,822804,822922,823038,823133,823226,823311,823407,823501,823593,823676,823780,823885,823985,824086,824191,824291,824392,824491,824593,824687,824794,824896,824999,825092,825188,825290,825393,825489,825591,825694,825791,825894,825992,826096,826201,826298,826406,826520,826635,826743,826857,826972,827074,827179,827287,827397,827513,827630,827725,827822,827921,828026,828132,828231,828336,828442,828542,828648,828749,828856,828975,829074,829179,829281,829383,829483,829586,829681,829785,829870,829974,830078,830176,830280,830386,830484,830589,830687,830800,830894,830983,831072,831155,831246,831329,831427,831517,831613,831702,831796,831884,831980,832065,832173,832274,832375,832473,832579,832670,832769,832866,832964,833060,833153,833263,833361,833456,833566,833658,833758,833857,833944,834048,834153,834252,834359,834466,834565,834674,834766,834877,834988,835099,835203,835318,835434,835561,835681,835776,835871,835968,836067,836159,836258,836350,836449,836535,836629,836732,836828,836931,837027,837130,837227,837325,837428,837521,837611,837712,837795,837886,837971,838063,838166,838261,838357,838450,838544,838623,838730,838821,838920,839013,839116,839220,839321,839422,839526,839620,839724,839828,839941,840047,840153,840261,840378,840479,840587,840687,840790,840895,841002,841098,841177,841267,841351,841443,841516,841608,841697,841789,841874,841971,842064,842159,842258,842355,842446,842537,842629,842724,842831,842939,843041,843138,843235,843328,843415,843499,843596,843693,843786,843873,843964,844063,844162,844257,844346,844427,844526,844630,844727,844832,844929,845013,845112,845216,845313,845418,845515,845613,845714,845820,845919,846026,846125,846224,846315,846404,846493,846575,846668,846759,846870,846971,847071,847183,847296,847394,847502,847596,847696,847785,847877,847988,848098,848193,848309,848435,848561,848680,848808,848933,849058,849176,849303,849412,849521,849634,849757,849880,849996,850121,850218,850326,850448,850564,850680,850789,850877,850978,851067,851168,851255,851343,851440,851532,851638,851738,851814", + "endLines": "10,16,27,30,31,32,33,34,37,38,39,40,41,43,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,117,118,140,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,226,228,229,231,232,233,234,235,236,237,238,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,462,467,468,469,497,509,510,511,512,513,514,515,516,517,518,519,523,524,525,526,527,529,530,531,532,533,534,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,575,576,587,588,598,599,629,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,1062,1066,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1784,1785,1833,1834,1835,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1854,1857,1858,1859,1880,1881,1882,1883,1884,1885,1886,1897,1906,1907,1910,1911,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1976,2010,2022,2023,2024,2025,2026,2027,2059,2060,2061,2062,2218,2220,2225,2226,2227,2230,2231,2232,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2281,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2320,2323,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2409,2410,2411,2412,2413,2491,2493,2494,2519,2520,2556,2560,2564,2568,2569,2573,2628,2635,2643,2808,2818,2827,2836,2845,2906,2907,2908,2914,2915,2916,2917,2918,2919,2925,2926,2927,2928,2929,2934,2935,2939,2940,2946,2950,2951,2952,2953,2963,2964,2965,2969,2970,2976,2980,2981,3053,3054,3059,3060,3063,3064,3065,3066,3330,3337,3598,3604,3868,3875,4136,4142,4205,4287,4339,4421,4483,4565,4629,4681,4763,4771,4777,4788,4792,4796,4809,4824,5600,5607,5613,5630,5643,5663,5680,5689,5694,5701,5721,5734,5751,5757,5763,5770,5774,5780,5794,5797,5807,5808,5809,5857,5861,5865,5869,5870,5871,5874,5890,5897,5911,5956,5957,5971,5975,5979,5984,5991,5997,5998,6001,6005,6010,6023,6027,6032,6037,6042,6045,6048,6051,6055,6059,6199,6200,6201,6202,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6300,6304,6308,6312,6316,6320,6324,6325,6326,6327,6328,6329,6330,6331,6335,6339,6340,6344,6345,6348,6352,6355,6358,6361,6365,6368,6371,6375,6379,6383,6387,6390,6391,6392,6393,6396,6400,6403,6406,6409,6412,6415,6418,6422,6492,6493,6496,6499,6500,6503,6504,6505,6509,6510,6515,6522,6529,6536,6543,6550,6557,6564,6571,6578,6587,6596,6605,6612,6621,6630,6633,6636,6637,6638,6639,6640,6641,6642,6643,6644,6645,6646,6647,6648,6652,6657,6662,6665,6666,6667,6668,6669,6677,6685,6686,6694,6698,6706,6714,6722,6730,6738,6739,6747,6755,6756,6759,6762,6834,6839,6841,6846,6850,6854,6855,6856,6857,6861,6865,6866,6870,6871,6872,6873,6874,6875,6876,6877,6878,6879,6880,6884,6885,6886,6887,6891,6892,6893,6894,6898,6902,6903,6907,6908,6909,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6938,6939,6940,6946,6947,6951,6953,6954,6959,6960,6961,6962,6963,6964,6968,6969,6970,6976,6977,6981,6983,6987,6991,6995,6999,7020,7021,7022,7025,7028,7031,7034,7037,7042,7046,7049,7050,7055,7059,7064,7070,7076,7081,7085,7090,7094,7098,7139,7140,7141,7142,7143,7147,7148,7149,7150,7154,7158,7162,7166,7170,7174,7178,7182,7188,7189,7230,7244,7249,7275,7282,7285,7296,7301,7304,7307,7362,7368,7369,7372,7375,7378,7381,7384,7387,7390,7394,7397,7398,7399,7407,7415,7418,7423,7428,7433,7438,7442,7446,7447,7455,7456,7457,7458,7459,7467,7472,7477,7478,7479,7480,7505,7511,7516,7519,7523,7526,7530,7540,7543,7548,7551,7555,7559,7664,7678,7691,7695,7710,7721,7724,7735,7740,7744,7779,7780,7781,7793,7801,7809,7817,7825,7845,7848,7875,7880,7900,7903,7906,7913,7926,7935,7938,7958,7968,7972,7976,7989,7993,7997,8001,8007,8011,8028,8036,8040,8044,8048,8051,8055,8059,8063,8073,8080,8087,8091,8117,8127,8152,8161,8181,8191,8195,8205,8230,8240,8243,8250,8257,8264,8265,8266,8267,8268,8275,8279,8285,8291,8292,8305,8306,8307,8310,8313,8316,8319,8322,8325,8328,8331,8334,8337,8340,8343,8346,8349,8352,8355,8358,8361,8364,8367,8370,8371,8379,8387,8388,8401,8411,8415,8420,8425,8429,8432,8436,8440,8443,8447,8450,8454,8459,8464,8467,8474,8478,8482,8491,8496,8501,8502,8506,8509,8513,8526,8531,8539,8543,8547,8564,8568,8573,8591,8598,8602,8632,8635,8638,8641,8644,8647,8650,8669,8675,8683,8690,8702,8710,8715,8723,8727,8745,8752,8768,8772,8780,8783,8788,8789,8790,8791,8795,8799,8803,8807,8842,8845,8849,8853,8887,8890,8894,8898,8907,8913,8916,8926,8930,8931,8938,8942,8949,8950,8951,8954,8959,8964,8965,8969,8984,9003,9007,9008,9020,9030,9031,9043,9048,9072,9075,9081,9084,9093,9101,9105,9108,9111,9114,9118,9121,9138,9142,9145,9160,9163,9171,9176,9183,9188,9189,9194,9195,9201,9207,9213,9245,9256,9273,9280,9284,9287,9300,9309,9313,9318,9322,9326,9330,9334,9338,9342,9346,9351,9354,9366,9371,9380,9383,9390,9391,9395,9404,9410,9414,9415,9419,9440,9446,9450,9454,9455,9473,9474,9475,9476,9477,9482,9485,9486,9492,9493,9505,9517,9524,9525,9530,9535,9536,9540,9554,9559,9565,9571,9577,9582,9588,9594,9595,9601,9616,9621,9630,9639,9642,9656,9661,9672,9676,9685,9694,9695,9702,9710,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370", + "endColumns": "55,48,54,55,59,60,64,54,49,49,52,57,47,68,47,70,71,71,72,66,48,53,36,50,59,46,55,48,57,53,60,55,50,59,55,62,48,55,55,49,58,54,61,46,53,55,51,54,53,53,53,48,57,53,56,55,46,52,55,59,62,58,61,49,53,53,47,56,52,55,53,55,62,61,55,59,52,60,78,80,71,78,79,75,77,68,75,76,70,72,75,77,68,75,76,63,70,71,50,52,54,66,52,51,49,57,64,47,50,66,65,57,68,57,68,69,72,73,67,66,69,65,72,59,75,59,59,74,67,65,67,59,58,56,65,61,56,67,72,69,61,60,67,61,69,68,55,58,61,61,66,56,60,60,60,60,55,55,55,55,57,57,57,57,56,56,56,56,58,58,57,82,82,72,53,68,55,80,80,70,9,52,57,57,57,45,59,53,69,69,64,65,64,67,68,67,9,52,58,57,51,49,51,45,49,55,46,57,57,61,62,61,58,59,64,65,64,61,61,61,61,61,61,65,66,65,62,63,62,67,60,61,61,62,63,62,63,77,58,65,79,60,52,57,50,44,60,63,58,61,73,70,65,73,68,70,72,70,67,72,75,69,77,67,65,60,68,63,65,67,65,62,67,70,64,72,62,80,63,65,69,69,69,69,66,56,57,58,59,58,58,58,58,58,58,58,58,58,58,59,60,61,60,60,60,60,60,60,59,60,60,59,60,60,60,60,60,60,60,60,60,60,60,67,68,69,68,68,68,68,68,68,68,68,68,68,59,60,61,60,60,60,60,60,60,60,60,60,60,61,62,63,62,62,62,62,62,62,62,62,62,62,60,61,62,61,61,61,61,61,61,61,61,61,61,56,85,79,89,94,91,91,89,82,92,86,96,90,100,86,102,88,98,91,99,83,93,87,97,82,90,93,98,101,97,99,86,99,85,95,87,80,90,95,92,92,90,84,93,88,97,92,101,87,103,90,99,92,100,84,94,88,98,84,91,94,99,102,98,102,88,100,86,96,87,95,91,99,89,97,84,88,88,92,86,90,65,75,68,78,72,79,79,76,67,77,75,70,80,72,82,74,84,72,80,80,73,83,69,77,69,79,77,71,81,69,76,79,84,87,83,86,73,77,77,70,80,90,82,95,97,106,64,65,52,75,65,86,75,75,64,54,53,78,77,72,64,62,65,70,70,69,61,68,65,59,66,66,55,50,52,51,53,70,62,58,61,58,72,66,69,59,62,74,71,95,70,55,70,56,56,65,63,70,56,52,62,51,57,66,68,65,58,82,58,56,66,69,73,61,68,69,98,96,98,85,85,80,74,88,90,83,58,45,65,56,66,56,81,64,65,122,83,120,64,61,97,73,82,88,63,78,73,61,95,64,58,55,55,59,106,46,59,60,63,60,59,57,42,48,51,50,51,48,48,64,65,59,60,55,58,48,47,57,56,101,56,74,47,50,61,64,51,73,62,62,67,49,61,59,56,59,48,67,105,101,68,70,55,48,99,70,109,90,81,97,55,100,109,98,62,105,76,111,126,111,126,69,113,130,96,67,117,102,117,60,73,66,104,121,73,66,109,98,72,96,121,117,117,60,121,116,67,105,101,79,70,95,66,73,73,85,89,77,76,99,70,120,120,63,124,73,123,123,66,108,127,111,78,77,100,70,121,121,64,125,111,105,67,98,103,62,65,83,112,112,117,77,71,135,135,84,139,137,137,141,81,85,76,72,108,110,127,127,131,129,129,133,88,61,95,66,116,120,96,81,86,86,130,130,134,76,76,110,113,73,108,111,66,72,64,101,95,103,67,64,93,71,109,105,72,90,101,102,94,106,104,121,121,125,58,57,123,123,127,117,117,121,85,96,133,133,79,137,131,131,135,74,75,102,73,112,80,56,60,58,59,57,60,57,49,48,66,58,58,48,70,83,69,70,79,68,62,67,65,67,64,65,76,77,105,105,95,128,88,126,65,69,85,65,82,73,97,95,95,97,108,94,88,61,59,64,56,80,53,56,96,109,60,114,120,94,91,92,55,58,48,91,48,53,53,53,53,53,54,109,109,107,109,109,109,109,107,105,103,103,103,94,94,92,92,103,105,103,103,92,92,92,92,107,105,105,105,96,94,94,94,105,105,105,105,97,94,95,96,64,103,57,63,60,61,59,64,61,67,57,62,62,66,74,72,65,51,52,51,56,83,94,84,80,79,76,78,76,73,73,70,79,71,74,64,60,59,74,73,72,69,71,69,72,63,69,45,68,51,84,82,56,65,66,65,80,74,55,52,60,57,49,48,48,48,61,51,44,80,50,53,52,53,50,48,65,50,60,60,61,49,40,76,58,58,58,60,55,55,66,60,64,54,64,68,67,77,68,59,70,73,64,71,69,66,83,68,66,69,62,66,67,82,78,89,76,67,66,77,56,56,67,65,55,59,58,53,49,49,47,61,50,72,79,79,63,66,70,57,60,65,58,66,59,59,62,67,60,66,77,69,48,56,68,60,87,87,87,87,86,86,86,86,57,73,69,55,70,64,61,74,72,89,65,65,60,63,61,57,70,82,58,70,65,64,60,58,70,65,64,82,75,74,80,59,68,69,68,54,55,55,60,57,55,58,53,54,61,56,93,68,100,50,69,62,55,57,58,53,85,83,69,68,69,114,120,66,66,74,66,58,53,53,53,52,51,73,136,139,48,49,49,47,55,57,61,54,57,70,63,58,61,65,65,42,43,44,42,50,46,44,50,50,50,50,47,65,61,62,71,56,53,54,57,54,58,55,68,68,68,69,62,62,62,62,64,64,64,64,62,63,63,63,50,77,77,70,71,72,71,65,65,67,67,65,66,73,62,56,59,64,66,64,56,60,57,103,109,108,103,77,64,66,65,69,46,51,49,56,12,149,130,183,177,237,188,168,97,114,84,78,11,64,88,156,156,152,153,58,186,95,89,95,89,165,122,122,169,105,114,114,101,105,116,114,81,172,167,147,158,154,172,116,116,167,111,113,171,175,157,132,111,145,151,131,142,121,177,135,95,135,94,166,92,91,186,11,11,11,181,316,181,181,189,231,189,176,161,156,109,182,136,203,183,183,159,157,183,226,202,170,219,221,154,199,183,102,189,140,164,170,199,203,201,164,204,198,198,196,90,148,149,83,148,144,151,140,165,160,77,300,165,154,101,11,163,185,222,124,10,10,10,10,61,10,10,10,10,10,10,10,10,10,84,120,98,10,96,116,86,122,100,10,98,118,92,106,10,106,10,120,10,10,99,104,118,10,146,118,10,132,10,10,111,10,124,10,120,10,120,132,146,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,136,90,10,10,10,10,108,118,10,10,10,10,10,94,10,10,10,10,10,10,121,10,10,10,10,10,10,10,10,10,10,10,10,10,72,86,84,98,111,105,122,131,122,129,123,132,130,124,116,119,131,127,113,117,112,120,10,10,10,10,10,10,10,119,119,107,109,111,107,109,10,10,151,10,100,10,10,10,10,10,10,10,10,10,10,10,10,10,144,121,134,10,10,10,10,10,10,10,10,10,10,91,10,10,94,10,93,88,10,88,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,105,107,105,111,113,111,113,115,113,107,109,107,10,10,10,10,107,109,107,113,10,10,115,10,10,10,10,10,10,10,121,10,10,121,10,10,10,10,10,10,10,10,75,111,89,10,10,107,10,107,75,111,89,101,107,107,99,107,84,10,103,127,86,10,77,113,91,10,10,109,10,109,83,10,97,107,93,129,107,121,135,107,119,133,121,127,141,125,139,125,117,131,97,109,10,111,117,10,115,10,10,95,10,109,123,137,109,121,10,123,129,10,127,10,10,10,10,10,10,67,83,103,10,10,10,10,10,10,10,10,115,10,10,10,10,10,10,10,10,10,10,10,113,119,115,93,10,98,117,100,10,10,10,10,10,10,10,10,10,75,10,10,10,10,10,10,10,10,10,10,10,10,111,10,10,10,10,10,10,10,10,10,83,103,10,10,10,10,10,10,10,10,10,137,10,113,137,111,123,10,10,10,144,92,91,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,99,89,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,152,144,142,69,10,10,10,10,115,10,121,111,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,111,10,10,123,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,139,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,87,107,107,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,123,10,10,10,102,129,10,10,10,139,10,10,10,10,129,10,10,145,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,78,10,104,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,158,10,10,10,10,157,10,10,10,10,10,141,10,105,129,137,123,10,10,99,10,113,10,10,10,123,10,10,133,10,10,10,10,10,10,10,10,10,103,10,10,10,10,10,10,10,10,10,10,10,10,119,10,10,94,92,62,81,92,92,86,97,90,90,87,83,95,99,105,102,100,103,105,98,105,101,106,108,110,130,119,115,117,98,106,115,118,127,88,94,76,88,90,92,73,96,94,97,98,103,95,101,102,99,102,84,100,97,89,94,86,105,101,93,90,93,75,91,88,102,110,82,85,94,96,95,87,100,100,102,105,97,96,94,97,102,99,102,104,117,115,94,92,84,95,93,91,82,103,104,99,100,104,99,100,98,101,93,106,101,102,92,95,101,102,95,101,102,96,102,97,103,104,96,107,113,114,107,113,114,101,104,107,109,115,116,94,96,98,104,105,98,104,105,99,105,100,106,118,98,104,101,101,99,102,94,103,84,103,103,97,103,105,97,104,97,112,93,88,88,82,90,82,97,89,95,88,93,87,95,84,107,100,100,97,105,90,98,96,97,95,92,109,97,94,109,91,99,98,86,103,104,98,106,106,98,108,91,110,110,110,103,114,115,126,119,94,94,96,98,91,98,91,98,85,93,102,95,102,95,102,96,97,102,92,89,100,82,90,84,91,102,94,95,92,93,78,106,90,98,92,102,103,100,100,103,93,103,103,112,105,105,107,116,100,107,99,102,104,106,95,78,89,83,91,72,91,88,91,84,96,92,94,98,96,90,90,91,94,106,107,101,96,96,92,86,83,96,96,92,86,90,98,98,94,88,80,98,103,96,104,96,83,98,103,96,104,96,97,100,105,98,106,98,98,90,88,88,81,92,90,110,100,99,111,112,97,107,93,99,88,91,110,109,94,115,125,125,118,127,124,124,117,126,108,108,112,122,122,115,124,96,107,121,115,115,108,87,100,88,100,86,87,96,91,105,99,75,76", + "endOffsets": "541,776,1235,1394,1454,1515,1580,1635,1785,1835,1888,1946,1994,2114,2463,2534,2606,2678,2751,2818,2867,2921,2958,3009,3069,3116,3172,3221,3279,3333,3394,3450,3501,3561,3617,3680,3729,3785,3841,3891,3950,4005,4067,4114,4168,4224,4276,4331,4385,4439,4493,4542,4600,4654,4711,4767,4814,4867,4923,4983,5046,5105,5167,5217,5271,5325,5373,5430,5483,5539,6161,6217,7155,7265,7321,7381,7434,7495,7574,7655,7727,7806,7886,7962,8040,8109,8185,8262,8333,8406,8482,8560,8629,8705,8782,8846,8917,8989,11481,11579,11634,11750,11803,11855,11905,11963,12028,12076,12127,19084,19150,19208,19277,19335,19404,19474,19547,19621,19689,19756,19826,19892,19965,20025,20101,20161,20221,20296,20364,20430,20498,20558,20617,20674,20740,20802,20859,20927,21000,21070,21132,21193,21261,21323,21393,21462,21518,21577,21639,21701,21768,21825,21886,21947,22008,22069,22125,22181,22237,22293,22351,22409,22467,22525,22582,22639,22696,22753,22812,22871,22929,23012,23095,23168,23222,23291,23347,23428,23509,23580,23709,23968,24026,24084,25249,25796,25856,25910,25980,26050,26115,26181,26246,26314,26383,26451,26581,26634,26693,26751,26803,26899,26951,26997,27047,27103,27150,27255,27313,27375,27438,27500,27559,27619,27684,27750,27815,27877,27939,28001,28063,28125,28187,28253,28320,28386,28449,28513,28576,28644,28705,28767,28829,28892,28956,29019,29083,29161,29220,29286,29366,29427,29480,29689,29740,30167,30228,30698,30757,31952,34698,34769,34835,34909,34978,35049,35122,35193,35261,35334,35410,35480,35558,35626,35692,35753,35822,35886,35952,36020,36086,36149,36217,36288,36353,36426,36489,36570,36634,36700,36770,36840,36910,36980,37047,38062,38120,38179,38239,38298,38357,38416,38475,38534,38593,38652,38711,38770,38829,38889,38950,39012,39073,39134,39195,39256,39317,39378,39438,39499,39560,39620,39681,39742,39803,39864,39925,39986,40047,40108,40169,40230,40291,40359,40428,40498,40567,40636,40705,40774,40843,40912,40981,41050,41119,41188,41248,41309,41371,41432,41493,41554,41615,41676,41737,41798,41859,41920,41981,42043,42106,42170,42233,42296,42359,42422,42485,42548,42611,42674,42737,42800,42861,42923,42986,43048,43110,43172,43234,43296,43358,43420,43482,43544,43606,43663,43749,43829,43919,44014,44106,44198,44288,44371,44464,44551,44648,44739,44840,44927,45030,45119,45218,45310,45410,45494,45588,45676,45774,45857,45948,46042,46141,46243,46341,46441,46528,46628,46714,46810,46898,46979,47070,47166,47259,47352,47443,47528,47622,47711,47809,47902,48004,48092,48196,48287,48387,48480,48581,48666,48761,48850,48949,49034,49126,49221,49321,49424,49523,49626,49715,49816,49903,50000,50088,50184,50276,50376,50466,50564,50649,50738,50827,50920,51007,51098,51836,51912,51981,52060,52133,52213,52293,52370,52438,52516,52592,52663,52744,52817,52900,52975,53060,53133,53214,53295,53369,53453,53523,53601,53671,53751,53829,53901,53983,54053,54130,54210,54295,54383,54467,54554,54628,54706,54784,54855,54936,55027,55110,55206,55304,55411,55476,55542,55595,55671,55737,55824,55900,55976,63475,63700,64294,64373,64451,64524,64589,64652,64718,64789,64860,64930,64992,65061,65127,65187,65254,65321,65377,65428,65481,65533,65587,65658,65721,65780,65842,65901,65974,66041,66111,66171,66234,66309,66381,66477,66548,66604,66675,66732,66789,66855,66919,66990,67047,67100,67163,67215,67273,67340,68579,68645,68704,68787,68846,68903,68970,69040,69114,69176,69245,69315,69414,69511,69610,69696,69782,69863,69938,70027,70118,70202,70261,70307,70373,70430,70497,70554,70636,70701,70767,70890,70974,71095,71160,71222,71320,71394,71477,71566,71630,71709,71783,71845,71941,72006,72065,72121,72177,72237,72344,72391,72451,72512,72576,72637,72697,72755,72798,72847,72899,72950,73002,73051,73100,73165,73231,73291,73352,73408,73467,73516,73564,73622,73679,73781,73838,73913,73961,74012,74074,74139,74191,74265,74328,74391,74459,74509,74571,74631,74688,74748,74797,74865,74971,75073,75142,75213,75269,75318,75418,75489,75599,75690,75772,75870,75926,76027,76137,76236,76299,76405,76482,76594,76721,76833,76960,77030,77144,77275,77372,77440,77558,77661,77779,77840,77914,77981,78086,78208,78282,78349,78459,78558,78631,78728,78850,78968,79086,79147,79269,79386,79454,79560,79662,79742,79813,79909,79976,80050,80124,80210,80300,80378,80455,80555,80626,80747,80868,80932,81057,81131,81255,81379,81446,81555,81683,81795,81874,81952,82053,82124,82246,82368,82433,82559,82671,82777,82845,82944,83048,83111,83177,83261,83374,83487,83605,83683,83755,83891,84027,84112,84252,84390,84528,84670,84752,84838,84915,84988,85097,85208,85336,85464,85596,85726,85856,85990,86079,86141,86237,86304,86421,86542,86639,86721,86808,86895,87026,87157,87292,87369,87446,87557,87671,87745,87854,87966,88033,88106,88171,88273,88369,88473,88541,88606,88700,88772,88882,88988,89061,89152,89254,89357,89452,89559,89664,89786,89908,90034,90093,90151,90275,90399,90527,90645,90763,90885,90971,91068,91202,91336,91416,91554,91686,91818,91954,92029,92105,92208,92282,92395,92476,92533,92594,92653,92713,92771,92832,92890,92940,92989,93056,93115,93174,93223,93294,93378,93448,93519,93599,93668,93731,93799,93865,93933,93998,94064,94141,94219,94325,94431,94527,94656,94745,94872,94938,95008,95094,95160,95243,95317,95415,95511,95607,95705,95814,95909,95998,96060,96120,96185,96242,96323,96377,96434,96531,96641,96702,96817,96938,97033,97125,97218,97274,97333,97382,97474,97523,97577,97631,97685,97739,97793,97848,97958,98068,98176,98286,98396,98506,98616,98724,98830,98934,99038,99142,99237,99332,99425,99518,99622,99728,99832,99936,100029,100122,100215,100308,100416,100522,100628,100734,100831,100926,101021,101116,101222,101328,101434,101540,101638,101733,101829,101926,101991,102095,102153,102217,102278,102340,102400,102465,102527,102595,102653,102716,102779,102846,102921,102994,103060,103112,103165,103217,103274,103358,103453,103538,103619,103699,103776,103855,103932,104006,104080,104151,104231,104303,104378,104443,104504,104564,104639,104713,104786,104856,104928,104998,105071,105135,105205,105251,105320,105372,105457,105540,105597,105663,105730,105796,105877,105952,106008,106061,106122,106180,106230,106279,106328,106377,106439,106491,106536,106617,106668,106722,106775,106829,106880,106929,106995,107046,107107,107168,107230,107280,107321,107398,107457,107516,107575,107636,107692,107748,107815,107876,107941,107996,108061,108130,108198,108276,108345,108405,108476,108550,108615,108687,108757,108824,108908,108977,109044,109114,109177,109244,109312,109395,109474,109564,109641,109709,109776,109854,109911,109968,110036,110102,110158,110218,110277,110331,110381,110431,110479,110541,110592,110665,110745,110825,110889,110956,111027,111085,111146,111212,111271,111338,111398,111458,111521,111589,111650,111717,111795,111865,111914,111971,112040,112101,112189,112277,112365,112453,112540,112627,112714,112801,112859,112933,113003,113059,113130,113195,113257,113332,113405,113495,113561,113627,113688,113752,113814,113872,113943,114026,114085,114156,114222,114287,114348,114407,114478,114544,114609,114692,114768,114843,114924,114984,115053,115123,115192,115247,115303,115359,115420,115478,115534,115593,115647,115702,115764,115821,115915,115984,116085,116136,116206,116269,116325,116383,116442,116496,116582,116666,116736,116805,116875,116990,117111,117178,117245,117320,117387,117446,117500,117554,117608,117661,117713,117787,119355,119495,122240,122290,122340,122429,122485,122543,122605,122660,122718,122789,122853,122912,122974,123040,123106,123397,123543,123588,123631,124763,124810,124855,124906,124957,125008,125059,125593,126101,126163,126343,126415,126540,126594,126649,126707,126762,126821,126877,126946,127015,127084,127154,127217,127280,127343,127406,127471,127536,127601,127666,127729,127793,127857,127921,127972,128050,128128,128199,128271,128344,128416,128482,128548,128616,128684,128750,128817,128891,128954,129011,129071,129136,129203,129268,129325,129386,129444,129548,129658,129767,129871,129949,130014,130081,130147,130217,130264,130316,130366,130423,130813,133303,134339,134523,134701,134939,135128,135297,137776,137891,137976,138055,152901,153046,153517,153674,153831,154132,154286,154345,156684,156780,156870,156966,157056,157222,157345,157468,157638,157744,157859,157974,158076,158182,158299,158414,158911,159084,159252,159400,159559,159714,159887,160004,160121,160289,160401,160515,160687,160863,161021,161154,161266,161412,161564,161696,161839,161961,162139,162275,162371,162507,162602,162769,162862,162954,163141,163297,163475,163639,163821,164138,164320,164502,164692,164924,165114,165291,165453,165610,165720,165903,166040,166244,166428,166612,166772,166930,167114,167341,167544,167715,167935,168157,168312,168512,168696,168799,168989,169130,169295,169466,169666,169870,170072,170237,170442,170641,170840,171037,171128,171277,171427,171511,171660,171805,171957,172098,172264,172425,174877,175178,175344,175499,175601,181715,181942,182128,184237,184362,187041,187313,187591,187836,187898,188183,191477,191933,192442,203218,203732,204169,204603,205046,209028,209149,209248,209653,209750,209867,209954,210077,210178,210584,210683,210802,210895,211002,211345,211452,211697,211818,212227,212475,212575,212680,212799,213308,213455,213574,213825,213958,214373,214627,214739,220089,220214,220622,220743,220971,221092,221225,221372,242094,242586,263057,263481,284248,284742,305258,305684,310525,315942,320033,325464,330206,335583,339567,343559,348950,349497,349930,350686,350916,351159,352326,353255,401400,401984,402457,403887,404631,405824,406878,407356,407649,408032,409547,410312,411455,411896,412337,412933,413207,413618,414634,414812,415565,415702,415793,417987,418253,418575,418785,418894,419013,419197,420315,420785,421536,424119,424214,424908,425136,425392,425651,426227,426581,426703,426842,427134,427394,428322,428608,429011,429413,429756,429968,430169,430382,430671,430956,441631,441718,441803,441902,446584,446690,446813,446945,447068,447198,447322,447455,447586,447711,447828,447948,448080,448208,448322,448440,448553,448674,448862,449049,449230,449413,449597,449762,449944,450064,450184,450292,450402,450514,450622,450732,450897,451063,451215,451380,451481,451601,451772,451933,452096,452257,452424,452543,452660,452840,453022,453203,453386,453541,453686,453808,453943,454106,454299,454425,454577,454719,454889,455045,455217,455508,462175,462267,462440,462602,462697,462866,462960,463049,463292,463381,463674,464090,464510,464931,465357,465774,466190,466607,467025,467439,467909,468382,468854,469265,469736,470208,470398,470604,470710,470818,470924,471036,471150,471262,471376,471492,471606,471714,471824,471932,472194,472573,472977,473124,473232,473342,473450,473564,473973,474387,474503,474921,475162,475592,476027,476437,476859,477269,477391,477800,478216,478338,478556,478740,483374,483718,483798,484154,484304,484448,484524,484636,484726,484988,485253,485361,485513,485621,485697,485809,485899,486001,486109,486217,486317,486425,486510,486676,486780,486908,486995,487162,487240,487354,487446,487710,487977,488087,488240,488350,488434,488823,488921,489029,489123,489253,489361,489483,489619,489727,489847,489981,490103,490231,490373,490499,490639,490765,490883,491015,491113,491223,491523,491635,491753,492217,492333,492636,492762,492858,493259,493369,493493,493631,493741,493863,494175,494299,494429,494905,495033,495348,495486,495648,495864,496020,496224,497705,497789,497893,498096,498285,498486,498679,498884,499197,499409,499575,499691,499937,500153,500466,500892,501354,501591,501743,502003,502147,502289,505521,505635,505755,505871,505965,506286,506385,506503,506604,506883,507168,507447,507729,507982,508241,508494,508750,509174,509250,512500,513855,514299,516153,516728,516936,517946,518326,518492,518633,523653,524079,524191,524326,524479,524676,524847,525030,525205,525392,525664,525822,525906,526010,526497,527053,527211,527430,527661,527884,528119,528341,528607,528745,529344,529458,529596,529708,529832,530403,530898,531444,531589,531682,531774,533701,534271,534569,534758,534964,535157,535367,536251,536396,536788,536946,537163,537424,545651,546526,547146,547343,548291,549056,549179,549952,550173,550373,552350,552450,552540,553226,553979,554744,555507,556282,557495,557660,559273,559594,560657,560867,561037,561607,562502,563135,563301,564787,565403,565639,565860,566818,567083,567348,567595,568009,568245,569530,569979,570166,570415,570657,570833,571074,571307,571532,572127,572602,573126,573387,574738,575213,576439,576909,577957,578409,578653,579110,580355,580838,580988,581543,581995,582395,582548,582693,582836,582906,583334,583622,584126,584635,584751,585653,585775,585887,586064,586330,586600,586866,587134,587390,587650,587906,588164,588416,588672,588924,589178,589410,589646,589898,590154,590406,590660,590892,591126,591238,591890,592345,592469,593561,594376,594572,594896,595285,595637,595878,596092,596391,596583,596898,597105,597451,597751,598152,598371,598784,599021,599391,600115,600470,600739,600879,601133,601277,601554,602546,602955,603587,603933,604301,605375,605738,606138,607646,608231,608549,611084,611278,611496,611722,611934,612133,612340,613544,613839,614396,614786,615418,615895,616140,616627,616873,618069,618466,619472,619694,620117,620308,620687,620775,620883,620991,621304,621629,621948,622279,624982,625170,625431,625680,628264,628456,628721,628974,629506,629914,630113,630697,630932,631056,631468,631682,632084,632187,632317,632492,632744,632940,633080,633274,634285,635354,635642,635772,636549,637206,637352,638058,638296,639836,639986,640403,640568,641254,641724,641920,642011,642095,642239,642473,642640,643568,643854,644014,644629,644788,645116,645343,645855,646217,646296,646635,646740,647105,647476,647837,649711,650340,651416,651840,652093,652245,653293,654030,654233,654479,654726,654944,655186,655507,655771,656076,656299,656610,656799,657514,657783,658277,658503,658943,659102,659386,660131,660496,660801,660959,661197,662516,662914,663142,663362,663504,664794,664900,665030,665168,665292,665580,665749,665849,666134,666248,667131,667886,668325,668449,668695,668888,669022,669213,669992,670210,670501,670780,671097,671319,671614,671897,672001,672342,673158,673474,674035,674541,674746,675532,675937,676598,676787,677338,677904,678024,678426,678960,814558,814651,814714,814796,814889,814982,815069,815167,815258,815349,815437,815521,815617,815717,815823,815926,816027,816131,816237,816336,816442,816544,816651,816760,816871,817002,817122,817238,817356,817455,817562,817678,817797,817925,818014,818109,818186,818275,818366,818459,818533,818630,818725,818823,818922,819026,819122,819224,819327,819427,819530,819615,819716,819814,819904,819999,820086,820192,820294,820388,820479,820573,820649,820741,820830,820933,821044,821127,821213,821308,821405,821501,821589,821690,821791,821894,822000,822098,822195,822290,822388,822491,822591,822694,822799,822917,823033,823128,823221,823306,823402,823496,823588,823671,823775,823880,823980,824081,824186,824286,824387,824486,824588,824682,824789,824891,824994,825087,825183,825285,825388,825484,825586,825689,825786,825889,825987,826091,826196,826293,826401,826515,826630,826738,826852,826967,827069,827174,827282,827392,827508,827625,827720,827817,827916,828021,828127,828226,828331,828437,828537,828643,828744,828851,828970,829069,829174,829276,829378,829478,829581,829676,829780,829865,829969,830073,830171,830275,830381,830479,830584,830682,830795,830889,830978,831067,831150,831241,831324,831422,831512,831608,831697,831791,831879,831975,832060,832168,832269,832370,832468,832574,832665,832764,832861,832959,833055,833148,833258,833356,833451,833561,833653,833753,833852,833939,834043,834148,834247,834354,834461,834560,834669,834761,834872,834983,835094,835198,835313,835429,835556,835676,835771,835866,835963,836062,836154,836253,836345,836444,836530,836624,836727,836823,836926,837022,837125,837222,837320,837423,837516,837606,837707,837790,837881,837966,838058,838161,838256,838352,838445,838539,838618,838725,838816,838915,839008,839111,839215,839316,839417,839521,839615,839719,839823,839936,840042,840148,840256,840373,840474,840582,840682,840785,840890,840997,841093,841172,841262,841346,841438,841511,841603,841692,841784,841869,841966,842059,842154,842253,842350,842441,842532,842624,842719,842826,842934,843036,843133,843230,843323,843410,843494,843591,843688,843781,843868,843959,844058,844157,844252,844341,844422,844521,844625,844722,844827,844924,845008,845107,845211,845308,845413,845510,845608,845709,845815,845914,846021,846120,846219,846310,846399,846488,846570,846663,846754,846865,846966,847066,847178,847291,847389,847497,847591,847691,847780,847872,847983,848093,848188,848304,848430,848556,848675,848803,848928,849053,849171,849298,849407,849516,849629,849752,849875,849991,850116,850213,850321,850443,850559,850675,850784,850872,850973,851062,851163,851250,851338,851435,851527,851633,851733,851809,851886" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/876d8563d3a0673414de11fb9eb4d2a1/transformed/activity-1.8.0/res/values/values.xml", + "from": { + "startLines": "-1,-1", + "startColumns": "-1,-1", + "startOffsets": "-1,-1" + }, + "to": { + "startLines": "1853,1900", + "startColumns": "4,4", + "startOffsets": "123317,125686", + "endColumns": "41,59", + "endOffsets": "123354,125741" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/30d4e98469639d69ad240eb0afa9d087/transformed/cardview-1.0.0/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "35,653,654,655,656,1063,1064,1065,2603,5958,5960,5963", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "1640,33709,33770,33832,33894,63480,63539,63596,189939,424219,424283,424409", + "endLines": "35,653,654,655,656,1063,1064,1065,2609,5959,5962,5965", + "endColumns": "51,60,61,61,63,58,56,53,12,12,12,12", + "endOffsets": "1687,33765,33827,33889,33953,63534,63591,63645,190348,424278,424404,424532" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values/values.xml", + "from": { + "startLines": "-1,-1", + "startColumns": "-1,-1", + "startOffsets": "-1,-1" + }, + "to": { + "startLines": "1912,2085", + "startColumns": "4,4", + "startOffsets": "126420,140027", + "endColumns": "67,166", + "endOffsets": "126483,140189" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/9a42c6bba20e3615051551280bf9b220/transformed/startup-runtime-1.1.1/res/values/values.xml", + "from": { + "startLines": "-1", + "startColumns": "-1", + "startOffsets": "-1" + }, + "to": { + "startLines": "2008", + "startColumns": "4", + "startOffsets": "133025", + "endColumns": "82", + "endOffsets": "133103" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/347545d553f2245dd1a387759374950f/transformed/coordinatorlayout-1.1.0/res/values/values.xml", + "from": { + "startLines": "-1,-1", + "startColumns": "-1,-1", + "startOffsets": "-1,-1" + }, + "to": { + "startLines": "109,9711", + "startColumns": "4,4", + "startOffsets": "5765,678965", + "endLines": "109,9713", + "endColumns": "60,12", + "endOffsets": "5821,679105" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/a8b802474834ad934ab806f5360c513e/transformed/transition-1.5.0/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "1826,1827,1849,1855,1856,1888,1889,1890,1891,1892,1893,1894,1895", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "121885,121925,123111,123402,123457,125099,125144,125198,125254,125306,125358,125407,125468", + "endColumns": "39,46,42,54,46,44,53,55,51,51,48,60,49", + "endOffsets": "121920,121967,123149,123452,123499,125139,125193,125249,125301,125353,125402,125463,125513" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values/colors.xml", + "from": { + "startLines": "-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,169,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "endColumns": "-1,54,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "endOffsets": "-1,219,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "700,701,712,713,714,968,969,970,971,972,973,974", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "37052,37109,37845,37902,37955,57112,57174,57239,57306,57365,57422,57494", + "endColumns": "56,54,56,52,54,61,64,66,58,56,71,64", + "endOffsets": "37104,37159,37897,37950,38005,57169,57234,57301,57360,57417,57489,57554" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values/themes.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "2574,2578,6769,6775,6781,6785,6790,6797", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "188188,188334,479173,479487,479806,480060,480371,480786", + "endLines": "2577,2581,6774,6780,6784,6789,6796,6802", + "endColumns": "12,12,12,12,12,12,12,12", + "endOffsets": "188329,188483,479482,479801,480055,480366,480781,481098" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values/values.xml", + "from": { + "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", + "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" + }, + "to": { + "startLines": "657,658,659,660,661,662,663,664,2077,2078,2079,2080,2081,2082,2083,2084,2086,2087,2088,2089,2090,2091,2092,2093,2094", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "33958,34048,34128,34218,34308,34388,34469,34549,138987,139092,139273,139398,139505,139685,139808,139924,140194,140382,140487,140668,140793,140968,141116,141179,141241", + "endColumns": "89,79,89,89,79,80,79,79,104,180,124,106,179,122,115,102,187,104,180,124,174,147,62,61,78", + "endOffsets": "34043,34123,34213,34303,34383,34464,34544,34624,139087,139268,139393,139500,139680,139803,139919,140022,140377,140482,140663,140788,140963,141111,141174,141236,141315" + } + } + ] + }, + { + "outputFile": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-mergeDebugResources-36:/values/values.xml", + "map": [ + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/6562528685bcf4f32771c81c31bdb251/transformed/recyclerview-1.3.2/res/values/values.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10", + "startColumns": "4,4,4,4,4,4,4,4,4", + "startOffsets": "55,111,170,218,274,349,425,497,563", + "endLines": "2,3,4,5,6,7,8,9,30", + "endColumns": "55,58,47,55,74,75,71,65,24", + "endOffsets": "106,165,213,269,344,420,492,558,1398" + }, + "to": { + "startLines": "508,1124,1125,1126,1134,1135,1136,1829,13177", + "startColumns": "4,4,4,4,4,4,4,4,4", + "startOffsets": "25699,67463,67522,67570,68237,68312,68388,122005,806977", + "endLines": "508,1124,1125,1126,1134,1135,1136,1829,13197", + "endColumns": "55,58,47,55,74,75,71,65,24", + "endOffsets": "25750,67517,67565,67621,68307,68383,68455,122066,807812" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/451be4cb7f62a323593f851d2cb28156/transformed/fragment-1.5.4/res/values/values.xml", + "from": { + "startLines": "2,3,4,5,10", + "startColumns": "4,4,4,4,4", + "startOffsets": "55,112,177,241,411", + "endLines": "2,3,4,9,13", + "endColumns": "56,64,63,24,24", + "endOffsets": "107,172,236,406,555" + }, + "to": { + "startLines": "1824,1859,1902,11941,11946", + "startColumns": "4,4,4,4,4", + "startOffsets": "121773,123581,125795,761513,761683", + "endLines": "1824,1859,1902,11945,11949", + "endColumns": "56,64,63,24,24", + "endOffsets": "121825,123641,125854,761678,761827" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/8c994b5da60099950ae0b0677f9a0925/transformed/lifecycle-viewmodel-2.6.2/res/values/values.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "49", + "endOffsets": "100" + }, + "to": { + "startLines": "1901", + "startColumns": "4", + "startOffsets": "125745", + "endColumns": "49", + "endOffsets": "125790" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values/strings.xml", + "from": { + "startLines": "85,84,83,2,124,126,123,125,76,127,128,26,25,110,162,208,204,205,32,33,167,37,36,166,35,34,75,20,21,22,179,132,111,38,39,80,81,129,77,364,368,367,68,69,165,362,363,366,70,71,360,365,261,108,109,27,246,242,247,240,248,249,252,250,251,241,239,245,244,243,337,336,339,340,338,329,330,331,332,327,333,335,334,328,279,280,265,267,266,254,263,262,260,255,256,253,225,222,221,220,224,219,214,223,216,278,273,275,274,277,276,217,215,218,235,270,264,308,306,309,307,310,305,257,259,326,324,325,297,282,286,281,299,302,301,303,300,284,296,285,292,294,291,293,298,289,290,288,287,295,283,258,230,231,229,227,226,228,269,268,271,272,213,304,212,236,234,233,232,211,120,121,377,74,116,113,114,112,115,78,88,57,203,202,201,200,199,23,361,24,58,18,19,186,168,59,16,93,140,375,17,138,137,143,185,15,136,56,190,188,189,187,210,209,5,89,90,86,87,161,160,131,60,65,67,61,164,163,64,62,66,63,348,345,344,350,358,354,356,357,346,355,343,353,347,359,342,341,349,352,351,374,103,102,101,139,8,176,175,177,372,371,369,373,370,97,95,96,118,119,99,98,91,100,173,172,171,169,170,196,155,158,156,157,149,153,152,151,148,147,154,146,145,150,159,42,40,41,4,142,141,105,376,79,104,7,174,9,10,82,206,207,46,44,49,55,54,47,48,43,45,52,51,53,50,12,73,3,117,6,323,318,317,316,320,322,321,313,314,315,319,312,311,197,178,198,133,135,134,14,11,94,92,144,107,184,195,192,194,193,191,122,72,30,29,28,238,31,180,181,183,182,130,13,106,237", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "6023,5955,5883,55,8919,9081,8854,9024,5359,9137,9203,1754,1691,7810,12059,15108,14824,14874,2271,2349,12365,2780,2641,12303,2506,2414,5283,1255,1317,1400,13244,9471,7869,2888,2963,5687,5746,9272,5493,29590,29800,29722,4808,4859,12199,29474,29532,29678,4911,4977,29352,29632,19960,7697,7748,1929,18379,18036,18451,17868,18785,18864,19146,18986,19062,17958,17796,18267,18197,18104,27451,27380,27575,27652,27514,26729,26790,26852,26939,26581,27169,27316,27240,26668,21696,21776,20353,20540,20438,19309,20178,20075,19793,19388,19474,19222,16244,16027,15964,15899,16169,15823,15469,16110,15662,21555,21127,21296,21207,21468,21380,15716,15609,15770,17382,20838,20274,24883,24535,24953,24816,25037,24446,19558,19717,26482,26245,26315,23754,22114,22423,22031,23938,24186,24104,24282,24019,22244,23654,22314,23168,23331,23082,23253,23828,22795,22887,22704,22614,23536,22178,19638,16686,16793,16600,16414,16325,16495,20740,20649,20918,21004,15409,24374,15355,17479,17154,17047,16968,15283,8636,8708,30681,5235,8323,8032,8112,7941,8171,5553,6228,4165,14771,14720,14667,14610,14555,1512,29416,1598,4240,1084,1161,13777,12429,4295,954,6537,10049,30412,1020,9885,9805,10262,13731,900,9753,4107,13996,13890,13943,13829,15206,15154,243,6309,6363,6097,6162,11991,11888,9420,4363,4631,4753,4418,12156,12115,4561,4463,4684,4514,28437,28171,28071,28576,29212,28967,29085,29151,28235,29039,27988,28900,28308,29282,27793,27729,28508,28741,28679,30326,7351,7299,7226,9971,520,13005,12945,13129,30077,30002,29850,30204,29907,6878,6715,6793,8501,8575,7052,6960,6434,7135,12772,12714,12638,12473,12573,14326,11602,11770,11656,11721,10746,11335,11165,11006,10677,10610,11489,10536,10466,10835,11829,3174,3028,3092,174,10184,10111,7490,30496,5620,7417,460,12845,561,605,5818,14939,15027,3402,3296,3638,4026,3951,3477,3559,3239,3348,3839,3783,3895,3719,716,5167,105,8403,402,26105,25744,25627,25517,25915,26041,25980,25328,25400,25458,25831,25180,25113,14422,13186,14492,9541,9681,9613,842,666,6626,6499,10338,7632,13646,14264,14122,14212,14166,14064,8777,5076,2134,2068,1999,17721,2204,13336,13411,13541,13485,9340,779,7556,17593", + "endColumns": "73,67,71,49,104,55,64,56,133,65,68,174,62,58,55,45,49,64,77,64,63,107,138,61,134,91,75,61,82,111,91,69,71,74,64,58,71,67,59,41,49,77,50,51,103,57,57,43,65,98,63,45,114,50,61,69,71,67,333,89,78,121,75,75,83,77,71,111,69,92,62,70,76,76,60,60,61,86,229,86,70,63,75,60,79,254,84,108,101,78,95,102,166,85,83,86,80,82,62,64,74,75,139,58,53,140,79,83,88,86,87,53,52,52,96,79,78,69,280,83,66,75,88,79,75,98,69,166,73,63,190,82,80,95,81,91,84,69,99,108,84,204,85,77,109,91,194,90,89,117,65,78,106,174,85,80,88,104,97,90,85,122,59,71,53,113,227,106,78,71,71,68,57,47,79,79,58,90,151,66,80,74,52,50,52,56,54,85,57,92,54,76,93,51,43,67,65,88,61,83,63,85,79,75,45,53,51,57,67,52,52,60,76,51,158,53,70,64,65,67,102,50,54,52,54,44,42,40,69,50,68,46,70,63,99,102,69,71,65,60,72,45,82,66,128,69,194,63,67,158,61,85,65,51,72,77,40,123,59,56,126,74,56,121,94,81,77,84,73,60,82,91,64,90,72,57,75,99,64,95,53,58,64,48,88,153,169,158,68,66,112,73,69,170,58,64,63,81,68,77,72,65,184,66,72,59,99,43,60,64,87,80,74,51,80,80,74,81,78,56,53,55,55,55,63,62,67,68,97,57,139,86,116,109,64,63,60,71,57,58,83,147,66,69,57,62,71,71,67,57,49,88,37,127,64,84,61,43,51,45,57,76,90,69,65,68,74,66,74,73,104,55,79,62,75,127", + "endOffsets": "6092,6018,5950,100,9019,9132,8914,9076,5488,9198,9267,1924,1749,7864,12110,15149,14869,14934,2344,2409,12424,2883,2775,12360,2636,2501,5354,1312,1395,1507,13331,9536,7936,2958,3023,5741,5813,9335,5548,29627,29845,29795,4854,4906,12298,29527,29585,29717,4972,5071,29411,29673,20070,7743,7805,1994,18446,18099,18780,17953,18859,18981,19217,19057,19141,18031,17863,18374,18262,18192,27509,27446,27647,27724,27570,26785,26847,26934,27164,26663,27235,27375,27311,26724,21771,22026,20433,20644,20535,19383,20269,20173,19955,19469,19553,19304,16320,16105,16022,15959,16239,15894,15604,16164,15711,21691,21202,21375,21291,21550,21463,15765,15657,15818,17474,20913,20348,24948,24811,25032,24878,25108,24530,19633,19788,26576,26310,26477,23823,22173,22609,22109,24014,24277,24181,24369,24099,22309,23749,22418,23248,23531,23163,23326,23933,22882,23077,22790,22699,23649,22239,19712,16788,16963,16681,16490,16409,16595,20833,20735,20999,21122,15464,24441,15404,17588,17377,17149,17042,15350,8703,8772,30734,5278,8398,8107,8166,8027,8318,5615,6304,4235,14819,14766,14715,14662,14605,1593,29469,1686,4290,1156,1250,13824,12468,4358,1015,6621,10106,30491,1079,9966,9880,10333,13772,949,9800,4160,14059,13938,13991,13885,15278,15201,397,6358,6429,6157,6223,12054,11986,9466,4413,4679,4803,4458,12194,12151,4626,4509,4748,4556,28503,28230,28166,28674,29277,29034,29146,29207,28303,29080,28066,28962,28432,29347,27983,27788,28571,28895,28736,30407,7412,7346,7294,10044,556,13124,13000,13181,30199,30072,29902,30321,29997,6955,6788,6873,8570,8631,7130,7047,6494,7221,12840,12767,12709,12568,12633,14417,11651,11824,11716,11765,10830,11484,11330,11160,10741,10672,11597,10605,10531,11001,11883,3234,3087,3169,238,10257,10179,7551,30676,5682,7485,515,12940,600,661,5878,15022,15103,3472,3343,3714,4102,4021,3554,3633,3291,3397,3890,3834,3946,3778,774,5230,169,8496,455,26240,25826,25739,25622,25975,26100,26036,25395,25453,25512,25910,25323,25175,14487,13239,14550,9608,9748,9676,895,711,6710,6532,10461,7692,13726,14321,14161,14259,14207,14117,8849,5162,2199,2129,2063,17791,2266,13406,13480,13641,13536,9415,837,7627,17716" + }, + "to": { + "startLines": "2004,2005,2006,2008,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2027,2028,2029,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2062,2063,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2094,2095,2096,2097,2098,2099,2100,2101,2102,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149,2150,2151,2152,2153,2154,2155,2156,2157,2158,2159,2160,2161,2162,2163,2164,2165,2166,2167,2168,2169,2170,2171,2172,2173,2174,2175,2176,2177,2178,2179,2180,2181,2182,2183,2184,2185,2186,2187,2188,2189,2190,2191,2192,2193,2194,2195,2196,2197,2198,2199,2200,2201,2202,2203,2204,2205,2206,2207,2208,2209,2210,2211,2212,2213,2214,2218,2220,2221,2222,2223,2227,2228,2232,2233,2234,2235,2236,2237,2238,2239,2240,2241,2242,2243,2244,2245,2246,2247,2248,2249,2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261,2262,2263,2264,2281,2282,2283,2284,2285,2376,2377,2378,2379,2380,2381,2382,2383,2384,2385,2386,2387,2388,2389,2390,2391,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2402,2403,2404,2405,2406,2407,2413,2414,2415,2416,2417,2418,2419,2420,2421,2422,2423,2424,2425,2426,2427,2428,2429,2430,2431,2432,2433,2434,2435,2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2473,2474,2475,2476,2477,2478,2479,2480,2481,2482,2483,2484,2485,2486,2491,2494,2495,2496,2497,2498,2499,2500,2501,2502,2503,2504,2505,2506,2507,2508,2509,2510,2511,2512,2513,2514,2515,2516,2517,2520,2521,2523,2524,2525,2526,2527,2528,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "132756,132830,132898,133053,133253,133358,133414,133479,133536,133670,133736,133805,133980,134043,134102,135247,135293,135343,135919,135997,136062,136126,136234,136373,136435,136570,136662,136738,136800,136883,136995,137087,137157,137229,137304,137369,137428,137500,137568,138005,138047,138097,138175,138226,138278,138382,138440,138498,138542,138608,138707,138771,138817,141265,141316,141378,141448,141520,141588,141922,142012,142091,142213,142289,142365,142449,142527,142599,142711,142781,142874,142937,143008,143085,143162,143223,143284,143346,143433,143663,143750,143821,143885,143961,144022,144102,144357,144442,144551,144653,144732,144828,144931,145098,145184,145268,145355,145436,145519,145582,145647,145722,145798,145938,145997,146051,146192,146272,146356,146445,146532,146620,146674,146727,146780,146877,146957,147036,147106,147387,147471,147538,147614,147703,147783,147859,147958,148028,148195,148269,148333,148524,148607,148688,148784,148866,148958,149043,149113,149213,149322,149407,149612,149698,149776,149886,149978,150173,150264,150354,150472,150538,150617,150724,150899,150985,151066,151155,151260,151358,151449,151535,151658,151718,151790,151844,151958,152186,152293,152372,152444,152516,152585,152643,152851,152996,153076,153135,153226,153781,153848,154295,154370,154423,154474,154527,154584,154639,154725,154783,154876,154931,155008,155102,155154,155198,155266,155332,155421,155483,155567,155631,155717,155797,155873,155919,155973,156025,156083,156151,156204,156257,156318,156395,158364,158523,158577,158648,158713,172375,172443,172546,172597,172652,172705,172760,172805,172848,172889,172959,173010,173079,173126,173197,173261,173361,173464,173534,173606,173672,173733,173806,173852,173935,174002,174131,174201,174396,174460,174528,174687,175551,175637,175703,175755,175828,175906,175947,176071,176131,176188,176315,176390,176447,176569,176664,176746,176824,176909,176983,177044,177127,177219,177284,177375,177448,177506,177582,177682,177747,177843,177897,177956,178021,178070,178159,178313,178483,178642,178711,178778,178891,178965,179035,179206,179265,179330,179394,179476,179545,179623,179696,179762,179947,180014,180087,180147,180247,180291,180352,180417,180505,180586,180661,180713,180794,180875,180950,181032,181111,181168,181222,181278,181334,181390,181665,182078,182146,182215,182313,182371,182511,182598,182715,182825,182890,182954,183015,183087,183145,183204,183288,183436,183503,183573,183631,183694,183766,183838,183906,184312,184362,184522,184560,184688,184753,184838,184900,184944,184996,185042,185100,185177,185268,185338,185404,185473,185548,185615,185690,185764,185869,185925,186005,186068,186144", + "endColumns": "73,67,71,49,104,55,64,56,133,65,68,174,62,58,55,45,49,64,77,64,63,107,138,61,134,91,75,61,82,111,91,69,71,74,64,58,71,67,59,41,49,77,50,51,103,57,57,43,65,98,63,45,114,50,61,69,71,67,333,89,78,121,75,75,83,77,71,111,69,92,62,70,76,76,60,60,61,86,229,86,70,63,75,60,79,254,84,108,101,78,95,102,166,85,83,86,80,82,62,64,74,75,139,58,53,140,79,83,88,86,87,53,52,52,96,79,78,69,280,83,66,75,88,79,75,98,69,166,73,63,190,82,80,95,81,91,84,69,99,108,84,204,85,77,109,91,194,90,89,117,65,78,106,174,85,80,88,104,97,90,85,122,59,71,53,113,227,106,78,71,71,68,57,47,79,79,58,90,151,66,80,74,52,50,52,56,54,85,57,92,54,76,93,51,43,67,65,88,61,83,63,85,79,75,45,53,51,57,67,52,52,60,76,51,158,53,70,64,65,67,102,50,54,52,54,44,42,40,69,50,68,46,70,63,99,102,69,71,65,60,72,45,82,66,128,69,194,63,67,158,61,85,65,51,72,77,40,123,59,56,126,74,56,121,94,81,77,84,73,60,82,91,64,90,72,57,75,99,64,95,53,58,64,48,88,153,169,158,68,66,112,73,69,170,58,64,63,81,68,77,72,65,184,66,72,59,99,43,60,64,87,80,74,51,80,80,74,81,78,56,53,55,55,55,63,62,67,68,97,57,139,86,116,109,64,63,60,71,57,58,83,147,66,69,57,62,71,71,67,57,49,88,37,127,64,84,61,43,51,45,57,76,90,69,65,68,74,66,74,73,104,55,79,62,75,127", + "endOffsets": "132825,132893,132965,133098,133353,133409,133474,133531,133665,133731,133800,133975,134038,134097,134153,135288,135338,135403,135992,136057,136121,136229,136368,136430,136565,136657,136733,136795,136878,136990,137082,137152,137224,137299,137364,137423,137495,137563,137623,138042,138092,138170,138221,138273,138377,138435,138493,138537,138603,138702,138766,138812,138927,141311,141373,141443,141515,141583,141917,142007,142086,142208,142284,142360,142444,142522,142594,142706,142776,142869,142932,143003,143080,143157,143218,143279,143341,143428,143658,143745,143816,143880,143956,144017,144097,144352,144437,144546,144648,144727,144823,144926,145093,145179,145263,145350,145431,145514,145577,145642,145717,145793,145933,145992,146046,146187,146267,146351,146440,146527,146615,146669,146722,146775,146872,146952,147031,147101,147382,147466,147533,147609,147698,147778,147854,147953,148023,148190,148264,148328,148519,148602,148683,148779,148861,148953,149038,149108,149208,149317,149402,149607,149693,149771,149881,149973,150168,150259,150349,150467,150533,150612,150719,150894,150980,151061,151150,151255,151353,151444,151530,151653,151713,151785,151839,151953,152181,152288,152367,152439,152511,152580,152638,152686,152926,153071,153130,153221,153373,153843,153924,154365,154418,154469,154522,154579,154634,154720,154778,154871,154926,155003,155097,155149,155193,155261,155327,155416,155478,155562,155626,155712,155792,155868,155914,155968,156020,156078,156146,156199,156252,156313,156390,156442,158518,158572,158643,158708,158774,172438,172541,172592,172647,172700,172755,172800,172843,172884,172954,173005,173074,173121,173192,173256,173356,173459,173529,173601,173667,173728,173801,173847,173930,173997,174126,174196,174391,174455,174523,174682,174744,175632,175698,175750,175823,175901,175942,176066,176126,176183,176310,176385,176442,176564,176659,176741,176819,176904,176978,177039,177122,177214,177279,177370,177443,177501,177577,177677,177742,177838,177892,177951,178016,178065,178154,178308,178478,178637,178706,178773,178886,178960,179030,179201,179260,179325,179389,179471,179540,179618,179691,179757,179942,180009,180082,180142,180242,180286,180347,180412,180500,180581,180656,180708,180789,180870,180945,181027,181106,181163,181217,181273,181329,181385,181449,181723,182141,182210,182308,182366,182506,182593,182710,182820,182885,182949,183010,183082,183140,183199,183283,183431,183498,183568,183626,183689,183761,183833,183901,183959,184357,184446,184555,184683,184748,184833,184895,184939,184991,185037,185095,185172,185263,185333,185399,185468,185543,185610,185685,185759,185864,185920,186000,186063,186139,186267" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/68e97725e1781378fe335998c8e500ec/transformed/core-common-2.0.4/res/values/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "166", + "endLines": "11", + "endColumns": "8", + "endOffsets": "571" + }, + "to": { + "startLines": "6999", + "startColumns": "4", + "startOffsets": "496174", + "endLines": "7006", + "endColumns": "8", + "endOffsets": "496579" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/6be8cab6745c75787fdf6101b92e71af/transformed/drawerlayout-1.1.1/res/values/values.xml", + "from": { + "startLines": "2,3,4,5", + "startColumns": "4,4,4,4", + "startOffsets": "55,111,159,211", + "endLines": "2,3,4,8", + "endColumns": "55,47,51,24", + "endOffsets": "106,154,206,426" + }, + "to": { + "startLines": "138,141,1073,11794", + "startColumns": "4,4,4,4", + "startOffsets": "6996,7160,64138,756375", + "endLines": "138,141,1073,11797", + "endColumns": "55,47,51,24", + "endOffsets": "7047,7203,64185,756481" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b371554f1bd82303b03da89fdd8c9a13/transformed/core-1.13.0/res/values/values.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,98,99,103,104,105,106,112,122,155,176,209", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,115,187,275,340,406,475,538,608,676,748,818,879,953,1026,1087,1148,1210,1274,1336,1397,1465,1565,1625,1691,1764,1833,1890,1942,2004,2076,2152,2217,2276,2335,2395,2455,2515,2575,2635,2695,2755,2815,2875,2935,2994,3054,3114,3174,3234,3294,3354,3414,3474,3534,3594,3653,3713,3773,3832,3891,3950,4009,4068,4127,4162,4197,4252,4315,4370,4428,4486,4547,4610,4667,4718,4768,4829,4886,4952,4986,5021,5056,5126,5193,5265,5334,5403,5477,5549,5637,5708,5825,6026,6136,6337,6466,6538,6605,6808,7109,8840,9521,10203", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,97,98,102,103,104,105,111,121,154,175,208,214", + "endColumns": "59,71,87,64,65,68,62,69,67,71,69,60,73,72,60,60,61,63,61,60,67,99,59,65,72,68,56,51,61,71,75,64,58,58,59,59,59,59,59,59,59,59,59,59,58,59,59,59,59,59,59,59,59,59,59,58,59,59,58,58,58,58,58,58,34,34,54,62,54,57,57,60,62,56,50,49,60,56,65,33,34,34,69,66,71,68,68,73,71,87,70,116,12,109,12,128,71,66,24,24,24,24,24,24", + "endOffsets": "110,182,270,335,401,470,533,603,671,743,813,874,948,1021,1082,1143,1205,1269,1331,1392,1460,1560,1620,1686,1759,1828,1885,1937,1999,2071,2147,2212,2271,2330,2390,2450,2510,2570,2630,2690,2750,2810,2870,2930,2989,3049,3109,3169,3229,3289,3349,3409,3469,3529,3589,3648,3708,3768,3827,3886,3945,4004,4063,4122,4157,4192,4247,4310,4365,4423,4481,4542,4605,4662,4713,4763,4824,4881,4947,4981,5016,5051,5121,5188,5260,5329,5398,5472,5544,5632,5703,5820,6021,6131,6332,6461,6533,6600,6803,7104,8835,9516,10198,10365" + }, + "to": { + "startLines": "470,637,638,651,652,951,952,1066,1067,1068,1069,1070,1071,1072,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1830,1831,1861,1862,1863,1864,1865,1866,1867,1868,1872,1873,1874,1875,1876,1877,1878,1886,1971,2030,2031,2032,2033,2034,2035,2036,2522,6478,6479,6483,6484,6488,7654,7655,10679,11037,11881,11914,11950,11983", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "24089,32458,32530,33578,33643,55926,55995,63650,63720,63788,63860,63930,63991,64065,117737,117798,117859,117921,117985,118047,118108,118176,118276,118336,118402,118475,118544,118601,118653,119445,119517,119593,119658,119717,119776,119836,119896,119956,120016,120076,120136,120196,120256,120316,120376,120435,120495,120555,120615,120675,120735,120795,120855,120915,120975,121035,121094,121154,121214,121273,121332,121391,121450,121509,122071,122106,123692,123747,123810,123865,123923,123981,124042,124105,124308,124359,124409,124470,124527,124593,124627,125009,130373,135408,135475,135547,135616,135685,135759,135831,184451,461172,461289,461490,461600,461801,545030,545102,712404,724989,758876,760607,761832,762514", + "endLines": "470,637,638,651,652,951,952,1066,1067,1068,1069,1070,1071,1072,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1830,1831,1861,1862,1863,1864,1865,1866,1867,1868,1872,1873,1874,1875,1876,1877,1878,1886,1971,2030,2031,2032,2033,2034,2035,2036,2522,6478,6482,6483,6487,6488,7654,7655,10684,11046,11913,11934,11982,11988", + "endColumns": "59,71,87,64,65,68,62,69,67,71,69,60,73,72,60,60,61,63,61,60,67,99,59,65,72,68,56,51,61,71,75,64,58,58,59,59,59,59,59,59,59,59,59,59,58,59,59,59,59,59,59,59,59,59,59,58,59,59,58,58,58,58,58,58,34,34,54,62,54,57,57,60,62,56,50,49,60,56,65,33,34,34,69,66,71,68,68,73,71,87,70,116,12,109,12,128,71,66,24,24,24,24,24,24", + "endOffsets": "24144,32525,32613,33638,33704,55990,56053,63715,63783,63855,63925,63986,64060,64133,117793,117854,117916,117980,118042,118103,118171,118271,118331,118397,118470,118539,118596,118648,118710,119512,119588,119653,119712,119771,119831,119891,119951,120011,120071,120131,120191,120251,120311,120371,120430,120490,120550,120610,120670,120730,120790,120850,120910,120970,121030,121089,121149,121209,121268,121327,121386,121445,121504,121563,122101,122136,123742,123805,123860,123918,123976,124037,124100,124157,124354,124404,124465,124522,124588,124622,124657,125039,130438,135470,135542,135611,135680,135754,135826,135914,184517,461284,461485,461595,461796,461925,545097,545164,712602,725285,760602,761283,762509,762676" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/6c0e8749c44e3843f0401e2e78787c36/transformed/customview-poolingcontainer-1.0.0/res/values/values.xml", + "from": { + "startLines": "2,3", + "startColumns": "4,4", + "startOffsets": "55,109", + "endColumns": "53,66", + "endOffsets": "104,171" + }, + "to": { + "startLines": "1828,1849", + "startColumns": "4,4", + "startOffsets": "121951,123099", + "endColumns": "53,66", + "endOffsets": "122000,123161" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/30d4e98469639d69ad240eb0afa9d087/transformed/cardview-1.0.0/res/values/values.xml", + "from": { + "startLines": "2,3,4,5,6,35,36,37,38,45,47,50,7", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,107,168,230,292,2179,2238,2295,2349,2763,2827,2953,356", + "endLines": "2,3,4,5,6,35,36,37,44,46,49,52,34", + "endColumns": "51,60,61,61,63,58,56,53,12,12,12,12,24", + "endOffsets": "102,163,225,287,351,2233,2290,2344,2758,2822,2948,3076,2174" + }, + "to": { + "startLines": "35,653,654,655,656,1062,1063,1064,2602,5957,5959,5962,10685", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "1640,33709,33770,33832,33894,63425,63484,63541,189884,424164,424228,424354,712607", + "endLines": "35,653,654,655,656,1062,1063,1064,2608,5958,5961,5964,10712", + "endColumns": "51,60,61,61,63,58,56,53,12,12,12,12,24", + "endOffsets": "1687,33765,33827,33889,33953,63479,63536,63590,190293,424223,424349,424477,713526" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/7c92a4cf93057ea119c8f0349cc524c6/transformed/play-services-basement-18.4.0/res/values/values.xml", + "from": { + "startLines": "4,7", + "startColumns": "0,0", + "startOffsets": "243,406", + "endColumns": "63,166", + "endOffsets": "306,572" + }, + "to": { + "startLines": "1911,2084", + "startColumns": "4,4", + "startOffsets": "126365,139972", + "endColumns": "67,166", + "endOffsets": "126428,140134" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/a8b802474834ad934ab806f5360c513e/transformed/transition-1.5.0/res/values/values.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,95,142,185,240,287,332,386,442,494,546,595,656", + "endColumns": "39,46,42,54,46,44,53,55,51,51,48,60,49", + "endOffsets": "90,137,180,235,282,327,381,437,489,541,590,651,701" + }, + "to": { + "startLines": "1825,1826,1848,1854,1855,1887,1888,1889,1890,1891,1892,1893,1894", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "121830,121870,123056,123347,123402,125044,125089,125143,125199,125251,125303,125352,125413", + "endColumns": "39,46,42,54,46,44,53,55,51,51,48,60,49", + "endOffsets": "121865,121912,123094,123397,123444,125084,125138,125194,125246,125298,125347,125408,125458" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values/colors.xml", + "from": { + "startLines": "3,2,10,9,13,6,5,8,7,12,11", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "112,55,529,474,719,293,226,415,358,647,582", + "endColumns": "56,56,52,54,61,64,66,58,56,71,64", + "endOffsets": "164,107,577,524,776,353,288,469,410,714,642" + }, + "to": { + "startLines": "700,711,712,713,967,968,969,970,971,972,973", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "37052,37790,37847,37900,57057,57119,57184,57251,57310,57367,57439", + "endColumns": "56,56,52,54,61,64,66,58,56,71,64", + "endOffsets": "37104,37842,37895,37950,57114,57179,57246,57305,57362,57434,57499" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values/themes.xml", + "from": { + "startLines": "42,47,2,27,15,9,34,20", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "1991,2138,55,1255,682,370,1575,937", + "endLines": "45,50,7,32,18,13,40,25", + "endColumns": "12,12,12,12,12,12,12,12", + "endOffsets": "2132,2287,364,1569,931,676,1985,1249" + }, + "to": { + "startLines": "2573,2577,6768,6774,6780,6784,6789,6796", + "startColumns": "4,4,4,4,4,4,4,4", + "startOffsets": "188133,188279,479118,479432,479751,480005,480316,480731", + "endLines": "2576,2580,6773,6779,6783,6788,6795,6801", + "endColumns": "12,12,12,12,12,12,12,12", + "endOffsets": "188274,188428,479427,479746,480000,480311,480726,481043" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/cc91afd01cb4f955b418c94caa09925e/transformed/lifecycle-runtime-2.6.2/res/values/values.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "42", + "endOffsets": "93" + }, + "to": { + "startLines": "1898", + "startColumns": "4", + "startOffsets": "125588", + "endColumns": "42", + "endOffsets": "125626" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/dd8af392ce77662fd38615207c468886/transformed/appcompat-1.7.0/res/values/values.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,221,222,226,230,234,239,245,252,256,260,265,269,273,277,281,285,289,295,299,305,309,315,319,324,328,331,335,341,345,351,355,361,364,368,372,376,380,384,385,386,387,390,393,396,399,403,404,405,406,407,410,412,414,416,421,422,426,432,436,437,439,451,452,456,462,466,467,468,472,499,503,504,508,536,708,734,905,931,962,970,976,992,1014,1019,1024,1034,1043,1052,1056,1063,1082,1089,1090,1099,1102,1105,1109,1113,1117,1120,1121,1126,1131,1141,1146,1153,1159,1160,1163,1167,1172,1174,1176,1179,1182,1184,1188,1191,1198,1201,1204,1208,1210,1214,1216,1218,1220,1224,1232,1240,1252,1258,1267,1270,1281,1284,1285,1290,1291,1296,1365,1435,1436,1446,1455,1456,1458,1462,1465,1468,1471,1474,1477,1480,1483,1487,1490,1493,1496,1500,1503,1507,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1533,1535,1536,1537,1538,1539,1540,1541,1542,1544,1545,1547,1548,1550,1552,1553,1555,1556,1557,1558,1559,1560,1562,1563,1564,1565,1566,1567,1569,1571,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1587,1588,1589,1590,1591,1592,1593,1595,1599,1603,1604,1605,1606,1607,1608,1612,1613,1614,1615,1617,1619,1621,1623,1625,1626,1627,1628,1630,1632,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1648,1649,1650,1651,1653,1655,1656,1658,1659,1661,1663,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1678,1679,1680,1681,1683,1684,1685,1686,1687,1689,1691,1693,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1785,1788,1791,1794,1808,1814,1824,1827,1856,1883,1892,1956,2319,2323,2351,2379,2397,2421,2427,2433,2454,2578,2598,2604,2608,2649,2661,2727,2747,2802,2814,2840", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "105,160,205,254,295,350,412,476,546,607,682,758,835,913,998,1080,1156,1232,1309,1387,1493,1599,1678,1758,1815,1873,1947,2022,2087,2153,2213,2274,2346,2419,2486,2554,2613,2672,2731,2790,2849,2903,2957,3010,3064,3118,3172,3226,3300,3379,3452,3526,3597,3669,3741,3814,3871,3929,4002,4076,4150,4225,4297,4370,4440,4511,4571,4632,4701,4770,4840,4914,4990,5054,5131,5207,5284,5349,5418,5495,5570,5639,5707,5784,5850,5911,6008,6073,6142,6241,6312,6371,6429,6486,6545,6609,6680,6752,6824,6896,6968,7035,7103,7171,7230,7293,7357,7447,7538,7598,7664,7731,7797,7867,7931,7984,8051,8112,8179,8292,8350,8413,8478,8543,8618,8691,8763,8807,8854,8900,8949,9010,9071,9132,9194,9258,9322,9386,9451,9514,9574,9635,9701,9760,9820,9882,9953,10013,10081,10167,10254,10344,10431,10519,10601,10684,10774,10865,10917,10975,11020,11086,11150,11207,11264,11318,11375,11423,11472,11523,11557,11604,11653,11699,11731,11795,11857,11917,11974,12048,12118,12196,12250,12320,12405,12453,12499,12560,12623,12689,12753,12824,12887,12952,13016,13077,13138,13190,13263,13337,13406,13481,13555,13629,13770,13840,13893,13971,14061,14149,14245,14335,14917,15006,15253,15534,15786,16071,16464,16941,17163,17385,17661,17888,18118,18348,18578,18808,19035,19454,19680,20105,20335,20763,20982,21265,21473,21604,21831,22257,22482,22909,23130,23555,23675,23951,24252,24576,24867,25181,25318,25449,25554,25796,25963,26167,26375,26646,26758,26870,26975,27092,27306,27452,27592,27678,28026,28114,28360,28778,29027,29109,29207,29864,29964,30216,30640,30895,30989,31078,31315,33339,33581,33683,33936,36092,46773,48289,58984,60512,62269,62895,63315,64576,65841,66097,66333,66880,67374,67979,68177,68757,70125,70500,70618,71156,71313,71509,71782,72038,72208,72349,72413,72778,73145,73821,74085,74423,74776,74870,75056,75362,75624,75749,75876,76115,76326,76445,76638,76815,77270,77451,77573,77832,77945,78132,78234,78341,78470,78745,79253,79749,80626,80920,81490,81639,82371,82543,82627,82963,83055,83333,88564,93935,93997,94575,95159,95250,95363,95592,95752,95904,96075,96241,96410,96577,96740,96983,97153,97326,97497,97771,97970,98175,98505,98589,98685,98781,98879,98979,99081,99183,99285,99387,99489,99589,99685,99797,99926,100049,100180,100311,100409,100523,100617,100757,100891,100987,101099,101199,101315,101411,101523,101623,101763,101899,102063,102193,102351,102501,102642,102786,102921,103033,103183,103311,103439,103575,103707,103837,103967,104079,104219,104365,104509,104647,104713,104803,104879,104983,105073,105175,105283,105391,105491,105571,105663,105761,105871,105923,106001,106107,106199,106303,106413,106535,106698,106855,106935,107035,107125,107235,107325,107566,107660,107766,107858,107958,108070,108184,108300,108416,108510,108624,108736,108838,108958,109080,109162,109266,109386,109512,109610,109704,109792,109904,110020,110142,110254,110429,110545,110631,110723,110835,110959,111026,111152,111220,111348,111492,111620,111689,111784,111899,112012,112111,112220,112331,112442,112543,112648,112748,112878,112969,113092,113186,113298,113384,113488,113584,113672,113790,113894,113998,114124,114212,114320,114420,114510,114620,114704,114806,114890,114944,115008,115114,115200,115310,115394,115514,118130,118248,118363,118443,118804,119037,119554,119632,120976,122337,122725,125568,135621,135756,137126,138483,139055,139806,140068,140268,140647,144925,145531,145760,145911,147209,147521,150547,151291,153422,153762,155073", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,220,221,225,229,233,238,244,251,255,259,264,268,272,276,280,284,288,294,298,304,308,314,318,323,327,330,334,340,344,350,354,360,363,367,371,375,379,383,384,385,386,389,392,395,398,402,403,404,405,406,409,411,413,415,420,421,425,431,435,436,438,450,451,455,461,465,466,467,471,498,502,503,507,535,707,733,904,930,961,969,975,991,1013,1018,1023,1033,1042,1051,1055,1062,1081,1088,1089,1098,1101,1104,1108,1112,1116,1119,1120,1125,1130,1140,1145,1152,1158,1159,1162,1166,1171,1173,1175,1178,1181,1183,1187,1190,1197,1200,1203,1207,1209,1213,1215,1217,1219,1223,1231,1239,1251,1257,1266,1269,1280,1283,1284,1289,1290,1295,1364,1434,1435,1445,1454,1455,1457,1461,1464,1467,1470,1473,1476,1479,1482,1486,1489,1492,1495,1499,1502,1506,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1532,1534,1535,1536,1537,1538,1539,1540,1541,1543,1544,1546,1547,1549,1551,1552,1554,1555,1556,1557,1558,1559,1561,1562,1563,1564,1565,1566,1568,1570,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1586,1587,1588,1589,1590,1591,1592,1594,1598,1602,1603,1604,1605,1606,1607,1611,1612,1613,1614,1616,1618,1620,1622,1624,1625,1626,1627,1629,1631,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1647,1648,1649,1650,1652,1654,1655,1657,1658,1660,1662,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1677,1678,1679,1680,1682,1683,1684,1685,1686,1688,1690,1692,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1784,1787,1790,1793,1807,1813,1823,1826,1855,1882,1891,1955,2318,2322,2350,2378,2396,2420,2426,2432,2453,2577,2597,2603,2607,2613,2660,2726,2746,2801,2813,2839,2846", + "endColumns": "54,44,48,40,54,61,63,69,60,74,75,76,77,84,81,75,75,76,77,105,105,78,79,56,57,73,74,64,65,59,60,71,72,66,67,58,58,58,58,58,53,53,52,53,53,53,53,73,78,72,73,70,71,71,72,56,57,72,73,73,74,71,72,69,70,59,60,68,68,69,73,75,63,76,75,76,64,68,76,74,68,67,76,65,60,96,64,68,98,70,58,57,56,58,63,70,71,71,71,71,66,67,67,58,62,63,89,90,59,65,66,65,69,63,52,66,60,66,112,57,62,64,64,74,72,71,43,46,45,48,60,60,60,61,63,63,63,64,62,59,60,65,58,59,61,70,59,67,85,86,89,86,87,81,82,89,90,51,57,44,65,63,56,56,53,56,47,48,50,33,46,48,45,31,63,61,59,56,73,69,77,53,69,84,47,45,60,62,65,63,70,62,64,63,60,60,51,72,73,68,74,73,73,140,69,52,77,89,87,95,89,12,88,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,136,130,104,12,12,12,12,12,111,111,104,116,12,12,12,12,12,87,12,12,12,81,12,12,99,12,12,12,93,88,12,12,12,101,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,117,12,12,12,12,12,12,12,63,12,12,12,12,12,12,93,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,12,91,12,12,12,61,12,12,90,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,95,95,97,99,101,101,101,101,101,99,95,111,128,122,130,130,97,113,93,12,12,95,111,99,115,95,111,99,12,135,12,129,12,12,140,12,134,111,149,127,127,12,131,129,129,111,139,12,12,12,65,89,75,103,89,101,107,107,99,79,91,97,12,51,77,105,91,103,109,12,12,12,79,99,89,109,89,12,93,105,91,12,12,12,12,12,93,113,111,12,12,12,81,103,119,125,97,93,87,111,115,121,111,12,115,85,91,12,12,66,12,67,12,12,12,68,94,114,112,98,108,110,110,100,104,99,12,90,122,93,12,85,103,95,87,12,12,12,12,87,107,99,89,109,83,101,83,53,63,105,85,109,83,119,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24", + "endOffsets": "155,200,249,290,345,407,471,541,602,677,753,830,908,993,1075,1151,1227,1304,1382,1488,1594,1673,1753,1810,1868,1942,2017,2082,2148,2208,2269,2341,2414,2481,2549,2608,2667,2726,2785,2844,2898,2952,3005,3059,3113,3167,3221,3295,3374,3447,3521,3592,3664,3736,3809,3866,3924,3997,4071,4145,4220,4292,4365,4435,4506,4566,4627,4696,4765,4835,4909,4985,5049,5126,5202,5279,5344,5413,5490,5565,5634,5702,5779,5845,5906,6003,6068,6137,6236,6307,6366,6424,6481,6540,6604,6675,6747,6819,6891,6963,7030,7098,7166,7225,7288,7352,7442,7533,7593,7659,7726,7792,7862,7926,7979,8046,8107,8174,8287,8345,8408,8473,8538,8613,8686,8758,8802,8849,8895,8944,9005,9066,9127,9189,9253,9317,9381,9446,9509,9569,9630,9696,9755,9815,9877,9948,10008,10076,10162,10249,10339,10426,10514,10596,10679,10769,10860,10912,10970,11015,11081,11145,11202,11259,11313,11370,11418,11467,11518,11552,11599,11648,11694,11726,11790,11852,11912,11969,12043,12113,12191,12245,12315,12400,12448,12494,12555,12618,12684,12748,12819,12882,12947,13011,13072,13133,13185,13258,13332,13401,13476,13550,13624,13765,13835,13888,13966,14056,14144,14240,14330,14912,15001,15248,15529,15781,16066,16459,16936,17158,17380,17656,17883,18113,18343,18573,18803,19030,19449,19675,20100,20330,20758,20977,21260,21468,21599,21826,22252,22477,22904,23125,23550,23670,23946,24247,24571,24862,25176,25313,25444,25549,25791,25958,26162,26370,26641,26753,26865,26970,27087,27301,27447,27587,27673,28021,28109,28355,28773,29022,29104,29202,29859,29959,30211,30635,30890,30984,31073,31310,33334,33576,33678,33931,36087,46768,48284,58979,60507,62264,62890,63310,64571,65836,66092,66328,66875,67369,67974,68172,68752,70120,70495,70613,71151,71308,71504,71777,72033,72203,72344,72408,72773,73140,73816,74080,74418,74771,74865,75051,75357,75619,75744,75871,76110,76321,76440,76633,76810,77265,77446,77568,77827,77940,78127,78229,78336,78465,78740,79248,79744,80621,80915,81485,81634,82366,82538,82622,82958,83050,83328,88559,93930,93992,94570,95154,95245,95358,95587,95747,95899,96070,96236,96405,96572,96735,96978,97148,97321,97492,97766,97965,98170,98500,98584,98680,98776,98874,98974,99076,99178,99280,99382,99484,99584,99680,99792,99921,100044,100175,100306,100404,100518,100612,100752,100886,100982,101094,101194,101310,101406,101518,101618,101758,101894,102058,102188,102346,102496,102637,102781,102916,103028,103178,103306,103434,103570,103702,103832,103962,104074,104214,104360,104504,104642,104708,104798,104874,104978,105068,105170,105278,105386,105486,105566,105658,105756,105866,105918,105996,106102,106194,106298,106408,106530,106693,106850,106930,107030,107120,107230,107320,107561,107655,107761,107853,107953,108065,108179,108295,108411,108505,108619,108731,108833,108953,109075,109157,109261,109381,109507,109605,109699,109787,109899,110015,110137,110249,110424,110540,110626,110718,110830,110954,111021,111147,111215,111343,111487,111615,111684,111779,111894,112007,112106,112215,112326,112437,112538,112643,112743,112873,112964,113087,113181,113293,113379,113483,113579,113667,113785,113889,113993,114119,114207,114315,114415,114505,114615,114699,114801,114885,114939,115003,115109,115195,115305,115389,115509,118125,118243,118358,118438,118799,119032,119549,119627,120971,122332,122720,125563,135616,135751,137121,138478,139050,139801,140063,140263,140642,144920,145526,145755,145906,146121,147516,150542,151286,153417,153757,155068,155271" + }, + "to": { + "startLines": "137,227,230,574,627,628,630,631,632,633,634,635,636,639,640,641,642,643,644,645,646,647,648,649,650,701,702,703,704,705,706,707,708,709,710,885,886,887,888,889,890,891,892,893,894,895,896,953,954,955,956,957,958,959,960,961,962,963,964,965,966,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1122,1123,1127,1128,1129,1130,1131,1132,1133,1775,1776,1777,1778,1779,1780,1781,1782,1820,1821,1822,1823,1827,1850,1851,1860,1895,1903,1904,1907,1908,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2487,2547,2548,2549,2550,2551,2581,2589,2590,2594,2598,2609,2614,2643,2650,2654,2658,2663,2667,2671,2675,2679,2683,2687,2693,2697,2703,2707,2713,2717,2722,2726,2729,2733,2739,2743,2749,2753,2759,2762,2766,2770,2774,2778,2782,2783,2784,2785,2788,2791,2794,2797,2801,2802,2803,2804,2845,2848,2850,2852,2854,2859,2860,2864,2870,2874,2875,2877,2889,2890,2894,2900,2904,2981,2982,2986,3013,3017,3018,3022,4824,4996,5022,5193,5219,5250,5258,5264,5280,5302,5307,5312,5322,5331,5340,5344,5351,5370,5377,5378,5387,5390,5393,5397,5401,5405,5408,5409,5414,5419,5429,5434,5441,5447,5448,5451,5455,5460,5462,5464,5467,5470,5472,5476,5479,5486,5489,5492,5496,5498,5502,5504,5506,5508,5512,5520,5528,5540,5546,5555,5558,5569,5572,5573,5578,5579,6059,6128,6202,6203,6213,6222,6223,6225,6229,6232,6235,6238,6241,6244,6247,6250,6254,6257,6260,6263,6267,6270,6274,6422,6423,6424,6425,6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6444,6446,6447,6448,6449,6450,6451,6452,6453,6455,6456,6458,6459,6461,6463,6464,6466,6467,6468,6469,6470,6471,6473,6474,6475,6476,6477,6762,6764,6766,6802,6803,6804,6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6816,6817,6818,6819,6820,6821,6822,6824,6828,7007,7008,7009,7010,7011,7012,7016,7017,7018,7559,7561,7563,7565,7567,7569,7570,7571,7572,7574,7576,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7592,7593,7594,7595,7597,7599,7600,7602,7603,7605,7607,7609,7610,7611,7612,7613,7614,7615,7616,7617,7618,7619,7620,7622,7623,7624,7625,7627,7628,7629,7630,7631,7633,7635,7637,7639,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,9713,9788,9791,9794,9797,9811,9817,9933,9936,9965,9992,10001,10065,10675,10725,11047,11776,12247,12271,12311,12671,12692,12816,13138,13144,13171,13426,13465,13636,13963,14108,14120,14149", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "6941,11486,11639,29595,31778,31833,31957,32021,32091,32152,32227,32303,32380,32618,32703,32785,32861,32937,33014,33092,33198,33304,33383,33463,33520,37109,37183,37258,37323,37389,37449,37510,37582,37655,37722,51048,51107,51166,51225,51284,51343,51397,51451,51504,51558,51612,51666,56058,56132,56211,56284,56358,56429,56501,56573,56646,56703,56761,56834,56908,56982,57504,57576,57649,57719,57790,57850,57911,57980,58049,58119,58193,58269,58333,58410,58486,58563,58628,58697,58774,58849,58918,58986,59063,59129,59190,59287,59352,59421,59520,59591,59650,59708,59765,59824,59888,59959,60031,60103,60175,60247,60314,60382,60450,60509,60572,60636,60726,60817,60877,60943,61010,61076,61146,61210,61263,61330,61391,61458,61571,61629,61692,61757,61822,61897,61970,62042,62086,62133,62179,62228,62289,62350,62411,62473,62537,62601,62665,62730,62793,62853,62914,62980,63039,63099,63161,63232,63292,67290,67376,67626,67716,67803,67891,67973,68056,68146,118715,118767,118825,118870,118936,119000,119057,119114,121568,121625,121673,121722,121917,123166,123213,123646,125463,125859,125923,126113,126173,130890,130964,131034,131112,131166,131236,131321,131369,131415,131476,131539,131605,131669,131740,131803,131868,131932,131993,132054,132106,132179,132253,132322,132397,132471,132545,132686,181454,186272,186350,186440,186528,186624,188433,189015,189104,189351,189632,190298,190583,192392,192869,193091,193313,193589,193816,194046,194276,194506,194736,194963,195382,195608,196033,196263,196691,196910,197193,197401,197532,197759,198185,198410,198837,199058,199483,199603,199879,200180,200504,200795,201109,201246,201377,201482,201724,201891,202095,202303,202574,202686,202798,202903,204996,205210,205356,205496,205582,205930,206018,206264,206682,206931,207013,207111,207768,207868,208120,208544,208799,214689,214778,215015,217039,217281,217383,217636,353205,363886,365402,376097,377625,379382,380008,380428,381689,382954,383210,383446,383993,384487,385092,385290,385870,387238,387613,387731,388269,388426,388622,388895,389151,389321,389462,389526,389891,390258,390934,391198,391536,391889,391983,392169,392475,392737,392862,392989,393228,393439,393558,393751,393928,394383,394564,394686,394945,395058,395245,395347,395454,395583,395858,396366,396862,397739,398033,398603,398752,399484,399656,399740,400076,400168,430906,436137,441852,441914,442492,443076,443167,443280,443509,443669,443821,443992,444158,444327,444494,444657,444900,445070,445243,445414,445688,445887,446092,455458,455542,455638,455734,455832,455932,456034,456136,456238,456340,456442,456542,456638,456750,456879,457002,457133,457264,457362,457476,457570,457710,457844,457940,458052,458152,458268,458364,458476,458576,458716,458852,459016,459146,459304,459454,459595,459739,459874,459986,460136,460264,460392,460528,460660,460790,460920,461032,478690,478836,478980,481048,481114,481204,481280,481384,481474,481576,481684,481792,481892,481972,482064,482162,482272,482324,482402,482508,482600,482704,482814,482936,483099,496584,496664,496764,496854,496964,497054,497295,497389,497495,537374,537474,537586,537700,537816,537932,538026,538140,538252,538354,538474,538596,538678,538782,538902,539028,539126,539220,539308,539420,539536,539658,539770,539945,540061,540147,540239,540351,540475,540542,540668,540736,540864,541008,541136,541205,541300,541415,541528,541627,541736,541847,541958,542059,542164,542264,542394,542485,542608,542702,542814,542900,543004,543100,543188,543306,543410,543514,543640,543728,543836,543936,544026,544136,544220,544322,544406,544460,544524,544630,544716,544826,544910,679055,681671,681789,681904,681984,682345,682578,687156,687234,688578,689939,690327,693170,712269,714496,725290,755803,773225,773976,775537,789124,789503,793781,805801,806030,806762,815592,816712,823244,835897,840963,841303,842724", + "endLines": "137,227,230,574,627,628,630,631,632,633,634,635,636,639,640,641,642,643,644,645,646,647,648,649,650,701,702,703,704,705,706,707,708,709,710,885,886,887,888,889,890,891,892,893,894,895,896,953,954,955,956,957,958,959,960,961,962,963,964,965,966,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1122,1123,1127,1128,1129,1130,1131,1132,1133,1775,1776,1777,1778,1779,1780,1781,1782,1820,1821,1822,1823,1827,1850,1851,1860,1895,1903,1904,1907,1908,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2487,2547,2548,2549,2550,2551,2588,2589,2593,2597,2601,2613,2619,2649,2653,2657,2662,2666,2670,2674,2678,2682,2686,2692,2696,2702,2706,2712,2716,2721,2725,2728,2732,2738,2742,2748,2752,2758,2761,2765,2769,2773,2777,2781,2782,2783,2784,2787,2790,2793,2796,2800,2801,2802,2803,2804,2847,2849,2851,2853,2858,2859,2863,2869,2873,2874,2876,2888,2889,2893,2899,2903,2904,2981,2985,3012,3016,3017,3021,3049,4995,5021,5192,5218,5249,5257,5263,5279,5301,5306,5311,5321,5330,5339,5343,5350,5369,5376,5377,5386,5389,5392,5396,5400,5404,5407,5408,5413,5418,5428,5433,5440,5446,5447,5450,5454,5459,5461,5463,5466,5469,5471,5475,5478,5485,5488,5491,5495,5497,5501,5503,5505,5507,5511,5519,5527,5539,5545,5554,5557,5568,5571,5572,5577,5578,5583,6127,6197,6202,6212,6221,6222,6224,6228,6231,6234,6237,6240,6243,6246,6249,6253,6256,6259,6262,6266,6269,6273,6277,6422,6423,6424,6425,6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6443,6445,6446,6447,6448,6449,6450,6451,6452,6454,6455,6457,6458,6460,6462,6463,6465,6466,6467,6468,6469,6470,6472,6473,6474,6475,6476,6477,6763,6765,6767,6802,6803,6804,6805,6806,6807,6808,6809,6810,6811,6812,6813,6815,6816,6817,6818,6819,6820,6821,6823,6827,6831,7007,7008,7009,7010,7011,7015,7016,7017,7018,7560,7562,7564,7566,7568,7569,7570,7571,7573,7575,7577,7578,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7591,7592,7593,7594,7596,7598,7599,7601,7602,7604,7606,7608,7609,7610,7611,7612,7613,7614,7615,7616,7617,7618,7619,7621,7622,7623,7624,7626,7627,7628,7629,7630,7632,7634,7636,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,9787,9790,9793,9796,9810,9816,9826,9935,9964,9991,10000,10064,10427,10678,10752,11074,11793,12270,12276,12316,12691,12815,12835,13143,13147,13176,13437,13530,13655,14017,14119,14145,14155", + "endColumns": "54,44,48,40,54,61,63,69,60,74,75,76,77,84,81,75,75,76,77,105,105,78,79,56,57,73,74,64,65,59,60,71,72,66,67,58,58,58,58,58,53,53,52,53,53,53,53,73,78,72,73,70,71,71,72,56,57,72,73,73,74,71,72,69,70,59,60,68,68,69,73,75,63,76,75,76,64,68,76,74,68,67,76,65,60,96,64,68,98,70,58,57,56,58,63,70,71,71,71,71,66,67,67,58,62,63,89,90,59,65,66,65,69,63,52,66,60,66,112,57,62,64,64,74,72,71,43,46,45,48,60,60,60,61,63,63,63,64,62,59,60,65,58,59,61,70,59,67,85,86,89,86,87,81,82,89,90,51,57,44,65,63,56,56,53,56,47,48,50,33,46,48,45,31,63,61,59,56,73,69,77,53,69,84,47,45,60,62,65,63,70,62,64,63,60,60,51,72,73,68,74,73,73,140,69,52,77,89,87,95,89,12,88,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,136,130,104,12,12,12,12,12,111,111,104,116,12,12,12,12,12,87,12,12,12,81,12,12,99,12,12,12,93,88,12,12,12,101,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,117,12,12,12,12,12,12,12,63,12,12,12,12,12,12,93,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,12,91,12,12,12,61,12,12,90,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,95,95,97,99,101,101,101,101,101,99,95,111,128,122,130,130,97,113,93,12,12,95,111,99,115,95,111,99,12,135,12,129,12,12,140,12,134,111,149,127,127,12,131,129,129,111,139,12,12,12,65,89,75,103,89,101,107,107,99,79,91,97,12,51,77,105,91,103,109,12,12,12,79,99,89,109,89,12,93,105,91,12,12,12,12,12,93,113,111,12,12,12,81,103,119,125,97,93,87,111,115,121,111,12,115,85,91,12,12,66,12,67,12,12,12,68,94,114,112,98,108,110,110,100,104,99,12,90,122,93,12,85,103,95,87,12,12,12,12,87,107,99,89,109,83,101,83,53,63,105,85,109,83,119,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24", + "endOffsets": "6991,11526,11683,29631,31828,31890,32016,32086,32147,32222,32298,32375,32453,32698,32780,32856,32932,33009,33087,33193,33299,33378,33458,33515,33573,37178,37253,37318,37384,37444,37505,37577,37650,37717,37785,51102,51161,51220,51279,51338,51392,51446,51499,51553,51607,51661,51715,56127,56206,56279,56353,56424,56496,56568,56641,56698,56756,56829,56903,56977,57052,57571,57644,57714,57785,57845,57906,57975,58044,58114,58188,58264,58328,58405,58481,58558,58623,58692,58769,58844,58913,58981,59058,59124,59185,59282,59347,59416,59515,59586,59645,59703,59760,59819,59883,59954,60026,60098,60170,60242,60309,60377,60445,60504,60567,60631,60721,60812,60872,60938,61005,61071,61141,61205,61258,61325,61386,61453,61566,61624,61687,61752,61817,61892,61965,62037,62081,62128,62174,62223,62284,62345,62406,62468,62532,62596,62660,62725,62788,62848,62909,62975,63034,63094,63156,63227,63287,63355,67371,67458,67711,67798,67886,67968,68051,68141,68232,118762,118820,118865,118931,118995,119052,119109,119163,121620,121668,121717,121768,121946,123208,123257,123687,125490,125918,125980,126168,126225,130959,131029,131107,131161,131231,131316,131364,131410,131471,131534,131600,131664,131735,131798,131863,131927,131988,132049,132101,132174,132248,132317,132392,132466,132540,132681,132751,181502,186345,186435,186523,186619,186709,189010,189099,189346,189627,189879,190578,190971,192864,193086,193308,193584,193811,194041,194271,194501,194731,194958,195377,195603,196028,196258,196686,196905,197188,197396,197527,197754,198180,198405,198832,199053,199478,199598,199874,200175,200499,200790,201104,201241,201372,201477,201719,201886,202090,202298,202569,202681,202793,202898,203015,205205,205351,205491,205577,205925,206013,206259,206677,206926,207008,207106,207763,207863,208115,208539,208794,208888,214773,215010,217034,217276,217378,217631,219787,363881,365397,376092,377620,379377,380003,380423,381684,382949,383205,383441,383988,384482,385087,385285,385865,387233,387608,387726,388264,388421,388617,388890,389146,389316,389457,389521,389886,390253,390929,391193,391531,391884,391978,392164,392470,392732,392857,392984,393223,393434,393553,393746,393923,394378,394559,394681,394940,395053,395240,395342,395449,395578,395853,396361,396857,397734,398028,398598,398747,399479,399651,399735,400071,400163,400441,436132,441503,441909,442487,443071,443162,443275,443504,443664,443816,443987,444153,444322,444489,444652,444895,445065,445238,445409,445683,445882,446087,446417,455537,455633,455729,455827,455927,456029,456131,456233,456335,456437,456537,456633,456745,456874,456997,457128,457259,457357,457471,457565,457705,457839,457935,458047,458147,458263,458359,458471,458571,458711,458847,459011,459141,459299,459449,459590,459734,459869,459981,460131,460259,460387,460523,460655,460785,460915,461027,461167,478831,478975,479113,481109,481199,481275,481379,481469,481571,481679,481787,481887,481967,482059,482157,482267,482319,482397,482503,482595,482699,482809,482931,483094,483251,496659,496759,496849,496959,497049,497290,497384,497490,497582,537469,537581,537695,537811,537927,538021,538135,538247,538349,538469,538591,538673,538777,538897,539023,539121,539215,539303,539415,539531,539653,539765,539940,540056,540142,540234,540346,540470,540537,540663,540731,540859,541003,541131,541200,541295,541410,541523,541622,541731,541842,541953,542054,542159,542259,542389,542480,542603,542697,542809,542895,542999,543095,543183,543301,543405,543509,543635,543723,543831,543931,544021,544131,544215,544317,544401,544455,544519,544625,544711,544821,544905,545025,681666,681784,681899,681979,682340,682573,683090,687229,688573,689934,690322,693165,703218,712399,715861,726642,756370,773971,774233,775732,789498,793776,794382,806025,806176,806972,815899,819733,823983,838023,841298,842609,842922" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/eb0c45dedd1b15a9e37e22fcf0bd537e/transformed/constraintlayout-2.2.0/res/values/values.xml", + "from": { + "startLines": "2,9,10,15,16,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,42,43,44,45,55,63,64,65,70,71,76,81,82,83,88,89,94,95,100,101,102,108,109,110,115,121,122,123,124,130,131,132,133,136,139,142,143,146,149,150,151,152,153,156,159,160,161,162,168,173,176,179,180,181,186,187,188,191,194,195,198,201,204,207,208,209,212,215,216,221,222,228,233,236,239,240,241,242,243,244,245,246,247,248,249,250,266,272,273,274,275,276,283,291,292,293,296,301,302,310,311,312,313,314,315,316,317,326,327,328,334,335,341,345,346,347,348,349,358,362,363,382,547,675,681,685,834,980,993,1009,1025,1050,1073,1076,1079,1082,1110,1137,1154,1240,1248,1261,1277,1281,1311,1324,1328,1338,1348,1392,1404,1408,1411,1427,1464,1499,1506,1523", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "55,339,395,581,642,933,985,1035,1088,1136,1187,1242,1302,1367,1426,1488,1540,1601,1663,1709,1842,1894,1944,1995,2402,2714,2759,2818,3015,3072,3267,3448,3502,3559,3751,3809,4005,4061,4255,4312,4363,4585,4637,4692,4882,5098,5148,5200,5256,5462,5523,5583,5653,5786,5917,6045,6113,6242,6368,6430,6493,6561,6628,6751,6876,6943,7008,7073,7362,7543,7664,7785,7851,7918,8128,8197,8263,8388,8514,8581,8707,8834,8959,9086,9142,9207,9333,9456,9521,9729,9796,10084,10264,10384,10504,10569,10631,10693,10757,10819,10878,10938,10999,11060,11119,11179,11839,12090,12141,12190,12238,12296,12588,12896,12943,13003,13109,13289,13343,13678,13732,13788,13834,13881,13932,13991,14043,14373,14432,14486,14724,14779,14981,15120,15166,15221,15266,15310,15658,15795,15836,16818,22936,28601,28976,29143,34373,40550,41247,42021,42772,43626,44496,44562,44641,44716,45550,46441,47260,51197,51602,52073,52864,53027,54388,54952,55105,55564,55982,57995,58291,58441,58561,59208,59951,61372,61725,62467", + "endLines": "8,9,14,15,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,41,42,43,44,54,62,63,64,69,70,75,80,81,82,87,88,93,94,99,100,101,107,108,109,114,120,121,122,123,129,130,131,132,135,138,141,142,145,148,149,150,151,152,155,158,159,160,161,167,172,175,178,179,180,185,186,187,190,193,194,197,200,203,206,207,208,211,214,215,220,221,227,232,235,238,239,240,241,242,243,244,245,246,247,248,249,265,271,272,273,274,275,282,290,291,292,295,300,301,309,310,311,312,313,314,315,316,325,326,327,333,334,340,344,345,346,347,348,357,361,362,363,546,674,680,684,833,979,992,1008,1024,1049,1072,1075,1078,1081,1109,1136,1153,1239,1247,1260,1276,1280,1310,1323,1327,1337,1347,1391,1403,1407,1410,1426,1463,1498,1505,1522,1525", + "endColumns": "11,55,11,60,11,51,49,52,47,50,54,59,64,58,61,51,60,61,45,11,51,49,50,11,11,44,58,11,56,11,11,53,56,11,57,11,55,11,56,50,11,51,54,11,11,49,51,55,11,60,59,69,11,11,11,67,11,11,61,62,67,66,11,11,66,64,64,11,11,11,11,65,66,11,68,65,11,11,66,11,11,11,11,55,64,11,11,64,11,66,11,11,11,11,64,61,61,63,61,58,59,60,60,58,59,11,11,50,48,47,57,11,11,46,59,11,11,53,11,53,55,45,46,50,58,51,11,58,53,11,54,11,11,45,54,44,43,11,11,40,44,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24", + "endOffsets": "334,390,576,637,928,980,1030,1083,1131,1182,1237,1297,1362,1421,1483,1535,1596,1658,1704,1837,1889,1939,1990,2397,2709,2754,2813,3010,3067,3262,3443,3497,3554,3746,3804,4000,4056,4250,4307,4358,4580,4632,4687,4877,5093,5143,5195,5251,5457,5518,5578,5648,5781,5912,6040,6108,6237,6363,6425,6488,6556,6623,6746,6871,6938,7003,7068,7357,7538,7659,7780,7846,7913,8123,8192,8258,8383,8509,8576,8702,8829,8954,9081,9137,9202,9328,9451,9516,9724,9791,10079,10259,10379,10499,10564,10626,10688,10752,10814,10873,10933,10994,11055,11114,11174,11834,12085,12136,12185,12233,12291,12583,12891,12938,12998,13104,13284,13338,13673,13727,13783,13829,13876,13927,13986,14038,14368,14427,14481,14719,14774,14976,15115,15161,15216,15261,15305,15653,15790,15831,15876,22931,28596,28971,29138,34368,40545,41242,42016,42767,43621,44491,44557,44636,44711,45545,46436,47255,51192,51597,52068,52859,53022,54383,54947,55100,55559,55977,57990,58286,58436,58556,59203,59946,61367,61720,62462,62563" + }, + "to": { + "startLines": "2,9,11,17,18,26,28,29,36,42,44,45,46,47,48,105,106,107,108,110,114,115,116,119,129,139,167,168,173,174,179,184,185,186,191,192,197,198,203,204,205,211,212,213,218,224,225,239,240,246,247,248,249,252,255,258,259,262,265,266,267,268,269,272,275,276,277,278,284,289,292,295,296,297,302,303,304,307,310,311,314,317,320,323,324,325,328,331,332,337,338,344,349,352,355,356,357,358,359,360,361,362,363,364,365,366,382,463,464,465,466,471,478,486,487,488,491,496,498,506,507,528,535,572,573,577,578,589,590,591,597,600,606,610,611,612,613,614,623,1835,1897,11075,11240,11368,11374,11378,11527,11763,11989,12005,12032,12057,12080,12083,12086,12089,12117,12144,12161,12836,12844,12857,12873,12877,12907,12920,12924,13084,13094,13148,13438,13462,13656,14029,14066,14101,14156,14173", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,434,546,781,842,1133,1240,1290,1692,1999,2119,2174,2234,2299,2358,5544,5596,5657,5719,5826,5959,6011,6061,6222,6629,7052,8994,9053,9250,9307,9502,9683,9737,9794,9986,10044,10240,10296,10490,10547,10598,10820,10872,10927,11117,11333,11383,12132,12188,12394,12455,12515,12585,12718,12849,12977,13045,13174,13300,13362,13425,13493,13560,13683,13808,13875,13940,14005,14294,14475,14596,14717,14783,14850,15060,15129,15195,15320,15446,15513,15639,15766,15891,16018,16074,16139,16265,16388,16453,16661,16728,17016,17196,17316,17436,17501,17563,17625,17689,17751,17810,17870,17931,17992,18051,18111,18771,23714,23765,23814,23862,24149,24441,24749,24796,24856,24962,25142,25254,25589,25643,26808,27155,29485,29536,29745,29797,30233,30292,30346,30584,30762,30964,31103,31149,31204,31249,31293,31641,122290,125543,726647,732765,738430,738805,738972,744202,755106,762681,763455,764800,765654,766524,766590,766669,766744,767578,768469,769288,794387,794792,795263,796054,796217,797578,798142,798295,803370,803788,806181,815904,816592,823988,838446,839189,840610,842927,843669", + "endLines": "8,9,15,17,25,26,28,29,36,42,44,45,46,47,48,105,106,107,108,113,114,115,116,128,136,139,167,172,173,178,183,184,185,190,191,196,197,202,203,204,210,211,212,217,223,224,225,239,245,246,247,248,251,254,257,258,261,264,265,266,267,268,271,274,275,276,277,283,288,291,294,295,296,301,302,303,306,309,310,313,316,319,322,323,324,327,330,331,336,337,343,348,351,354,355,356,357,358,359,360,361,362,363,364,365,381,387,463,464,465,466,477,485,486,487,490,495,496,505,506,507,528,535,572,573,577,586,589,590,596,597,605,609,610,611,612,613,622,626,1835,1897,11239,11367,11373,11377,11526,11672,11775,12004,12020,12056,12079,12082,12085,12088,12116,12143,12160,12246,12843,12856,12872,12876,12906,12919,12923,12933,13093,13137,13159,13441,13464,13671,14065,14100,14107,14172,14175", + "endColumns": "11,55,11,60,11,51,49,52,47,50,54,59,64,58,61,51,60,61,45,11,51,49,50,11,11,44,58,11,56,11,11,53,56,11,57,11,55,11,56,50,11,51,54,11,11,49,51,55,11,60,59,69,11,11,11,67,11,11,61,62,67,66,11,11,66,64,64,11,11,11,11,65,66,11,68,65,11,11,66,11,11,11,11,55,64,11,11,64,11,66,11,11,11,11,64,61,61,63,61,58,59,60,60,58,59,11,11,50,48,47,57,11,11,46,59,11,11,53,11,53,55,45,46,50,58,51,11,58,53,11,54,11,11,45,54,44,43,11,11,40,44,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24", + "endOffsets": "429,485,727,837,1128,1180,1285,1338,1735,2045,2169,2229,2294,2353,2415,5591,5652,5714,5760,5954,6006,6056,6107,6624,6936,7092,9048,9245,9302,9497,9678,9732,9789,9981,10039,10235,10291,10485,10542,10593,10815,10867,10922,11112,11328,11378,11430,12183,12389,12450,12510,12580,12713,12844,12972,13040,13169,13295,13357,13420,13488,13555,13678,13803,13870,13935,14000,14289,14470,14591,14712,14778,14845,15055,15124,15190,15315,15441,15508,15634,15761,15886,16013,16069,16134,16260,16383,16448,16656,16723,17011,17191,17311,17431,17496,17558,17620,17684,17746,17805,17865,17926,17987,18046,18106,18766,19017,23760,23809,23857,23915,24436,24744,24791,24851,24957,25137,25191,25584,25638,25694,26849,27197,29531,29590,29792,30122,30287,30341,30579,30634,30959,31098,31144,31199,31244,31288,31636,31773,122326,125583,732760,738425,738800,738967,744197,750374,755798,763450,764201,765649,766519,766585,766664,766739,767573,768464,769283,773220,794787,795258,796049,796212,797573,798137,798290,798749,803783,805796,806472,816049,816707,824630,839184,840605,840958,843664,843765" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/e38dc42c74688090728264f3b8aa0abf/transformed/play-services-cronet-18.1.0/res/values/values.xml", + "from": { + "startLines": "4", + "startColumns": "0", + "startOffsets": "166", + "endColumns": "122", + "endOffsets": "288" + }, + "to": { + "startLines": "1976", + "startColumns": "4", + "startOffsets": "130763", + "endColumns": "126", + "endOffsets": "130885" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/58ee233a1856e9cf66919dc5d41e769c/transformed/appcompat-resources-1.7.0/res/values/values.xml", + "from": { + "startLines": "2,18,24,34,50", + "startColumns": "4,4,4,4,4", + "startOffsets": "55,480,658,942,1353", + "endLines": "17,23,33,49,53", + "endColumns": "24,24,24,24,24", + "endOffsets": "475,653,937,1348,1475" + }, + "to": { + "startLines": "9827,9843,9849,13442,13458", + "startColumns": "4,4,4,4,4", + "startOffsets": "683095,683520,683698,816054,816465", + "endLines": "9842,9848,9858,13457,13461", + "endColumns": "24,24,24,24,24", + "endOffsets": "683515,683693,683977,816460,816587" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/f172499cfa40099dc033c56c71b66ddf/transformed/viewpager2-1.1.0-beta02/res/values/values.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endLines": "4", + "endColumns": "24", + "endOffsets": "160" + }, + "to": { + "startLines": "14146", + "startColumns": "4", + "startOffsets": "842614", + "endLines": "14148", + "endColumns": "24", + "endOffsets": "842719" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/2e296852593701edd20e274ff098f368/transformed/savedstate-1.2.1/res/values/values.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "53", + "endOffsets": "104" + }, + "to": { + "startLines": "1900", + "startColumns": "4", + "startOffsets": "125691", + "endColumns": "53", + "endOffsets": "125740" + } + }, + { + "source": "/home/foxx/repos/My Projects/android cast/app/src/main/res/values/ids.xml", + "from": { + "startLines": "3,4,2", + "startColumns": "4,4,4", + "startOffsets": "104,151,55", + "endColumns": "46,52,48", + "endOffsets": "146,199,99" + }, + "to": { + "startLines": "1869,1870,1871", + "startColumns": "4,4,4", + "startOffsets": "124162,124208,124260", + "endColumns": "45,51,47", + "endOffsets": "124203,124255,124303" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/5bc639dde9188e3ea7976e69f7e0d0a5/transformed/material-1.12.0/res/values/values.xml", + "from": { + "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1358,1361,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1422,1423,1424,1425,1426,1430,1434,1438,1442,1443,1447,1455,1462,1470,1473,1483,1492,1501,1510,1511,1512,1513,1519,1520,1521,1522,1523,1524,1530,1531,1532,1533,1534,1539,1540,1544,1545,1551,1555,1556,1557,1558,1568,1569,1570,1574,1575,1581,1585,1586,1589,1590,1595,1596,1599,1600,1601,1602,1866,1873,2134,2140,2404,2411,2672,2678,2741,2823,2875,2957,3019,3101,3165,3217,3299,3307,3313,3324,3328,3332,3345,3360,3376,3383,3389,3406,3419,3439,3456,3465,3470,3477,3497,3510,3527,3533,3539,3546,3550,3556,3570,3573,3583,3584,3585,3633,3637,3641,3645,3646,3647,3650,3666,3673,3687,3732,3733,3739,3743,3747,3752,3759,3765,3766,3769,3773,3778,3791,3795,3800,3805,3810,3813,3816,3819,3823,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3849,3853,3857,3861,3865,3869,3873,3877,3878,3879,3880,3881,3882,3883,3884,3888,3892,3893,3897,3898,3901,3905,3908,3911,3914,3918,3921,3924,3928,3932,3936,3940,3943,3944,3945,3946,3949,3953,3956,3959,3962,3965,3968,3971,3975,3978,3979,3982,3985,3986,3989,3990,3991,3995,3996,4001,4008,4015,4022,4029,4036,4043,4050,4057,4064,4073,4082,4091,4098,4107,4116,4119,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,4138,4143,4148,4151,4152,4153,4154,4155,4163,4171,4172,4180,4184,4192,4200,4208,4216,4224,4225,4233,4241,4242,4245,4248,4250,4255,4257,4262,4266,4270,4271,4272,4273,4277,4281,4282,4286,4287,4288,4289,4290,4291,4292,4293,4294,4295,4296,4300,4301,4302,4303,4307,4308,4309,4310,4314,4318,4319,4323,4324,4325,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4347,4348,4349,4350,4354,4355,4356,4362,4363,4367,4369,4370,4375,4376,4377,4378,4379,4380,4384,4385,4386,4392,4393,4397,4399,4403,4407,4411,4415,4416,4417,4418,4421,4424,4427,4430,4433,4438,4442,4445,4446,4451,4455,4460,4466,4472,4477,4481,4486,4490,4494,4535,4536,4537,4538,4539,4543,4544,4545,4546,4550,4554,4558,4562,4566,4570,4574,4578,4584,4585,4626,4640,4645,4671,4678,4681,4692,4697,4700,4703,4758,4764,4765,4768,4771,4774,4777,4780,4783,4786,4790,4793,4794,4795,4803,4811,4814,4819,4824,4829,4834,4838,4842,4843,4851,4852,4853,4854,4855,4863,4868,4873,4874,4875,4876,4901,4907,4912,4915,4919,4922,4926,4936,4939,4944,4947,4951,4955,4963,4977,4990,4994,5009,5020,5023,5034,5039,5043,5078,5079,5080,5092,5100,5108,5116,5124,5144,5147,5174,5179,5199,5202,5205,5212,5225,5234,5237,5257,5267,5271,5275,5288,5292,5296,5300,5306,5310,5327,5335,5339,5343,5347,5350,5354,5358,5362,5372,5379,5386,5390,5416,5426,5451,5460,5480,5490,5494,5504,5529,5539,5542,5549,5556,5563,5564,5565,5566,5567,5574,5578,5584,5590,5591,5604,5605,5606,5609,5612,5615,5618,5621,5624,5627,5630,5633,5636,5639,5642,5645,5648,5651,5654,5657,5660,5663,5666,5669,5670,5678,5686,5687,5700,5710,5714,5719,5724,5728,5731,5735,5739,5742,5746,5749,5753,5758,5763,5766,5773,5777,5781,5790,5795,5800,5801,5805,5808,5812,5825,5830,5838,5842,5846,5863,5867,5872,5890,5897,5901,5931,5934,5937,5940,5943,5946,5949,5968,5974,5982,5989,6001,6009,6014,6022,6026,6044,6051,6067,6071,6079,6082,6087,6088,6089,6090,6094,6098,6102,6106,6141,6144,6148,6152,6186,6189,6193,6197,6206,6212,6215,6225,6229,6230,6237,6241,6248,6249,6250,6253,6258,6263,6264,6268,6283,6302,6306,6307,6319,6329,6330,6342,6347,6371,6374,6380,6383,6392,6400,6404,6407,6410,6413,6417,6420,6437,6441,6444,6459,6462,6470,6475,6482,6487,6488,6493,6494,6500,6506,6512,6544,6555,6572,6579,6583,6586,6599,6608,6612,6617,6621,6625,6629,6633,6637,6641,6645,6650,6653,6665,6670,6679,6682,6689,6690,6694,6703,6709,6713,6714,6718,6739,6745,6749,6753,6754,6772,6773,6774,6775,6776,6781,6784,6785,6791,6792,6804,6816,6823,6824,6829,6834,6835,6839,6853,6858,6864,6870,6876,6881,6887,6893,6894,6900,6915,6920,6929,6938,6941,6955,6960,6971,6975,6984,6993,6994,7001,7009,7026,7036,7083,7150,7203,7260,7272,7339,7448,7468,7489,7495,7503,7609,7623,7646,7652,7696,7700,7706,7712,7723,7757,7764,7772,7787,7843,7854,7867,7879,7917,7964,7970,7982,7988,7994,8046,8051,8056,8063,8098,8110,8156,8185,8248,8253,8259,8262,8266,8320,8358,8376,8394,8461,8469,8493,8497,8505,8598,8602,8881,8889,8900,8901,8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917,8918,8919,8920,8921,8922,8923,8924,8925,8926,8927,8928,8929,8930,8931,8932,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,8944,8945,8946,8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962,8963,8964,8965,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977,8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022,9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039,9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055,9056,9057,9058,9059,9060,9061,9062,9063,9064,9065,9066,9067,9068,9069,9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085,9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101,9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117,9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133,9134,9135,9136,9137,9138,9139,9140,9141,9142,9143,9144,9145,9146,9147,9148,9149,9150,9151,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163,9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,9176,9177,9178,9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194,9195,9196,9197,9198,9199,9200,9201,9202,9203,9204,9205,9206,9207,9208,9209,9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,9263,9264,9265,9266,9267,9268,9269,9270,9271,9272,9273,9274", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "150,206,255,310,366,426,487,552,607,657,707,760,818,866,935,983,1054,1126,1198,1271,1338,1387,1441,1478,1529,1589,1636,1692,1741,1799,1853,1914,1970,2021,2081,2137,2200,2249,2305,2361,2411,2470,2525,2587,2634,2688,2744,2796,2851,2905,2959,3013,3062,3120,3174,3231,3287,3334,3387,3443,3503,3566,3625,3687,3737,3791,3845,3893,3950,4003,4059,4113,4169,4232,4294,4350,4410,4463,4524,4603,4684,4756,4835,4915,4991,5069,5138,5214,5291,5362,5435,5511,5589,5658,5734,5811,5875,5946,6018,6069,6122,6177,6244,6297,6349,6399,6457,6522,6570,6621,6688,6754,6812,6881,6939,7008,7078,7151,7225,7293,7360,7430,7496,7569,7629,7705,7765,7825,7900,7968,8034,8102,8162,8221,8278,8344,8406,8463,8531,8604,8674,8736,8797,8865,8927,8997,9066,9122,9181,9243,9305,9372,9429,9490,9551,9612,9673,9729,9785,9841,9897,9955,10013,10071,10129,10186,10243,10300,10357,10416,10475,10533,10616,10699,10772,10826,10895,10951,11032,11113,11184,11313,11366,11424,11482,11540,11586,11646,11700,11770,11840,11905,11971,12036,12104,12173,12241,12371,12424,12483,12541,12593,12643,12695,12741,12791,12847,12894,12952,13010,13072,13135,13197,13256,13316,13381,13447,13512,13574,13636,13698,13760,13822,13884,13950,14017,14083,14146,14210,14273,14341,14402,14464,14526,14589,14653,14716,14780,14858,14917,14983,15063,15124,15177,15235,15286,15331,15392,15456,15515,15577,15651,15722,15788,15862,15931,16002,16075,16146,16214,16287,16363,16433,16511,16579,16645,16706,16775,16839,16905,16973,17039,17102,17170,17241,17306,17379,17442,17523,17587,17653,17723,17793,17863,17933,18000,18057,18115,18174,18234,18293,18352,18411,18470,18529,18588,18647,18706,18765,18824,18884,18945,19007,19068,19129,19190,19251,19312,19373,19433,19494,19555,19615,19676,19737,19798,19859,19920,19981,20042,20103,20164,20225,20286,20354,20423,20493,20562,20631,20700,20769,20838,20907,20976,21045,21114,21183,21243,21304,21366,21427,21488,21549,21610,21671,21732,21793,21854,21915,21976,22038,22101,22165,22228,22291,22354,22417,22480,22543,22606,22669,22732,22795,22856,22918,22981,23043,23105,23167,23229,23291,23353,23415,23477,23539,23601,23658,23744,23824,23914,24009,24101,24193,24283,24366,24459,24546,24643,24734,24835,24922,25025,25114,25213,25305,25405,25489,25583,25671,25769,25852,25943,26037,26136,26238,26336,26436,26523,26623,26709,26805,26893,26974,27065,27161,27254,27347,27438,27523,27617,27706,27804,27897,27999,28087,28191,28282,28382,28475,28576,28661,28756,28845,28944,29029,29121,29216,29316,29419,29518,29621,29710,29811,29898,29995,30083,30179,30271,30371,30461,30559,30644,30733,30822,30915,31002,31093,31159,31235,31304,31383,31456,31536,31616,31693,31761,31839,31915,31986,32067,32140,32223,32298,32383,32456,32537,32618,32692,32776,32846,32924,32994,33074,33152,33224,33306,33376,33453,33533,33618,33706,33790,33877,33951,34029,34107,34178,34259,34350,34433,34529,34627,34734,34799,34865,34918,34994,35060,35147,35223,35299,35364,35419,35473,35552,35630,35703,35768,35831,35897,35968,36039,36109,36171,36240,36306,36366,36433,36500,36556,36607,36660,36712,36766,36837,36900,36959,37021,37080,37153,37220,37290,37350,37413,37488,37560,37656,37727,37783,37854,37911,37968,38034,38098,38169,38226,38279,38342,38394,38452,38519,38588,38654,38713,38796,38855,38912,38979,39049,39123,39185,39254,39324,39423,39520,39619,39705,39791,39872,39947,40036,40127,40211,40270,40316,40382,40439,40506,40563,40645,40710,40776,40899,40983,41104,41169,41231,41329,41403,41486,41575,41639,41718,41792,41854,41950,42015,42074,42130,42186,42246,42353,42400,42460,42521,42585,42646,42706,42764,42807,42856,42908,42959,43011,43060,43109,43174,43240,43300,43361,43417,43476,43525,43573,43631,43688,43790,43847,43922,43970,44021,44083,44148,44200,44274,44337,44400,44468,44518,44580,44640,44697,44757,44806,44874,44980,45082,45151,45222,45278,45327,45427,45498,45608,45699,45781,45879,45935,46036,46146,46245,46308,46414,46491,46603,46730,46842,46969,47039,47153,47284,47381,47449,47567,47670,47788,47849,47923,47990,48095,48217,48291,48358,48468,48567,48640,48737,48859,48977,49095,49156,49278,49395,49463,49569,49671,49751,49822,49918,49985,50059,50133,50219,50309,50387,50464,50564,50635,50756,50877,50941,51066,51140,51264,51388,51455,51564,51692,51804,51883,51961,52062,52133,52255,52377,52442,52568,52680,52786,52854,52953,53057,53120,53186,53270,53383,53496,53614,53692,53764,53900,54036,54121,54261,54399,54537,54679,54761,54847,54924,54997,55106,55217,55345,55473,55605,55735,55865,55999,56088,56150,56246,56313,56430,56551,56648,56730,56817,56904,57035,57166,57301,57378,57455,57566,57680,57754,57863,57975,58042,58115,58180,58282,58378,58482,58550,58615,58709,58781,58891,58997,59070,59161,59263,59366,59461,59568,59673,59795,59917,60043,60102,60160,60284,60408,60536,60654,60772,60894,60980,61077,61211,61345,61425,61563,61695,61827,61963,62038,62114,62217,62291,62404,62485,62542,62603,62662,62722,62780,62841,62899,62949,62998,63065,63124,63183,63232,63303,63387,63457,63528,63608,63677,63740,63808,63874,63942,64007,64073,64150,64228,64334,64440,64536,64665,64754,64881,64947,65017,65103,65169,65252,65326,65424,65520,65616,65714,65823,65918,66007,66069,66129,66194,66251,66332,66386,66443,66540,66650,66711,66826,66947,67042,67134,67227,67283,67342,67391,67483,67532,67586,67640,67694,67748,67802,67857,67967,68077,68185,68295,68405,68515,68625,68733,68839,68943,69047,69151,69246,69341,69434,69527,69631,69737,69841,69945,70038,70131,70224,70317,70425,70531,70637,70743,70840,70935,71030,71125,71231,71337,71443,71549,71647,71742,71838,71935,72000,72104,72162,72226,72287,72349,72409,72474,72536,72604,72662,72725,72788,72855,72930,73003,73069,73121,73174,73226,73283,73367,73462,73547,73628,73708,73785,73864,73941,74015,74089,74160,74240,74312,74387,74452,74513,74573,74648,74722,74795,74865,74937,75007,75080,75144,75214,75260,75329,75381,75466,75549,75606,75672,75739,75805,75886,75961,76017,76070,76131,76189,76239,76288,76337,76386,76448,76500,76545,76626,76677,76731,76784,76838,76889,76938,77004,77055,77116,77177,77239,77289,77330,77407,77466,77525,77584,77645,77701,77757,77824,77885,77950,78005,78070,78139,78207,78285,78354,78414,78485,78559,78624,78696,78766,78833,78917,78986,79053,79123,79186,79253,79321,79404,79483,79573,79650,79718,79785,79863,79920,79977,80045,80111,80167,80227,80286,80340,80390,80440,80488,80550,80601,80674,80754,80834,80898,80965,81036,81094,81155,81221,81280,81347,81407,81467,81530,81598,81659,81726,81804,81874,81923,81980,82049,82110,82198,82286,82374,82462,82549,82636,82723,82810,82868,82942,83012,83068,83139,83204,83266,83341,83414,83504,83570,83636,83697,83761,83823,83881,83952,84035,84094,84165,84231,84296,84357,84416,84487,84553,84618,84701,84777,84852,84933,84993,85062,85132,85201,85256,85312,85368,85429,85487,85543,85602,85656,85711,85773,85830,85924,85993,86094,86145,86215,86278,86334,86392,86451,86505,86591,86675,86745,86814,86884,86999,87120,87187,87254,87329,87396,87455,87509,87563,87617,87670,87722,87796,87933,88073,88122,88172,88222,88270,88326,88384,88446,88501,88559,88630,88694,88753,88815,88881,88947,88990,89034,89079,89122,89173,89220,89265,89316,89367,89418,89469,89517,89583,89645,89708,89780,89837,89891,89946,90004,90059,90118,90174,90243,90312,90381,90451,90514,90577,90640,90703,90768,90833,90898,90963,91026,91090,91154,91218,91269,91347,91425,91496,91568,91641,91713,91779,91845,91913,91981,92047,92114,92188,92251,92308,92368,92433,92500,92565,92622,92683,92741,92845,92955,93064,93168,93246,93311,93378,93444,93514,93561,93613,93663,93720,94040,94190,94321,94505,94683,94921,95110,95279,95377,95492,95577,95656,95816,95881,95970,96127,96284,96437,96591,96650,96837,96933,97023,97119,97209,97375,97498,97621,97791,97897,98012,98127,98229,98335,98452,98567,98649,98822,98990,99138,99297,99452,99625,99742,99859,100027,100139,100253,100425,100601,100759,100892,101004,101150,101302,101434,101577,101699,101877,102013,102109,102245,102340,102507,102600,102692,102879,103035,103213,103377,103559,103876,104058,104240,104430,104662,104852,105029,105191,105348,105458,105641,105778,105982,106166,106350,106510,106668,106852,107079,107282,107453,107673,107895,108050,108250,108434,108537,108727,108868,109033,109204,109404,109608,109810,109975,110180,110379,110578,110775,110866,111015,111165,111249,111398,111543,111695,111836,112002,112163,112241,112542,112708,112863,112965,113123,113287,113473,113696,113821,114098,114370,114648,114893,114955,115240,115691,116147,116656,116804,117318,117755,118189,118632,118717,118838,118937,119342,119439,119556,119643,119766,119867,120273,120372,120491,120584,120691,121034,121141,121386,121507,121916,122164,122264,122369,122488,122997,123144,123263,123514,123647,124062,124316,124428,124675,124800,125208,125329,125557,125678,125811,125958,146680,147172,167643,168067,188834,189328,209844,210270,215111,220528,224619,230050,234792,240169,244153,248145,253536,254083,254516,255272,255502,255745,256912,257841,258745,259329,259802,261232,261976,263169,264223,264701,264994,265377,266892,267657,268800,269241,269682,270278,270552,270963,271979,272157,272910,273047,273138,275332,275598,275920,276130,276239,276358,276542,277660,278130,278881,281464,281559,281935,282163,282419,282678,283254,283608,283730,283869,284161,284421,285349,285635,286038,286440,286783,286995,287196,287409,287698,287983,288056,288143,288228,288327,288439,288545,288668,288800,288923,289053,289177,289310,289441,289566,289683,289803,289935,290063,290177,290295,290408,290529,290717,290904,291085,291268,291452,291617,291799,291919,292039,292147,292257,292369,292477,292587,292752,292918,293070,293235,293336,293456,293627,293788,293951,294112,294279,294398,294515,294695,294877,295058,295241,295396,295541,295663,295798,295961,296154,296280,296432,296574,296744,296900,297072,297363,297558,297650,297823,297985,298080,298249,298343,298432,298675,298764,299057,299473,299893,300314,300740,301157,301573,301990,302408,302822,303292,303765,304237,304648,305119,305591,305781,305987,306093,306201,306307,306419,306533,306645,306759,306875,306989,307097,307207,307315,307577,307956,308360,308507,308615,308725,308833,308947,309356,309770,309886,310304,310545,310975,311410,311820,312242,312652,312774,313183,313599,313721,313939,314123,314191,314535,314615,314971,315121,315265,315341,315453,315543,315805,316070,316178,316330,316438,316514,316626,316716,316818,316926,317034,317134,317242,317327,317493,317597,317725,317812,317979,318057,318171,318263,318527,318794,318904,319057,319167,319251,319640,319738,319846,319940,320070,320178,320300,320436,320544,320664,320798,320920,321048,321190,321316,321456,321582,321700,321832,321930,322040,322340,322452,322570,323034,323150,323453,323579,323675,324076,324186,324310,324448,324558,324680,324992,325116,325246,325722,325850,326165,326303,326465,326681,326837,327041,327109,327193,327297,327500,327689,327890,328083,328288,328601,328813,328979,329095,329341,329557,329870,330296,330758,330995,331147,331407,331551,331693,334925,335039,335159,335275,335369,335690,335789,335907,336008,336287,336572,336851,337133,337386,337645,337898,338154,338578,338654,341904,343259,343703,345557,346132,346340,347350,347730,347896,348037,353057,353483,353595,353730,353883,354080,354251,354434,354609,354796,355068,355226,355310,355414,355901,356457,356615,356834,357065,357288,357523,357745,358011,358149,358748,358862,359000,359112,359236,359807,360302,360848,360993,361086,361178,363105,363675,363973,364162,364368,364561,364771,365655,365800,366192,366350,366567,366828,367260,368135,368755,368952,369900,370665,370788,371561,371782,371982,373959,374059,374149,374835,375588,376353,377116,377891,379104,379269,380882,381203,382266,382476,382646,383216,384111,384744,384910,386396,387012,387248,387469,388427,388692,388957,389204,389618,389854,391139,391588,391775,392024,392266,392442,392683,392916,393141,393736,394211,394735,394996,396347,396822,398048,398518,399566,400018,400262,400719,401964,402447,402597,403152,403604,404004,404157,404302,404445,404515,404943,405231,405735,406244,406360,407262,407384,407496,407673,407939,408209,408475,408743,408999,409259,409515,409773,410025,410281,410533,410787,411019,411255,411507,411763,412015,412269,412501,412735,412847,413499,413954,414078,415170,415985,416181,416505,416894,417246,417487,417701,418000,418192,418507,418714,419060,419360,419761,419980,420393,420630,421000,421724,422079,422348,422488,422742,422886,423163,424155,424564,425196,425542,425910,426984,427347,427747,429255,429840,430158,432693,432887,433105,433331,433543,433742,433949,435153,435448,436005,436395,437027,437504,437749,438236,438482,439678,440075,441081,441303,441726,441917,442296,442384,442492,442600,442913,443238,443557,443888,446591,446779,447040,447289,449873,450065,450330,450583,451115,451523,451722,452306,452541,452665,453077,453291,453693,453796,453926,454101,454353,454549,454689,454883,455894,456963,457251,457381,458158,458815,458961,459667,459905,461445,461595,462012,462177,462863,463333,463529,463620,463704,463848,464082,464249,465177,465463,465623,466238,466397,466725,466952,467464,467826,467905,468244,468349,468714,469085,469446,471320,471949,473025,473449,473702,473854,474902,475639,475842,476088,476335,476553,476795,477116,477380,477685,477908,478219,478408,479123,479392,479886,480112,480552,480711,480995,481740,482105,482410,482568,482806,484125,484523,484751,484971,485113,486403,486509,486639,486777,486901,487189,487358,487458,487743,487857,488740,489495,489934,490058,490304,490497,490631,490822,491601,491819,492110,492389,492706,492928,493223,493506,493610,493951,494767,495083,495644,496150,496355,497141,497546,498207,498396,498947,499513,499633,500035,500569,501099,501398,503743,506185,508010,510017,510356,513030,515325,515765,516517,516701,516912,521570,522153,522881,523083,524218,524368,524543,524768,525362,526661,527002,527510,528021,529815,530075,530691,531186,532223,534089,534280,534613,534769,534962,537354,537583,537791,537961,539733,540031,541374,542384,544349,544465,544634,544771,544917,546268,547406,547937,548363,550378,550626,551396,551512,551687,554902,555049,565921,566164,566582,566677,566770,566833,566915,567008,567101,567188,567286,567377,567468,567556,567640,567736,567836,567942,568045,568146,568250,568356,568455,568561,568663,568770,568879,568990,569121,569241,569357,569475,569574,569681,569797,569916,570044,570133,570228,570305,570394,570485,570578,570652,570749,570844,570942,571041,571145,571241,571343,571446,571546,571649,571734,571835,571933,572023,572118,572205,572311,572413,572507,572598,572692,572768,572860,572949,573052,573163,573246,573332,573427,573524,573620,573708,573809,573910,574013,574119,574217,574314,574409,574507,574610,574710,574813,574918,575036,575152,575247,575340,575425,575521,575615,575707,575790,575894,575999,576099,576200,576305,576405,576506,576605,576707,576801,576908,577010,577113,577206,577302,577404,577507,577603,577705,577808,577905,578008,578106,578210,578315,578412,578520,578634,578749,578857,578971,579086,579188,579293,579401,579511,579627,579744,579839,579936,580035,580140,580246,580345,580450,580556,580656,580762,580863,580970,581089,581188,581293,581395,581497,581597,581700,581795,581899,581984,582088,582192,582290,582394,582500,582598,582703,582801,582914,583008,583097,583186,583269,583360,583443,583541,583631,583727,583816,583910,583998,584094,584179,584287,584388,584489,584587,584693,584784,584883,584980,585078,585174,585267,585377,585475,585570,585680,585772,585872,585971,586058,586162,586267,586366,586473,586580,586679,586788,586880,586991,587102,587213,587317,587432,587548,587675,587795,587890,587985,588082,588181,588273,588372,588464,588563,588649,588743,588846,588942,589045,589141,589244,589341,589439,589542,589635,589725,589826,589909,590000,590085,590177,590280,590375,590471,590564,590658,590737,590844,590935,591034,591127,591230,591334,591435,591536,591640,591734,591838,591942,592055,592161,592267,592375,592492,592593,592701,592801,592904,593009,593116,593212,593291,593381,593465,593557,593630,593722,593811,593903,593988,594085,594178,594273,594372,594469,594560,594651,594743,594838,594945,595053,595155,595252,595349,595442,595529,595613,595710,595807,595900,595987,596078,596177,596276,596371,596460,596541,596640,596744,596841,596946,597043,597127,597226,597330,597427,597532,597629,597727,597828,597934,598033,598140,598239,598338,598429,598518,598607,598689,598782,598873,598984,599085,599185,599297,599410,599508,599616,599710,599810,599899,599991,600102,600212,600307,600423,600549,600675,600794,600922,601047,601172,601290,601417,601526,601635,601748,601871,601994,602110,602235,602332,602440,602562,602678,602794,602903,602991,603092,603181,603282,603369,603457,603554,603646,603752,603852,603928", + "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1357,1360,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1421,1422,1423,1424,1425,1429,1433,1437,1441,1442,1446,1454,1461,1469,1472,1482,1491,1500,1509,1510,1511,1512,1518,1519,1520,1521,1522,1523,1529,1530,1531,1532,1533,1538,1539,1543,1544,1550,1554,1555,1556,1557,1567,1568,1569,1573,1574,1580,1584,1585,1588,1589,1594,1595,1598,1599,1600,1601,1865,1872,2133,2139,2403,2410,2671,2677,2740,2822,2874,2956,3018,3100,3164,3216,3298,3306,3312,3323,3327,3331,3344,3359,3375,3382,3388,3405,3418,3438,3455,3464,3469,3476,3496,3509,3526,3532,3538,3545,3549,3555,3569,3572,3582,3583,3584,3632,3636,3640,3644,3645,3646,3649,3665,3672,3686,3731,3732,3738,3742,3746,3751,3758,3764,3765,3768,3772,3777,3790,3794,3799,3804,3809,3812,3815,3818,3822,3826,3827,3828,3829,3830,3831,3832,3833,3834,3835,3836,3837,3838,3839,3840,3841,3842,3843,3844,3845,3846,3847,3848,3852,3856,3860,3864,3868,3872,3876,3877,3878,3879,3880,3881,3882,3883,3887,3891,3892,3896,3897,3900,3904,3907,3910,3913,3917,3920,3923,3927,3931,3935,3939,3942,3943,3944,3945,3948,3952,3955,3958,3961,3964,3967,3970,3974,3977,3978,3981,3984,3985,3988,3989,3990,3994,3995,4000,4007,4014,4021,4028,4035,4042,4049,4056,4063,4072,4081,4090,4097,4106,4115,4118,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4137,4142,4147,4150,4151,4152,4153,4154,4162,4170,4171,4179,4183,4191,4199,4207,4215,4223,4224,4232,4240,4241,4244,4247,4249,4254,4256,4261,4265,4269,4270,4271,4272,4276,4280,4281,4285,4286,4287,4288,4289,4290,4291,4292,4293,4294,4295,4299,4300,4301,4302,4306,4307,4308,4309,4313,4317,4318,4322,4323,4324,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4347,4348,4349,4353,4354,4355,4361,4362,4366,4368,4369,4374,4375,4376,4377,4378,4379,4383,4384,4385,4391,4392,4396,4398,4402,4406,4410,4414,4415,4416,4417,4420,4423,4426,4429,4432,4437,4441,4444,4445,4450,4454,4459,4465,4471,4476,4480,4485,4489,4493,4534,4535,4536,4537,4538,4542,4543,4544,4545,4549,4553,4557,4561,4565,4569,4573,4577,4583,4584,4625,4639,4644,4670,4677,4680,4691,4696,4699,4702,4757,4763,4764,4767,4770,4773,4776,4779,4782,4785,4789,4792,4793,4794,4802,4810,4813,4818,4823,4828,4833,4837,4841,4842,4850,4851,4852,4853,4854,4862,4867,4872,4873,4874,4875,4900,4906,4911,4914,4918,4921,4925,4935,4938,4943,4946,4950,4954,4962,4976,4989,4993,5008,5019,5022,5033,5038,5042,5077,5078,5079,5091,5099,5107,5115,5123,5143,5146,5173,5178,5198,5201,5204,5211,5224,5233,5236,5256,5266,5270,5274,5287,5291,5295,5299,5305,5309,5326,5334,5338,5342,5346,5349,5353,5357,5361,5371,5378,5385,5389,5415,5425,5450,5459,5479,5489,5493,5503,5528,5538,5541,5548,5555,5562,5563,5564,5565,5566,5573,5577,5583,5589,5590,5603,5604,5605,5608,5611,5614,5617,5620,5623,5626,5629,5632,5635,5638,5641,5644,5647,5650,5653,5656,5659,5662,5665,5668,5669,5677,5685,5686,5699,5709,5713,5718,5723,5727,5730,5734,5738,5741,5745,5748,5752,5757,5762,5765,5772,5776,5780,5789,5794,5799,5800,5804,5807,5811,5824,5829,5837,5841,5845,5862,5866,5871,5889,5896,5900,5930,5933,5936,5939,5942,5945,5948,5967,5973,5981,5988,6000,6008,6013,6021,6025,6043,6050,6066,6070,6078,6081,6086,6087,6088,6089,6093,6097,6101,6105,6140,6143,6147,6151,6185,6188,6192,6196,6205,6211,6214,6224,6228,6229,6236,6240,6247,6248,6249,6252,6257,6262,6263,6267,6282,6301,6305,6306,6318,6328,6329,6341,6346,6370,6373,6379,6382,6391,6399,6403,6406,6409,6412,6416,6419,6436,6440,6443,6458,6461,6469,6474,6481,6486,6487,6492,6493,6499,6505,6511,6543,6554,6571,6578,6582,6585,6598,6607,6611,6616,6620,6624,6628,6632,6636,6640,6644,6649,6652,6664,6669,6678,6681,6688,6689,6693,6702,6708,6712,6713,6717,6738,6744,6748,6752,6753,6771,6772,6773,6774,6775,6780,6783,6784,6790,6791,6803,6815,6822,6823,6828,6833,6834,6838,6852,6857,6863,6869,6875,6880,6886,6892,6893,6899,6914,6919,6928,6937,6940,6954,6959,6970,6974,6983,6992,6993,7000,7008,7025,7035,7082,7149,7202,7259,7271,7329,7447,7467,7488,7494,7502,7608,7622,7645,7651,7695,7699,7705,7711,7722,7756,7763,7771,7786,7842,7853,7866,7878,7916,7963,7969,7981,7987,7993,8045,8050,8055,8062,8097,8109,8155,8184,8247,8252,8258,8261,8265,8293,8357,8375,8393,8460,8468,8492,8496,8504,8597,8601,8880,8888,8899,8900,8901,8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917,8918,8919,8920,8921,8922,8923,8924,8925,8926,8927,8928,8929,8930,8931,8932,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,8944,8945,8946,8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962,8963,8964,8965,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977,8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022,9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039,9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055,9056,9057,9058,9059,9060,9061,9062,9063,9064,9065,9066,9067,9068,9069,9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085,9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101,9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117,9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133,9134,9135,9136,9137,9138,9139,9140,9141,9142,9143,9144,9145,9146,9147,9148,9149,9150,9151,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163,9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,9176,9177,9178,9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194,9195,9196,9197,9198,9199,9200,9201,9202,9203,9204,9205,9206,9207,9208,9209,9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,9263,9264,9265,9266,9267,9268,9269,9270,9271,9272,9273,9274", + "endColumns": "55,48,54,55,59,60,64,54,49,49,52,57,47,68,47,70,71,71,72,66,48,53,36,50,59,46,55,48,57,53,60,55,50,59,55,62,48,55,55,49,58,54,61,46,53,55,51,54,53,53,53,48,57,53,56,55,46,52,55,59,62,58,61,49,53,53,47,56,52,55,53,55,62,61,55,59,52,60,78,80,71,78,79,75,77,68,75,76,70,72,75,77,68,75,76,63,70,71,50,52,54,66,52,51,49,57,64,47,50,66,65,57,68,57,68,69,72,73,67,66,69,65,72,59,75,59,59,74,67,65,67,59,58,56,65,61,56,67,72,69,61,60,67,61,69,68,55,58,61,61,66,56,60,60,60,60,55,55,55,55,57,57,57,57,56,56,56,56,58,58,57,82,82,72,53,68,55,80,80,70,9,52,57,57,57,45,59,53,69,69,64,65,64,67,68,67,9,52,58,57,51,49,51,45,49,55,46,57,57,61,62,61,58,59,64,65,64,61,61,61,61,61,61,65,66,65,62,63,62,67,60,61,61,62,63,62,63,77,58,65,79,60,52,57,50,44,60,63,58,61,73,70,65,73,68,70,72,70,67,72,75,69,77,67,65,60,68,63,65,67,65,62,67,70,64,72,62,80,63,65,69,69,69,69,66,56,57,58,59,58,58,58,58,58,58,58,58,58,58,59,60,61,60,60,60,60,60,60,59,60,60,59,60,60,60,60,60,60,60,60,60,60,60,67,68,69,68,68,68,68,68,68,68,68,68,68,59,60,61,60,60,60,60,60,60,60,60,60,60,61,62,63,62,62,62,62,62,62,62,62,62,62,60,61,62,61,61,61,61,61,61,61,61,61,61,56,85,79,89,94,91,91,89,82,92,86,96,90,100,86,102,88,98,91,99,83,93,87,97,82,90,93,98,101,97,99,86,99,85,95,87,80,90,95,92,92,90,84,93,88,97,92,101,87,103,90,99,92,100,84,94,88,98,84,91,94,99,102,98,102,88,100,86,96,87,95,91,99,89,97,84,88,88,92,86,90,65,75,68,78,72,79,79,76,67,77,75,70,80,72,82,74,84,72,80,80,73,83,69,77,69,79,77,71,81,69,76,79,84,87,83,86,73,77,77,70,80,90,82,95,97,106,64,65,52,75,65,86,75,75,64,54,53,78,77,72,64,62,65,70,70,69,61,68,65,59,66,66,55,50,52,51,53,70,62,58,61,58,72,66,69,59,62,74,71,95,70,55,70,56,56,65,63,70,56,52,62,51,57,66,68,65,58,82,58,56,66,69,73,61,68,69,98,96,98,85,85,80,74,88,90,83,58,45,65,56,66,56,81,64,65,122,83,120,64,61,97,73,82,88,63,78,73,61,95,64,58,55,55,59,106,46,59,60,63,60,59,57,42,48,51,50,51,48,48,64,65,59,60,55,58,48,47,57,56,101,56,74,47,50,61,64,51,73,62,62,67,49,61,59,56,59,48,67,105,101,68,70,55,48,99,70,109,90,81,97,55,100,109,98,62,105,76,111,126,111,126,69,113,130,96,67,117,102,117,60,73,66,104,121,73,66,109,98,72,96,121,117,117,60,121,116,67,105,101,79,70,95,66,73,73,85,89,77,76,99,70,120,120,63,124,73,123,123,66,108,127,111,78,77,100,70,121,121,64,125,111,105,67,98,103,62,65,83,112,112,117,77,71,135,135,84,139,137,137,141,81,85,76,72,108,110,127,127,131,129,129,133,88,61,95,66,116,120,96,81,86,86,130,130,134,76,76,110,113,73,108,111,66,72,64,101,95,103,67,64,93,71,109,105,72,90,101,102,94,106,104,121,121,125,58,57,123,123,127,117,117,121,85,96,133,133,79,137,131,131,135,74,75,102,73,112,80,56,60,58,59,57,60,57,49,48,66,58,58,48,70,83,69,70,79,68,62,67,65,67,64,65,76,77,105,105,95,128,88,126,65,69,85,65,82,73,97,95,95,97,108,94,88,61,59,64,56,80,53,56,96,109,60,114,120,94,91,92,55,58,48,91,48,53,53,53,53,53,54,109,109,107,109,109,109,109,107,105,103,103,103,94,94,92,92,103,105,103,103,92,92,92,92,107,105,105,105,96,94,94,94,105,105,105,105,97,94,95,96,64,103,57,63,60,61,59,64,61,67,57,62,62,66,74,72,65,51,52,51,56,83,94,84,80,79,76,78,76,73,73,70,79,71,74,64,60,59,74,73,72,69,71,69,72,63,69,45,68,51,84,82,56,65,66,65,80,74,55,52,60,57,49,48,48,48,61,51,44,80,50,53,52,53,50,48,65,50,60,60,61,49,40,76,58,58,58,60,55,55,66,60,64,54,64,68,67,77,68,59,70,73,64,71,69,66,83,68,66,69,62,66,67,82,78,89,76,67,66,77,56,56,67,65,55,59,58,53,49,49,47,61,50,72,79,79,63,66,70,57,60,65,58,66,59,59,62,67,60,66,77,69,48,56,68,60,87,87,87,87,86,86,86,86,57,73,69,55,70,64,61,74,72,89,65,65,60,63,61,57,70,82,58,70,65,64,60,58,70,65,64,82,75,74,80,59,68,69,68,54,55,55,60,57,55,58,53,54,61,56,93,68,100,50,69,62,55,57,58,53,85,83,69,68,69,114,120,66,66,74,66,58,53,53,53,52,51,73,136,139,48,49,49,47,55,57,61,54,57,70,63,58,61,65,65,42,43,44,42,50,46,44,50,50,50,50,47,65,61,62,71,56,53,54,57,54,58,55,68,68,68,69,62,62,62,62,64,64,64,64,62,63,63,63,50,77,77,70,71,72,71,65,65,67,67,65,66,73,62,56,59,64,66,64,56,60,57,103,109,108,103,77,64,66,65,69,46,51,49,56,12,149,130,183,177,237,188,168,97,114,84,78,11,64,88,156,156,152,153,58,186,95,89,95,89,165,122,122,169,105,114,114,101,105,116,114,81,172,167,147,158,154,172,116,116,167,111,113,171,175,157,132,111,145,151,131,142,121,177,135,95,135,94,166,92,91,186,11,11,11,181,316,181,181,189,231,189,176,161,156,109,182,136,203,183,183,159,157,183,226,202,170,219,221,154,199,183,102,189,140,164,170,199,203,201,164,204,198,198,196,90,148,149,83,148,144,151,140,165,160,77,300,165,154,101,11,163,185,222,124,10,10,10,10,61,10,10,10,10,10,10,10,10,10,84,120,98,10,96,116,86,122,100,10,98,118,92,106,10,106,10,120,10,10,99,104,118,10,146,118,10,132,10,10,111,10,124,10,120,10,120,132,146,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,136,90,10,10,10,10,108,118,10,10,10,10,10,94,10,10,10,10,10,10,121,10,10,10,10,10,10,10,10,10,10,10,10,10,72,86,84,98,111,105,122,131,122,129,123,132,130,124,116,119,131,127,113,117,112,120,10,10,10,10,10,10,10,119,119,107,109,111,107,109,10,10,151,10,100,10,10,10,10,10,10,10,10,10,10,10,10,10,144,121,134,10,10,10,10,10,10,10,10,10,10,91,10,10,94,10,93,88,10,88,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,105,107,105,111,113,111,113,115,113,107,109,107,10,10,10,10,107,109,107,113,10,10,115,10,10,10,10,10,10,10,121,10,10,121,10,10,10,10,10,10,10,10,75,111,89,10,10,107,10,107,75,111,89,101,107,107,99,107,84,10,103,127,86,10,77,113,91,10,10,109,10,109,83,10,97,107,93,129,107,121,135,107,119,133,121,127,141,125,139,125,117,131,97,109,10,111,117,10,115,10,10,95,10,109,123,137,109,121,10,123,129,10,127,10,10,10,10,10,10,67,83,103,10,10,10,10,10,10,10,10,115,10,10,10,10,10,10,10,10,10,10,10,113,119,115,93,10,98,117,100,10,10,10,10,10,10,10,10,10,75,10,10,10,10,10,10,10,10,10,10,10,10,111,10,10,10,10,10,10,10,10,10,83,103,10,10,10,10,10,10,10,10,10,137,10,113,137,111,123,10,10,10,144,92,91,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,99,89,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,152,144,142,69,10,10,10,10,115,10,121,111,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,111,10,10,123,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,139,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,87,107,107,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,123,10,10,10,102,129,10,10,10,139,10,10,10,10,129,10,10,145,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,78,10,104,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,158,10,10,10,10,157,10,10,10,10,10,141,10,105,129,137,123,10,10,99,10,113,10,10,10,123,10,10,133,10,10,10,10,10,10,10,10,10,103,10,10,10,10,10,10,10,10,10,10,10,10,119,10,10,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,94,92,62,81,92,92,86,97,90,90,87,83,95,99,105,102,100,103,105,98,105,101,106,108,110,130,119,115,117,98,106,115,118,127,88,94,76,88,90,92,73,96,94,97,98,103,95,101,102,99,102,84,100,97,89,94,86,105,101,93,90,93,75,91,88,102,110,82,85,94,96,95,87,100,100,102,105,97,96,94,97,102,99,102,104,117,115,94,92,84,95,93,91,82,103,104,99,100,104,99,100,98,101,93,106,101,102,92,95,101,102,95,101,102,96,102,97,103,104,96,107,113,114,107,113,114,101,104,107,109,115,116,94,96,98,104,105,98,104,105,99,105,100,106,118,98,104,101,101,99,102,94,103,84,103,103,97,103,105,97,104,97,112,93,88,88,82,90,82,97,89,95,88,93,87,95,84,107,100,100,97,105,90,98,96,97,95,92,109,97,94,109,91,99,98,86,103,104,98,106,106,98,108,91,110,110,110,103,114,115,126,119,94,94,96,98,91,98,91,98,85,93,102,95,102,95,102,96,97,102,92,89,100,82,90,84,91,102,94,95,92,93,78,106,90,98,92,102,103,100,100,103,93,103,103,112,105,105,107,116,100,107,99,102,104,106,95,78,89,83,91,72,91,88,91,84,96,92,94,98,96,90,90,91,94,106,107,101,96,96,92,86,83,96,96,92,86,90,98,98,94,88,80,98,103,96,104,96,83,98,103,96,104,96,97,100,105,98,106,98,98,90,88,88,81,92,90,110,100,99,111,112,97,107,93,99,88,91,110,109,94,115,125,125,118,127,124,124,117,126,108,108,112,122,122,115,124,96,107,121,115,115,108,87,100,88,100,86,87,96,91,105,99,75,76", + "endOffsets": "201,250,305,361,421,482,547,602,652,702,755,813,861,930,978,1049,1121,1193,1266,1333,1382,1436,1473,1524,1584,1631,1687,1736,1794,1848,1909,1965,2016,2076,2132,2195,2244,2300,2356,2406,2465,2520,2582,2629,2683,2739,2791,2846,2900,2954,3008,3057,3115,3169,3226,3282,3329,3382,3438,3498,3561,3620,3682,3732,3786,3840,3888,3945,3998,4054,4108,4164,4227,4289,4345,4405,4458,4519,4598,4679,4751,4830,4910,4986,5064,5133,5209,5286,5357,5430,5506,5584,5653,5729,5806,5870,5941,6013,6064,6117,6172,6239,6292,6344,6394,6452,6517,6565,6616,6683,6749,6807,6876,6934,7003,7073,7146,7220,7288,7355,7425,7491,7564,7624,7700,7760,7820,7895,7963,8029,8097,8157,8216,8273,8339,8401,8458,8526,8599,8669,8731,8792,8860,8922,8992,9061,9117,9176,9238,9300,9367,9424,9485,9546,9607,9668,9724,9780,9836,9892,9950,10008,10066,10124,10181,10238,10295,10352,10411,10470,10528,10611,10694,10767,10821,10890,10946,11027,11108,11179,11308,11361,11419,11477,11535,11581,11641,11695,11765,11835,11900,11966,12031,12099,12168,12236,12366,12419,12478,12536,12588,12638,12690,12736,12786,12842,12889,12947,13005,13067,13130,13192,13251,13311,13376,13442,13507,13569,13631,13693,13755,13817,13879,13945,14012,14078,14141,14205,14268,14336,14397,14459,14521,14584,14648,14711,14775,14853,14912,14978,15058,15119,15172,15230,15281,15326,15387,15451,15510,15572,15646,15717,15783,15857,15926,15997,16070,16141,16209,16282,16358,16428,16506,16574,16640,16701,16770,16834,16900,16968,17034,17097,17165,17236,17301,17374,17437,17518,17582,17648,17718,17788,17858,17928,17995,18052,18110,18169,18229,18288,18347,18406,18465,18524,18583,18642,18701,18760,18819,18879,18940,19002,19063,19124,19185,19246,19307,19368,19428,19489,19550,19610,19671,19732,19793,19854,19915,19976,20037,20098,20159,20220,20281,20349,20418,20488,20557,20626,20695,20764,20833,20902,20971,21040,21109,21178,21238,21299,21361,21422,21483,21544,21605,21666,21727,21788,21849,21910,21971,22033,22096,22160,22223,22286,22349,22412,22475,22538,22601,22664,22727,22790,22851,22913,22976,23038,23100,23162,23224,23286,23348,23410,23472,23534,23596,23653,23739,23819,23909,24004,24096,24188,24278,24361,24454,24541,24638,24729,24830,24917,25020,25109,25208,25300,25400,25484,25578,25666,25764,25847,25938,26032,26131,26233,26331,26431,26518,26618,26704,26800,26888,26969,27060,27156,27249,27342,27433,27518,27612,27701,27799,27892,27994,28082,28186,28277,28377,28470,28571,28656,28751,28840,28939,29024,29116,29211,29311,29414,29513,29616,29705,29806,29893,29990,30078,30174,30266,30366,30456,30554,30639,30728,30817,30910,30997,31088,31154,31230,31299,31378,31451,31531,31611,31688,31756,31834,31910,31981,32062,32135,32218,32293,32378,32451,32532,32613,32687,32771,32841,32919,32989,33069,33147,33219,33301,33371,33448,33528,33613,33701,33785,33872,33946,34024,34102,34173,34254,34345,34428,34524,34622,34729,34794,34860,34913,34989,35055,35142,35218,35294,35359,35414,35468,35547,35625,35698,35763,35826,35892,35963,36034,36104,36166,36235,36301,36361,36428,36495,36551,36602,36655,36707,36761,36832,36895,36954,37016,37075,37148,37215,37285,37345,37408,37483,37555,37651,37722,37778,37849,37906,37963,38029,38093,38164,38221,38274,38337,38389,38447,38514,38583,38649,38708,38791,38850,38907,38974,39044,39118,39180,39249,39319,39418,39515,39614,39700,39786,39867,39942,40031,40122,40206,40265,40311,40377,40434,40501,40558,40640,40705,40771,40894,40978,41099,41164,41226,41324,41398,41481,41570,41634,41713,41787,41849,41945,42010,42069,42125,42181,42241,42348,42395,42455,42516,42580,42641,42701,42759,42802,42851,42903,42954,43006,43055,43104,43169,43235,43295,43356,43412,43471,43520,43568,43626,43683,43785,43842,43917,43965,44016,44078,44143,44195,44269,44332,44395,44463,44513,44575,44635,44692,44752,44801,44869,44975,45077,45146,45217,45273,45322,45422,45493,45603,45694,45776,45874,45930,46031,46141,46240,46303,46409,46486,46598,46725,46837,46964,47034,47148,47279,47376,47444,47562,47665,47783,47844,47918,47985,48090,48212,48286,48353,48463,48562,48635,48732,48854,48972,49090,49151,49273,49390,49458,49564,49666,49746,49817,49913,49980,50054,50128,50214,50304,50382,50459,50559,50630,50751,50872,50936,51061,51135,51259,51383,51450,51559,51687,51799,51878,51956,52057,52128,52250,52372,52437,52563,52675,52781,52849,52948,53052,53115,53181,53265,53378,53491,53609,53687,53759,53895,54031,54116,54256,54394,54532,54674,54756,54842,54919,54992,55101,55212,55340,55468,55600,55730,55860,55994,56083,56145,56241,56308,56425,56546,56643,56725,56812,56899,57030,57161,57296,57373,57450,57561,57675,57749,57858,57970,58037,58110,58175,58277,58373,58477,58545,58610,58704,58776,58886,58992,59065,59156,59258,59361,59456,59563,59668,59790,59912,60038,60097,60155,60279,60403,60531,60649,60767,60889,60975,61072,61206,61340,61420,61558,61690,61822,61958,62033,62109,62212,62286,62399,62480,62537,62598,62657,62717,62775,62836,62894,62944,62993,63060,63119,63178,63227,63298,63382,63452,63523,63603,63672,63735,63803,63869,63937,64002,64068,64145,64223,64329,64435,64531,64660,64749,64876,64942,65012,65098,65164,65247,65321,65419,65515,65611,65709,65818,65913,66002,66064,66124,66189,66246,66327,66381,66438,66535,66645,66706,66821,66942,67037,67129,67222,67278,67337,67386,67478,67527,67581,67635,67689,67743,67797,67852,67962,68072,68180,68290,68400,68510,68620,68728,68834,68938,69042,69146,69241,69336,69429,69522,69626,69732,69836,69940,70033,70126,70219,70312,70420,70526,70632,70738,70835,70930,71025,71120,71226,71332,71438,71544,71642,71737,71833,71930,71995,72099,72157,72221,72282,72344,72404,72469,72531,72599,72657,72720,72783,72850,72925,72998,73064,73116,73169,73221,73278,73362,73457,73542,73623,73703,73780,73859,73936,74010,74084,74155,74235,74307,74382,74447,74508,74568,74643,74717,74790,74860,74932,75002,75075,75139,75209,75255,75324,75376,75461,75544,75601,75667,75734,75800,75881,75956,76012,76065,76126,76184,76234,76283,76332,76381,76443,76495,76540,76621,76672,76726,76779,76833,76884,76933,76999,77050,77111,77172,77234,77284,77325,77402,77461,77520,77579,77640,77696,77752,77819,77880,77945,78000,78065,78134,78202,78280,78349,78409,78480,78554,78619,78691,78761,78828,78912,78981,79048,79118,79181,79248,79316,79399,79478,79568,79645,79713,79780,79858,79915,79972,80040,80106,80162,80222,80281,80335,80385,80435,80483,80545,80596,80669,80749,80829,80893,80960,81031,81089,81150,81216,81275,81342,81402,81462,81525,81593,81654,81721,81799,81869,81918,81975,82044,82105,82193,82281,82369,82457,82544,82631,82718,82805,82863,82937,83007,83063,83134,83199,83261,83336,83409,83499,83565,83631,83692,83756,83818,83876,83947,84030,84089,84160,84226,84291,84352,84411,84482,84548,84613,84696,84772,84847,84928,84988,85057,85127,85196,85251,85307,85363,85424,85482,85538,85597,85651,85706,85768,85825,85919,85988,86089,86140,86210,86273,86329,86387,86446,86500,86586,86670,86740,86809,86879,86994,87115,87182,87249,87324,87391,87450,87504,87558,87612,87665,87717,87791,87928,88068,88117,88167,88217,88265,88321,88379,88441,88496,88554,88625,88689,88748,88810,88876,88942,88985,89029,89074,89117,89168,89215,89260,89311,89362,89413,89464,89512,89578,89640,89703,89775,89832,89886,89941,89999,90054,90113,90169,90238,90307,90376,90446,90509,90572,90635,90698,90763,90828,90893,90958,91021,91085,91149,91213,91264,91342,91420,91491,91563,91636,91708,91774,91840,91908,91976,92042,92109,92183,92246,92303,92363,92428,92495,92560,92617,92678,92736,92840,92950,93059,93163,93241,93306,93373,93439,93509,93556,93608,93658,93715,94035,94185,94316,94500,94678,94916,95105,95274,95372,95487,95572,95651,95811,95876,95965,96122,96279,96432,96586,96645,96832,96928,97018,97114,97204,97370,97493,97616,97786,97892,98007,98122,98224,98330,98447,98562,98644,98817,98985,99133,99292,99447,99620,99737,99854,100022,100134,100248,100420,100596,100754,100887,100999,101145,101297,101429,101572,101694,101872,102008,102104,102240,102335,102502,102595,102687,102874,103030,103208,103372,103554,103871,104053,104235,104425,104657,104847,105024,105186,105343,105453,105636,105773,105977,106161,106345,106505,106663,106847,107074,107277,107448,107668,107890,108045,108245,108429,108532,108722,108863,109028,109199,109399,109603,109805,109970,110175,110374,110573,110770,110861,111010,111160,111244,111393,111538,111690,111831,111997,112158,112236,112537,112703,112858,112960,113118,113282,113468,113691,113816,114093,114365,114643,114888,114950,115235,115686,116142,116651,116799,117313,117750,118184,118627,118712,118833,118932,119337,119434,119551,119638,119761,119862,120268,120367,120486,120579,120686,121029,121136,121381,121502,121911,122159,122259,122364,122483,122992,123139,123258,123509,123642,124057,124311,124423,124670,124795,125203,125324,125552,125673,125806,125953,146675,147167,167638,168062,188829,189323,209839,210265,215106,220523,224614,230045,234787,240164,244148,248140,253531,254078,254511,255267,255497,255740,256907,257836,258740,259324,259797,261227,261971,263164,264218,264696,264989,265372,266887,267652,268795,269236,269677,270273,270547,270958,271974,272152,272905,273042,273133,275327,275593,275915,276125,276234,276353,276537,277655,278125,278876,281459,281554,281930,282158,282414,282673,283249,283603,283725,283864,284156,284416,285344,285630,286033,286435,286778,286990,287191,287404,287693,287978,288051,288138,288223,288322,288434,288540,288663,288795,288918,289048,289172,289305,289436,289561,289678,289798,289930,290058,290172,290290,290403,290524,290712,290899,291080,291263,291447,291612,291794,291914,292034,292142,292252,292364,292472,292582,292747,292913,293065,293230,293331,293451,293622,293783,293946,294107,294274,294393,294510,294690,294872,295053,295236,295391,295536,295658,295793,295956,296149,296275,296427,296569,296739,296895,297067,297358,297553,297645,297818,297980,298075,298244,298338,298427,298670,298759,299052,299468,299888,300309,300735,301152,301568,301985,302403,302817,303287,303760,304232,304643,305114,305586,305776,305982,306088,306196,306302,306414,306528,306640,306754,306870,306984,307092,307202,307310,307572,307951,308355,308502,308610,308720,308828,308942,309351,309765,309881,310299,310540,310970,311405,311815,312237,312647,312769,313178,313594,313716,313934,314118,314186,314530,314610,314966,315116,315260,315336,315448,315538,315800,316065,316173,316325,316433,316509,316621,316711,316813,316921,317029,317129,317237,317322,317488,317592,317720,317807,317974,318052,318166,318258,318522,318789,318899,319052,319162,319246,319635,319733,319841,319935,320065,320173,320295,320431,320539,320659,320793,320915,321043,321185,321311,321451,321577,321695,321827,321925,322035,322335,322447,322565,323029,323145,323448,323574,323670,324071,324181,324305,324443,324553,324675,324987,325111,325241,325717,325845,326160,326298,326460,326676,326832,327036,327104,327188,327292,327495,327684,327885,328078,328283,328596,328808,328974,329090,329336,329552,329865,330291,330753,330990,331142,331402,331546,331688,334920,335034,335154,335270,335364,335685,335784,335902,336003,336282,336567,336846,337128,337381,337640,337893,338149,338573,338649,341899,343254,343698,345552,346127,346335,347345,347725,347891,348032,353052,353478,353590,353725,353878,354075,354246,354429,354604,354791,355063,355221,355305,355409,355896,356452,356610,356829,357060,357283,357518,357740,358006,358144,358743,358857,358995,359107,359231,359802,360297,360843,360988,361081,361173,363100,363670,363968,364157,364363,364556,364766,365650,365795,366187,366345,366562,366823,367255,368130,368750,368947,369895,370660,370783,371556,371777,371977,373954,374054,374144,374830,375583,376348,377111,377886,379099,379264,380877,381198,382261,382471,382641,383211,384106,384739,384905,386391,387007,387243,387464,388422,388687,388952,389199,389613,389849,391134,391583,391770,392019,392261,392437,392678,392911,393136,393731,394206,394730,394991,396342,396817,398043,398513,399561,400013,400257,400714,401959,402442,402592,403147,403599,403999,404152,404297,404440,404510,404938,405226,405730,406239,406355,407257,407379,407491,407668,407934,408204,408470,408738,408994,409254,409510,409768,410020,410276,410528,410782,411014,411250,411502,411758,412010,412264,412496,412730,412842,413494,413949,414073,415165,415980,416176,416500,416889,417241,417482,417696,417995,418187,418502,418709,419055,419355,419756,419975,420388,420625,420995,421719,422074,422343,422483,422737,422881,423158,424150,424559,425191,425537,425905,426979,427342,427742,429250,429835,430153,432688,432882,433100,433326,433538,433737,433944,435148,435443,436000,436390,437022,437499,437744,438231,438477,439673,440070,441076,441298,441721,441912,442291,442379,442487,442595,442908,443233,443552,443883,446586,446774,447035,447284,449868,450060,450325,450578,451110,451518,451717,452301,452536,452660,453072,453286,453688,453791,453921,454096,454348,454544,454684,454878,455889,456958,457246,457376,458153,458810,458956,459662,459900,461440,461590,462007,462172,462858,463328,463524,463615,463699,463843,464077,464244,465172,465458,465618,466233,466392,466720,466947,467459,467821,467900,468239,468344,468709,469080,469441,471315,471944,473020,473444,473697,473849,474897,475634,475837,476083,476330,476548,476790,477111,477375,477680,477903,478214,478403,479118,479387,479881,480107,480547,480706,480990,481735,482100,482405,482563,482801,484120,484518,484746,484966,485108,486398,486504,486634,486772,486896,487184,487353,487453,487738,487852,488735,489490,489929,490053,490299,490492,490626,490817,491596,491814,492105,492384,492701,492923,493218,493501,493605,493946,494762,495078,495639,496145,496350,497136,497541,498202,498391,498942,499508,499628,500030,500564,501094,501393,503738,506180,508005,510012,510351,512784,515320,515760,516512,516696,516907,521565,522148,522876,523078,524213,524363,524538,524763,525357,526656,526997,527505,528016,529810,530070,530686,531181,532218,534084,534275,534608,534764,534957,537349,537578,537786,537956,539728,540026,541369,542379,544344,544460,544629,544766,544912,545597,547401,547932,548358,550373,550621,551391,551507,551682,554897,555044,565916,566159,566577,566672,566765,566828,566910,567003,567096,567183,567281,567372,567463,567551,567635,567731,567831,567937,568040,568141,568245,568351,568450,568556,568658,568765,568874,568985,569116,569236,569352,569470,569569,569676,569792,569911,570039,570128,570223,570300,570389,570480,570573,570647,570744,570839,570937,571036,571140,571236,571338,571441,571541,571644,571729,571830,571928,572018,572113,572200,572306,572408,572502,572593,572687,572763,572855,572944,573047,573158,573241,573327,573422,573519,573615,573703,573804,573905,574008,574114,574212,574309,574404,574502,574605,574705,574808,574913,575031,575147,575242,575335,575420,575516,575610,575702,575785,575889,575994,576094,576195,576300,576400,576501,576600,576702,576796,576903,577005,577108,577201,577297,577399,577502,577598,577700,577803,577900,578003,578101,578205,578310,578407,578515,578629,578744,578852,578966,579081,579183,579288,579396,579506,579622,579739,579834,579931,580030,580135,580241,580340,580445,580551,580651,580757,580858,580965,581084,581183,581288,581390,581492,581592,581695,581790,581894,581979,582083,582187,582285,582389,582495,582593,582698,582796,582909,583003,583092,583181,583264,583355,583438,583536,583626,583722,583811,583905,583993,584089,584174,584282,584383,584484,584582,584688,584779,584878,584975,585073,585169,585262,585372,585470,585565,585675,585767,585867,585966,586053,586157,586262,586361,586468,586575,586674,586783,586875,586986,587097,587208,587312,587427,587543,587670,587790,587885,587980,588077,588176,588268,588367,588459,588558,588644,588738,588841,588937,589040,589136,589239,589336,589434,589537,589630,589720,589821,589904,589995,590080,590172,590275,590370,590466,590559,590653,590732,590839,590930,591029,591122,591225,591329,591430,591531,591635,591729,591833,591937,592050,592156,592262,592370,592487,592588,592696,592796,592899,593004,593111,593207,593286,593376,593460,593552,593625,593717,593806,593898,593983,594080,594173,594268,594367,594464,594555,594646,594738,594833,594940,595048,595150,595247,595344,595437,595524,595608,595705,595802,595895,595982,596073,596172,596271,596366,596455,596536,596635,596739,596836,596941,597038,597122,597221,597325,597422,597527,597624,597722,597823,597929,598028,598135,598234,598333,598424,598513,598602,598684,598777,598868,598979,599080,599180,599292,599405,599503,599611,599705,599805,599894,599986,600097,600207,600302,600418,600544,600670,600789,600917,601042,601167,601285,601412,601521,601630,601743,601866,601989,602105,602230,602327,602435,602557,602673,602789,602898,602986,603087,603176,603277,603364,603452,603549,603641,603747,603847,603923,604000" + }, + "to": { + "startLines": "10,16,27,30,31,32,33,34,37,38,39,40,41,43,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,117,118,140,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,226,228,229,231,232,233,234,235,236,237,238,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,467,468,469,497,509,510,511,512,513,514,515,516,517,518,519,520,524,525,526,527,529,530,531,532,533,534,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,575,576,587,588,598,599,629,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,1061,1065,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1783,1784,1832,1833,1834,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1853,1856,1857,1858,1879,1880,1881,1882,1883,1884,1885,1896,1905,1906,1909,1910,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1972,2009,2021,2022,2023,2024,2025,2026,2058,2059,2060,2061,2215,2219,2224,2225,2226,2229,2230,2231,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2320,2323,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2408,2409,2410,2411,2412,2488,2492,2493,2518,2519,2552,2556,2560,2564,2568,2569,2620,2628,2635,2805,2808,2818,2827,2836,2905,2906,2907,2908,2914,2915,2916,2917,2918,2919,2925,2926,2927,2928,2929,2934,2935,2939,2940,2946,2950,2951,2952,2953,2963,2964,2965,2969,2970,2976,2980,3050,3053,3054,3059,3060,3063,3064,3065,3066,3330,3337,3598,3604,3868,3875,4136,4142,4205,4287,4339,4421,4483,4565,4629,4681,4763,4771,4777,4788,4792,4796,4809,5584,5600,5607,5613,5630,5643,5663,5680,5689,5694,5701,5721,5734,5751,5757,5763,5770,5774,5780,5794,5797,5807,5808,5809,5857,5861,5865,5869,5870,5871,5874,5890,5897,5911,5956,5965,5971,5975,5979,5984,5991,5997,5998,6001,6005,6010,6023,6027,6032,6037,6042,6045,6048,6051,6055,6198,6199,6200,6201,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6300,6304,6308,6312,6316,6320,6324,6325,6326,6327,6328,6329,6330,6331,6335,6339,6340,6344,6345,6348,6352,6355,6358,6361,6365,6368,6371,6375,6379,6383,6387,6390,6391,6392,6393,6396,6400,6403,6406,6409,6412,6415,6418,6489,6492,6493,6496,6499,6500,6503,6504,6505,6509,6510,6515,6522,6529,6536,6543,6550,6557,6564,6571,6578,6587,6596,6605,6612,6621,6630,6633,6636,6637,6638,6639,6640,6641,6642,6643,6644,6645,6646,6647,6648,6652,6657,6662,6665,6666,6667,6668,6669,6677,6685,6686,6694,6698,6706,6714,6722,6730,6738,6739,6747,6755,6756,6759,6832,6834,6839,6841,6846,6850,6854,6855,6856,6857,6861,6865,6866,6870,6871,6872,6873,6874,6875,6876,6877,6878,6879,6880,6884,6885,6886,6887,6891,6892,6893,6894,6898,6902,6903,6907,6908,6909,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6938,6939,6940,6946,6947,6951,6953,6954,6959,6960,6961,6962,6963,6964,6968,6969,6970,6976,6977,6981,6983,6987,6991,6995,7019,7020,7021,7022,7025,7028,7031,7034,7037,7042,7046,7049,7050,7055,7059,7064,7070,7076,7081,7085,7090,7094,7098,7139,7140,7141,7142,7143,7147,7148,7149,7150,7154,7158,7162,7166,7170,7174,7178,7182,7188,7189,7230,7244,7249,7275,7282,7285,7296,7301,7304,7307,7362,7368,7369,7372,7375,7378,7381,7384,7387,7390,7394,7397,7398,7399,7407,7415,7418,7423,7428,7433,7438,7442,7446,7447,7455,7456,7457,7458,7459,7467,7472,7477,7478,7479,7480,7505,7511,7516,7519,7523,7526,7530,7540,7543,7548,7551,7555,7656,7664,7678,7691,7695,7710,7721,7724,7735,7740,7744,7779,7780,7781,7793,7801,7809,7817,7825,7845,7848,7875,7880,7900,7903,7906,7913,7926,7935,7938,7958,7968,7972,7976,7989,7993,7997,8001,8007,8011,8028,8036,8040,8044,8048,8051,8055,8059,8063,8073,8080,8087,8091,8117,8127,8152,8161,8181,8191,8195,8205,8230,8240,8243,8250,8257,8264,8265,8266,8267,8268,8275,8279,8285,8291,8292,8305,8306,8307,8310,8313,8316,8319,8322,8325,8328,8331,8334,8337,8340,8343,8346,8349,8352,8355,8358,8361,8364,8367,8370,8371,8379,8387,8388,8401,8411,8415,8420,8425,8429,8432,8436,8440,8443,8447,8450,8454,8459,8464,8467,8474,8478,8482,8491,8496,8501,8502,8506,8509,8513,8526,8531,8539,8543,8547,8564,8568,8573,8591,8598,8602,8632,8635,8638,8641,8644,8647,8650,8669,8675,8683,8690,8702,8710,8715,8723,8727,8745,8752,8768,8772,8780,8783,8788,8789,8790,8791,8795,8799,8803,8807,8842,8845,8849,8853,8887,8890,8894,8898,8907,8913,8916,8926,8930,8931,8938,8942,8949,8950,8951,8954,8959,8964,8965,8969,8984,9003,9007,9008,9020,9030,9031,9043,9048,9072,9075,9081,9084,9093,9101,9105,9108,9111,9114,9118,9121,9138,9142,9145,9160,9163,9171,9176,9183,9188,9189,9194,9195,9201,9207,9213,9245,9256,9273,9280,9284,9287,9300,9309,9313,9318,9322,9326,9330,9334,9338,9342,9346,9351,9354,9366,9371,9380,9383,9390,9391,9395,9404,9410,9414,9415,9419,9440,9446,9450,9454,9455,9473,9474,9475,9476,9477,9482,9485,9486,9492,9493,9505,9517,9524,9525,9530,9535,9536,9540,9554,9559,9565,9571,9577,9582,9588,9594,9595,9601,9616,9621,9630,9639,9642,9656,9661,9672,9676,9685,9694,9695,9702,9859,9876,9886,10428,10495,10548,10605,10617,10753,10862,10882,10903,10909,10917,11023,11798,11821,11827,11871,11875,11935,12021,12277,12330,12337,12345,12360,12416,12427,12440,12452,12490,12537,12543,12555,12561,12567,12619,12624,12629,12636,12934,12946,12992,13021,13160,13165,13198,13201,13205,13234,13272,13290,13327,13394,13402,13531,13535,13543,13672,13676,13955,14018,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545,14546,14547,14548,14549,14550", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "490,732,1185,1343,1399,1459,1520,1585,1740,1790,1840,1893,1951,2050,2420,2468,2539,2611,2683,2756,2823,2872,2926,2963,3014,3074,3121,3177,3226,3284,3338,3399,3455,3506,3566,3622,3685,3734,3790,3846,3896,3955,4010,4072,4119,4173,4229,4281,4336,4390,4444,4498,4547,4605,4659,4716,4772,4819,4872,4928,4988,5051,5110,5172,5222,5276,5330,5378,5435,5488,6112,6166,7097,7208,7270,7326,7386,7439,7500,7579,7660,7732,7811,7891,7967,8045,8114,8190,8267,8338,8411,8487,8565,8634,8710,8787,8851,8922,11435,11531,11584,11688,11755,11808,11860,11910,11968,12033,12081,19022,19089,19155,19213,19282,19340,19409,19479,19552,19626,19694,19761,19831,19897,19970,20030,20106,20166,20226,20301,20369,20435,20503,20563,20622,20679,20745,20807,20864,20932,21005,21075,21137,21198,21266,21328,21398,21467,21523,21582,21644,21706,21773,21830,21891,21952,22013,22074,22130,22186,22242,22298,22356,22414,22472,22530,22587,22644,22701,22758,22817,22876,22934,23017,23100,23173,23227,23296,23352,23433,23514,23585,23920,23973,24031,25196,25755,25801,25861,25915,25985,26055,26120,26186,26251,26319,26388,26456,26586,26639,26698,26756,26854,26904,26956,27002,27052,27108,27202,27260,27318,27380,27443,27505,27564,27624,27689,27755,27820,27882,27944,28006,28068,28130,28192,28258,28325,28391,28454,28518,28581,28649,28710,28772,28834,28897,28961,29024,29088,29166,29225,29291,29371,29432,29636,29694,30127,30172,30639,30703,31895,34629,34703,34774,34840,34914,34983,35054,35127,35198,35266,35339,35415,35485,35563,35631,35697,35758,35827,35891,35957,36025,36091,36154,36222,36293,36358,36431,36494,36575,36639,36705,36775,36845,36915,36985,37955,38012,38070,38129,38189,38248,38307,38366,38425,38484,38543,38602,38661,38720,38779,38839,38900,38962,39023,39084,39145,39206,39267,39328,39388,39449,39510,39570,39631,39692,39753,39814,39875,39936,39997,40058,40119,40180,40241,40309,40378,40448,40517,40586,40655,40724,40793,40862,40931,41000,41069,41138,41198,41259,41321,41382,41443,41504,41565,41626,41687,41748,41809,41870,41931,41993,42056,42120,42183,42246,42309,42372,42435,42498,42561,42624,42687,42750,42811,42873,42936,42998,43060,43122,43184,43246,43308,43370,43432,43494,43556,43613,43699,43779,43869,43964,44056,44148,44238,44321,44414,44501,44598,44689,44790,44877,44980,45069,45168,45260,45360,45444,45538,45626,45724,45807,45898,45992,46091,46193,46291,46391,46478,46578,46664,46760,46848,46929,47020,47116,47209,47302,47393,47478,47572,47661,47759,47852,47954,48042,48146,48237,48337,48430,48531,48616,48711,48800,48899,48984,49076,49171,49271,49374,49473,49576,49665,49766,49853,49950,50038,50134,50226,50326,50416,50514,50599,50688,50777,50870,50957,51720,51786,51862,51931,52010,52083,52163,52243,52320,52388,52466,52542,52613,52694,52767,52850,52925,53010,53083,53164,53245,53319,53403,53473,53551,53621,53701,53779,53851,53933,54003,54080,54160,54245,54333,54417,54504,54578,54656,54734,54805,54886,54977,55060,55156,55254,55361,55426,55492,55545,55621,55687,55774,55850,63360,63595,64190,64244,64323,64401,64474,64539,64602,64668,64739,64810,64880,64942,65011,65077,65137,65204,65271,65327,65378,65431,65483,65537,65608,65671,65730,65792,65851,65924,65991,66061,66121,66184,66259,66331,66427,66498,66554,66625,66682,66739,66805,66869,66940,66997,67050,67113,67165,67223,68460,68529,68595,68654,68737,68796,68853,68920,68990,69064,69126,69195,69265,69364,69461,69560,69646,69732,69813,69888,69977,70068,70152,70211,70257,70323,70380,70447,70504,70586,70651,70717,70840,70924,71045,71110,71172,71270,71344,71427,71516,71580,71659,71733,71795,71891,71956,72015,72071,72127,72187,72294,72341,72401,72462,72526,72587,72647,72705,72748,72797,72849,72900,72952,73001,73050,73115,73181,73241,73302,73358,73417,73466,73514,73572,73629,73731,73788,73863,73911,73962,74024,74089,74141,74215,74278,74341,74409,74459,74521,74581,74638,74698,74747,74815,74921,75023,75092,75163,75219,75268,75368,75439,75549,75640,75722,75820,75876,75977,76087,76186,76249,76355,76432,76544,76671,76783,76910,76980,77094,77225,77322,77390,77508,77611,77729,77790,77864,77931,78036,78158,78232,78299,78409,78508,78581,78678,78800,78918,79036,79097,79219,79336,79404,79510,79612,79692,79763,79859,79926,80000,80074,80160,80250,80328,80405,80505,80576,80697,80818,80882,81007,81081,81205,81329,81396,81505,81633,81745,81824,81902,82003,82074,82196,82318,82383,82509,82621,82727,82795,82894,82998,83061,83127,83211,83324,83437,83555,83633,83705,83841,83977,84062,84202,84340,84478,84620,84702,84788,84865,84938,85047,85158,85286,85414,85546,85676,85806,85940,86029,86091,86187,86254,86371,86492,86589,86671,86758,86845,86976,87107,87242,87319,87396,87507,87621,87695,87804,87916,87983,88056,88121,88223,88319,88423,88491,88556,88650,88722,88832,88938,89011,89102,89204,89307,89402,89509,89614,89736,89858,89984,90043,90101,90225,90349,90477,90595,90713,90835,90921,91018,91152,91286,91366,91504,91636,91768,91904,91979,92055,92158,92232,92345,92426,92483,92544,92603,92663,92721,92782,92840,92890,92939,93006,93065,93124,93173,93244,93328,93398,93469,93549,93618,93681,93749,93815,93883,93948,94014,94091,94169,94275,94381,94477,94606,94695,94822,94888,94958,95044,95110,95193,95267,95365,95461,95557,95655,95764,95859,95948,96010,96070,96135,96192,96273,96327,96384,96481,96591,96652,96767,96888,96983,97075,97168,97224,97283,97332,97424,97473,97527,97581,97635,97689,97743,97798,97908,98018,98126,98236,98346,98456,98566,98674,98780,98884,98988,99092,99187,99282,99375,99468,99572,99678,99782,99886,99979,100072,100165,100258,100366,100472,100578,100684,100781,100876,100971,101066,101172,101278,101384,101490,101588,101683,101779,101876,101941,102045,102103,102167,102228,102290,102350,102415,102477,102545,102603,102666,102729,102796,102871,102944,103010,103062,103115,103167,103224,103308,103403,103488,103569,103649,103726,103805,103882,103956,104030,104101,104181,104253,104328,104393,104454,104514,104589,104663,104736,104806,104878,104948,105021,105085,105155,105201,105270,105322,105407,105490,105547,105613,105680,105746,105827,105902,105958,106011,106072,106130,106180,106229,106278,106327,106389,106441,106486,106567,106618,106672,106725,106779,106830,106879,106945,106996,107057,107118,107180,107230,107271,107348,107407,107466,107525,107586,107642,107698,107765,107826,107891,107946,108011,108080,108148,108226,108295,108355,108426,108500,108565,108637,108707,108774,108858,108927,108994,109064,109127,109194,109262,109345,109424,109514,109591,109659,109726,109804,109861,109918,109986,110052,110108,110168,110227,110281,110331,110381,110429,110491,110542,110615,110695,110775,110839,110906,110977,111035,111096,111162,111221,111288,111348,111408,111471,111539,111600,111667,111745,111815,111864,111921,111990,112051,112139,112227,112315,112403,112490,112577,112664,112751,112809,112883,112953,113009,113080,113145,113207,113282,113355,113445,113511,113577,113638,113702,113764,113822,113893,113976,114035,114106,114172,114237,114298,114357,114428,114494,114559,114642,114718,114793,114874,114934,115003,115073,115142,115197,115253,115309,115370,115428,115484,115543,115597,115652,115714,115771,115865,115934,116035,116086,116156,116219,116275,116333,116392,116446,116532,116616,116686,116755,116825,116940,117061,117128,117195,117270,117337,117396,117450,117504,117558,117611,117663,119168,119305,122141,122190,122240,122331,122379,122435,122493,122555,122610,122668,122739,122803,122862,122924,122990,123304,123449,123493,123538,124662,124713,124760,124805,124856,124907,124958,125495,125985,126051,126230,126293,126433,126490,126544,126599,126657,126712,126771,126827,126896,126965,127034,127104,127167,127230,127293,127356,127421,127486,127551,127616,127679,127743,127807,127871,127922,128000,128078,128149,128221,128294,128366,128432,128498,128566,128634,128700,128767,128841,128904,128961,129021,129086,129153,129218,129275,129336,129394,129498,129608,129717,129821,129899,129964,130031,130097,130167,130214,130266,130316,130443,133103,134158,134289,134473,134651,134889,135078,137628,137726,137841,137926,152691,152931,153378,153467,153624,153929,154082,154236,156447,156634,156730,156820,156916,157006,157172,157295,157418,157588,157694,157809,157924,158026,158132,158249,158779,158861,159034,159202,159350,159509,159664,159837,159954,160071,160239,160351,160465,160637,160813,160971,161104,161216,161362,161514,161646,161789,161911,162089,162225,162321,162457,162552,162719,162812,162904,163091,163247,163425,163589,163771,164088,164270,164452,164642,164874,165064,165241,165403,165560,165670,165853,165990,166194,166378,166562,166722,166880,167064,167291,167494,167665,167885,168107,168262,168462,168646,168749,168939,169080,169245,169416,169616,169820,170022,170187,170392,170591,170790,170987,171078,171227,171377,171461,171610,171755,171907,172048,172214,174749,174827,175128,175294,175449,181507,181728,181892,183964,184187,186714,186991,187263,187541,187786,187848,190976,191427,191883,203020,203168,203682,204119,204553,208893,208978,209099,209198,209603,209700,209817,209904,210027,210128,210534,210633,210752,210845,210952,211295,211402,211647,211768,212177,212425,212525,212630,212749,213258,213405,213524,213775,213908,214323,214577,219792,220039,220164,220572,220693,220921,221042,221175,221322,242044,242536,263007,263431,284198,284692,305208,305634,310475,315892,319983,325414,330156,335533,339517,343509,348900,349447,349880,350636,350866,351109,352276,400446,401350,401934,402407,403837,404581,405774,406828,407306,407599,407982,409497,410262,411405,411846,412287,412883,413157,413568,414584,414762,415515,415652,415743,417937,418203,418525,418735,418844,418963,419147,420265,420735,421486,424069,424482,424858,425086,425342,425601,426177,426531,426653,426792,427084,427344,428272,428558,428961,429363,429706,429918,430119,430332,430621,441508,441581,441668,441753,446422,446534,446640,446763,446895,447018,447148,447272,447405,447536,447661,447778,447898,448030,448158,448272,448390,448503,448624,448812,448999,449180,449363,449547,449712,449894,450014,450134,450242,450352,450464,450572,450682,450847,451013,451165,451330,451431,451551,451722,451883,452046,452207,452374,452493,452610,452790,452972,453153,453336,453491,453636,453758,453893,454056,454249,454375,454527,454669,454839,454995,455167,461930,462125,462217,462390,462552,462647,462816,462910,462999,463242,463331,463624,464040,464460,464881,465307,465724,466140,466557,466975,467389,467859,468332,468804,469215,469686,470158,470348,470554,470660,470768,470874,470986,471100,471212,471326,471442,471556,471664,471774,471882,472144,472523,472927,473074,473182,473292,473400,473514,473923,474337,474453,474871,475112,475542,475977,476387,476809,477219,477341,477750,478166,478288,478506,483256,483324,483668,483748,484104,484254,484398,484474,484586,484676,484938,485203,485311,485463,485571,485647,485759,485849,485951,486059,486167,486267,486375,486460,486626,486730,486858,486945,487112,487190,487304,487396,487660,487927,488037,488190,488300,488384,488773,488871,488979,489073,489203,489311,489433,489569,489677,489797,489931,490053,490181,490323,490449,490589,490715,490833,490965,491063,491173,491473,491585,491703,492167,492283,492586,492712,492808,493209,493319,493443,493581,493691,493813,494125,494249,494379,494855,494983,495298,495436,495598,495814,495970,497587,497655,497739,497843,498046,498235,498436,498629,498834,499147,499359,499525,499641,499887,500103,500416,500842,501304,501541,501693,501953,502097,502239,505471,505585,505705,505821,505915,506236,506335,506453,506554,506833,507118,507397,507679,507932,508191,508444,508700,509124,509200,512450,513805,514249,516103,516678,516886,517896,518276,518442,518583,523603,524029,524141,524276,524429,524626,524797,524980,525155,525342,525614,525772,525856,525960,526447,527003,527161,527380,527611,527834,528069,528291,528557,528695,529294,529408,529546,529658,529782,530353,530848,531394,531539,531632,531724,533651,534221,534519,534708,534914,535107,535317,536201,536346,536738,536896,537113,545169,545601,546476,547096,547293,548241,549006,549129,549902,550123,550323,552300,552400,552490,553176,553929,554694,555457,556232,557445,557610,559223,559544,560607,560817,560987,561557,562452,563085,563251,564737,565353,565589,565810,566768,567033,567298,567545,567959,568195,569480,569929,570116,570365,570607,570783,571024,571257,571482,572077,572552,573076,573337,574688,575163,576389,576859,577907,578359,578603,579060,580305,580788,580938,581493,581945,582345,582498,582643,582786,582856,583284,583572,584076,584585,584701,585603,585725,585837,586014,586280,586550,586816,587084,587340,587600,587856,588114,588366,588622,588874,589128,589360,589596,589848,590104,590356,590610,590842,591076,591188,591840,592295,592419,593511,594326,594522,594846,595235,595587,595828,596042,596341,596533,596848,597055,597401,597701,598102,598321,598734,598971,599341,600065,600420,600689,600829,601083,601227,601504,602496,602905,603537,603883,604251,605325,605688,606088,607596,608181,608499,611034,611228,611446,611672,611884,612083,612290,613494,613789,614346,614736,615368,615845,616090,616577,616823,618019,618416,619422,619644,620067,620258,620637,620725,620833,620941,621254,621579,621898,622229,624932,625120,625381,625630,628214,628406,628671,628924,629456,629864,630063,630647,630882,631006,631418,631632,632034,632137,632267,632442,632694,632890,633030,633224,634235,635304,635592,635722,636499,637156,637302,638008,638246,639786,639936,640353,640518,641204,641674,641870,641961,642045,642189,642423,642590,643518,643804,643964,644579,644738,645066,645293,645805,646167,646246,646585,646690,647055,647426,647787,649661,650290,651366,651790,652043,652195,653243,653980,654183,654429,654676,654894,655136,655457,655721,656026,656249,656560,656749,657464,657733,658227,658453,658893,659052,659336,660081,660446,660751,660909,661147,662466,662864,663092,663312,663454,664744,664850,664980,665118,665242,665530,665699,665799,666084,666198,667081,667836,668275,668399,668645,668838,668972,669163,669942,670160,670451,670730,671047,671269,671564,671847,671951,672292,673108,673424,673985,674491,674696,675482,675887,676548,676737,677288,677854,677974,678376,683982,684512,684811,703223,705665,707490,709497,709836,715866,718161,718601,719353,719537,719748,724406,756486,757214,757416,758551,758701,761288,764206,774238,776052,776393,776901,777412,779206,779466,780082,780577,781614,783480,783671,784004,784160,784353,786745,786974,787182,787352,798754,799052,800395,801405,806477,806593,807817,807954,808100,810047,811185,811716,812559,814574,814822,819738,819854,820029,824635,824782,835654,838028,843770,843865,843958,844021,844103,844196,844289,844376,844474,844565,844656,844744,844828,844924,845024,845130,845233,845334,845438,845544,845643,845749,845851,845958,846067,846178,846309,846429,846545,846663,846762,846869,846985,847104,847232,847321,847416,847493,847582,847673,847766,847840,847937,848032,848130,848229,848333,848429,848531,848634,848734,848837,848922,849023,849121,849211,849306,849393,849499,849601,849695,849786,849880,849956,850048,850137,850240,850351,850434,850520,850615,850712,850808,850896,850997,851098,851201,851307,851405,851502,851597,851695,851798,851898,852001,852106,852224,852340,852435,852528,852613,852709,852803,852895,852978,853082,853187,853287,853388,853493,853593,853694,853793,853895,853989,854096,854198,854301,854394,854490,854592,854695,854791,854893,854996,855093,855196,855294,855398,855503,855600,855708,855822,855937,856045,856159,856274,856376,856481,856589,856699,856815,856932,857027,857124,857223,857328,857434,857533,857638,857744,857844,857950,858051,858158,858277,858376,858481,858583,858685,858785,858888,858983,859087,859172,859276,859380,859478,859582,859688,859786,859891,859989,860102,860196,860285,860374,860457,860548,860631,860729,860819,860915,861004,861098,861186,861282,861367,861475,861576,861677,861775,861881,861972,862071,862168,862266,862362,862455,862565,862663,862758,862868,862960,863060,863159,863246,863350,863455,863554,863661,863768,863867,863976,864068,864179,864290,864401,864505,864620,864736,864863,864983,865078,865173,865270,865369,865461,865560,865652,865751,865837,865931,866034,866130,866233,866329,866432,866529,866627,866730,866823,866913,867014,867097,867188,867273,867365,867468,867563,867659,867752,867846,867925,868032,868123,868222,868315,868418,868522,868623,868724,868828,868922,869026,869130,869243,869349,869455,869563,869680,869781,869889,869989,870092,870197,870304,870400,870479,870569,870653,870745,870818,870910,870999,871091,871176,871273,871366,871461,871560,871657,871748,871839,871931,872026,872133,872241,872343,872440,872537,872630,872717,872801,872898,872995,873088,873175,873266,873365,873464,873559,873648,873729,873828,873932,874029,874134,874231,874315,874414,874518,874615,874720,874817,874915,875016,875122,875221,875328,875427,875526,875617,875706,875795,875877,875970,876061,876172,876273,876373,876485,876598,876696,876804,876898,876998,877087,877179,877290,877400,877495,877611,877737,877863,877982,878110,878235,878360,878478,878605,878714,878823,878936,879059,879182,879298,879423,879520,879628,879750,879866,879982,880091,880179,880280,880369,880470,880557,880645,880742,880834,880940,881040,881116", + "endLines": "10,16,27,30,31,32,33,34,37,38,39,40,41,43,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,117,118,140,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,226,228,229,231,232,233,234,235,236,237,238,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,462,467,468,469,497,509,510,511,512,513,514,515,516,517,518,519,523,524,525,526,527,529,530,531,532,533,534,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,575,576,587,588,598,599,629,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,1061,1065,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1783,1784,1832,1833,1834,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1853,1856,1857,1858,1879,1880,1881,1882,1883,1884,1885,1896,1905,1906,1909,1910,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1975,2009,2021,2022,2023,2024,2025,2026,2058,2059,2060,2061,2217,2219,2224,2225,2226,2229,2230,2231,2265,2266,2267,2268,2269,2270,2271,2272,2273,2274,2275,2276,2277,2278,2279,2280,2286,2287,2288,2289,2290,2291,2292,2293,2294,2295,2296,2297,2298,2299,2300,2301,2302,2303,2304,2305,2306,2307,2308,2309,2310,2311,2312,2313,2314,2315,2316,2319,2322,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2362,2363,2364,2365,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2408,2409,2410,2411,2412,2490,2492,2493,2518,2519,2555,2559,2563,2567,2568,2572,2627,2634,2642,2807,2817,2826,2835,2844,2905,2906,2907,2913,2914,2915,2916,2917,2918,2924,2925,2926,2927,2928,2933,2934,2938,2939,2945,2949,2950,2951,2952,2962,2963,2964,2968,2969,2975,2979,2980,3052,3053,3058,3059,3062,3063,3064,3065,3329,3336,3597,3603,3867,3874,4135,4141,4204,4286,4338,4420,4482,4564,4628,4680,4762,4770,4776,4787,4791,4795,4808,4823,5599,5606,5612,5629,5642,5662,5679,5688,5693,5700,5720,5733,5750,5756,5762,5769,5773,5779,5793,5796,5806,5807,5808,5856,5860,5864,5868,5869,5870,5873,5889,5896,5910,5955,5956,5970,5974,5978,5983,5990,5996,5997,6000,6004,6009,6022,6026,6031,6036,6041,6044,6047,6050,6054,6058,6198,6199,6200,6201,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6299,6303,6307,6311,6315,6319,6323,6324,6325,6326,6327,6328,6329,6330,6334,6338,6339,6343,6344,6347,6351,6354,6357,6360,6364,6367,6370,6374,6378,6382,6386,6389,6390,6391,6392,6395,6399,6402,6405,6408,6411,6414,6417,6421,6491,6492,6495,6498,6499,6502,6503,6504,6508,6509,6514,6521,6528,6535,6542,6549,6556,6563,6570,6577,6586,6595,6604,6611,6620,6629,6632,6635,6636,6637,6638,6639,6640,6641,6642,6643,6644,6645,6646,6647,6651,6656,6661,6664,6665,6666,6667,6668,6676,6684,6685,6693,6697,6705,6713,6721,6729,6737,6738,6746,6754,6755,6758,6761,6833,6838,6840,6845,6849,6853,6854,6855,6856,6860,6864,6865,6869,6870,6871,6872,6873,6874,6875,6876,6877,6878,6879,6883,6884,6885,6886,6890,6891,6892,6893,6897,6901,6902,6906,6907,6908,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6937,6938,6939,6945,6946,6950,6952,6953,6958,6959,6960,6961,6962,6963,6967,6968,6969,6975,6976,6980,6982,6986,6990,6994,6998,7019,7020,7021,7024,7027,7030,7033,7036,7041,7045,7048,7049,7054,7058,7063,7069,7075,7080,7084,7089,7093,7097,7138,7139,7140,7141,7142,7146,7147,7148,7149,7153,7157,7161,7165,7169,7173,7177,7181,7187,7188,7229,7243,7248,7274,7281,7284,7295,7300,7303,7306,7361,7367,7368,7371,7374,7377,7380,7383,7386,7389,7393,7396,7397,7398,7406,7414,7417,7422,7427,7432,7437,7441,7445,7446,7454,7455,7456,7457,7458,7466,7471,7476,7477,7478,7479,7504,7510,7515,7518,7522,7525,7529,7539,7542,7547,7550,7554,7558,7663,7677,7690,7694,7709,7720,7723,7734,7739,7743,7778,7779,7780,7792,7800,7808,7816,7824,7844,7847,7874,7879,7899,7902,7905,7912,7925,7934,7937,7957,7967,7971,7975,7988,7992,7996,8000,8006,8010,8027,8035,8039,8043,8047,8050,8054,8058,8062,8072,8079,8086,8090,8116,8126,8151,8160,8180,8190,8194,8204,8229,8239,8242,8249,8256,8263,8264,8265,8266,8267,8274,8278,8284,8290,8291,8304,8305,8306,8309,8312,8315,8318,8321,8324,8327,8330,8333,8336,8339,8342,8345,8348,8351,8354,8357,8360,8363,8366,8369,8370,8378,8386,8387,8400,8410,8414,8419,8424,8428,8431,8435,8439,8442,8446,8449,8453,8458,8463,8466,8473,8477,8481,8490,8495,8500,8501,8505,8508,8512,8525,8530,8538,8542,8546,8563,8567,8572,8590,8597,8601,8631,8634,8637,8640,8643,8646,8649,8668,8674,8682,8689,8701,8709,8714,8722,8726,8744,8751,8767,8771,8779,8782,8787,8788,8789,8790,8794,8798,8802,8806,8841,8844,8848,8852,8886,8889,8893,8897,8906,8912,8915,8925,8929,8930,8937,8941,8948,8949,8950,8953,8958,8963,8964,8968,8983,9002,9006,9007,9019,9029,9030,9042,9047,9071,9074,9080,9083,9092,9100,9104,9107,9110,9113,9117,9120,9137,9141,9144,9159,9162,9170,9175,9182,9187,9188,9193,9194,9200,9206,9212,9244,9255,9272,9279,9283,9286,9299,9308,9312,9317,9321,9325,9329,9333,9337,9341,9345,9350,9353,9365,9370,9379,9382,9389,9390,9394,9403,9409,9413,9414,9418,9439,9445,9449,9453,9454,9472,9473,9474,9475,9476,9481,9484,9485,9491,9492,9504,9516,9523,9524,9529,9534,9535,9539,9553,9558,9564,9570,9576,9581,9587,9593,9594,9600,9615,9620,9629,9638,9641,9655,9660,9671,9675,9684,9693,9694,9701,9709,9875,9885,9932,10494,10547,10604,10616,10674,10861,10881,10902,10908,10916,11022,11036,11820,11826,11870,11874,11880,11940,12031,12310,12336,12344,12359,12415,12426,12439,12451,12489,12536,12542,12554,12560,12566,12618,12623,12628,12635,12670,12945,12991,13020,13083,13164,13170,13200,13204,13232,13271,13289,13307,13393,13401,13425,13534,13542,13635,13675,13954,13962,14028,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545,14546,14547,14548,14549,14550", + "endColumns": "55,48,54,55,59,60,64,54,49,49,52,57,47,68,47,70,71,71,72,66,48,53,36,50,59,46,55,48,57,53,60,55,50,59,55,62,48,55,55,49,58,54,61,46,53,55,51,54,53,53,53,48,57,53,56,55,46,52,55,59,62,58,61,49,53,53,47,56,52,55,53,55,62,61,55,59,52,60,78,80,71,78,79,75,77,68,75,76,70,72,75,77,68,75,76,63,70,71,50,52,54,66,52,51,49,57,64,47,50,66,65,57,68,57,68,69,72,73,67,66,69,65,72,59,75,59,59,74,67,65,67,59,58,56,65,61,56,67,72,69,61,60,67,61,69,68,55,58,61,61,66,56,60,60,60,60,55,55,55,55,57,57,57,57,56,56,56,56,58,58,57,82,82,72,53,68,55,80,80,70,9,52,57,57,57,45,59,53,69,69,64,65,64,67,68,67,9,52,58,57,51,49,51,45,49,55,46,57,57,61,62,61,58,59,64,65,64,61,61,61,61,61,61,65,66,65,62,63,62,67,60,61,61,62,63,62,63,77,58,65,79,60,52,57,50,44,60,63,58,61,73,70,65,73,68,70,72,70,67,72,75,69,77,67,65,60,68,63,65,67,65,62,67,70,64,72,62,80,63,65,69,69,69,69,66,56,57,58,59,58,58,58,58,58,58,58,58,58,58,59,60,61,60,60,60,60,60,60,59,60,60,59,60,60,60,60,60,60,60,60,60,60,60,67,68,69,68,68,68,68,68,68,68,68,68,68,59,60,61,60,60,60,60,60,60,60,60,60,60,61,62,63,62,62,62,62,62,62,62,62,62,62,60,61,62,61,61,61,61,61,61,61,61,61,61,56,85,79,89,94,91,91,89,82,92,86,96,90,100,86,102,88,98,91,99,83,93,87,97,82,90,93,98,101,97,99,86,99,85,95,87,80,90,95,92,92,90,84,93,88,97,92,101,87,103,90,99,92,100,84,94,88,98,84,91,94,99,102,98,102,88,100,86,96,87,95,91,99,89,97,84,88,88,92,86,90,65,75,68,78,72,79,79,76,67,77,75,70,80,72,82,74,84,72,80,80,73,83,69,77,69,79,77,71,81,69,76,79,84,87,83,86,73,77,77,70,80,90,82,95,97,106,64,65,52,75,65,86,75,75,64,54,53,78,77,72,64,62,65,70,70,69,61,68,65,59,66,66,55,50,52,51,53,70,62,58,61,58,72,66,69,59,62,74,71,95,70,55,70,56,56,65,63,70,56,52,62,51,57,66,68,65,58,82,58,56,66,69,73,61,68,69,98,96,98,85,85,80,74,88,90,83,58,45,65,56,66,56,81,64,65,122,83,120,64,61,97,73,82,88,63,78,73,61,95,64,58,55,55,59,106,46,59,60,63,60,59,57,42,48,51,50,51,48,48,64,65,59,60,55,58,48,47,57,56,101,56,74,47,50,61,64,51,73,62,62,67,49,61,59,56,59,48,67,105,101,68,70,55,48,99,70,109,90,81,97,55,100,109,98,62,105,76,111,126,111,126,69,113,130,96,67,117,102,117,60,73,66,104,121,73,66,109,98,72,96,121,117,117,60,121,116,67,105,101,79,70,95,66,73,73,85,89,77,76,99,70,120,120,63,124,73,123,123,66,108,127,111,78,77,100,70,121,121,64,125,111,105,67,98,103,62,65,83,112,112,117,77,71,135,135,84,139,137,137,141,81,85,76,72,108,110,127,127,131,129,129,133,88,61,95,66,116,120,96,81,86,86,130,130,134,76,76,110,113,73,108,111,66,72,64,101,95,103,67,64,93,71,109,105,72,90,101,102,94,106,104,121,121,125,58,57,123,123,127,117,117,121,85,96,133,133,79,137,131,131,135,74,75,102,73,112,80,56,60,58,59,57,60,57,49,48,66,58,58,48,70,83,69,70,79,68,62,67,65,67,64,65,76,77,105,105,95,128,88,126,65,69,85,65,82,73,97,95,95,97,108,94,88,61,59,64,56,80,53,56,96,109,60,114,120,94,91,92,55,58,48,91,48,53,53,53,53,53,54,109,109,107,109,109,109,109,107,105,103,103,103,94,94,92,92,103,105,103,103,92,92,92,92,107,105,105,105,96,94,94,94,105,105,105,105,97,94,95,96,64,103,57,63,60,61,59,64,61,67,57,62,62,66,74,72,65,51,52,51,56,83,94,84,80,79,76,78,76,73,73,70,79,71,74,64,60,59,74,73,72,69,71,69,72,63,69,45,68,51,84,82,56,65,66,65,80,74,55,52,60,57,49,48,48,48,61,51,44,80,50,53,52,53,50,48,65,50,60,60,61,49,40,76,58,58,58,60,55,55,66,60,64,54,64,68,67,77,68,59,70,73,64,71,69,66,83,68,66,69,62,66,67,82,78,89,76,67,66,77,56,56,67,65,55,59,58,53,49,49,47,61,50,72,79,79,63,66,70,57,60,65,58,66,59,59,62,67,60,66,77,69,48,56,68,60,87,87,87,87,86,86,86,86,57,73,69,55,70,64,61,74,72,89,65,65,60,63,61,57,70,82,58,70,65,64,60,58,70,65,64,82,75,74,80,59,68,69,68,54,55,55,60,57,55,58,53,54,61,56,93,68,100,50,69,62,55,57,58,53,85,83,69,68,69,114,120,66,66,74,66,58,53,53,53,52,51,73,136,139,48,49,49,47,55,57,61,54,57,70,63,58,61,65,65,42,43,44,42,50,46,44,50,50,50,50,47,65,61,62,71,56,53,54,57,54,58,55,68,68,68,69,62,62,62,62,64,64,64,64,62,63,63,63,50,77,77,70,71,72,71,65,65,67,67,65,66,73,62,56,59,64,66,64,56,60,57,103,109,108,103,77,64,66,65,69,46,51,49,56,12,149,130,183,177,237,188,168,97,114,84,78,11,64,88,156,156,152,153,58,186,95,89,95,89,165,122,122,169,105,114,114,101,105,116,114,81,172,167,147,158,154,172,116,116,167,111,113,171,175,157,132,111,145,151,131,142,121,177,135,95,135,94,166,92,91,186,11,11,11,181,316,181,181,189,231,189,176,161,156,109,182,136,203,183,183,159,157,183,226,202,170,219,221,154,199,183,102,189,140,164,170,199,203,201,164,204,198,198,196,90,148,149,83,148,144,151,140,165,160,77,300,165,154,101,11,163,185,222,124,10,10,10,10,61,10,10,10,10,10,10,10,10,10,84,120,98,10,96,116,86,122,100,10,98,118,92,106,10,106,10,120,10,10,99,104,118,10,146,118,10,132,10,10,111,10,124,10,120,10,120,132,146,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,136,90,10,10,10,10,108,118,10,10,10,10,10,94,10,10,10,10,10,10,121,10,10,10,10,10,10,10,10,10,10,10,10,10,72,86,84,98,111,105,122,131,122,129,123,132,130,124,116,119,131,127,113,117,112,120,10,10,10,10,10,10,10,119,119,107,109,111,107,109,10,10,151,10,100,10,10,10,10,10,10,10,10,10,10,10,10,10,144,121,134,10,10,10,10,10,10,10,10,10,10,91,10,10,94,10,93,88,10,88,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,105,107,105,111,113,111,113,115,113,107,109,107,10,10,10,10,107,109,107,113,10,10,115,10,10,10,10,10,10,10,121,10,10,121,10,10,10,10,10,10,10,10,75,111,89,10,10,107,10,107,75,111,89,101,107,107,99,107,84,10,103,127,86,10,77,113,91,10,10,109,10,109,83,10,97,107,93,129,107,121,135,107,119,133,121,127,141,125,139,125,117,131,97,109,10,111,117,10,115,10,10,95,10,109,123,137,109,121,10,123,129,10,127,10,10,10,10,10,10,67,83,103,10,10,10,10,10,10,10,10,115,10,10,10,10,10,10,10,10,10,10,10,113,119,115,93,10,98,117,100,10,10,10,10,10,10,10,10,10,75,10,10,10,10,10,10,10,10,10,10,10,10,111,10,10,10,10,10,10,10,10,10,83,103,10,10,10,10,10,10,10,10,10,137,10,113,137,111,123,10,10,10,144,92,91,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,99,89,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,152,144,142,69,10,10,10,10,115,10,121,111,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,111,10,10,123,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,139,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,87,107,107,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,123,10,10,10,102,129,10,10,10,139,10,10,10,10,129,10,10,145,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,78,10,104,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,158,10,10,10,10,157,10,10,10,10,10,141,10,105,129,137,123,10,10,99,10,113,10,10,10,123,10,10,133,10,10,10,10,10,10,10,10,10,103,10,10,10,10,10,10,10,10,10,10,10,10,119,10,10,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,94,92,62,81,92,92,86,97,90,90,87,83,95,99,105,102,100,103,105,98,105,101,106,108,110,130,119,115,117,98,106,115,118,127,88,94,76,88,90,92,73,96,94,97,98,103,95,101,102,99,102,84,100,97,89,94,86,105,101,93,90,93,75,91,88,102,110,82,85,94,96,95,87,100,100,102,105,97,96,94,97,102,99,102,104,117,115,94,92,84,95,93,91,82,103,104,99,100,104,99,100,98,101,93,106,101,102,92,95,101,102,95,101,102,96,102,97,103,104,96,107,113,114,107,113,114,101,104,107,109,115,116,94,96,98,104,105,98,104,105,99,105,100,106,118,98,104,101,101,99,102,94,103,84,103,103,97,103,105,97,104,97,112,93,88,88,82,90,82,97,89,95,88,93,87,95,84,107,100,100,97,105,90,98,96,97,95,92,109,97,94,109,91,99,98,86,103,104,98,106,106,98,108,91,110,110,110,103,114,115,126,119,94,94,96,98,91,98,91,98,85,93,102,95,102,95,102,96,97,102,92,89,100,82,90,84,91,102,94,95,92,93,78,106,90,98,92,102,103,100,100,103,93,103,103,112,105,105,107,116,100,107,99,102,104,106,95,78,89,83,91,72,91,88,91,84,96,92,94,98,96,90,90,91,94,106,107,101,96,96,92,86,83,96,96,92,86,90,98,98,94,88,80,98,103,96,104,96,83,98,103,96,104,96,97,100,105,98,106,98,98,90,88,88,81,92,90,110,100,99,111,112,97,107,93,99,88,91,110,109,94,115,125,125,118,127,124,124,117,126,108,108,112,122,122,115,124,96,107,121,115,115,108,87,100,88,100,86,87,96,91,105,99,75,76", + "endOffsets": "541,776,1235,1394,1454,1515,1580,1635,1785,1835,1888,1946,1994,2114,2463,2534,2606,2678,2751,2818,2867,2921,2958,3009,3069,3116,3172,3221,3279,3333,3394,3450,3501,3561,3617,3680,3729,3785,3841,3891,3950,4005,4067,4114,4168,4224,4276,4331,4385,4439,4493,4542,4600,4654,4711,4767,4814,4867,4923,4983,5046,5105,5167,5217,5271,5325,5373,5430,5483,5539,6161,6217,7155,7265,7321,7381,7434,7495,7574,7655,7727,7806,7886,7962,8040,8109,8185,8262,8333,8406,8482,8560,8629,8705,8782,8846,8917,8989,11481,11579,11634,11750,11803,11855,11905,11963,12028,12076,12127,19084,19150,19208,19277,19335,19404,19474,19547,19621,19689,19756,19826,19892,19965,20025,20101,20161,20221,20296,20364,20430,20498,20558,20617,20674,20740,20802,20859,20927,21000,21070,21132,21193,21261,21323,21393,21462,21518,21577,21639,21701,21768,21825,21886,21947,22008,22069,22125,22181,22237,22293,22351,22409,22467,22525,22582,22639,22696,22753,22812,22871,22929,23012,23095,23168,23222,23291,23347,23428,23509,23580,23709,23968,24026,24084,25249,25796,25856,25910,25980,26050,26115,26181,26246,26314,26383,26451,26581,26634,26693,26751,26803,26899,26951,26997,27047,27103,27150,27255,27313,27375,27438,27500,27559,27619,27684,27750,27815,27877,27939,28001,28063,28125,28187,28253,28320,28386,28449,28513,28576,28644,28705,28767,28829,28892,28956,29019,29083,29161,29220,29286,29366,29427,29480,29689,29740,30167,30228,30698,30757,31952,34698,34769,34835,34909,34978,35049,35122,35193,35261,35334,35410,35480,35558,35626,35692,35753,35822,35886,35952,36020,36086,36149,36217,36288,36353,36426,36489,36570,36634,36700,36770,36840,36910,36980,37047,38007,38065,38124,38184,38243,38302,38361,38420,38479,38538,38597,38656,38715,38774,38834,38895,38957,39018,39079,39140,39201,39262,39323,39383,39444,39505,39565,39626,39687,39748,39809,39870,39931,39992,40053,40114,40175,40236,40304,40373,40443,40512,40581,40650,40719,40788,40857,40926,40995,41064,41133,41193,41254,41316,41377,41438,41499,41560,41621,41682,41743,41804,41865,41926,41988,42051,42115,42178,42241,42304,42367,42430,42493,42556,42619,42682,42745,42806,42868,42931,42993,43055,43117,43179,43241,43303,43365,43427,43489,43551,43608,43694,43774,43864,43959,44051,44143,44233,44316,44409,44496,44593,44684,44785,44872,44975,45064,45163,45255,45355,45439,45533,45621,45719,45802,45893,45987,46086,46188,46286,46386,46473,46573,46659,46755,46843,46924,47015,47111,47204,47297,47388,47473,47567,47656,47754,47847,47949,48037,48141,48232,48332,48425,48526,48611,48706,48795,48894,48979,49071,49166,49266,49369,49468,49571,49660,49761,49848,49945,50033,50129,50221,50321,50411,50509,50594,50683,50772,50865,50952,51043,51781,51857,51926,52005,52078,52158,52238,52315,52383,52461,52537,52608,52689,52762,52845,52920,53005,53078,53159,53240,53314,53398,53468,53546,53616,53696,53774,53846,53928,53998,54075,54155,54240,54328,54412,54499,54573,54651,54729,54800,54881,54972,55055,55151,55249,55356,55421,55487,55540,55616,55682,55769,55845,55921,63420,63645,64239,64318,64396,64469,64534,64597,64663,64734,64805,64875,64937,65006,65072,65132,65199,65266,65322,65373,65426,65478,65532,65603,65666,65725,65787,65846,65919,65986,66056,66116,66179,66254,66326,66422,66493,66549,66620,66677,66734,66800,66864,66935,66992,67045,67108,67160,67218,67285,68524,68590,68649,68732,68791,68848,68915,68985,69059,69121,69190,69260,69359,69456,69555,69641,69727,69808,69883,69972,70063,70147,70206,70252,70318,70375,70442,70499,70581,70646,70712,70835,70919,71040,71105,71167,71265,71339,71422,71511,71575,71654,71728,71790,71886,71951,72010,72066,72122,72182,72289,72336,72396,72457,72521,72582,72642,72700,72743,72792,72844,72895,72947,72996,73045,73110,73176,73236,73297,73353,73412,73461,73509,73567,73624,73726,73783,73858,73906,73957,74019,74084,74136,74210,74273,74336,74404,74454,74516,74576,74633,74693,74742,74810,74916,75018,75087,75158,75214,75263,75363,75434,75544,75635,75717,75815,75871,75972,76082,76181,76244,76350,76427,76539,76666,76778,76905,76975,77089,77220,77317,77385,77503,77606,77724,77785,77859,77926,78031,78153,78227,78294,78404,78503,78576,78673,78795,78913,79031,79092,79214,79331,79399,79505,79607,79687,79758,79854,79921,79995,80069,80155,80245,80323,80400,80500,80571,80692,80813,80877,81002,81076,81200,81324,81391,81500,81628,81740,81819,81897,81998,82069,82191,82313,82378,82504,82616,82722,82790,82889,82993,83056,83122,83206,83319,83432,83550,83628,83700,83836,83972,84057,84197,84335,84473,84615,84697,84783,84860,84933,85042,85153,85281,85409,85541,85671,85801,85935,86024,86086,86182,86249,86366,86487,86584,86666,86753,86840,86971,87102,87237,87314,87391,87502,87616,87690,87799,87911,87978,88051,88116,88218,88314,88418,88486,88551,88645,88717,88827,88933,89006,89097,89199,89302,89397,89504,89609,89731,89853,89979,90038,90096,90220,90344,90472,90590,90708,90830,90916,91013,91147,91281,91361,91499,91631,91763,91899,91974,92050,92153,92227,92340,92421,92478,92539,92598,92658,92716,92777,92835,92885,92934,93001,93060,93119,93168,93239,93323,93393,93464,93544,93613,93676,93744,93810,93878,93943,94009,94086,94164,94270,94376,94472,94601,94690,94817,94883,94953,95039,95105,95188,95262,95360,95456,95552,95650,95759,95854,95943,96005,96065,96130,96187,96268,96322,96379,96476,96586,96647,96762,96883,96978,97070,97163,97219,97278,97327,97419,97468,97522,97576,97630,97684,97738,97793,97903,98013,98121,98231,98341,98451,98561,98669,98775,98879,98983,99087,99182,99277,99370,99463,99567,99673,99777,99881,99974,100067,100160,100253,100361,100467,100573,100679,100776,100871,100966,101061,101167,101273,101379,101485,101583,101678,101774,101871,101936,102040,102098,102162,102223,102285,102345,102410,102472,102540,102598,102661,102724,102791,102866,102939,103005,103057,103110,103162,103219,103303,103398,103483,103564,103644,103721,103800,103877,103951,104025,104096,104176,104248,104323,104388,104449,104509,104584,104658,104731,104801,104873,104943,105016,105080,105150,105196,105265,105317,105402,105485,105542,105608,105675,105741,105822,105897,105953,106006,106067,106125,106175,106224,106273,106322,106384,106436,106481,106562,106613,106667,106720,106774,106825,106874,106940,106991,107052,107113,107175,107225,107266,107343,107402,107461,107520,107581,107637,107693,107760,107821,107886,107941,108006,108075,108143,108221,108290,108350,108421,108495,108560,108632,108702,108769,108853,108922,108989,109059,109122,109189,109257,109340,109419,109509,109586,109654,109721,109799,109856,109913,109981,110047,110103,110163,110222,110276,110326,110376,110424,110486,110537,110610,110690,110770,110834,110901,110972,111030,111091,111157,111216,111283,111343,111403,111466,111534,111595,111662,111740,111810,111859,111916,111985,112046,112134,112222,112310,112398,112485,112572,112659,112746,112804,112878,112948,113004,113075,113140,113202,113277,113350,113440,113506,113572,113633,113697,113759,113817,113888,113971,114030,114101,114167,114232,114293,114352,114423,114489,114554,114637,114713,114788,114869,114929,114998,115068,115137,115192,115248,115304,115365,115423,115479,115538,115592,115647,115709,115766,115860,115929,116030,116081,116151,116214,116270,116328,116387,116441,116527,116611,116681,116750,116820,116935,117056,117123,117190,117265,117332,117391,117445,117499,117553,117606,117658,117732,119300,119440,122185,122235,122285,122374,122430,122488,122550,122605,122663,122734,122798,122857,122919,122985,123051,123342,123488,123533,123576,124708,124755,124800,124851,124902,124953,125004,125538,126046,126108,126288,126360,126485,126539,126594,126652,126707,126766,126822,126891,126960,127029,127099,127162,127225,127288,127351,127416,127481,127546,127611,127674,127738,127802,127866,127917,127995,128073,128144,128216,128289,128361,128427,128493,128561,128629,128695,128762,128836,128899,128956,129016,129081,129148,129213,129270,129331,129389,129493,129603,129712,129816,129894,129959,130026,130092,130162,130209,130261,130311,130368,130758,133248,134284,134468,134646,134884,135073,135242,137721,137836,137921,138000,152846,152991,153462,153619,153776,154077,154231,154290,156629,156725,156815,156911,157001,157167,157290,157413,157583,157689,157804,157919,158021,158127,158244,158359,158856,159029,159197,159345,159504,159659,159832,159949,160066,160234,160346,160460,160632,160808,160966,161099,161211,161357,161509,161641,161784,161906,162084,162220,162316,162452,162547,162714,162807,162899,163086,163242,163420,163584,163766,164083,164265,164447,164637,164869,165059,165236,165398,165555,165665,165848,165985,166189,166373,166557,166717,166875,167059,167286,167489,167660,167880,168102,168257,168457,168641,168744,168934,169075,169240,169411,169611,169815,170017,170182,170387,170586,170785,170982,171073,171222,171372,171456,171605,171750,171902,172043,172209,172370,174822,175123,175289,175444,175546,181660,181887,182073,184182,184307,186986,187258,187536,187781,187843,188128,191422,191878,192387,203163,203677,204114,204548,204991,208973,209094,209193,209598,209695,209812,209899,210022,210123,210529,210628,210747,210840,210947,211290,211397,211642,211763,212172,212420,212520,212625,212744,213253,213400,213519,213770,213903,214318,214572,214684,220034,220159,220567,220688,220916,221037,221170,221317,242039,242531,263002,263426,284193,284687,305203,305629,310470,315887,319978,325409,330151,335528,339512,343504,348895,349442,349875,350631,350861,351104,352271,353200,401345,401929,402402,403832,404576,405769,406823,407301,407594,407977,409492,410257,411400,411841,412282,412878,413152,413563,414579,414757,415510,415647,415738,417932,418198,418520,418730,418839,418958,419142,420260,420730,421481,424064,424159,424853,425081,425337,425596,426172,426526,426648,426787,427079,427339,428267,428553,428956,429358,429701,429913,430114,430327,430616,430901,441576,441663,441748,441847,446529,446635,446758,446890,447013,447143,447267,447400,447531,447656,447773,447893,448025,448153,448267,448385,448498,448619,448807,448994,449175,449358,449542,449707,449889,450009,450129,450237,450347,450459,450567,450677,450842,451008,451160,451325,451426,451546,451717,451878,452041,452202,452369,452488,452605,452785,452967,453148,453331,453486,453631,453753,453888,454051,454244,454370,454522,454664,454834,454990,455162,455453,462120,462212,462385,462547,462642,462811,462905,462994,463237,463326,463619,464035,464455,464876,465302,465719,466135,466552,466970,467384,467854,468327,468799,469210,469681,470153,470343,470549,470655,470763,470869,470981,471095,471207,471321,471437,471551,471659,471769,471877,472139,472518,472922,473069,473177,473287,473395,473509,473918,474332,474448,474866,475107,475537,475972,476382,476804,477214,477336,477745,478161,478283,478501,478685,483319,483663,483743,484099,484249,484393,484469,484581,484671,484933,485198,485306,485458,485566,485642,485754,485844,485946,486054,486162,486262,486370,486455,486621,486725,486853,486940,487107,487185,487299,487391,487655,487922,488032,488185,488295,488379,488768,488866,488974,489068,489198,489306,489428,489564,489672,489792,489926,490048,490176,490318,490444,490584,490710,490828,490960,491058,491168,491468,491580,491698,492162,492278,492581,492707,492803,493204,493314,493438,493576,493686,493808,494120,494244,494374,494850,494978,495293,495431,495593,495809,495965,496169,497650,497734,497838,498041,498230,498431,498624,498829,499142,499354,499520,499636,499882,500098,500411,500837,501299,501536,501688,501948,502092,502234,505466,505580,505700,505816,505910,506231,506330,506448,506549,506828,507113,507392,507674,507927,508186,508439,508695,509119,509195,512445,513800,514244,516098,516673,516881,517891,518271,518437,518578,523598,524024,524136,524271,524424,524621,524792,524975,525150,525337,525609,525767,525851,525955,526442,526998,527156,527375,527606,527829,528064,528286,528552,528690,529289,529403,529541,529653,529777,530348,530843,531389,531534,531627,531719,533646,534216,534514,534703,534909,535102,535312,536196,536341,536733,536891,537108,537369,545596,546471,547091,547288,548236,549001,549124,549897,550118,550318,552295,552395,552485,553171,553924,554689,555452,556227,557440,557605,559218,559539,560602,560812,560982,561552,562447,563080,563246,564732,565348,565584,565805,566763,567028,567293,567540,567954,568190,569475,569924,570111,570360,570602,570778,571019,571252,571477,572072,572547,573071,573332,574683,575158,576384,576854,577902,578354,578598,579055,580300,580783,580933,581488,581940,582340,582493,582638,582781,582851,583279,583567,584071,584580,584696,585598,585720,585832,586009,586275,586545,586811,587079,587335,587595,587851,588109,588361,588617,588869,589123,589355,589591,589843,590099,590351,590605,590837,591071,591183,591835,592290,592414,593506,594321,594517,594841,595230,595582,595823,596037,596336,596528,596843,597050,597396,597696,598097,598316,598729,598966,599336,600060,600415,600684,600824,601078,601222,601499,602491,602900,603532,603878,604246,605320,605683,606083,607591,608176,608494,611029,611223,611441,611667,611879,612078,612285,613489,613784,614341,614731,615363,615840,616085,616572,616818,618014,618411,619417,619639,620062,620253,620632,620720,620828,620936,621249,621574,621893,622224,624927,625115,625376,625625,628209,628401,628666,628919,629451,629859,630058,630642,630877,631001,631413,631627,632029,632132,632262,632437,632689,632885,633025,633219,634230,635299,635587,635717,636494,637151,637297,638003,638241,639781,639931,640348,640513,641199,641669,641865,641956,642040,642184,642418,642585,643513,643799,643959,644574,644733,645061,645288,645800,646162,646241,646580,646685,647050,647421,647782,649656,650285,651361,651785,652038,652190,653238,653975,654178,654424,654671,654889,655131,655452,655716,656021,656244,656555,656744,657459,657728,658222,658448,658888,659047,659331,660076,660441,660746,660904,661142,662461,662859,663087,663307,663449,664739,664845,664975,665113,665237,665525,665694,665794,666079,666193,667076,667831,668270,668394,668640,668833,668967,669158,669937,670155,670446,670725,671042,671264,671559,671842,671946,672287,673103,673419,673980,674486,674691,675477,675882,676543,676732,677283,677849,677969,678371,678905,684507,684806,687151,705660,707485,709492,709831,712264,718156,718596,719348,719532,719743,724401,724984,757209,757411,758546,758696,758871,761508,764795,775532,776388,776896,777407,779201,779461,780077,780572,781609,783475,783666,783999,784155,784348,786740,786969,787177,787347,789119,799047,800390,801400,803365,806588,806757,807949,808095,808780,811180,811711,812137,814569,814817,815587,819849,820024,823239,824777,835649,835892,838441,843860,843953,844016,844098,844191,844284,844371,844469,844560,844651,844739,844823,844919,845019,845125,845228,845329,845433,845539,845638,845744,845846,845953,846062,846173,846304,846424,846540,846658,846757,846864,846980,847099,847227,847316,847411,847488,847577,847668,847761,847835,847932,848027,848125,848224,848328,848424,848526,848629,848729,848832,848917,849018,849116,849206,849301,849388,849494,849596,849690,849781,849875,849951,850043,850132,850235,850346,850429,850515,850610,850707,850803,850891,850992,851093,851196,851302,851400,851497,851592,851690,851793,851893,851996,852101,852219,852335,852430,852523,852608,852704,852798,852890,852973,853077,853182,853282,853383,853488,853588,853689,853788,853890,853984,854091,854193,854296,854389,854485,854587,854690,854786,854888,854991,855088,855191,855289,855393,855498,855595,855703,855817,855932,856040,856154,856269,856371,856476,856584,856694,856810,856927,857022,857119,857218,857323,857429,857528,857633,857739,857839,857945,858046,858153,858272,858371,858476,858578,858680,858780,858883,858978,859082,859167,859271,859375,859473,859577,859683,859781,859886,859984,860097,860191,860280,860369,860452,860543,860626,860724,860814,860910,860999,861093,861181,861277,861362,861470,861571,861672,861770,861876,861967,862066,862163,862261,862357,862450,862560,862658,862753,862863,862955,863055,863154,863241,863345,863450,863549,863656,863763,863862,863971,864063,864174,864285,864396,864500,864615,864731,864858,864978,865073,865168,865265,865364,865456,865555,865647,865746,865832,865926,866029,866125,866228,866324,866427,866524,866622,866725,866818,866908,867009,867092,867183,867268,867360,867463,867558,867654,867747,867841,867920,868027,868118,868217,868310,868413,868517,868618,868719,868823,868917,869021,869125,869238,869344,869450,869558,869675,869776,869884,869984,870087,870192,870299,870395,870474,870564,870648,870740,870813,870905,870994,871086,871171,871268,871361,871456,871555,871652,871743,871834,871926,872021,872128,872236,872338,872435,872532,872625,872712,872796,872893,872990,873083,873170,873261,873360,873459,873554,873643,873724,873823,873927,874024,874129,874226,874310,874409,874513,874610,874715,874812,874910,875011,875117,875216,875323,875422,875521,875612,875701,875790,875872,875965,876056,876167,876268,876368,876480,876593,876691,876799,876893,876993,877082,877174,877285,877395,877490,877606,877732,877858,877977,878105,878230,878355,878473,878600,878709,878818,878931,879054,879177,879293,879418,879515,879623,879745,879861,879977,880086,880174,880275,880364,880465,880552,880640,880737,880829,880935,881035,881111,881188" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/876d8563d3a0673414de11fb9eb4d2a1/transformed/activity-1.8.0/res/values/values.xml", + "from": { + "startLines": "2,3", + "startColumns": "4,4", + "startOffsets": "55,97", + "endColumns": "41,59", + "endOffsets": "92,152" + }, + "to": { + "startLines": "1852,1899", + "startColumns": "4,4", + "startOffsets": "123262,125631", + "endColumns": "41,59", + "endOffsets": "123299,125686" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/9a42c6bba20e3615051551280bf9b220/transformed/startup-runtime-1.1.1/res/values/values.xml", + "from": { + "startLines": "2", + "startColumns": "4", + "startOffsets": "55", + "endColumns": "82", + "endOffsets": "133" + }, + "to": { + "startLines": "2007", + "startColumns": "4", + "startOffsets": "132970", + "endColumns": "82", + "endOffsets": "133048" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/347545d553f2245dd1a387759374950f/transformed/coordinatorlayout-1.1.0/res/values/values.xml", + "from": { + "startLines": "2,3,6,16", + "startColumns": "4,4,4,4", + "startOffsets": "55,116,261,869", + "endLines": "2,5,15,104", + "endColumns": "60,12,24,24", + "endOffsets": "111,256,864,6075" + }, + "to": { + "startLines": "109,9710,11673,11679", + "startColumns": "4,4,4,4", + "startOffsets": "5765,678910,750379,750590", + "endLines": "109,9712,11678,11762", + "endColumns": "60,12,24,24", + "endOffsets": "5821,679050,750585,755101" + } + }, + { + "source": "/home/foxx/.gradle/caches/8.9/transforms/b7f9919704e07e4789974f48d04ff84b/transformed/play-services-base-18.5.0/res/values/values.xml", + "from": { + "startLines": "4,5,6,7,8,9,10,11,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,33,46", + "startColumns": "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", + "startOffsets": "215,301,377,463,549,625,702,778,951,1052,1233,1354,1457,1637,1756,1868,1967,2155,2256,2437,2558,2733,2877,2936,2994,3164,3475", + "endLines": "4,5,6,7,8,9,10,11,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,45,64", + "endColumns": "85,75,85,85,75,76,75,75,100,180,120,102,179,118,111,98,187,100,180,120,174,143,58,57,74,20,20", + "endOffsets": "300,376,462,548,624,701,777,853,1051,1232,1353,1456,1636,1755,1867,1966,2154,2255,2436,2557,2732,2876,2935,2993,3068,3474,3887" + }, + "to": { + "startLines": "657,658,659,660,661,662,663,664,2076,2077,2078,2079,2080,2081,2082,2083,2085,2086,2087,2088,2089,2090,2091,2092,2093,12317,13308", + "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", + "startOffsets": "33958,34048,34128,34218,34308,34388,34469,34549,138932,139037,139218,139343,139450,139630,139753,139869,140139,140327,140432,140613,140738,140913,141061,141124,141186,775737,812142", + "endLines": "657,658,659,660,661,662,663,664,2076,2077,2078,2079,2080,2081,2082,2083,2085,2086,2087,2088,2089,2090,2091,2092,2093,12329,13326", + "endColumns": "89,79,89,89,79,80,79,79,104,180,124,106,179,122,115,102,187,104,180,124,174,147,62,61,78,20,20", + "endOffsets": "34043,34123,34213,34303,34383,34464,34544,34624,139032,139213,139338,139445,139625,139748,139864,139967,140322,140427,140608,140733,140908,141056,141119,141181,141260,776047,812554" + } + } + ] + } + ] +} \ No newline at end of file diff --git a/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/single/mergeDebugResources.json b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/single/mergeDebugResources.json new file mode 100644 index 0000000..a14c440 --- /dev/null +++ b/app/build/intermediates/merged_res_blame_folder/debug/mergeDebugResources/out/single/mergeDebugResources.json @@ -0,0 +1,194 @@ +[ + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_view_settings_drawer_handle.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/view_settings_drawer_handle.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_activity_dev_diagnostics_panel.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/activity_dev_diagnostics_panel.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/mipmap-anydpi-v26_ic_launcher.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/mipmap-anydpi-v26/ic_launcher.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout-land_activity_sender.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout-land/activity_sender.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_activity_main.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/activity_main.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_activity_session_stats_analyzer.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/activity_session_stats_analyzer.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_activity_cast_settings.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/activity_cast_settings.xml" + }, + { + "merged": "com.foxx.androidcast.app-debug-38:/drawable_device_item_live_border.xml.flat", + "source": "com.foxx.androidcast.app-main-40:/drawable/device_item_live_border.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_item_session_stats.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/item_session_stats.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/drawable_bg_settings_spinner_item.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/drawable/bg_settings_spinner_item.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_item_device.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/item_device.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_activity_sender.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/activity_sender.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/drawable_bg_settings_section_header.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/drawable/bg_settings_section_header.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/anim_robot_dance.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/anim/robot_dance.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_activity_dev_settings_panel.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/activity_dev_settings_panel.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_spinner_item_settings.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/spinner_item_settings.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_activity_developer_settings.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/activity_developer_settings.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/drawable_ic_launcher_foreground.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/drawable/ic_launcher_foreground.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_dialog_ota_download.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/dialog_ota_download.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/drawable_bg_settings_spinner_popup.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/drawable/bg_settings_spinner_popup.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/drawable_ic_notification.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/drawable/ic_notification.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_activity_playback.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/activity_playback.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/color_device_item_text.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/color/device_item_text.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/xml_file_paths.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/xml/file_paths.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/drawable_settings_app_info_divider.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/drawable/settings_app_info_divider.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_spinner_item_scored.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/spinner_item_scored.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_activity_settings_panel.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/activity_settings_panel.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_fragment_cast_settings.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/fragment_cast_settings.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_spinner_dropdown_item_scored.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/spinner_dropdown_item_scored.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/drawable_ic_picture_in_picture.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/drawable/ic_picture_in_picture.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/drawable_bg_spinner_item_underline_light.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/drawable/bg_spinner_item_underline_light.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/drawable_device_item_background.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/drawable/device_item_background.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/color_settings_spinner_text.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/color/settings_spinner_text.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_activity_licenses.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/activity_licenses.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_overlay_stream_awaiting.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/overlay_stream_awaiting.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/drawable_ic_android_robot.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/drawable/ic_android_robot.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_overlay_cast_diagnostics.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/overlay_cast_diagnostics.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/drawable_bg_settings_drawer_handle.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/drawable/bg_settings_drawer_handle.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/drawable_bg_settings_spinner_item_selected.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/drawable/bg_settings_spinner_item_selected.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_include_settings_section_header.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/include_settings_section_header.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/drawable_bg_settings_spinner.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/drawable/bg_settings_spinner.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_spinner_dropdown_item_settings.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/spinner_dropdown_item_settings.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_view_dev_diag_card.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/view_dev_diag_card.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_activity_dev_network_selftest_panel.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/activity_dev_network_selftest_panel.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_include_app_info_section.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/include_app_info_section.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/drawable_bg_spinner_item_underline_dark.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/drawable/bg_spinner_item_underline_dark.xml" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/drawable-nodpi_calibration_chart_reference.png.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/drawable-nodpi/calibration_chart_reference.png" + }, + { + "merged": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-debug-38:/layout_activity_drawer_host.xml.flat", + "source": "/home/foxx/.gradle/daemon/8.9/com.foxx.androidcast.app-main-40:/layout/activity_drawer_host.xml" + } +] \ No newline at end of file diff --git a/app/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json b/app/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/app/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/app/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt b/app/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt new file mode 100644 index 0000000..08f4ebe --- /dev/null +++ b/app/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt @@ -0,0 +1 @@ +0 Warning/Error \ No newline at end of file diff --git a/app/build/intermediates/packaged_manifests/debug/processDebugManifestForPackage/AndroidManifest.xml b/app/build/intermediates/packaged_manifests/debug/processDebugManifestForPackage/AndroidManifest.xml new file mode 100644 index 0000000..828cfa4 --- /dev/null +++ b/app/build/intermediates/packaged_manifests/debug/processDebugManifestForPackage/AndroidManifest.xml @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build/intermediates/packaged_manifests/debug/processDebugManifestForPackage/output-metadata.json b/app/build/intermediates/packaged_manifests/debug/processDebugManifestForPackage/output-metadata.json new file mode 100644 index 0000000..937bc31 --- /dev/null +++ b/app/build/intermediates/packaged_manifests/debug/processDebugManifestForPackage/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "PACKAGED_MANIFESTS", + "kind": "Directory" + }, + "applicationId": "com.foxx.androidcast", + "variantName": "debug", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 100, + "versionName": "0.1.0", + "outputFile": "AndroidManifest.xml" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/anim/robot_dance.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/anim/robot_dance.xml new file mode 100644 index 0000000..961182e --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/anim/robot_dance.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/color/device_item_text.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/color/device_item_text.xml new file mode 100644 index 0000000..5baa79c --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/color/device_item_text.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/color/settings_spinner_text.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/color/settings_spinner_text.xml new file mode 100644 index 0000000..8386006 --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/color/settings_spinner_text.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable-nodpi-v4/calibration_chart_reference.png b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable-nodpi-v4/calibration_chart_reference.png new file mode 100644 index 0000000..6d0fa7b Binary files /dev/null and b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable-nodpi-v4/calibration_chart_reference.png differ diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_drawer_handle.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_drawer_handle.xml new file mode 100644 index 0000000..5c4c516 --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_drawer_handle.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_section_header.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_section_header.xml new file mode 100644 index 0000000..f7ad3d5 --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_section_header.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_spinner.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_spinner.xml new file mode 100644 index 0000000..cab0619 --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_spinner.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_spinner_item.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_spinner_item.xml new file mode 100644 index 0000000..bd5607b --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_spinner_item.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_spinner_item_selected.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_spinner_item_selected.xml new file mode 100644 index 0000000..1464fbc --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_spinner_item_selected.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_spinner_popup.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_spinner_popup.xml new file mode 100644 index 0000000..a6a8843 --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_settings_spinner_popup.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_spinner_item_underline_dark.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_spinner_item_underline_dark.xml new file mode 100644 index 0000000..26177a3 --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_spinner_item_underline_dark.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_spinner_item_underline_light.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_spinner_item_underline_light.xml new file mode 100644 index 0000000..93c0a03 --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/bg_spinner_item_underline_light.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/device_item_background.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/device_item_background.xml new file mode 100644 index 0000000..ec3de96 --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/device_item_background.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/device_item_live_border.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/device_item_live_border.xml new file mode 100644 index 0000000..3e8cd03 --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/device_item_live_border.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_android_robot.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_android_robot.xml new file mode 100644 index 0000000..fea980d --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_android_robot.xml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_launcher_foreground.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..413a7f4 --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_launcher_foreground.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_notification.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_notification.xml new file mode 100644 index 0000000..56e7c0a --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_notification.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_picture_in_picture.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_picture_in_picture.xml new file mode 100644 index 0000000..3720eaa --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/ic_picture_in_picture.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/settings_app_info_divider.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/settings_app_info_divider.xml new file mode 100644 index 0000000..9542d46 --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/drawable/settings_app_info_divider.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/build/intermediates/packaged_res/debug/packageDebugResources/layout-land/activity_sender.xml b/app/build/intermediates/packaged_res/debug/packageDebugResources/layout-land/activity_sender.xml new file mode 100644 index 0000000..6fd74bd --- /dev/null +++ b/app/build/intermediates/packaged_res/debug/packageDebugResources/layout-land/activity_sender.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+

Remote access settings

+
+ + + +

+ + +
+
+ +
+

Internals

+
Loading…
+
+ + + + diff --git a/app/src/main/assets/ra_control/shell.html b/app/src/main/assets/ra_control/shell.html new file mode 100644 index 0000000..8a1c2f2 --- /dev/null +++ b/app/src/main/assets/ra_control/shell.html @@ -0,0 +1,46 @@ + + + + + + Android Cast — shell + + + +
+

Sandbox shell

+

← Settings

+
+

+  
+ +
+ + + diff --git a/app/src/main/java/com/foxx/androidcast/AndroidCastApplication.java b/app/src/main/java/com/foxx/androidcast/AndroidCastApplication.java new file mode 100644 index 0000000..ccd0e74 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/AndroidCastApplication.java @@ -0,0 +1,54 @@ +package com.foxx.androidcast; + +/********************************************************************* + * AndroidCastApplication.java + * Created at: Sun 17 May 2026 18:17:14 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class AndroidCastApplication + * Contributors: + * - Anton Afanasyeu (6 commits, 34 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 c6ffb05899adbbdc35c27a4048643990b8f2d162583777745b968b7e62189070 +**********************************************************************/ +import android.app.Application; +import android.content.Context; + +import com.foxx.androidcast.CastTrayNotifier; +import com.foxx.androidcast.commercial.CommercialFeatures; +import com.foxx.androidcast.crash.CrashReporter; +import com.foxx.androidcast.dev.DevAdbWifiKeeper; +import com.foxx.androidcast.display.WiredDisplayMonitor; +import com.foxx.androidcast.entitlements.EntitlementCoordinator; +import com.foxx.androidcast.media.CodecPriorityCatalog; +import com.foxx.androidcast.network.CastTransportFactory; +import com.foxx.androidcast.receiver.av.ReceiverAvRuntime; +import com.foxx.androidcast.remoteaccess.RemoteAccessCoordinator; + +/** Applies saved theme and locale at process start. */ +public class AndroidCastApplication extends Application { + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + } + + @Override + public void onCreate() { + super.onCreate(); + CrashReporter.install(this); + if (!CrashReporter.isMainProcess(this, CrashReporter.currentProcessName())) { + return; + } + CodecPriorityCatalog.init(this); + CastLocaleHelper.applyStoredLocale(this); + CastThemeHelper.applyNightMode(this); + ReceiverAvRuntime.reload(this); + CastTransportFactory.init(this); + WiredDisplayMonitor.getInstance(this).ensureRegistered(); + CommercialFeatures.refreshFromPreferences(this); + EntitlementCoordinator.getInstance(this).bootstrap(); + RemoteAccessCoordinator.onBootIfNeeded(this); + DevAdbWifiKeeper.ensureStarted(this); + CastTrayNotifier.ensureTrayService(this); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/AppPreferences.java b/app/src/main/java/com/foxx/androidcast/AppPreferences.java new file mode 100644 index 0000000..e75ef60 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/AppPreferences.java @@ -0,0 +1,725 @@ +package com.foxx.androidcast; + +/********************************************************************* + * AppPreferences.java + * Created at: Sun 17 May 2026 18:17:14 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class AppPreferences + * Contributors: + * - Anton Afanasyeu (10 commits, 349 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 86ebfc1c70fdfd77db43accfd8ffd2f77d080c321852157a25b9dcedcf806a8b +**********************************************************************/ +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Build; +import android.provider.Settings; +import android.text.TextUtils; + +import com.foxx.androidcast.display.ExternalDisplayCapturePolicy; +import com.foxx.androidcast.receiver.av.ReceiverAudioPreset; +import com.foxx.androidcast.receiver.av.ReceiverVideoPreset; +import com.foxx.androidcast.sender.SenderResolutionUiMode; + +/** + * Global app preferences: identity, PIN, tray icon, and default sender/receiver cast options. + */ +public final class AppPreferences { + private static final String PREFS = "androidcast_app"; + + private static final String KEY_USERNAME = "username"; + private static final String KEY_PIN = "pin"; + private static final String KEY_SHOW_TRAY = "show_tray_icon"; + private static final String KEY_THEME = "theme_mode"; + private static final String KEY_LOCALE = "locale_mode"; + private static final String KEY_PLAY_INCOMING_AUDIO = "play_incoming_audio"; + private static final String KEY_DEV_RECEIVER_DEBUG_OVERLAY = "dev_receiver_debug_overlay"; + private static final String KEY_DEV_GRAB_SESSION_STATS = "dev_grab_session_stats"; + private static final String KEY_DEV_STREAM_DUMP = "dev_stream_dump"; + private static final String KEY_SEND_ANONYMOUS_CRASH_LOGS = "send_anonymous_crash_logs"; + private static final String KEY_DEV_SHOW_CODEC_PRIORITY_SCORES = "dev_show_codec_priority_scores"; + private static final String KEY_DEV_RECEIVER_VIDEO_PRESET = "dev_receiver_video_preset"; + private static final String KEY_DEV_RECEIVER_AUDIO_PRESET = "dev_receiver_audio_preset"; + private static final String KEY_DEV_RECEIVER_AV_INTENSITY = "dev_receiver_av_intensity"; + private static final String KEY_DEV_RECEIVER_ADAPTIVE_DISPLAY = "dev_receiver_adaptive_display"; + private static final String KEY_RECEIVER_PIP_USER_DEFINED = "receiver_pip_user_defined"; + private static final String KEY_RECEIVER_PIP_ENABLED = "receiver_pip_enabled"; + private static final String KEY_OTA_CHANNEL_URL = "ota_channel_url"; + private static final String KEY_OTA_MANIFEST_URL_LEGACY = "ota_manifest_url"; + private static final String KEY_OTA_CHECK_ON_LAUNCH = "ota_check_on_launch"; + private static final String KEY_OTA_LAST_CHECK_MS = "ota_last_check_ms"; + private static final String KEY_OTA_DISMISSED_VERSION = "ota_dismissed_version_code"; + private static final String KEY_OTA_ROUND_ROBIN_INDEX = "ota_round_robin_index"; + + private static final String KEY_DEV_WIRED_DISPLAY_HINTS = "dev_wired_display_hints"; + private static final String KEY_DEV_USB_TETHER_TRANSPORT = "dev_usb_tether_transport"; + private static final String KEY_DEV_SENDER_RESOLUTION_UI_MODE = "dev_sender_resolution_ui_mode"; + private static final String KEY_DEV_EXTERNAL_CAPTURE_POLICY = "dev_external_capture_policy"; + private static final String KEY_DEV_COMMERCIAL_ADS = "dev_commercial_ads"; + private static final String KEY_DEV_COMMERCIAL_IAP = "dev_commercial_iap"; + private static final String KEY_DEV_COMMERCIAL_PLAY_STORE = "dev_commercial_play_store"; + private static final String KEY_DEV_DIAG_PING_PONG = "dev_diag_ping_pong"; + private static final String KEY_DEV_DIAG_PING_RESPONSE_MODE = "dev_diag_ping_response_mode"; + private static final String KEY_DEV_BACKEND_NTP_SYNC = "dev_backend_ntp_sync"; + private static final String KEY_DEV_BACKEND_NTP_OFFSET_MS = "dev_backend_ntp_offset_ms"; + private static final String KEY_DEV_BACKEND_NTP_LAST_SYNC_MS = "dev_backend_ntp_last_sync_ms"; + private static final String KEY_DEV_BACKEND_NTP_LAST_SKEW_MS = "dev_backend_ntp_last_skew_ms"; + private static final String KEY_DEV_REMOTE_ACCESS_MODE = "dev_remote_access_mode"; + private static final String KEY_DEV_REMOTE_ACCESS_RANDOM = "dev_remote_access_random"; + private static final String KEY_DEV_REMOTE_ACCESS_SESSION_ID = "dev_remote_access_session_id"; + private static final String KEY_DEV_REMOTE_ACCESS_EXPIRES_AT = "dev_remote_access_expires_at"; + private static final String KEY_DEV_REMOTE_ACCESS_VPN_ROUTE_SCOPE = "dev_remote_access_vpn_route_scope"; + private static final String KEY_DEV_REMOTE_ACCESS_VPN_APP_SCOPE = "dev_remote_access_vpn_app_scope"; + private static final String KEY_DEV_ADB_WIFI_KEEPER = "dev_adb_wifi_keeper"; + private static final String KEY_ENTITLEMENT_ACCOUNT_KEY = "entitlement_account_key"; + private static final String KEY_ENTITLEMENT_LAST_VERIFIED_WALL_MS = "entitlement_last_verified_wall_ms"; + + /** Minimum interval between automatic OTA checks on app launch. */ + public static final long OTA_CHECK_INTERVAL_MS = 12 * 60 * 60 * 1000L; + + private static final String PREFIX_SENDER = "sender_"; + private static final String PREFIX_RECEIVER = "receiver_"; + + private AppPreferences() {} + + public static String getUsername(Context context) { + String stored = prefs(context).getString(KEY_USERNAME, null); + if (!TextUtils.isEmpty(stored)) { + return stored.trim(); + } + return defaultDeviceName(context); + } + + public static void setUsername(Context context, String username) { + String v = username != null ? username.trim() : ""; + if (v.isEmpty()) { + v = defaultDeviceName(context); + } + prefs(context).edit().putString(KEY_USERNAME, v).apply(); + } + + public static String getPin(Context context) { + return prefs(context).getString(KEY_PIN, CastConfig.DEFAULT_PIN); + } + + public static void setPin(Context context, String pin) { + prefs(context).edit().putString(KEY_PIN, pin != null ? pin : "").apply(); + } + + public static boolean isShowTrayIcon(Context context) { + return prefs(context).getBoolean(KEY_SHOW_TRAY, true); + } + + public static void setShowTrayIcon(Context context, boolean show) { + prefs(context).edit().putBoolean(KEY_SHOW_TRAY, show).apply(); + } + + public static CastThemeHelper.AppThemeMode getThemeMode(Context context) { + String name = prefs(context).getString(KEY_THEME, CastThemeHelper.AppThemeMode.SYSTEM.name()); + try { + return CastThemeHelper.AppThemeMode.valueOf(name); + } catch (Exception e) { + return CastThemeHelper.AppThemeMode.SYSTEM; + } + } + + public static void setThemeMode(Context context, CastThemeHelper.AppThemeMode mode) { + prefs(context).edit().putString(KEY_THEME, + mode != null ? mode.name() : CastThemeHelper.AppThemeMode.SYSTEM.name()).apply(); + } + + public static CastLocaleHelper.AppLocaleMode getLocaleMode(Context context) { + String name = prefs(context).getString(KEY_LOCALE, CastLocaleHelper.AppLocaleMode.SYSTEM.name()); + try { + return CastLocaleHelper.AppLocaleMode.valueOf(name); + } catch (Exception e) { + return CastLocaleHelper.AppLocaleMode.SYSTEM; + } + } + + public static void setLocaleMode(Context context, CastLocaleHelper.AppLocaleMode mode) { + prefs(context).edit().putString(KEY_LOCALE, + mode != null ? mode.name() : CastLocaleHelper.AppLocaleMode.SYSTEM.name()).apply(); + } + + public static boolean isPlayIncomingAudio(Context context) { + return prefs(context).getBoolean(KEY_PLAY_INCOMING_AUDIO, true); + } + + public static void setPlayIncomingAudio(Context context, boolean play) { + prefs(context).edit().putBoolean(KEY_PLAY_INCOMING_AUDIO, play).apply(); + } + + /** Developer: metrics HTML overlay on receiver video (default on). */ + public static boolean isShowReceiverDebugOverlay(Context context) { + return prefs(context).getBoolean(KEY_DEV_RECEIVER_DEBUG_OVERLAY, true); + } + + public static void setShowReceiverDebugOverlay(Context context, boolean show) { + prefs(context).edit().putBoolean(KEY_DEV_RECEIVER_DEBUG_OVERLAY, show).apply(); + } + + /** Developer: write anonymous session_send_* / session_recv_* JSON (default on). */ + public static boolean isGrabSessionStats(Context context) { + return prefs(context).getBoolean(KEY_DEV_GRAB_SESSION_STATS, true); + } + + public static void setGrabSessionStats(Context context, boolean grab) { + prefs(context).edit().putBoolean(KEY_DEV_GRAB_SESSION_STATS, grab).apply(); + } + + /** Developer: record elementary cast streams to zip (FR 0.1; default off). */ + public static boolean isDevStreamDumpEnabled(Context context) { + return prefs(context).getBoolean(KEY_DEV_STREAM_DUMP, false); + } + + public static void setDevStreamDumpEnabled(Context context, boolean enabled) { + prefs(context).edit().putBoolean(KEY_DEV_STREAM_DUMP, enabled).apply(); + } + + /** Send anonymous crash reports via the standalone crash watcher process (default on). */ + public static boolean isSendAnonymousCrashLogs(Context context) { + return prefs(context).getBoolean(KEY_SEND_ANONYMOUS_CRASH_LOGS, true); + } + + public static void setSendAnonymousCrashLogs(Context context, boolean send) { + prefs(context).edit().putBoolean(KEY_SEND_ANONYMOUS_CRASH_LOGS, send).apply(); + } + + /** Developer: show priority scores in codec settings spinners (default off). */ + public static boolean isShowCodecPriorityScores(Context context) { + return prefs(context).getBoolean(KEY_DEV_SHOW_CODEC_PRIORITY_SCORES, false); + } + + public static void setShowCodecPriorityScores(Context context, boolean show) { + prefs(context).edit().putBoolean(KEY_DEV_SHOW_CODEC_PRIORITY_SCORES, show).apply(); + } + + /** v0 channel URL ({@code …/v0/ota/channel/stable.json}) or direct manifest URL. */ + public static String getOtaChannelUrl(Context context) { + SharedPreferences p = prefs(context); + String url = p.getString(KEY_OTA_CHANNEL_URL, "").trim(); + if (url.isEmpty()) { + url = p.getString(KEY_OTA_MANIFEST_URL_LEGACY, "").trim(); + } + return url; + } + + public static void setOtaChannelUrl(Context context, String url) { + String v = url != null ? url.trim() : ""; + prefs(context).edit() + .putString(KEY_OTA_CHANNEL_URL, v) + .remove(KEY_OTA_MANIFEST_URL_LEGACY) + .apply(); + } + + public static boolean isOtaCheckOnLaunch(Context context) { + return prefs(context).getBoolean(KEY_OTA_CHECK_ON_LAUNCH, true); + } + + public static void setOtaCheckOnLaunch(Context context, boolean check) { + prefs(context).edit().putBoolean(KEY_OTA_CHECK_ON_LAUNCH, check).apply(); + } + + public static long getOtaLastCheckMs(Context context) { + return prefs(context).getLong(KEY_OTA_LAST_CHECK_MS, 0L); + } + + public static void setOtaLastCheckMs(Context context, long epochMs) { + prefs(context).edit().putLong(KEY_OTA_LAST_CHECK_MS, epochMs).apply(); + } + + public static int getOtaRoundRobinIndex(Context context) { + return Math.max(0, prefs(context).getInt(KEY_OTA_ROUND_ROBIN_INDEX, 0)); + } + + public static void setOtaRoundRobinIndex(Context context, int nextIndex) { + prefs(context).edit().putInt(KEY_OTA_ROUND_ROBIN_INDEX, Math.max(0, nextIndex)).apply(); + } + + public static int getOtaDismissedVersionCode(Context context) { + return prefs(context).getInt(KEY_OTA_DISMISSED_VERSION, 0); + } + + public static void setOtaDismissedVersionCode(Context context, int versionCode) { + prefs(context).edit().putInt(KEY_OTA_DISMISSED_VERSION, versionCode).apply(); + } + + /** + * Receiver PiP: user toggle when set; otherwise derived from PiP support + notifications permission. + */ + public static boolean isReceiverPipEnabled(Context context) { + if (prefs(context).getBoolean(KEY_RECEIVER_PIP_USER_DEFINED, false)) { + return prefs(context).getBoolean(KEY_RECEIVER_PIP_ENABLED, false); + } + return defaultReceiverPipEnabled(context); + } + + /** Value shown in settings before the user changes the toggle. */ + public static boolean getReceiverPipEffective(Context context) { + return isReceiverPipEnabled(context); + } + + public static boolean isReceiverPipUserDefined(Context context) { + return prefs(context).getBoolean(KEY_RECEIVER_PIP_USER_DEFINED, false); + } + + public static void setReceiverPipUserChoice(Context context, boolean enabled) { + prefs(context).edit() + .putBoolean(KEY_RECEIVER_PIP_USER_DEFINED, true) + .putBoolean(KEY_RECEIVER_PIP_ENABLED, enabled) + .apply(); + } + + private static boolean defaultReceiverPipEnabled(Context context) { + return PictureInPictureHelper.isSupported() + && PictureInPictureHelper.isAllowedForApp(context) + && PermissionHelper.hasReceiverPlaybackReady(context); + } + + public static CastSettings loadSenderDefaults(Context context) { + CastSettings s = new CastSettings(); + applyStoredCastSettings(context, PREFIX_SENDER, s); + s.setAdjustmentPreset(CastSettings.AdjustmentPreset.AUTO); + s.setQuality(CastSettings.Quality.MEDIUM); + if (s.getBitrateMode() == CastSettings.BitrateMode.AUTO) { + s.setBitrateMode(CastSettings.BitrateMode.ESTIMATED); + } + if (s.getNetworkAdoption() == CastSettings.NetworkAdoption.AUTO) { + s.setNetworkAdoption(CastSettings.NetworkAdoption.ESTIMATED); + } + clampAlphaTransport(s); + return s; + } + + public static void saveSenderDefaults(Context context, CastSettings settings) { + if (settings == null) { + return; + } + storeCastSettings(context, PREFIX_SENDER, settings); + } + + public static ReceiverVideoPreset getReceiverVideoPreset(Context context) { + return ReceiverVideoPreset.fromName( + prefs(context).getString(KEY_DEV_RECEIVER_VIDEO_PRESET, null), + ReceiverVideoPreset.DEFAULT); + } + + public static void setReceiverVideoPreset(Context context, ReceiverVideoPreset preset) { + prefs(context).edit() + .putString(KEY_DEV_RECEIVER_VIDEO_PRESET, preset.name()) + .apply(); + } + + public static ReceiverAudioPreset getReceiverAudioPreset(Context context) { + return ReceiverAudioPreset.fromName( + prefs(context).getString(KEY_DEV_RECEIVER_AUDIO_PRESET, null), + ReceiverAudioPreset.DEFAULT); + } + + public static void setReceiverAudioPreset(Context context, ReceiverAudioPreset preset) { + prefs(context).edit() + .putString(KEY_DEV_RECEIVER_AUDIO_PRESET, preset.name()) + .apply(); + } + + public static int getReceiverAvIntensity(Context context) { + return Math.max(0, Math.min(10, prefs(context).getInt(KEY_DEV_RECEIVER_AV_INTENSITY, 5))); + } + + public static void setReceiverAvIntensity(Context context, int intensity) { + prefs(context).edit() + .putInt(KEY_DEV_RECEIVER_AV_INTENSITY, Math.max(0, Math.min(10, intensity))) + .apply(); + } + + public static boolean isDevReceiverAdaptiveDisplay(Context context) { + return prefs(context).getBoolean(KEY_DEV_RECEIVER_ADAPTIVE_DISPLAY, false); + } + + public static void setDevReceiverAdaptiveDisplay(Context context, boolean enabled) { + prefs(context).edit().putBoolean(KEY_DEV_RECEIVER_ADAPTIVE_DISPLAY, enabled).apply(); + } + + public static boolean isDevWiredDisplayHintsEnabled(Context context) { + return prefs(context).getBoolean(KEY_DEV_WIRED_DISPLAY_HINTS, false); + } + + public static void setDevWiredDisplayHintsEnabled(Context context, boolean enabled) { + prefs(context).edit().putBoolean(KEY_DEV_WIRED_DISPLAY_HINTS, enabled).apply(); + } + + public static boolean isDevUsbTetherTransportEnabled(Context context) { + return prefs(context).getBoolean(KEY_DEV_USB_TETHER_TRANSPORT, false); + } + + public static void setDevUsbTetherTransportEnabled(Context context, boolean enabled) { + prefs(context).edit().putBoolean(KEY_DEV_USB_TETHER_TRANSPORT, enabled).apply(); + } + + /** Default: {@link SenderResolutionUiMode#SEPARATED}. */ + public static SenderResolutionUiMode getDevSenderResolutionUiMode(Context context) { + String name = prefs(context).getString( + KEY_DEV_SENDER_RESOLUTION_UI_MODE, SenderResolutionUiMode.SEPARATED.name()); + try { + return SenderResolutionUiMode.valueOf(name); + } catch (IllegalArgumentException e) { + return SenderResolutionUiMode.SEPARATED; + } + } + + public static void setDevSenderResolutionUiMode(Context context, SenderResolutionUiMode mode) { + SenderResolutionUiMode value = mode != null ? mode : SenderResolutionUiMode.SEPARATED; + prefs(context).edit().putString(KEY_DEV_SENDER_RESOLUTION_UI_MODE, value.name()).apply(); + } + + public static ExternalDisplayCapturePolicy getExternalDisplayCapturePolicy(Context context) { + return ExternalDisplayCapturePolicy.fromName( + prefs(context).getString(KEY_DEV_EXTERNAL_CAPTURE_POLICY, null), + ExternalDisplayCapturePolicy.DEFAULT_DISPLAY_ONLY); + } + + public static void setExternalDisplayCapturePolicy(Context context, ExternalDisplayCapturePolicy policy) { + prefs(context).edit() + .putString(KEY_DEV_EXTERNAL_CAPTURE_POLICY, + policy != null ? policy.name() : ExternalDisplayCapturePolicy.DEFAULT_DISPLAY_ONLY.name()) + .apply(); + } + + public static boolean isDevCommercialAdsEnabled(Context context) { + return prefs(context).getBoolean(KEY_DEV_COMMERCIAL_ADS, false); + } + + public static void setDevCommercialAdsEnabled(Context context, boolean enabled) { + prefs(context).edit().putBoolean(KEY_DEV_COMMERCIAL_ADS, enabled).apply(); + } + + public static boolean isDevCommercialIapEnabled(Context context) { + return prefs(context).getBoolean(KEY_DEV_COMMERCIAL_IAP, false); + } + + public static void setDevCommercialIapEnabled(Context context, boolean enabled) { + prefs(context).edit().putBoolean(KEY_DEV_COMMERCIAL_IAP, enabled).apply(); + } + + public static boolean isDevCommercialPlayStoreEnabled(Context context) { + return prefs(context).getBoolean(KEY_DEV_COMMERCIAL_PLAY_STORE, false); + } + + public static void setDevCommercialPlayStoreEnabled(Context context, boolean enabled) { + prefs(context).edit().putBoolean(KEY_DEV_COMMERCIAL_PLAY_STORE, enabled).apply(); + } + + /** Developer: ~1 Hz diagnostic cast ping-pong during sessions (default off). */ + public static boolean isDevDiagPingPongEnabled(Context context) { + return prefs(context).getBoolean(KEY_DEV_DIAG_PING_PONG, false); + } + + public static void setDevDiagPingPongEnabled(Context context, boolean enabled) { + prefs(context).edit().putBoolean(KEY_DEV_DIAG_PING_PONG, enabled).apply(); + } + + /** + * How this device responds to peer diag probes: + * 0 mirror-as-is, 1 mirror-smart (default), 2 reply-with. + */ + public static byte getDevDiagPingResponseMode(Context context) { + int mode = prefs(context).getInt(KEY_DEV_DIAG_PING_RESPONSE_MODE, + com.foxx.androidcast.network.diag.CastDiagPing.DIR_MIRROR_SMART); + if (mode < 0 || mode > 2) { + return com.foxx.androidcast.network.diag.CastDiagPing.DIR_MIRROR_SMART; + } + return (byte) mode; + } + + public static void setDevDiagPingResponseMode(Context context, byte mode) { + int v = mode; + if (v < 0 || v > 2) { + v = com.foxx.androidcast.network.diag.CastDiagPing.DIR_MIRROR_SMART; + } + prefs(context).edit().putInt(KEY_DEV_DIAG_PING_RESPONSE_MODE, v).apply(); + } + + /** Developer: allow backend-provided NTP correction for diagnostics (default off). */ + public static boolean isDevBackendNtpSyncEnabled(Context context) { + return prefs(context).getBoolean(KEY_DEV_BACKEND_NTP_SYNC, false); + } + + public static void setDevBackendNtpSyncEnabled(Context context, boolean enabled) { + prefs(context).edit().putBoolean(KEY_DEV_BACKEND_NTP_SYNC, enabled).apply(); + if (!enabled) { + clearDevBackendNtpOffset(context); + } + } + + public static long getDevBackendNtpOffsetMs(Context context) { + return prefs(context).getLong(KEY_DEV_BACKEND_NTP_OFFSET_MS, 0L); + } + + public static void setDevBackendNtpOffsetMs(Context context, long offsetMs) { + prefs(context).edit().putLong(KEY_DEV_BACKEND_NTP_OFFSET_MS, offsetMs).apply(); + } + + public static long getDevBackendNtpLastSyncMs(Context context) { + return prefs(context).getLong(KEY_DEV_BACKEND_NTP_LAST_SYNC_MS, 0L); + } + + public static void setDevBackendNtpLastSyncMs(Context context, long whenMs) { + prefs(context).edit().putLong(KEY_DEV_BACKEND_NTP_LAST_SYNC_MS, whenMs).apply(); + } + + public static long getDevBackendNtpLastSkewMs(Context context) { + return prefs(context).getLong(KEY_DEV_BACKEND_NTP_LAST_SKEW_MS, 0L); + } + + public static void setDevBackendNtpLastSkewMs(Context context, long skewMs) { + prefs(context).edit().putLong(KEY_DEV_BACKEND_NTP_LAST_SKEW_MS, skewMs).apply(); + } + + public static void clearDevBackendNtpOffset(Context context) { + prefs(context).edit() + .remove(KEY_DEV_BACKEND_NTP_OFFSET_MS) + .remove(KEY_DEV_BACKEND_NTP_LAST_SYNC_MS) + .remove(KEY_DEV_BACKEND_NTP_LAST_SKEW_MS) + .apply(); + } + + /** Debug builds: auto re-enable wireless adb after Wi-Fi reconnects. */ + public static boolean isDevAdbWifiKeeperEnabled(Context context) { + return prefs(context).getBoolean(KEY_DEV_ADB_WIFI_KEEPER, true); + } + + public static void setDevAdbWifiKeeperEnabled(Context context, boolean enabled) { + prefs(context).edit().putBoolean(KEY_DEV_ADB_WIFI_KEEPER, enabled).apply(); + } + + public static com.foxx.androidcast.remoteaccess.RemoteAccessMode getDevRemoteAccessMode(Context context) { + return com.foxx.androidcast.remoteaccess.RemoteAccessMode.fromStored( + prefs(context).getString(KEY_DEV_REMOTE_ACCESS_MODE, com.foxx.androidcast.remoteaccess.RemoteAccessMode.DISABLED.name())); + } + + public static void setDevRemoteAccessMode(Context context, com.foxx.androidcast.remoteaccess.RemoteAccessMode mode) { + if (mode == null) { + mode = com.foxx.androidcast.remoteaccess.RemoteAccessMode.DISABLED; + } + prefs(context).edit().putString(KEY_DEV_REMOTE_ACCESS_MODE, mode.name()).apply(); + } + + public static String getDevRemoteAccessRandom(Context context) { + return prefs(context).getString(KEY_DEV_REMOTE_ACCESS_RANDOM, ""); + } + + public static void setDevRemoteAccessRandom(Context context, String random) { + prefs(context).edit().putString(KEY_DEV_REMOTE_ACCESS_RANDOM, random != null ? random : "").apply(); + } + + public static void setDevRemoteAccessSession(Context context, String sessionId, long expiresAtEpochSec) { + prefs(context).edit() + .putString(KEY_DEV_REMOTE_ACCESS_SESSION_ID, sessionId != null ? sessionId : "") + .putLong(KEY_DEV_REMOTE_ACCESS_EXPIRES_AT, expiresAtEpochSec) + .apply(); + } + + public static void clearDevRemoteAccessSession(Context context) { + prefs(context).edit() + .remove(KEY_DEV_REMOTE_ACCESS_SESSION_ID) + .remove(KEY_DEV_REMOTE_ACCESS_EXPIRES_AT) + .apply(); + } + + public static long getDevRemoteAccessExpiresAt(Context context) { + return prefs(context).getLong(KEY_DEV_REMOTE_ACCESS_EXPIRES_AT, 0L); + } + + public static com.foxx.androidcast.remoteaccess.RemoteAccessVpnRouting.RouteScope getDevRemoteAccessVpnRouteScope( + Context context) { + return com.foxx.androidcast.remoteaccess.RemoteAccessVpnRouting.RouteScope.fromStored( + prefs(context).getString( + KEY_DEV_REMOTE_ACCESS_VPN_ROUTE_SCOPE, + com.foxx.androidcast.remoteaccess.RemoteAccessVpnRouting.RouteScope.HUB_ONLY.name())); + } + + public static void setDevRemoteAccessVpnRouteScope( + Context context, + com.foxx.androidcast.remoteaccess.RemoteAccessVpnRouting.RouteScope scope) { + if (scope == null) { + scope = com.foxx.androidcast.remoteaccess.RemoteAccessVpnRouting.RouteScope.HUB_ONLY; + } + prefs(context).edit().putString(KEY_DEV_REMOTE_ACCESS_VPN_ROUTE_SCOPE, scope.name()).apply(); + } + + public static com.foxx.androidcast.remoteaccess.RemoteAccessVpnRouting.AppScope getDevRemoteAccessVpnAppScope( + Context context) { + return com.foxx.androidcast.remoteaccess.RemoteAccessVpnRouting.AppScope.fromStored( + prefs(context).getString( + KEY_DEV_REMOTE_ACCESS_VPN_APP_SCOPE, + com.foxx.androidcast.remoteaccess.RemoteAccessVpnRouting.AppScope.ALL_APPS.name())); + } + + public static void setDevRemoteAccessVpnAppScope( + Context context, + com.foxx.androidcast.remoteaccess.RemoteAccessVpnRouting.AppScope scope) { + if (scope == null) { + scope = com.foxx.androidcast.remoteaccess.RemoteAccessVpnRouting.AppScope.ALL_APPS; + } + prefs(context).edit().putString(KEY_DEV_REMOTE_ACCESS_VPN_APP_SCOPE, scope.name()).apply(); + } + + /** + * Reset user-facing settings shown in Android Cast settings. + * Developer-only settings are intentionally preserved. + */ + public static void resetUserVisibleSettings(Context context) { + SharedPreferences p = prefs(context); + SharedPreferences.Editor e = p.edit(); + + e.putString(KEY_USERNAME, defaultDeviceName(context)); + e.putString(KEY_PIN, CastConfig.DEFAULT_PIN); + e.putBoolean(KEY_SHOW_TRAY, true); + e.putString(KEY_THEME, CastThemeHelper.AppThemeMode.SYSTEM.name()); + e.putString(KEY_LOCALE, CastLocaleHelper.AppLocaleMode.SYSTEM.name()); + e.putBoolean(KEY_PLAY_INCOMING_AUDIO, true); + e.putBoolean(KEY_SEND_ANONYMOUS_CRASH_LOGS, true); + e.putBoolean(KEY_RECEIVER_PIP_USER_DEFINED, false); + e.putBoolean(KEY_RECEIVER_PIP_ENABLED, false); + + java.util.Map all = p.getAll(); + for (String key : all.keySet()) { + if (key.startsWith(PREFIX_SENDER) || key.startsWith(PREFIX_RECEIVER)) { + e.remove(key); + } + } + e.apply(); + } + + public static CastSettings loadReceiverDefaults(Context context) { + CastSettings s = new CastSettings(); + applyStoredCastSettings(context, PREFIX_RECEIVER, s); + if (isDevReceiverAdaptiveDisplay(context)) { + s.setReceiverDisplayResolution(CastSettings.ReceiverDisplayResolution.ADAPTIVE_EXPERIMENTAL); + } else { + s.setReceiverDisplayResolution(CastSettings.ReceiverDisplayResolution.AUTO_FIT); + } + s.setAdjustmentPreset(CastSettings.AdjustmentPreset.AUTO); + s.setQuality(CastSettings.Quality.MEDIUM); + if (s.getBitrateMode() == CastSettings.BitrateMode.AUTO) { + s.setBitrateMode(CastSettings.BitrateMode.ESTIMATED); + } + if (s.getNetworkAdoption() == CastSettings.NetworkAdoption.AUTO) { + s.setNetworkAdoption(CastSettings.NetworkAdoption.ESTIMATED); + } + clampAlphaTransport(s); + return s; + } + + public static void saveReceiverDefaults(Context context, CastSettings settings) { + if (settings == null) { + return; + } + storeCastSettings(context, PREFIX_RECEIVER, settings); + } + + public static String defaultDeviceName(Context context) { + String name = Settings.Global.getString(context.getContentResolver(), Settings.Global.DEVICE_NAME); + if (TextUtils.isEmpty(name)) { + name = Build.MODEL; + } + return name != null ? name : "Android device"; + } + + private static void applyStoredCastSettings(Context context, String prefix, CastSettings s) { + SharedPreferences p = prefs(context); + String transport = p.getString(prefix + "transport", CastConfig.DEFAULT_TRANSPORT); + s.setTransport(transport); + CastSettings.Resolution resolution = readEnum(p, prefix + "resolution", + CastSettings.Resolution.values(), CastSettings.Resolution.ADAPTIVE); + if (PREFIX_SENDER.equals(prefix)) { + resolution = CastSettings.forPresetUi(resolution); + } + s.setResolution(resolution); + s.setVideoCodec(readEnum(p, prefix + "video_codec", CastSettings.VideoCodec.values(), + CastSettings.VideoCodec.AUTO)); + s.setBitrateMode(readEnum(p, prefix + "bitrate_mode", CastSettings.BitrateMode.values(), + CastSettings.BitrateMode.ESTIMATED)); + s.setNetworkAdoption(readEnum(p, prefix + "network_adoption", CastSettings.NetworkAdoption.values(), + CastSettings.NetworkAdoption.ESTIMATED)); + s.setCaptureMode(readEnum(p, prefix + "capture_mode", CastSettings.CaptureMode.values(), + PlatformCastSupport.defaultCaptureMode())); + CastSettings.StreamProtection protection = readEnum(p, prefix + "stream_protection", + CastSettings.StreamProtection.values(), CastSettings.StreamProtection.NONE); + if (protection == CastSettings.StreamProtection.AUTO) { + protection = CastSettings.StreamProtection.NONE; + } + s.setStreamProtection(protection); + s.setReceiverDisplayResolution(readEnum(p, prefix + "receiver_display", + CastSettings.ReceiverDisplayResolution.values(), + CastSettings.ReceiverDisplayResolution.AUTO_FIT)); + s.setAudioEnabled(p.getBoolean(prefix + "audio_enabled", PlatformCastSupport.isAudioCaptureSupported())); + s.setAudioCodec(readEnum(p, prefix + "audio_codec", CastSettings.AudioCodec.values(), + CastSettings.AudioCodec.AUTO)); + } + + private static void storeCastSettings(Context context, String prefix, CastSettings s) { + prefs(context).edit() + .putString(prefix + "transport", s.getTransport()) + .putString(prefix + "resolution", s.getResolution().name()) + .putString(prefix + "video_codec", s.getVideoCodec().name()) + .putString(prefix + "bitrate_mode", s.getBitrateMode().name()) + .putString(prefix + "network_adoption", s.getNetworkAdoption().name()) + .putString(prefix + "capture_mode", s.getCaptureMode().name()) + .putString(prefix + "stream_protection", s.getStreamProtection().name()) + .putString(prefix + "receiver_display", s.getReceiverDisplayResolution().name()) + .putBoolean(prefix + "audio_enabled", s.isAudioRequested()) + .putString(prefix + "audio_codec", s.getAudioCodec().name()) + .apply(); + } + + private static > T readEnum(SharedPreferences p, String key, T[] values, T fallback) { + String name = p.getString(key, fallback.name()); + for (T v : values) { + if (v.name().equals(name)) { + return v; + } + } + return fallback; + } + + private static void clampAlphaTransport(CastSettings settings) { + if (settings == null || !CastConfig.ALPHA_FEATURE_FREEZE) { + return; + } + if (!CastConfig.isReleaseTransport(settings.getTransport())) { + settings.setTransport(CastConfig.DEFAULT_TRANSPORT); + } + } + + public static String getEntitlementAccountKey(Context context) { + return prefs(context).getString(KEY_ENTITLEMENT_ACCOUNT_KEY, ""); + } + + public static void setEntitlementAccountKey(Context context, String keyHex) { + prefs(context).edit().putString(KEY_ENTITLEMENT_ACCOUNT_KEY, + keyHex != null ? keyHex : "").apply(); + } + + public static long getEntitlementLastVerifiedWallMs(Context context) { + return prefs(context).getLong(KEY_ENTITLEMENT_LAST_VERIFIED_WALL_MS, 0L); + } + + public static void setEntitlementLastVerifiedWallMs(Context context, long wallMs) { + prefs(context).edit().putLong(KEY_ENTITLEMENT_LAST_VERIFIED_WALL_MS, wallMs).apply(); + } + + private static SharedPreferences prefs(Context context) { + if (context == null) { + throw new IllegalStateException("context is null"); + } + Context storage = context; + Context app = context.getApplicationContext(); + if (app != null) { + storage = app; + } + return storage.getSharedPreferences(PREFS, Context.MODE_PRIVATE); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/CastActiveState.java b/app/src/main/java/com/foxx/androidcast/CastActiveState.java new file mode 100644 index 0000000..71b7024 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/CastActiveState.java @@ -0,0 +1,38 @@ +package com.foxx.androidcast; + +/********************************************************************* + * CastActiveState.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastActiveState + * Contributors: + * - Anton Afanasyeu (3 commits, 34 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 eeb5dc6633d096a40bdb9e6b70e4085e0b4f475882dff24b2b8d05331fe67f68 +**********************************************************************/ +import java.util.concurrent.atomic.AtomicBoolean; + +/** Process-wide cast session flags for UI back-key handling. */ +public final class CastActiveState { + private static final AtomicBoolean senderCasting = new AtomicBoolean(false); + private static final AtomicBoolean receiverListening = new AtomicBoolean(false); + + private CastActiveState() {} + + public static void setSenderCasting(boolean active) { + senderCasting.set(active); + } + + public static boolean isSenderCasting() { + return senderCasting.get(); + } + + public static void setReceiverListening(boolean active) { + receiverListening.set(active); + } + + public static boolean isReceiverListening() { + return receiverListening.get(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/CastActivityTracker.java b/app/src/main/java/com/foxx/androidcast/CastActivityTracker.java new file mode 100644 index 0000000..4e33480 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/CastActivityTracker.java @@ -0,0 +1,40 @@ +package com.foxx.androidcast; + +/********************************************************************* + * CastActivityTracker.java + * Created at: Sun 17 May 2026 18:17:14 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastActivityTracker + * Contributors: + * - Anton Afanasyeu (2 commits, 35 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 e7007416d4f7ce75f65c74e0bb2ccf13b30a468a01a47827487a68fe980a93ce +**********************************************************************/ +import android.app.Activity; +import android.content.Context; +import android.content.Intent; + +/** Remembers the last foreground activity for tray / notification resume. */ +public final class CastActivityTracker { + private static volatile Class lastActivityClass; + + private CastActivityTracker() {} + + public static void onResume(Activity activity) { + if (activity != null) { + lastActivityClass = activity.getClass(); + CastTrayNotifier.syncWhenForeground(activity); + } + } + + public static Intent resumeIntent(Context context) { + Class cls = lastActivityClass; + if (cls != null) { + Intent intent = new Intent(context, cls); + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); + return intent; + } + return new Intent(context, MainActivity.class); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/CastConfig.java b/app/src/main/java/com/foxx/androidcast/CastConfig.java new file mode 100644 index 0000000..ca83715 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/CastConfig.java @@ -0,0 +1,97 @@ +package com.foxx.androidcast; + +/********************************************************************* + * CastConfig.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastConfig + * Contributors: + * - Anton Afanasyeu (11 commits, 80 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 46ab864bc4474c49c7e832578a1559f20f1fbb8365b87f77425bc8d53129729c +**********************************************************************/ +/** Shared constants for the LAN cast POC. */ +public final class CastConfig { + public static final int DISCOVERY_PORT = 41234; + /** One UDP browse pass duration (sender shows countdown on Refresh). */ + public static final long DISCOVERY_SCAN_PASS_MS = 30_000; + /** Fast scan when user taps Refresh (UDP burst + NSD). */ + public static final long DISCOVERY_BURST_MS = 5_000; + /** Idle gap between automatic browse passes. */ + public static final long DISCOVERY_PAUSE_MS = 30_000; + /** How often the sender broadcasts a discover probe during a scan pass. */ + public static final long DISCOVERY_PROBE_INTERVAL_MS = 1_000; + /** Probe interval during burst scan. */ + public static final long DISCOVERY_BURST_PROBE_MS = 250; + /** NSD service type for LAN discovery (in addition to UDP). */ + public static final String NSD_SERVICE_TYPE = "_androidcast._udp."; + public static final int CAST_PORT = 41235; + public static final String DISCOVERY_MAGIC = "ACAST1"; + + /** + * Alpha / feature-freeze gate: limits transports in settings and disables 1:N cast until post-alpha soak. + * Set to {@code false} on a release branch when re-enabling QUIC and multi-receiver experiments. + */ + public static final boolean ALPHA_FEATURE_FREEZE = true; + + /** When true, sender list allows selecting multiple receivers (1:N cast). */ + public static final boolean MULTI_RECEIVER_ENABLED = !ALPHA_FEATURE_FREEZE; + + /** Transports exposed in cast settings while {@link #ALPHA_FEATURE_FREEZE} is on. */ + public static boolean isReleaseTransport(String transport) { + return TRANSPORT_UDP.equals(transport) || TRANSPORT_TCP.equals(transport); + } + + public static final int MAX_RECEIVERS = 5; + public static final String DEFAULT_PIN = "1234"; + + public static final String TRANSPORT_TCP = "tcp"; + public static final String TRANSPORT_UDP = "udp"; + public static final String TRANSPORT_QUIC = "quic"; + public static final String TRANSPORT_WEBRTC = "webrtc"; + /** USB tether / ADB reverse — stub until roadmap E is implemented. */ + public static final String TRANSPORT_USB_TETHER = "usb_tether"; + /** Default cast transport (UDP); TCP/QUIC remain selectable in settings. */ + public static final String DEFAULT_TRANSPORT = TRANSPORT_UDP; + /** Dedicated port for experimental QUIC transport (UDP/TCP framed). */ + public static final int QUIC_PORT = 41236; + + public static int portForTransport(String transport) { + if (TRANSPORT_QUIC.equals(transport)) { + return QUIC_PORT; + } + return CAST_PORT; + } + + /** Seconds between IDR frames (1 = faster recovery, slightly more bandwidth). */ + public static final int VIDEO_I_FRAME_INTERVAL = 1; + + /** Request sync frames on this interval when the screen is static (Mediatek stall workaround). */ + public static final long KEYFRAME_KEEPALIVE_MS = 2_000; + + /** P-frames smaller than this are treated as empty and not sent (unless keepalive IDR). */ + public static final int MIN_SIGNIFICANT_FRAME_BYTES = 400; + + public static final int AUDIO_SAMPLE_RATE = 44100; + public static final int AUDIO_CHANNEL_COUNT = 2; + public static final int AUDIO_BITRATE = 96_000; + + /** + * Optional cap on calibration chart long edge (0 = use asset size as-is). + * Keeps encoder load bounded if the reference PNG is replaced with a larger image. + */ + public static final int CALIBRATION_MAX_LONG_EDGE = 0; + + /** Max UDP payload chunk (fits typical Wi‑Fi MTU with header). */ + public static final int UDP_CHUNK_SIZE = 1200; + + /** Max retained session stat JSON files (room for one new file on next session). */ + public static final int SESSION_STATS_MAX_FILES = 20; + + /** No video packets for this long → treat stream as stopped (robot overlay). */ + /** No inbound video this long → robot overlay (keep above ~2× slowest expected frame interval). */ + public static final long STREAM_IDLE_TIMEOUT_MS = 8_000; + + private CastConfig() {} +} diff --git a/app/src/main/java/com/foxx/androidcast/CastLocaleHelper.java b/app/src/main/java/com/foxx/androidcast/CastLocaleHelper.java new file mode 100644 index 0000000..7e96ad0 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/CastLocaleHelper.java @@ -0,0 +1,90 @@ +package com.foxx.androidcast; + +/********************************************************************* + * CastLocaleHelper.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastLocaleHelper + * Contributors: + * - Anton Afanasyeu (2 commits, 86 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 6945cf0b617565a368eaf89b22484f82f07cdd9422fbccc6dabbe169f3b1bd6e +**********************************************************************/ +import android.content.Context; +import android.content.res.Configuration; +import android.os.Build; + +import androidx.appcompat.app.AppCompatDelegate; +import androidx.core.os.LocaleListCompat; + +import java.util.Locale; + +/** Applies user-selected app language (per-app locales). */ +public final class CastLocaleHelper { + private CastLocaleHelper() {} + + public enum AppLocaleMode { + /** Follow system locale. */ + SYSTEM, + /** Force English resources. */ + ENGLISH, + /** Force Russian resources. */ + RUSSIAN + } + + public static void applyStoredLocale(Context context) { + AppCompatDelegate.setApplicationLocales(toLocaleList(AppPreferences.getLocaleMode(context))); + } + + /** Wraps base context so resources resolve with the saved locale. */ + public static Context attach(Context context) { + AppLocaleMode mode = AppPreferences.getLocaleMode(context); + if (mode == AppLocaleMode.SYSTEM) { + return context; + } + Locale locale = toLocale(mode); + if (locale == null) { + return context; + } + return localizedContext(context, locale); + } + + public static LocaleListCompat toLocaleList(AppLocaleMode mode) { + if (mode == null) { + mode = AppLocaleMode.SYSTEM; + } + switch (mode) { + case ENGLISH: + return LocaleListCompat.forLanguageTags("en"); + case RUSSIAN: + return LocaleListCompat.forLanguageTags("ru"); + case SYSTEM: + default: + return LocaleListCompat.getEmptyLocaleList(); + } + } + + private static Locale toLocale(AppLocaleMode mode) { + switch (mode) { + case ENGLISH: + return Locale.ENGLISH; + case RUSSIAN: + return new Locale("ru"); + case SYSTEM: + default: + return null; + } + } + + private static Context localizedContext(Context context, Locale locale) { + Locale.setDefault(locale); + Configuration config = new Configuration(context.getResources().getConfiguration()); + config.setLocale(locale); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + return context.createConfigurationContext(config); + } + config.setLocales(new android.os.LocaleList(locale)); + return context.createConfigurationContext(config); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/CastNotifications.java b/app/src/main/java/com/foxx/androidcast/CastNotifications.java new file mode 100644 index 0000000..962ddff --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/CastNotifications.java @@ -0,0 +1,72 @@ +package com.foxx.androidcast; + +/********************************************************************* + * CastNotifications.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastNotifications + * Contributors: + * - Anton Afanasyeu (3 commits, 68 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 80a4c9129979483b88fd61c08595abf0cccda2057155620e1a5a9bafec97641e +**********************************************************************/ +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.Service; +import android.content.Intent; +import android.os.Build; + +import androidx.core.app.NotificationCompat; + +public final class CastNotifications { + public static final String CHANNEL_CAST = "cast_channel"; + public static final String CHANNEL_RECEIVE = "receive_channel"; + public static final int ID_SENDER = 1; + public static final int ID_RECEIVER = 2; + + private CastNotifications() {} + + public static void createChannels(Service service) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + return; + } + NotificationManager nm = service.getSystemService(NotificationManager.class); + NotificationChannel cast = new NotificationChannel( + CHANNEL_CAST, "Screen cast", NotificationManager.IMPORTANCE_LOW); + NotificationChannel recv = new NotificationChannel( + CHANNEL_RECEIVE, "Cast receiver", NotificationManager.IMPORTANCE_LOW); + nm.createNotificationChannel(cast); + nm.createNotificationChannel(recv); + } + + public static Notification sender(Service service, String text, Class serviceClass) { + return build(service, CHANNEL_CAST, ID_SENDER, text, serviceClass, "com.foxx.androidcast.STOP_SEND"); + } + + public static Notification receiver(Service service, String text, Class serviceClass) { + return build(service, CHANNEL_RECEIVE, ID_RECEIVER, text, serviceClass, "com.foxx.androidcast.STOP_RECV"); + } + + private static Notification build( + Service service, String channel, int id, String text, + Class serviceClass, String stopAction) { + PendingIntent pi = PendingIntent.getActivity( + service, 0, CastActivityTracker.resumeIntent(service), + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + Intent stop = new Intent(service, serviceClass); + stop.setAction(stopAction); + PendingIntent stopPi = PendingIntent.getService( + service, id, stop, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + return new NotificationCompat.Builder(service, channel) + .setContentTitle(service.getString(R.string.app_name)) + .setContentText(text) + .setSmallIcon(R.drawable.ic_notification) + .setContentIntent(pi) + .addAction(0, service.getString(R.string.stop), stopPi) + .setOngoing(true) + .build(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/CastResolution.java b/app/src/main/java/com/foxx/androidcast/CastResolution.java new file mode 100644 index 0000000..9d1c7f0 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/CastResolution.java @@ -0,0 +1,91 @@ +package com.foxx.androidcast; + +/********************************************************************* + * CastResolution.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastResolution + * Contributors: + * - Anton Afanasyeu (6 commits, 87 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 447a38e8faae8e49ab2215056114497ba9f1d65c0a117a91582865661d7c3687 +**********************************************************************/ +import android.content.Context; +import android.util.DisplayMetrics; + +import com.foxx.androidcast.network.control.NetworkStatsSnapshot; +import com.foxx.androidcast.sender.calibration.CalibrationSourceDimensions; + +/** Computes encoder VirtualDisplay size from display metrics and user settings. */ +public final class CastResolution { + private CastResolution() {} + + public static final class Size { + public final int width; + public final int height; + public final int densityDpi; + + public Size(int width, int height, int densityDpi) { + this.width = width; + this.height = height; + this.densityDpi = densityDpi; + } + } + + public static Size compute(DisplayMetrics display, CastSettings settings) { + return compute(display, settings, null); + } + + public static Size compute(DisplayMetrics display, CastSettings settings, NetworkStatsSnapshot peer) { + int displayW = display.widthPixels & ~1; + int displayH = display.heightPixels & ~1; + float scale = settings.getResolutionScale(); + int encW = even(Math.max(2, (int) (displayW * scale))); + int encH = even(Math.max(2, (int) (displayH * scale))); + + CastTuningEngine.CaptureLimits limits = CastTuningEngine.resolveCaptureLimits(settings, peer); + int maxH = limits.maxHeight > 0 ? limits.maxHeight : settings.getMaxHeight(); + int maxW = limits.maxWidth > 0 ? limits.maxWidth : settings.getMaxWidth(); + + if (maxH > 0 && maxW == 0) { + int[] capped = capLongEdge(encW, encH, maxH); + encW = capped[0]; + encH = capped[1]; + } else { + if (maxH > 0 && encH > maxH) { + float ratio = (float) maxH / encH; + encH = even(maxH); + encW = even(Math.max(2, (int) (encW * ratio))); + } + if (maxW > 0 && encW > maxW) { + float ratio = (float) maxW / encW; + encW = even(maxW); + encH = even(Math.max(2, (int) (encH * ratio))); + } + } + + int density = Math.max(120, (int) (display.densityDpi * scale)); + return new Size(encW, encH, density); + } + + /** Caps the longer side (orientation-independent 720p height-cap mode). */ + private static int[] capLongEdge(int width, int height, int maxLong) { + int longEdge = Math.max(width, height); + if (longEdge <= maxLong) { + return new int[] {width, height}; + } + float ratio = (float) maxLong / longEdge; + return new int[] {even(Math.max(2, (int) (width * ratio))), + even(Math.max(2, (int) (height * ratio)))}; + } + + private static int even(int v) { + return Math.max(2, v & ~1); + } + + /** Calibration encoder size from chart asset intrinsic dimensions. */ + public static Size calibrationTestSize(Context context) { + return CalibrationSourceDimensions.resolve(context); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/CastSettings.java b/app/src/main/java/com/foxx/androidcast/CastSettings.java new file mode 100644 index 0000000..739a33a --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/CastSettings.java @@ -0,0 +1,333 @@ +package com.foxx.androidcast; + +/********************************************************************* + * CastSettings.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastSettings + * Contributors: + * - Anton Afanasyeu (9 commits, 293 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 f505c9e26b14289d81453dde3bfc161af9a37ec38d04f158f1bea928410ce3ff +**********************************************************************/ +import java.io.Serializable; + +/** User-selected cast parameters (passed sender → service → receiver via protocol). */ +public class CastSettings implements Serializable { + public static final String EXTRA = "cast_settings"; + public static final int SETTINGS_VERSION = 4; + + public enum Quality { + LOW(1_500_000, 24), + MEDIUM(5_000_000, 30), + HIGH(10_000_000, 30); + + public final int videoBitrate; + public final int videoFps; + + Quality(int videoBitrate, int videoFps) { + this.videoBitrate = videoBitrate; + this.videoFps = videoFps; + } + } + + public enum VideoCodec { + AUTO, H264, H265, PASSTHROUGH, + /** Future software VP8 (UI disabled until integrated). */ + LIBVPX_VP8, + /** Future software VP9 (UI disabled until integrated). */ + LIBVPX_VP9 + } + + public enum AudioCodec { + AUTO, AAC, + /** Speex (native when built; otherwise stub AAC + Speex backend label). */ + SPEEX, + /** Opus with in-band FEC when native; otherwise stub AAC + Opus backend label. */ + OPUS, + /** Explicit AAC passthrough wrapper for debug comparisons. */ + PASSTHROUGH_DEBUG + } + + public enum AdjustmentPreset { + AUTO, NONE, QUALITY, SPEED, PERFORMANCE + } + + public enum BitrateMode { + AUTO, NONE, QUALITY, SPEED, BALANCED, ROBUST_LESS, ESTIMATED + } + + public enum NetworkAdoption { + AUTO, QUALITY, SPEED, ESTIMATED + } + + /** + * Capture size. {@link #HD_720P} caps height only (width follows aspect — e.g. 1532×720). + * {@link #FIXED_720P} fits inside 1280×720 box. + */ + /** How the system screen-capture consent dialog behaves (sender only). */ + public enum CaptureMode { + /** Whole display (default). */ + FULL_SCREEN, + /** Android 14+: system picker can target a single app (better app audio capture). */ + USER_CHOICE, + /** Generated TV calibration pattern (no MediaProjection). */ + CALIBRATION_TEST, + /** Camera2 rear camera as video source. */ + CAMERA, + /** Camera2 front camera as video source. */ + CAMERA_FRONT + } + + /** UDP stream protection hint (negotiated with peer; stubs until implemented). */ + public enum StreamProtection { + AUTO, + FEC_3_4, + FEC_REED_SOLOMON, + NACK, + FEC_NACK, + /** No FEC/NACK (default). */ + NONE + } + + /** How the receiver fits incoming video on its display. */ + public enum ReceiverDisplayResolution { + AUTO_FIT, + ADAPTIVE_EXPERIMENTAL + } + + public enum Resolution { + FULL(1.0f, 0, 0), + THREE_QUARTERS(0.75f, 0, 0), + HALF(0.5f, 0, 0), + HD_720P(1.0f, 720, 0), + FIXED_1080P(0f, 1080, 1920), + FIXED_720P(0f, 720, 1280), + ADAPTIVE(1.0f, 0, 0), + /** Long-edge cap 480p (aspect preserved). */ + SD_480P(1.0f, 480, 0); + + public final float scale; + public final int maxHeight; + public final int maxWidth; + + Resolution(float scale, int maxHeight, int maxWidth) { + this.scale = scale; + this.maxHeight = maxHeight; + this.maxWidth = maxWidth; + } + } + + /** + * Maps legacy stored resolutions to the alpha sender presets + * ({@link #FULL} / {@link #HD_720P} / {@link #SD_480P} / {@link #ADAPTIVE}). + */ + public static Resolution forPresetUi(Resolution stored) { + if (stored == null) { + return Resolution.ADAPTIVE; + } + switch (stored) { + case FIXED_720P: + return Resolution.HD_720P; + case FIXED_1080P: + return Resolution.FULL; + case THREE_QUARTERS: + case HALF: + return Resolution.ADAPTIVE; + default: + return stored; + } + } + + private String transport = CastConfig.DEFAULT_TRANSPORT; + private Quality quality = Quality.MEDIUM; + private Resolution resolution = Resolution.ADAPTIVE; + private boolean audioEnabled; + private VideoCodec videoCodec = VideoCodec.AUTO; + private AudioCodec audioCodec = AudioCodec.AUTO; + private AdjustmentPreset adjustmentPreset = AdjustmentPreset.AUTO; + private BitrateMode bitrateMode = BitrateMode.AUTO; + private NetworkAdoption networkAdoption = NetworkAdoption.AUTO; + private CaptureMode captureMode = PlatformCastSupport.defaultCaptureMode(); + private StreamProtection streamProtection = StreamProtection.NONE; + private ReceiverDisplayResolution receiverDisplayResolution = ReceiverDisplayResolution.AUTO_FIT; + /** Filled after codec handshake (e.g. video/avc). */ + private transient String negotiatedVideoMime; + /** Filled when AUTO (or fallback) resolves against peer audio caps. */ + private transient AudioCodec resolvedAudioCodec; + + public CastSettings() { + PlatformCastSupport.applyDefaultAudioSetting(this); + } + + public String getTransport() { + return transport; + } + + public void setTransport(String transport) { + this.transport = transport; + } + + public Quality getQuality() { + return quality; + } + + public void setQuality(Quality quality) { + this.quality = quality; + } + + public Resolution getResolution() { + return resolution; + } + + public void setResolution(Resolution resolution) { + this.resolution = resolution; + } + + public boolean isAudioEnabled() { + return audioEnabled && PlatformCastSupport.isAudioCaptureSupported(); + } + + public void setAudioEnabled(boolean audioEnabled) { + this.audioEnabled = audioEnabled; + } + + public boolean isAudioRequested() { + return audioEnabled; + } + + public VideoCodec getVideoCodec() { + return videoCodec; + } + + public void setVideoCodec(VideoCodec videoCodec) { + this.videoCodec = videoCodec; + } + + public AudioCodec getAudioCodec() { + return audioCodec; + } + + public void setAudioCodec(AudioCodec audioCodec) { + this.audioCodec = audioCodec != null ? audioCodec : AudioCodec.AUTO; + } + + public AdjustmentPreset getAdjustmentPreset() { + return adjustmentPreset; + } + + public void setAdjustmentPreset(AdjustmentPreset adjustmentPreset) { + this.adjustmentPreset = adjustmentPreset; + } + + public BitrateMode getBitrateMode() { + return bitrateMode; + } + + public void setBitrateMode(BitrateMode bitrateMode) { + this.bitrateMode = bitrateMode; + } + + public NetworkAdoption getNetworkAdoption() { + return networkAdoption; + } + + public void setNetworkAdoption(NetworkAdoption networkAdoption) { + this.networkAdoption = networkAdoption; + } + + /** Legacy: raw quality bitrate. Prefer {@link CastTuningEngine#resolve}. */ + public int getVideoBitrate() { + return quality.videoBitrate; + } + + public int getVideoFps() { + return quality.videoFps; + } + + public float getResolutionScale() { + return resolution.scale; + } + + public int getMaxHeight() { + return resolution.maxHeight; + } + + public int getMaxWidth() { + return resolution.maxWidth; + } + + public boolean isPassthrough() { + return videoCodec == VideoCodec.PASSTHROUGH; + } + + public String getNegotiatedVideoMime() { + return negotiatedVideoMime; + } + + public void setNegotiatedVideoMime(String negotiatedVideoMime) { + this.negotiatedVideoMime = negotiatedVideoMime; + } + + public AudioCodec getResolvedAudioCodec() { + return resolvedAudioCodec; + } + + public void setResolvedAudioCodec(AudioCodec resolvedAudioCodec) { + this.resolvedAudioCodec = resolvedAudioCodec; + } + + public CaptureMode getCaptureMode() { + return captureMode; + } + + public void setCaptureMode(CaptureMode captureMode) { + this.captureMode = captureMode != null ? captureMode : CaptureMode.FULL_SCREEN; + } + + public StreamProtection getStreamProtection() { + return streamProtection; + } + + public void setStreamProtection(StreamProtection streamProtection) { + this.streamProtection = streamProtection != null ? streamProtection : StreamProtection.NONE; + } + + public ReceiverDisplayResolution getReceiverDisplayResolution() { + return receiverDisplayResolution; + } + + public void setReceiverDisplayResolution(ReceiverDisplayResolution receiverDisplayResolution) { + this.receiverDisplayResolution = receiverDisplayResolution != null + ? receiverDisplayResolution : ReceiverDisplayResolution.AUTO_FIT; + } + + public boolean isCameraCapture() { + return captureMode == CaptureMode.CAMERA || captureMode == CaptureMode.CAMERA_FRONT; + } + + public boolean isFrontCamera() { + return captureMode == CaptureMode.CAMERA_FRONT; + } + + public void copyFrom(CastSettings other) { + if (other == null) { + return; + } + transport = other.transport; + quality = other.quality; + resolution = other.resolution; + audioEnabled = other.audioEnabled; + videoCodec = other.videoCodec; + audioCodec = other.audioCodec; + adjustmentPreset = other.adjustmentPreset; + bitrateMode = other.bitrateMode; + networkAdoption = other.networkAdoption; + captureMode = other.captureMode; + streamProtection = other.streamProtection; + receiverDisplayResolution = other.receiverDisplayResolution; + negotiatedVideoMime = other.negotiatedVideoMime; + resolvedAudioCodec = other.resolvedAudioCodec; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/CastSettingsActivity.java b/app/src/main/java/com/foxx/androidcast/CastSettingsActivity.java new file mode 100644 index 0000000..bdd8a3e --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/CastSettingsActivity.java @@ -0,0 +1,77 @@ +package com.foxx.androidcast; + +/********************************************************************* + * CastSettingsActivity.java + * Created at: Sun 17 May 2026 18:17:14 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastSettingsActivity + * Contributors: + * - Anton Afanasyeu (2 commits, 73 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 1d58e0ba44d2692f0f925163c929f836de05cd995fe631bf9f9777a46238ebff +**********************************************************************/ +import android.os.Bundle; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import com.foxx.androidcast.receiver.ReceiverPrefs; + +/** Global, sender, and receiver default cast settings. */ +public class CastSettingsActivity extends AppCompatActivity { + private final CastSettings senderSettings = new CastSettings(); + private final CastSettings receiverSettings = new CastSettings(); + + private EditText usernameInput; + private EditText pinInput; + private CheckBox trayIconCheck; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_cast_settings); + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + + usernameInput = findViewById(R.id.edit_username); + pinInput = findViewById(R.id.edit_settings_pin); + trayIconCheck = findViewById(R.id.check_tray_icon); + + senderSettings.copyFrom(AppPreferences.loadSenderDefaults(this)); + receiverSettings.copyFrom(AppPreferences.loadReceiverDefaults(this)); + + CastSettingsBinder.bindGlobal(this, usernameInput, pinInput, trayIconCheck); + CastSettingsBinder.bindSender(this, senderSettings); + CastSettingsBinder.bindReceiver(this, receiverSettings); + } + + @Override + protected void onResume() { + super.onResume(); + CastActivityTracker.onResume(this); + } + + @Override + protected void onPause() { + saveAll(); + super.onPause(); + } + + @Override + public boolean onSupportNavigateUp() { + finish(); + return true; + } + + private void saveAll() { + CastSettingsBinder.saveGlobal(this, usernameInput, pinInput, trayIconCheck); + CastSettingsBinder.saveSender(this, senderSettings); + CastSettingsBinder.saveReceiver(this, receiverSettings); + ReceiverPrefs.setAllowAudio(this, AppPreferences.isPlayIncomingAudio(this)); + Toast.makeText(this, R.string.settings_saved, Toast.LENGTH_SHORT).show(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/CastSettingsBinder.java b/app/src/main/java/com/foxx/androidcast/CastSettingsBinder.java new file mode 100644 index 0000000..00e784b --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/CastSettingsBinder.java @@ -0,0 +1,625 @@ +package com.foxx.androidcast; + +/********************************************************************* + * CastSettingsBinder.java + * Created at: Sun 17 May 2026 18:17:14 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastSettingsBinder + * Contributors: + * - Anton Afanasyeu (8 commits, 650 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 b42fba669987d4b76f8eef0405456807674d0790194862a921dc1aab8380b1d2 +**********************************************************************/ +import android.os.Build; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; + +import com.foxx.androidcast.sender.CodecCatalog; +import com.foxx.androidcast.ui.SettingsEnumSpinner; +import com.foxx.androidcast.ui.SettingsStringArrayAdapter; + +import java.util.ArrayList; +import java.util.List; + +/** Binds settings UI widgets to {@link AppPreferences} and {@link CastSettings}. */ +public final class CastSettingsBinder { + private CastSettingsBinder() {} + + public static void bindGlobal(AppCompatActivity activity, EditText username, EditText pin, + CheckBox trayIcon) { + username.setText(AppPreferences.getUsername(activity)); + pin.setText(AppPreferences.getPin(activity)); + trayIcon.setChecked(AppPreferences.isShowTrayIcon(activity)); + } + + public static void saveGlobal(AppCompatActivity activity, EditText username, EditText pin, + CheckBox trayIcon) { + String name = username.getText().toString().trim(); + if (name.isEmpty()) { + name = AppPreferences.defaultDeviceName(activity); + username.setText(name); + } + AppPreferences.setUsername(activity, name); + AppPreferences.setPin(activity, pin.getText().toString().trim()); + AppPreferences.setShowTrayIcon(activity, trayIcon.isChecked()); + } + + public static void bindTheme(AppCompatActivity activity, Spinner spinner) { + CastThemeHelper.AppThemeMode[] modes = CastThemeHelper.AppThemeMode.values(); + String[] labels = { + activity.getString(R.string.theme_system), + activity.getString(R.string.theme_dark), + activity.getString(R.string.theme_light), + activity.getString(R.string.theme_inverted) + }; + bindEnumSpinner(spinner, modes, labels, AppPreferences.getThemeMode(activity), + mode -> AppPreferences.setThemeMode(activity, mode)); + } + + public static void saveTheme(AppCompatActivity activity, Spinner spinner) { + readEnumSpinner(spinner, (CastThemeHelper.AppThemeMode mode) -> + AppPreferences.setThemeMode(activity, mode)); + } + + public static CastThemeHelper.AppThemeMode themeModeAt(int position) { + CastThemeHelper.AppThemeMode[] modes = CastThemeHelper.AppThemeMode.values(); + if (position >= 0 && position < modes.length) { + return modes[position]; + } + return CastThemeHelper.AppThemeMode.SYSTEM; + } + + public static void bindLanguage(AppCompatActivity activity, Spinner spinner) { + CastLocaleHelper.AppLocaleMode[] modes = CastLocaleHelper.AppLocaleMode.values(); + String[] labels = { + activity.getString(R.string.language_system), + activity.getString(R.string.language_english), + activity.getString(R.string.language_russian) + }; + bindEnumSpinner(spinner, modes, labels, AppPreferences.getLocaleMode(activity), + mode -> AppPreferences.setLocaleMode(activity, mode)); + } + + public static void saveLanguage(AppCompatActivity activity, Spinner spinner) { + readEnumSpinner(spinner, (CastLocaleHelper.AppLocaleMode mode) -> + AppPreferences.setLocaleMode(activity, mode)); + } + + public static CastLocaleHelper.AppLocaleMode localeModeAt(int position) { + CastLocaleHelper.AppLocaleMode[] modes = CastLocaleHelper.AppLocaleMode.values(); + if (position >= 0 && position < modes.length) { + return modes[position]; + } + return CastLocaleHelper.AppLocaleMode.SYSTEM; + } + + public static void bindSender(AppCompatActivity activity, CastSettings settings) { + bindTransport(activity, settings, R.id.spinner_sender_transport, true); + bindVideoCodec(activity, settings, R.id.spinner_sender_video_codec); + bindBitrate(activity, settings); + bindNetworkAdoption(activity, settings, R.id.spinner_sender_network); + com.foxx.androidcast.sender.SenderResolutionUi.bindSenderResolution(activity, settings); + bindCaptureMode(activity, settings); + bindStreamProtection(activity, settings); + bindAudioSpinner(activity, settings, R.id.spinner_sender_audio); + bindAudioCodec(activity, settings); + } + + public static void bindReceiver(AppCompatActivity activity, CastSettings settings) { + bindReceiverPip(activity); + bindTransport(activity, settings, R.id.spinner_receiver_transport, true); + bindVideoCodec(activity, settings, R.id.spinner_receiver_video_codec); + bindNetworkAdoption(activity, settings, R.id.spinner_receiver_network); + Spinner audioPlay = activity.findViewById(R.id.spinner_receiver_play_audio); + if (audioPlay != null) { + bindOnOffSpinner(activity, audioPlay, AppPreferences.isPlayIncomingAudio(activity), + on -> AppPreferences.setPlayIncomingAudio(activity, on)); + } + } + + public static void saveSender(AppCompatActivity activity, CastSettings settings) { + readTransport(activity, settings, R.id.spinner_sender_transport); + readVideoCodec(activity, settings, R.id.spinner_sender_video_codec); + readBitrate(activity, settings); + readNetworkAdoption(activity, settings, R.id.spinner_sender_network); + readSenderResolution(activity, settings); + readCaptureMode(activity, settings); + readStreamProtection(activity, settings); + readAudioSpinner(activity, settings, R.id.spinner_sender_audio); + readAudioCodec(activity, settings); + settings.setAdjustmentPreset(CastSettings.AdjustmentPreset.AUTO); + AppPreferences.saveSenderDefaults(activity, settings); + } + + public static void saveReceiver(AppCompatActivity activity, CastSettings settings) { + saveReceiverPip(activity); + readTransport(activity, settings, R.id.spinner_receiver_transport); + readVideoCodec(activity, settings, R.id.spinner_receiver_video_codec); + readNetworkAdoption(activity, settings, R.id.spinner_receiver_network); + Spinner audioPlay = activity.findViewById(R.id.spinner_receiver_play_audio); + if (audioPlay != null) { + AppPreferences.setPlayIncomingAudio(activity, audioPlay.getSelectedItemPosition() == 0); + } + settings.setAdjustmentPreset(CastSettings.AdjustmentPreset.AUTO); + AppPreferences.saveReceiverDefaults(activity, settings); + } + + private static void bindTransport(AppCompatActivity activity, CastSettings settings, int spinnerId, + boolean unused) { + Spinner spinner = activity.findViewById(spinnerId); + java.util.ArrayList labelList = new java.util.ArrayList<>(); + java.util.ArrayList valueList = new java.util.ArrayList<>(); + labelList.add(activity.getString(R.string.transport_udp)); + valueList.add(CastConfig.TRANSPORT_UDP); + labelList.add(activity.getString(R.string.transport_tcp)); + valueList.add(CastConfig.TRANSPORT_TCP); + if (!CastConfig.ALPHA_FEATURE_FREEZE) { + labelList.add(activity.getString(R.string.transport_quic)); + valueList.add(CastConfig.TRANSPORT_QUIC); + } + if (AppPreferences.isDevUsbTetherTransportEnabled(activity)) { + labelList.add(activity.getString(R.string.transport_usb_tether)); + valueList.add(CastConfig.TRANSPORT_USB_TETHER); + } + String[] labels = labelList.toArray(new String[0]); + String[] values = valueList.toArray(new String[0]); + bindStringSpinner(spinner, labels, values, settings.getTransport(), v -> { + settings.setTransport(v); + refreshStreamProtectionUi(activity, settings); + }); + refreshStreamProtectionUi(activity, settings); + } + + private static void refreshStreamProtectionUi(AppCompatActivity activity, CastSettings settings) { + updateStreamProtectionSpinnerEnabled(activity, settings, R.id.spinner_sender_stream_protection, + R.id.text_stream_protection_hint, R.id.spinner_sender_transport); + } + + private static void readTransport(AppCompatActivity activity, CastSettings settings, int spinnerId) { + Spinner spinner = activity.findViewById(spinnerId); + Object tag = spinner.getTag(R.id.tag_spinner_values); + if (tag instanceof String[]) { + int pos = spinner.getSelectedItemPosition(); + String[] values = (String[]) tag; + if (pos >= 0 && pos < values.length) { + settings.setTransport(values[pos]); + } + } + } + + private static void bindVideoCodec(AppCompatActivity activity, CastSettings settings, int spinnerId) { + Spinner spinner = activity.findViewById(spinnerId); + List choices = CodecCatalog.videoCodecChoicesForUi(settings); + CastSettings.VideoCodec[] values = new CastSettings.VideoCodec[choices.size()]; + String[] labels = new String[choices.size()]; + int[] scores = new int[choices.size()]; + boolean[] selectable = new boolean[choices.size()]; + boolean showScores = AppPreferences.isShowCodecPriorityScores(activity); + for (int i = 0; i < choices.size(); i++) { + values[i] = choices.get(i).codec; + labels[i] = labelVideoCodec(activity, choices.get(i).codec); + scores[i] = codecSpinnerScore(showScores, choices.get(i).codec, choices.get(i).priorityScore); + selectable[i] = choices.get(i).selectable; + } + CastSettings.VideoCodec current = settings.getVideoCodec(); + if (!isVideoCodecSelectable(choices, current)) { + current = CastSettings.VideoCodec.AUTO; + settings.setVideoCodec(current); + } + SettingsEnumSpinner.bind(spinner, values, labels, scores, selectable, current, settings::setVideoCodec); + } + + /** Rebind codec spinners after {@code codecs.json} reload or debug score toggle. */ + public static void refreshCodecSpinners(AppCompatActivity activity, CastSettings senderSettings, + CastSettings receiverSettings) { + bindVideoCodec(activity, senderSettings, R.id.spinner_sender_video_codec); + bindVideoCodec(activity, receiverSettings, R.id.spinner_receiver_video_codec); + bindAudioCodec(activity, senderSettings); + } + + private static boolean isVideoCodecSelectable(List choices, + CastSettings.VideoCodec codec) { + for (CodecCatalog.VideoCodecChoice c : choices) { + if (c.codec == codec) { + return c.selectable; + } + } + return false; + } + + private static void readVideoCodec(AppCompatActivity activity, CastSettings settings, int spinnerId) { + Spinner spinner = activity.findViewById(spinnerId); + CastSettings.VideoCodec v = SettingsEnumSpinner.read(spinner, CastSettings.VideoCodec.AUTO); + settings.setVideoCodec(v); + } + + private static void bindAudioCodec(AppCompatActivity activity, CastSettings settings) { + Spinner spinner = activity.findViewById(R.id.spinner_sender_audio_codec); + if (spinner == null) { + return; + } + List choices = CodecCatalog.audioCodecChoicesForUi(settings); + CastSettings.AudioCodec[] values = new CastSettings.AudioCodec[choices.size()]; + String[] labels = new String[choices.size()]; + int[] scores = new int[choices.size()]; + boolean[] selectable = new boolean[choices.size()]; + boolean showScores = AppPreferences.isShowCodecPriorityScores(activity); + for (int i = 0; i < choices.size(); i++) { + values[i] = choices.get(i).codec; + labels[i] = labelAudioCodec(activity, choices.get(i).codec); + scores[i] = codecSpinnerScore(showScores, choices.get(i).codec, choices.get(i).priorityScore); + selectable[i] = choices.get(i).selectable; + } + CastSettings.AudioCodec current = settings.getAudioCodec(); + for (CodecCatalog.AudioCodecChoice c : choices) { + if (c.codec == current && !c.selectable) { + current = CastSettings.AudioCodec.AUTO; + settings.setAudioCodec(current); + break; + } + } + SettingsEnumSpinner.bind(spinner, values, labels, scores, selectable, current, settings::setAudioCodec); + } + + private static void readAudioCodec(AppCompatActivity activity, CastSettings settings) { + Spinner spinner = activity.findViewById(R.id.spinner_sender_audio_codec); + if (spinner == null) { + return; + } + settings.setAudioCodec(SettingsEnumSpinner.read(spinner, CastSettings.AudioCodec.AUTO)); + } + + private static void bindBitrate(AppCompatActivity activity, CastSettings settings) { + Spinner spinner = activity.findViewById(R.id.spinner_sender_bitrate); + CastSettings.BitrateMode[] modes = { + CastSettings.BitrateMode.ESTIMATED, + CastSettings.BitrateMode.QUALITY, + CastSettings.BitrateMode.SPEED, + CastSettings.BitrateMode.BALANCED + }; + String[] labels = { + activity.getString(R.string.bitrate_estimated), + activity.getString(R.string.option_quality), + activity.getString(R.string.option_speed), + activity.getString(R.string.option_balanced) + }; + CastSettings.BitrateMode current = settings.getBitrateMode(); + if (current == CastSettings.BitrateMode.AUTO) { + current = CastSettings.BitrateMode.ESTIMATED; + } + bindEnumSpinner(spinner, modes, labels, current, settings::setBitrateMode); + } + + private static void readBitrate(AppCompatActivity activity, CastSettings settings) { + readEnumSpinner(activity.findViewById(R.id.spinner_sender_bitrate), settings::setBitrateMode); + } + + private static void bindNetworkAdoption(AppCompatActivity activity, CastSettings settings, int spinnerId) { + Spinner spinner = activity.findViewById(spinnerId); + CastSettings.NetworkAdoption[] modes = { + CastSettings.NetworkAdoption.ESTIMATED, + CastSettings.NetworkAdoption.QUALITY, + CastSettings.NetworkAdoption.SPEED + }; + String[] labels = { + activity.getString(R.string.network_estimated_auto), + activity.getString(R.string.option_quality), + activity.getString(R.string.option_speed) + }; + CastSettings.NetworkAdoption current = settings.getNetworkAdoption(); + if (current == CastSettings.NetworkAdoption.AUTO) { + current = CastSettings.NetworkAdoption.ESTIMATED; + } + bindEnumSpinner(spinner, modes, labels, current, settings::setNetworkAdoption); + } + + private static void readNetworkAdoption(AppCompatActivity activity, CastSettings settings, int spinnerId) { + readEnumSpinner(activity.findViewById(spinnerId), settings::setNetworkAdoption); + } + + private static void readSenderResolution(AppCompatActivity activity, CastSettings settings) { + com.foxx.androidcast.sender.SenderResolutionUi.readSenderResolution(activity, settings); + } + + public static void bindReceiverPip(AppCompatActivity activity) { + CheckBox pip = activity.findViewById(R.id.check_receiver_pip); + if (pip == null) { + return; + } + boolean supported = PictureInPictureHelper.isSupported(); + pip.setEnabled(supported); + pip.setOnCheckedChangeListener(null); + pip.setChecked(AppPreferences.getReceiverPipEffective(activity)); + pip.setOnCheckedChangeListener((btn, checked) -> + AppPreferences.setReceiverPipUserChoice(activity, checked)); + if (!supported) { + pip.setChecked(false); + } + } + + /** Re-apply permission-derived default when the user has not chosen explicitly. */ + public static void refreshReceiverPipFromPermissions(AppCompatActivity activity) { + if (AppPreferences.isReceiverPipUserDefined(activity)) { + return; + } + bindReceiverPip(activity); + } + + private static void saveReceiverPip(AppCompatActivity activity) { + CheckBox pip = activity.findViewById(R.id.check_receiver_pip); + if (pip != null && pip.isEnabled()) { + AppPreferences.setReceiverPipUserChoice(activity, pip.isChecked()); + } + } + + private static void bindCaptureMode(AppCompatActivity activity, CastSettings settings) { + Spinner spinner = activity.findViewById(R.id.spinner_sender_capture_mode); + List labels = new ArrayList<>(); + List values = new ArrayList<>(); + labels.add(activity.getString(R.string.capture_full_screen)); + values.add(CastSettings.CaptureMode.FULL_SCREEN); + if (PlatformCastSupport.isCaptureUserChoiceSupported()) { + labels.add(activity.getString(R.string.capture_user_choice)); + values.add(CastSettings.CaptureMode.USER_CHOICE); + } + if (PlatformCastSupport.isCameraCaptureModeSupported()) { + labels.add(activity.getString(R.string.capture_camera_rear)); + values.add(CastSettings.CaptureMode.CAMERA); + if (PlatformCastSupport.hasFrontCamera(activity)) { + labels.add(activity.getString(R.string.capture_camera_front)); + values.add(CastSettings.CaptureMode.CAMERA_FRONT); + } + } + labels.add(activity.getString(R.string.capture_calibration_test)); + values.add(CastSettings.CaptureMode.CALIBRATION_TEST); + bindEnumSpinner(spinner, values.toArray(new CastSettings.CaptureMode[0]), + labels.toArray(new String[0]), settings.getCaptureMode(), settings::setCaptureMode); + } + + private static void readCaptureMode(AppCompatActivity activity, CastSettings settings) { + readEnumSpinner(activity.findViewById(R.id.spinner_sender_capture_mode), settings::setCaptureMode); + } + + private static void bindStreamProtection(AppCompatActivity activity, CastSettings settings) { + bindStreamProtectionSpinner(activity, settings, R.id.spinner_sender_stream_protection, + R.id.text_stream_protection_hint, R.id.spinner_sender_transport); + } + + private static void bindStreamProtectionSpinner(AppCompatActivity activity, CastSettings settings, + int spinnerId, int hintId, int transportSpinnerId) { + Spinner spinner = activity.findViewById(spinnerId); + if (spinner == null) { + return; + } + CastSettings.StreamProtection[] modes = CastSettings.StreamProtection.values(); + String[] labels = { + activity.getString(R.string.option_auto), + activity.getString(R.string.protection_fec_34), + activity.getString(R.string.protection_fec_rs), + activity.getString(R.string.protection_nack), + activity.getString(R.string.protection_fec_nack), + activity.getString(R.string.protection_none) + }; + boolean[] selectable = new boolean[modes.length]; + java.util.Arrays.fill(selectable, true); + CastSettings.StreamProtection current = settings.getStreamProtection(); + if (current == CastSettings.StreamProtection.AUTO) { + current = CastSettings.StreamProtection.NONE; + } + SettingsEnumSpinner.bind(spinner, modes, labels, selectable, current, + settings::setStreamProtection); + Spinner transportSpinner = activity.findViewById(transportSpinnerId); + if (transportSpinner != null) { + transportSpinner.setOnItemSelectedListener(new android.widget.AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(android.widget.AdapterView parent, android.view.View view, + int position, long id) { + readTransport(activity, settings, transportSpinnerId); + updateStreamProtectionSpinnerEnabled(activity, settings, spinnerId, hintId, + transportSpinnerId); + } + + @Override + public void onNothingSelected(android.widget.AdapterView parent) { + } + }); + } + updateStreamProtectionSpinnerEnabled(activity, settings, spinnerId, hintId, transportSpinnerId); + } + + private static void readStreamProtection(AppCompatActivity activity, CastSettings settings) { + readEnumSpinner(activity.findViewById(R.id.spinner_sender_stream_protection), + settings::setStreamProtection); + } + + private static void updateStreamProtectionSpinnerEnabled(AppCompatActivity activity, + CastSettings settings, int spinnerId, int hintId, int transportSpinnerId) { + Spinner protection = activity.findViewById(spinnerId); + if (protection == null) { + return; + } + readTransport(activity, settings, transportSpinnerId); + boolean udp = CastConfig.TRANSPORT_UDP.equals(settings.getTransport()); + protection.setEnabled(udp); + TextView hint = activity.findViewById(hintId); + if (hint != null) { + hint.setVisibility(udp ? View.VISIBLE : View.GONE); + } + } + + private static void bindAudioSpinner(AppCompatActivity activity, CastSettings settings, int spinnerId) { + Spinner spinner = activity.findViewById(spinnerId); + TextView hint = activity.findViewById(R.id.text_sender_audio_hint); + if (!PlatformCastSupport.isAudioCaptureSupported()) { + spinner.setEnabled(false); + if (hint != null) { + hint.setVisibility(View.VISIBLE); + hint.setText(R.string.label_audio_unavailable); + } + settings.setAudioEnabled(false); + return; + } + if (hint != null) { + hint.setVisibility(View.GONE); + } + bindOnOffSpinner(activity, spinner, settings.isAudioRequested(), + settings::setAudioEnabled); + } + + private static void readAudioSpinner(AppCompatActivity activity, CastSettings settings, int spinnerId) { + Spinner spinner = activity.findViewById(spinnerId); + if (!PlatformCastSupport.isAudioCaptureSupported()) { + settings.setAudioEnabled(false); + return; + } + settings.setAudioEnabled(spinner.getSelectedItemPosition() == 0); + } + + private static void bindOnOffSpinner(AppCompatActivity activity, Spinner spinner, boolean on, + java.util.function.Consumer consumer) { + String[] labels = {activity.getString(R.string.option_on), activity.getString(R.string.option_off)}; + SettingsStringArrayAdapter adapter = new SettingsStringArrayAdapter(activity, labels); + spinner.setBackgroundResource(R.drawable.bg_settings_spinner); + spinner.setPopupBackgroundResource(R.drawable.bg_settings_spinner_popup); + spinner.setAdapter(adapter); + spinner.setSelection(on ? 0 : 1); + adapter.setSelectedPosition(on ? 0 : 1); + SettingsStringArrayAdapter.wireSelectionRefresh(spinner, adapter); + spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + consumer.accept(position == 0); + } + + @Override + public void onNothingSelected(AdapterView parent) {} + }); + } + + private static void bindStringSpinner(Spinner spinner, String[] labels, String[] values, + String current, java.util.function.Consumer onSelect) { + spinner.setTag(R.id.tag_spinner_values, values); + SettingsStringArrayAdapter adapter = new SettingsStringArrayAdapter(spinner.getContext(), labels); + spinner.setBackgroundResource(R.drawable.bg_settings_spinner); + spinner.setPopupBackgroundResource(R.drawable.bg_settings_spinner_popup); + spinner.setAdapter(adapter); + int sel = 0; + for (int i = 0; i < values.length; i++) { + if (values[i].equals(current)) { + sel = i; + break; + } + } + spinner.setSelection(sel); + adapter.setSelectedPosition(sel); + SettingsStringArrayAdapter.wireSelectionRefresh(spinner, adapter); + spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + if (position >= 0 && position < values.length) { + onSelect.accept(values[position]); + } + } + + @Override + public void onNothingSelected(AdapterView parent) {} + }); + } + + public static > void bindEnumSpinner(Spinner spinner, T[] values, String[] labels, + T current, java.util.function.Consumer onSelect) { + spinner.setTag(R.id.tag_spinner_enum, values); + SettingsStringArrayAdapter adapter = new SettingsStringArrayAdapter(spinner.getContext(), labels); + spinner.setBackgroundResource(R.drawable.bg_settings_spinner); + spinner.setPopupBackgroundResource(R.drawable.bg_settings_spinner_popup); + spinner.setAdapter(adapter); + int sel = 0; + for (int i = 0; i < values.length; i++) { + if (values[i] == current) { + sel = i; + break; + } + } + spinner.setSelection(sel); + adapter.setSelectedPosition(sel); + SettingsStringArrayAdapter.wireSelectionRefresh(spinner, adapter); + spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + if (position >= 0 && position < values.length) { + onSelect.accept(values[position]); + } + } + + @Override + public void onNothingSelected(AdapterView parent) {} + }); + } + + public static > void readEnumSpinner(Spinner spinner, + java.util.function.Consumer consumer) { + Object tag = spinner.getTag(R.id.tag_spinner_enum); + if (tag instanceof Enum[]) { + Enum[] values = (Enum[]) tag; + int pos = spinner.getSelectedItemPosition(); + if (pos >= 0 && pos < values.length) { + @SuppressWarnings("unchecked") + T v = (T) values[pos]; + consumer.accept(v); + } + } + } + + private static String labelVideoCodec(AppCompatActivity activity, CastSettings.VideoCodec codec) { + switch (codec) { + case H264: + return activity.getString(R.string.codec_h264); + case H265: + return activity.getString(R.string.codec_h265); + case LIBVPX_VP8: + return activity.getString(R.string.codec_libvpx_vp8); + case LIBVPX_VP9: + return activity.getString(R.string.codec_libvpx_vp9); + case PASSTHROUGH: + return activity.getString(R.string.codec_passthrough); + case AUTO: + default: + return activity.getString(R.string.option_auto); + } + } + + private static String labelAudioCodec(AppCompatActivity activity, CastSettings.AudioCodec codec) { + switch (codec) { + case AAC: + return activity.getString(R.string.codec_aac); + case SPEEX: + return activity.getString(R.string.codec_speex); + case OPUS: + return activity.getString(R.string.codec_opus); + case PASSTHROUGH_DEBUG: + return activity.getString(R.string.codec_audio_passthrough_debug); + case AUTO: + default: + return activity.getString(R.string.codec_audio_auto); + } + } + + private static int codecSpinnerScore(boolean showScores, Enum codec, int priorityScore) { + if (!showScores || codec == null) { + return com.foxx.androidcast.ui.SettingsScoredArrayAdapter.NO_SCORE; + } + String name = codec.name(); + if ("AUTO".equals(name)) { + return com.foxx.androidcast.ui.SettingsScoredArrayAdapter.NO_SCORE; + } + return priorityScore; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/CastSettingsFragment.java b/app/src/main/java/com/foxx/androidcast/CastSettingsFragment.java new file mode 100644 index 0000000..cd29e5e --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/CastSettingsFragment.java @@ -0,0 +1,254 @@ +package com.foxx.androidcast; + +/********************************************************************* + * CastSettingsFragment.java + * Created at: Sun 17 May 2026 18:17:14 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastSettingsFragment + * Contributors: + * - Anton Afanasyeu (6 commits, 227 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 cd27b0c2a7b01463d09e249600dd4f9c71c4791dee07eba2944f67e89a19491b +**********************************************************************/ +import android.content.Intent; +import android.os.Bundle; +import android.os.SystemClock; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.ArrayAdapter; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; + +import com.foxx.androidcast.receiver.ReceiverPrefs; + +/** Settings drawer content — swipe from the left edge on main screens. */ +public class CastSettingsFragment extends Fragment { + private final CastSettings senderSettings = new CastSettings(); + private final CastSettings receiverSettings = new CastSettings(); + + private EditText usernameInput; + private EditText pinInput; + private CheckBox trayIconCheck; + private Spinner themeSpinner; + private Spinner languageSpinner; + private int versionTapCount; + private long versionTapWindowStartMs; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_cast_settings, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + TextView headerGlobal = view.findViewById(R.id.header_global); + TextView headerSender = view.findViewById(R.id.header_sender); + TextView headerReceiver = view.findViewById(R.id.header_receiver); + headerGlobal.setText(R.string.settings_section_global); + headerSender.setText(R.string.settings_section_sender); + headerReceiver.setText(R.string.settings_section_receiver); + TextView headerAppInfo = view.findViewById(R.id.header_app_info); + if (headerAppInfo != null) { + headerAppInfo.setText(R.string.settings_section_app_info); + } + + usernameInput = view.findViewById(R.id.edit_username); + pinInput = view.findViewById(R.id.edit_settings_pin); + trayIconCheck = view.findViewById(R.id.check_tray_icon); + CheckBox crashLogsCheck = view.findViewById(R.id.check_send_crash_logs); + themeSpinner = view.findViewById(R.id.spinner_theme); + languageSpinner = view.findViewById(R.id.spinner_language); + + senderSettings.copyFrom(AppPreferences.loadSenderDefaults(requireContext())); + receiverSettings.copyFrom(AppPreferences.loadReceiverDefaults(requireContext())); + + AppCompatActivity activity = (AppCompatActivity) requireActivity(); + CastSettingsBinder.bindGlobal(activity, usernameInput, pinInput, trayIconCheck); + CastSettingsBinder.bindTheme(activity, themeSpinner); + CastSettingsBinder.bindLanguage(activity, languageSpinner); + CastSettingsBinder.bindSender(activity, senderSettings); + CastSettingsBinder.bindReceiver(activity, receiverSettings); + bindAppInfo(view); + styleSpinners(view); + + trayIconCheck.setOnCheckedChangeListener((btn, checked) -> { + AppPreferences.setShowTrayIcon(requireContext(), checked); + CastTrayNotifier.onPreferenceChanged(requireContext()); + }); + if (crashLogsCheck != null) { + crashLogsCheck.setChecked(AppPreferences.isSendAnonymousCrashLogs(requireContext())); + crashLogsCheck.setOnCheckedChangeListener((btn, checked) -> + AppPreferences.setSendAnonymousCrashLogs(requireContext(), checked)); + } + themeSpinner.setOnItemSelectedListener(new android.widget.AdapterView.OnItemSelectedListener() { + private boolean first = true; + + @Override + public void onItemSelected(android.widget.AdapterView parent, View v, int position, long id) { + CastThemeHelper.AppThemeMode mode = CastSettingsBinder.themeModeAt(position); + if (first) { + first = false; + return; + } + if (mode != AppPreferences.getThemeMode(requireContext())) { + AppPreferences.setThemeMode(requireContext(), mode); + Toast.makeText(requireContext(), R.string.theme_apply_restart, Toast.LENGTH_LONG).show(); + requireActivity().recreate(); + } + } + + @Override + public void onNothingSelected(android.widget.AdapterView parent) {} + }); + languageSpinner.setOnItemSelectedListener(new android.widget.AdapterView.OnItemSelectedListener() { + private boolean first = true; + + @Override + public void onItemSelected(android.widget.AdapterView parent, View v, int position, long id) { + CastLocaleHelper.AppLocaleMode mode = CastSettingsBinder.localeModeAt(position); + if (first) { + first = false; + return; + } + if (mode != AppPreferences.getLocaleMode(requireContext())) { + AppPreferences.setLocaleMode(requireContext(), mode); + CastLocaleHelper.applyStoredLocale(requireContext()); + Toast.makeText(requireContext(), R.string.language_apply_restart, Toast.LENGTH_LONG).show(); + requireActivity().recreate(); + } + } + + @Override + public void onNothingSelected(android.widget.AdapterView parent) {} + }); + } + + @Override + public void onResume() { + super.onResume(); + AppCompatActivity activity = (AppCompatActivity) requireActivity(); + CastSettingsBinder.refreshReceiverPipFromPermissions(activity); + CastSettingsBinder.refreshCodecSpinners(activity, senderSettings, receiverSettings); + } + + @Override + public void onPause() { + saveAll(); + super.onPause(); + } + + private void bindAppInfo(View view) { + TextView version = view.findViewById(R.id.text_app_version_value); + TextView protocol = view.findViewById(R.id.text_app_protocol_value); + TextView commit = view.findViewById(R.id.text_app_commit_value); + TextView built = view.findViewById(R.id.text_app_built_value); + TextView author = view.findViewById(R.id.text_app_author_value); + View.OnClickListener devTap = v -> onDeveloperSettingsTap(); + if (version != null) { + version.setText(VersionInfo.APP_VERSION_STRING); + version.setOnClickListener(devTap); + } + View versionRow = view.findViewById(R.id.row_app_version); + if (versionRow != null) { + versionRow.setOnClickListener(devTap); + } + TextView versionLabel = view.findViewById(R.id.label_app_version); + if (versionLabel != null) { + versionLabel.setOnClickListener(devTap); + } + View appInfoSection = view.findViewById(R.id.section_app_info); + if (appInfoSection != null) { + appInfoSection.setOnClickListener(devTap); + } + if (protocol != null) { + protocol.setText(VersionInfo.PROTO_VERSION_STRING); + } + if (commit != null) { + commit.setText(VersionInfo.GIT_COMMIT_SHORT); + } + if (built != null) { + built.setText(VersionInfo.BUILD_TIME_DISPLAY); + } + if (author != null) { + author.setText(VersionInfo.GIT_COMMIT_AUTHOR); + } + View licensesBtn = view.findViewById(R.id.btn_licenses); + if (licensesBtn != null) { + licensesBtn.setOnClickListener(v -> + startActivity(new Intent(requireContext(), LicensesActivity.class))); + } + View resetBtn = view.findViewById(R.id.btn_reset_defaults); + if (resetBtn != null) { + resetBtn.setOnClickListener(v -> showResetDefaultsConfirm()); + } + } + + private void styleSpinners(View root) { + if (root instanceof Spinner) { + Spinner spinner = (Spinner) root; + spinner.setBackgroundResource(R.drawable.bg_settings_spinner); + spinner.setPopupBackgroundResource(R.drawable.bg_settings_spinner_popup); + } + if (root instanceof android.view.ViewGroup) { + android.view.ViewGroup group = (android.view.ViewGroup) root; + for (int i = 0; i < group.getChildCount(); i++) { + styleSpinners(group.getChildAt(i)); + } + } + } + + private void onDeveloperSettingsTap() { + long now = SystemClock.elapsedRealtime(); + if (now - versionTapWindowStartMs > 2500) { + versionTapCount = 0; + } + versionTapWindowStartMs = now; + versionTapCount++; + if (versionTapCount >= 5) { + versionTapCount = 0; + startActivity(new Intent(requireContext(), DeveloperSettingsActivity.class)); + } + } + + private void saveAll() { + if (usernameInput == null) { + return; + } + AppCompatActivity activity = (AppCompatActivity) requireActivity(); + CastSettingsBinder.saveGlobal(activity, usernameInput, pinInput, trayIconCheck); + CastSettingsBinder.saveTheme(activity, themeSpinner); + CastSettingsBinder.saveLanguage(activity, languageSpinner); + CastSettingsBinder.saveSender(activity, senderSettings); + CastSettingsBinder.saveReceiver(activity, receiverSettings); + ReceiverPrefs.setAllowAudio(requireContext(), AppPreferences.isPlayIncomingAudio(requireContext())); + CastTrayNotifier.onPreferenceChanged(requireContext()); + } + + private void showResetDefaultsConfirm() { + new AlertDialog.Builder(requireContext()) + .setMessage(R.string.reset_defaults_confirm) + .setPositiveButton(android.R.string.yes, (d, which) -> { + AppPreferences.resetUserVisibleSettings(requireContext()); + ReceiverPrefs.setAllowAudio(requireContext(), AppPreferences.isPlayIncomingAudio(requireContext())); + CastTrayNotifier.onPreferenceChanged(requireContext()); + Toast.makeText(requireContext(), R.string.reset_defaults_done, Toast.LENGTH_SHORT).show(); + requireActivity().recreate(); + }) + .setNegativeButton(android.R.string.no, null) + .show(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/CastThemeHelper.java b/app/src/main/java/com/foxx/androidcast/CastThemeHelper.java new file mode 100644 index 0000000..daba777 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/CastThemeHelper.java @@ -0,0 +1,68 @@ +package com.foxx.androidcast; + +/********************************************************************* + * CastThemeHelper.java + * Created at: Sun 17 May 2026 18:17:14 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastThemeHelper + * Contributors: + * - Anton Afanasyeu (2 commits, 64 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 4dbc0e930b62735a65a2f278bc3b0164948feb338e9eb3d0d516eca92515339f +**********************************************************************/ +import android.app.Activity; +import android.content.Context; + +import androidx.appcompat.app.AppCompatDelegate; + +/** Applies user-selected app theme before {@link Activity#setContentView}. */ +public final class CastThemeHelper { + private CastThemeHelper() {} + + public enum AppThemeMode { + SYSTEM, + DARK, + LIGHT, + INVERTED + } + + public static void applyTheme(Activity activity) { + AppThemeMode mode = AppPreferences.getThemeMode(activity); + switch (mode) { + case DARK: + activity.setTheme(R.style.Theme_AndroidCast_Dark); + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + break; + case LIGHT: + activity.setTheme(R.style.Theme_AndroidCast_Light); + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + break; + case INVERTED: + activity.setTheme(R.style.Theme_AndroidCast_Inverted); + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + break; + case SYSTEM: + default: + activity.setTheme(R.style.Theme_AndroidCast); + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); + break; + } + } + + public static void applyNightMode(Context context) { + switch (AppPreferences.getThemeMode(context)) { + case DARK: + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + break; + case LIGHT: + case INVERTED: + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + break; + case SYSTEM: + default: + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); + break; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/CastTrayContent.java b/app/src/main/java/com/foxx/androidcast/CastTrayContent.java new file mode 100644 index 0000000..4299903 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/CastTrayContent.java @@ -0,0 +1,92 @@ +package com.foxx.androidcast; + +import com.foxx.androidcast.remoteaccess.RemoteAccessMode; +import com.foxx.androidcast.remoteaccess.RemoteAccessStatusStore; + +import java.util.ArrayList; +import java.util.List; + +/** Pure text assembly for the single persistent tray notification. */ +public final class CastTrayContent { + public static final class Body { + public final String summary; + public final String bigText; + + public Body(String summary, String bigText) { + this.summary = summary != null ? summary : ""; + this.bigText = bigText != null ? bigText : ""; + } + } + + private CastTrayContent() {} + + public static Body build( + String idleTapToOpen, + String castActive, + String adbWaiting, + String adbLineFormat, + String raPollFormat, + String raConnected, + String raSessionFormat, + boolean casting, + boolean adbEnabled, + String adbConnectLine, + RemoteAccessMode raMode, + RemoteAccessStatusStore.Snapshot raSnap) { + if (casting) { + return new Body(castActive, castActive); + } + List lines = new ArrayList<>(); + String raLine = remoteAccessLine(raPollFormat, raConnected, raSessionFormat, raMode, raSnap); + if (raLine != null && !raLine.isEmpty()) { + lines.add(raLine); + } + if (adbEnabled) { + String adbLine = adbConnectLine == null || adbConnectLine.isEmpty() + ? adbWaiting + : String.format(adbLineFormat, adbConnectLine); + lines.add(adbLine); + } + if (!lines.isEmpty()) { + String joined = joinLines(lines); + return new Body(lines.get(0), joined); + } + return new Body(idleTapToOpen, idleTapToOpen); + } + + static String remoteAccessLine( + String pollFormat, + String connected, + String sessionFormat, + RemoteAccessMode mode, + RemoteAccessStatusStore.Snapshot snap) { + if (mode == null || !mode.isActive()) { + return null; + } + if (snap != null && RemoteAccessStatusStore.STATE_SUCCESS.equals(snap.state)) { + if (snap.sessionId != null && !snap.sessionId.isEmpty()) { + String line = String.format(sessionFormat, snap.sessionId); + if (mode == RemoteAccessMode.RSSH) { + return line + " (RSSH)"; + } + return line; + } + if (mode == RemoteAccessMode.RSSH) { + return connected + " (RSSH)"; + } + return connected; + } + return String.format(pollFormat, mode.name()); + } + + private static String joinLines(List lines) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < lines.size(); i++) { + if (i > 0) { + sb.append('\n'); + } + sb.append(lines.get(i)); + } + return sb.toString(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/CastTrayNotifier.java b/app/src/main/java/com/foxx/androidcast/CastTrayNotifier.java new file mode 100644 index 0000000..66e546d --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/CastTrayNotifier.java @@ -0,0 +1,236 @@ +package com.foxx.androidcast; + +import android.app.ForegroundServiceStartNotAllowedException; +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.util.Log; + +import androidx.core.app.NotificationCompat; + +import com.foxx.androidcast.dev.DevAdbConnectInfo; +import com.foxx.androidcast.dev.DevAdbWifiKeeper; +import com.foxx.androidcast.remoteaccess.RemoteAccessMode; +import com.foxx.androidcast.remoteaccess.RemoteAccessStatusStore; + +/** + * Single persistent status-bar notification for Android Cast (prod + dev modes). + */ +public final class CastTrayNotifier { + private static final String TAG = "CastTrayNotifier"; + public static final String CHANNEL_TRAY = "cast_tray"; + public static final int ID_TRAY = 3; + + /** Legacy per-feature notification ids — cancelled on every refresh. */ + public static final int LEGACY_DEV_ADB_ID = 50391; + public static final int LEGACY_RA_ID = 0x7a00; + public static final int LEGACY_RA_VPN_ID = 0x7a01; + + private CastTrayNotifier() {} + + /** Sync tray content with app / dev service state. */ + public static void refresh(Context context) { + Context app = context.getApplicationContext(); + cancelLegacyNotifications(app); + if (!shouldMaintainTray(app)) { + stopTrayService(app); + hide(app); + return; + } + ensureTrayService(app); + publish(app); + } + + public static void syncWhenForeground(Context context) { + if (shouldMaintainTray(context)) { + ensureTrayService(context); + } + } + + public static void onPreferenceChanged(Context context) { + refresh(context); + } + + public static boolean shouldMaintainTray(Context context) { + if (AppPreferences.isShowTrayIcon(context)) { + return true; + } + return hasDevTrayContent(context); + } + + static boolean hasDevTrayContent(Context context) { + if (!BuildConfig.DEBUG) { + return false; + } + if (AppPreferences.isDevAdbWifiKeeperEnabled(context)) { + return true; + } + return AppPreferences.getDevRemoteAccessMode(context).isActive(); + } + + public static void ensureTrayService(Context context) { + Context app = context.getApplicationContext(); + if (!shouldMaintainTray(app)) { + return; + } + Intent intent = new Intent(app, TrayForegroundService.class); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + app.startForegroundService(intent); + } else { + app.startService(intent); + } + } catch (ForegroundServiceStartNotAllowedException e) { + Log.w(TAG, "tray FGS deferred (not foreground): " + e.getMessage()); + } catch (IllegalStateException e) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + Log.w(TAG, "tray FGS deferred: " + e.getMessage()); + } else { + throw e; + } + } + } + + public static void stopTrayService(Context context) { + context.getApplicationContext().stopService(new Intent(context, TrayForegroundService.class)); + } + + /** Foreground tray owned by {@link TrayForegroundService}. */ + public static void startForegroundTray(Service service) { + if (!shouldMaintainTray(service)) { + service.stopSelf(); + return; + } + createChannel(service); + Notification n = buildNotification(service); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + service.startForeground( + ID_TRAY, + n, + android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE); + } else { + service.startForeground(ID_TRAY, n); + } + } + + /** Other foreground services reuse the same tray notification id. */ + public static void startForeground(Service service, int fgsType) { + createChannel(service); + Notification n = buildNotification(service); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && fgsType != 0) { + service.startForeground(ID_TRAY, n, fgsType); + } else { + service.startForeground(ID_TRAY, n); + } + } + + public static Notification buildNotification(Context context) { + createChannel(context); + boolean casting = CastActiveState.isSenderCasting() || CastActiveState.isReceiverListening(); + boolean adbEnabled = BuildConfig.DEBUG && AppPreferences.isDevAdbWifiKeeperEnabled(context); + RemoteAccessMode raMode = BuildConfig.DEBUG + ? AppPreferences.getDevRemoteAccessMode(context) + : RemoteAccessMode.DISABLED; + RemoteAccessStatusStore.Snapshot raSnap = RemoteAccessStatusStore.load(context); + DevAdbConnectInfo adbInfo = adbEnabled ? DevAdbWifiKeeper.getLastInfo(context) : null; + String adbLine = adbInfo != null ? adbInfo.primaryConnectLine() : ""; + + CastTrayContent.Body body = CastTrayContent.build( + context.getString(R.string.tray_cast_idle), + context.getString(R.string.tray_cast_active), + context.getString(R.string.dev_adb_wifi_notification_waiting), + context.getString(R.string.dev_adb_wifi_notification_line), + context.getString(R.string.dev_remote_access_notification_poll), + context.getString(R.string.dev_remote_access_notification_connected), + context.getString(R.string.dev_remote_access_notification_session), + casting, + adbEnabled, + adbLine, + raMode, + raSnap); + + PendingIntent pi = PendingIntent.getActivity( + context, 0, CastActivityTracker.resumeIntent(context), + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + Intent deleted = new Intent(context, TrayNotificationReceiver.class); + deleted.setAction("com.foxx.androidcast.TRAY_DISMISSED"); + PendingIntent deletePi = PendingIntent.getBroadcast( + context, 1, deleted, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + + NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_TRAY) + .setContentTitle(context.getString(R.string.app_name)) + .setContentText(body.summary) + .setSmallIcon(R.drawable.ic_notification) + .setContentIntent(pi) + .setDeleteIntent(deletePi) + .setOngoing(true) + .setAutoCancel(false) + .setOnlyAlertOnce(true) + .setShowWhen(false) + .setLocalOnly(true) + .setPriority(NotificationCompat.PRIORITY_LOW) + .setCategory(NotificationCompat.CATEGORY_SERVICE) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + .setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE); + if (!body.bigText.equals(body.summary)) { + builder.setStyle(new NotificationCompat.BigTextStyle().bigText(body.bigText)); + } + return builder.build(); + } + + static void publish(Context context) { + if (!shouldMaintainTray(context)) { + return; + } + NotificationManager nm = context.getSystemService(NotificationManager.class); + if (nm != null) { + nm.notify(ID_TRAY, buildNotification(context)); + } + } + + static void cancelLegacyNotifications(Context context) { + NotificationManager nm = context.getSystemService(NotificationManager.class); + if (nm == null) { + return; + } + nm.cancel(LEGACY_DEV_ADB_ID); + nm.cancel(LEGACY_RA_ID); + nm.cancel(LEGACY_RA_VPN_ID); + } + + private static void hide(Context context) { + NotificationManager nm = context.getSystemService(NotificationManager.class); + if (nm != null) { + nm.cancel(ID_TRAY); + } + } + + private static void createChannel(Context context) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + return; + } + NotificationManager nm = context.getSystemService(NotificationManager.class); + if (nm == null) { + return; + } + NotificationChannel existing = nm.getNotificationChannel(CHANNEL_TRAY); + if (existing != null && existing.getImportance() < NotificationManager.IMPORTANCE_DEFAULT) { + nm.deleteNotificationChannel(CHANNEL_TRAY); + } + if (nm.getNotificationChannel(CHANNEL_TRAY) == null) { + NotificationChannel ch = new NotificationChannel( + CHANNEL_TRAY, + context.getString(R.string.tray_channel_name), + NotificationManager.IMPORTANCE_DEFAULT); + ch.setDescription(context.getString(R.string.tray_channel_description)); + ch.setShowBadge(true); + nm.createNotificationChannel(ch); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/CastTuningEngine.java b/app/src/main/java/com/foxx/androidcast/CastTuningEngine.java new file mode 100644 index 0000000..9740f94 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/CastTuningEngine.java @@ -0,0 +1,187 @@ +package com.foxx.androidcast; + +/********************************************************************* + * CastTuningEngine.java + * Created at: Fri 15 May 2026 20:37:44 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastTuningEngine + * Contributors: + * - Anton Afanasyeu (2 commits, 180 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 fd7ab546e1d7cbf75ad2f827d9ee46c291cf966f6cbd7b5d7da7ff36203ce8b8 +**********************************************************************/ +import com.foxx.androidcast.network.control.NetworkStatsSnapshot; + +/** Resolves AUTO presets into concrete encoder/network/capture parameters. */ +public final class CastTuningEngine { + private CastTuningEngine() {} + + public static final class EffectiveParams { + public final int videoBitrate; + public final int videoFps; + public final int keyframeIntervalSec; + public final boolean requestLowLatency; + public final boolean skipTinyPFrames; + + EffectiveParams(int videoBitrate, int videoFps, int keyframeIntervalSec, + boolean requestLowLatency, boolean skipTinyPFrames) { + this.videoBitrate = videoBitrate; + this.videoFps = videoFps; + this.keyframeIntervalSec = keyframeIntervalSec; + this.requestLowLatency = requestLowLatency; + this.skipTinyPFrames = skipTinyPFrames; + } + } + + public static final class CaptureLimits { + public final int maxWidth; + public final int maxHeight; + + public CaptureLimits(int maxWidth, int maxHeight) { + this.maxWidth = maxWidth; + this.maxHeight = maxHeight; + } + } + + public static CaptureLimits resolveCaptureLimits(CastSettings settings, NetworkStatsSnapshot peer) { + CastSettings.Resolution mode = settings.getResolution(); + int capLong = 0; + int boxW = 0; + int boxH = 0; + + switch (mode) { + case HD_720P: + capLong = 720; + break; + case SD_480P: + capLong = 480; + break; + case FIXED_1080P: + boxW = 1920; + boxH = 1080; + break; + case FIXED_720P: + boxW = 1280; + boxH = 720; + break; + case ADAPTIVE: + capLong = 720; + if (peer != null) { + if (peer.recvBitrateKbps > 0 && peer.recvBitrateKbps < 800) { + capLong = 480; + } else if (peer.recvBitrateKbps > 0 && peer.recvBitrateKbps < 1500) { + capLong = 540; + } + if (peer.rttMs > 500) { + capLong = Math.min(capLong, 540); + } + if (peer.rttMs > 800) { + capLong = Math.min(capLong, 480); + } + } + break; + default: + return new CaptureLimits(settings.getMaxWidth(), settings.getMaxHeight()); + } + + if (boxW > 0 && boxH > 0) { + return new CaptureLimits(boxW, boxH); + } + return new CaptureLimits(0, capLong); + } + + public static EffectiveParams resolve(CastSettings settings, NetworkStatsSnapshot peerStats) { + CastSettings.Quality quality = settings.getQuality(); + int bitrate = quality.videoBitrate; + int fps = quality.videoFps; + int gop = CastConfig.VIDEO_I_FRAME_INTERVAL; + boolean lowLatency = true; + boolean skipTiny = true; + + switch (settings.getAdjustmentPreset()) { + case NONE: + lowLatency = false; + skipTiny = false; + break; + case QUALITY: + bitrate = (int) (bitrate * 1.15f); + fps = Math.min(30, fps + 2); + gop = 2; + break; + case PERFORMANCE: + bitrate = (int) (bitrate * 0.85f); + fps = Math.max(24, fps); + break; + case SPEED: + case AUTO: + default: + break; + } + + switch (settings.getBitrateMode()) { + case NONE: + bitrate = Integer.MAX_VALUE / 4; + break; + case QUALITY: + bitrate = (int) (bitrate * 1.25f); + break; + case SPEED: + bitrate = (int) (bitrate * 0.65f); + fps = Math.min(fps, 24); + break; + case ROBUST_LESS: + if (CastConfig.TRANSPORT_UDP.equals(settings.getTransport())) { + bitrate = (int) (bitrate * 0.55f); + gop = 1; + } + break; + case ESTIMATED: + case BALANCED: + case AUTO: + default: + bitrate = applyBandwidthEstimate(peerStats, bitrate); + break; + } + + switch (settings.getNetworkAdoption()) { + case QUALITY: + bitrate = (int) (bitrate * 1.1f); + break; + case SPEED: + bitrate = (int) (bitrate * 0.7f); + fps = Math.min(fps, 24); + break; + case ESTIMATED: + bitrate = applyBandwidthEstimate(peerStats, bitrate); + break; + case AUTO: + default: + break; + } + + bitrate = Math.max(600_000, Math.min(16_000_000, bitrate)); + fps = Math.max(15, Math.min(30, fps)); + return new EffectiveParams(bitrate, fps, gop, lowLatency, skipTiny); + } + + private static int applyBandwidthEstimate(NetworkStatsSnapshot peer, int bitrate) { + if (peer == null) { + return bitrate; + } + if (peer.rttMs > 400) { + float factor = Math.max(0.35f, 1f - (peer.rttMs - 400) / 2000f); + bitrate = (int) (bitrate * factor); + } + if (peer.recvBitrateKbps > 0) { + int target = peer.recvBitrateKbps * 900; + if (target < bitrate) { + bitrate = Math.max(600_000, target); + } + } + if (peer.sendBitrateKbps > 0 && peer.sendBitrateKbps * 1000 < bitrate) { + bitrate = Math.max(600_000, peer.sendBitrateKbps * 950); + } + return bitrate; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/DeveloperSettingsActivity.java b/app/src/main/java/com/foxx/androidcast/DeveloperSettingsActivity.java new file mode 100644 index 0000000..34c50b6 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/DeveloperSettingsActivity.java @@ -0,0 +1,727 @@ +package com.foxx.androidcast; + +/********************************************************************* + * DeveloperSettingsActivity.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class DeveloperSettingsActivity + * Contributors: + * - Anton Afanasyeu (7 commits, 129 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 e8bf7419bf18028236c0e55eba2aefb055a7b9d5dd91b0fe32b9c4d185aaa1cb +**********************************************************************/ +import android.content.Context; +import android.os.Bundle; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.SeekBar; +import android.widget.Spinner; +import android.widget.TextView; +import android.text.TextUtils; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import com.foxx.androidcast.commercial.CommercialFeatures; +import com.foxx.androidcast.commercial.InAppPurchaseCoordinator; +import com.foxx.androidcast.commercial.PlayStoreIntegration; +import com.foxx.androidcast.display.ExternalDisplayCapturePolicy; +import com.foxx.androidcast.display.WiredDisplayMonitor; +import com.foxx.androidcast.media.CodecPriorityCatalog; +import com.foxx.androidcast.ota.OtaUpdateChecker; +import com.foxx.androidcast.ota.OtaUpdateCoordinator; +import com.foxx.androidcast.receiver.av.ReceiverAudioPreset; +import com.foxx.androidcast.receiver.av.ReceiverAvRuntime; +import com.foxx.androidcast.receiver.av.ReceiverVideoPreset; +import com.foxx.androidcast.sender.SenderResolutionUiMode; +import com.foxx.androidcast.dev.DevAdbConnectInfo; +import com.foxx.androidcast.dev.DevAdbWifiKeeper; +import com.foxx.androidcast.dev.DevDiagnosticsController; +import com.foxx.androidcast.dev.DevNetworkSelfTestController; +import com.foxx.androidcast.network.diag.CastDiagPing; +import com.foxx.androidcast.remoteaccess.RemoteAccessCoordinator; +import com.foxx.androidcast.remoteaccess.RemoteAccessMode; +import com.foxx.androidcast.remoteaccess.RemoteAccessVpnRouting; +import com.foxx.androidcast.stats.ui.SessionStatsAnalyzerActivity; +import com.google.android.material.tabs.TabLayout; +import com.google.android.material.textfield.TextInputEditText; + +/** Hidden developer settings (opened via app-info area easter egg). */ +public class DeveloperSettingsActivity extends AppCompatActivity { + private static final int REQUEST_VPN_PREPARE = 9107; + + private DevDiagnosticsController diagnosticsController; + private DevNetworkSelfTestController networkSelfTestController; + private android.view.View settingsPanel; + private android.view.View diagnosticsPanel; + private android.view.View networkSelfTestPanel; + private Spinner videoPresetSpinner; + private Spinner audioPresetSpinner; + private Spinner remoteAccessSpinner; + private Spinner remoteAccessVpnRouteSpinner; + private Spinner remoteAccessVpnAppSpinner; + private android.view.View remoteAccessVpnRouteLabel; + private android.view.View remoteAccessVpnAppLabel; + private RemoteAccessMode pendingRemoteAccessMode; + private boolean suppressRemoteAccessSpinnerEvents; + private SeekBar intensitySeek; + private TextView intensityValue; + + @Override + protected void attachBaseContext(Context newBase) { + super.attachBaseContext(CastLocaleHelper.attach(newBase)); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + CastThemeHelper.applyTheme(this); + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_developer_settings); + setTitle(R.string.developer_settings_title); + + settingsPanel = findViewById(R.id.dev_panel_settings); + diagnosticsPanel = findViewById(R.id.dev_panel_diagnostics); + networkSelfTestPanel = findViewById(R.id.dev_panel_network_selftest); + diagnosticsController = new DevDiagnosticsController(this); + networkSelfTestController = new DevNetworkSelfTestController(this); + bindDeveloperTabs(); + + CheckBox debugOverlay = findViewById(R.id.check_receiver_debug_overlay); + CheckBox codecScores = findViewById(R.id.check_show_codec_priority_scores); + CheckBox sessionStats = findViewById(R.id.check_grab_session_stats); + CheckBox streamDump = findViewById(R.id.check_dev_stream_dump); + CheckBox adaptiveDisplay = findViewById(R.id.check_receiver_adaptive_display); + CheckBox backendNtpSync = findViewById(R.id.check_dev_backend_ntp_sync); + + refreshFromPreferences(debugOverlay, codecScores, sessionStats, streamDump, adaptiveDisplay, backendNtpSync); + + findViewById(R.id.btn_open_session_stats).setOnClickListener(v -> + startActivity(new android.content.Intent(this, SessionStatsAnalyzerActivity.class))); + + findViewById(R.id.btn_reload_codecs_json).setOnClickListener(v -> { + String summary = CodecPriorityCatalog.reload(this); + Toast.makeText(this, summary, Toast.LENGTH_LONG).show(); + }); + + TextView installedVersion = findViewById(R.id.text_ota_installed_version); + TextInputEditText manifestUrl = findViewById(R.id.edit_ota_manifest_url); + CheckBox otaOnLaunch = findViewById(R.id.check_ota_on_launch); + Button checkOta = findViewById(R.id.btn_check_ota); + + refreshOtaUi(installedVersion, manifestUrl, otaOnLaunch); + + otaOnLaunch.setOnCheckedChangeListener((buttonView, isChecked) -> + AppPreferences.setOtaCheckOnLaunch(this, isChecked)); + + checkOta.setOnClickListener(v -> { + String url = manifestUrl.getText() != null ? manifestUrl.getText().toString().trim() : ""; + AppPreferences.setOtaChannelUrl(this, url); + OtaUpdateCoordinator.requestManualCheck(this); + }); + + bindAvPresets(); + bindRemoteAccessSection(); + bindDiagPingSection(); + bindSenderResolutionUiModeSection(); + bindWiredDisplaySection(); + bindAdbWifiSection(); + bindCommercialSection(); + } + + @Override + protected void onDestroy() { + if (diagnosticsController != null) { + diagnosticsController.onDestroy(); + } + if (networkSelfTestController != null) { + networkSelfTestController.onDestroy(); + } + super.onDestroy(); + } + + @Override + protected void onPause() { + saveAvPresets(); + super.onPause(); + } + + @Override + protected void onResume() { + super.onResume(); + refreshFromPreferences( + findViewById(R.id.check_receiver_debug_overlay), + findViewById(R.id.check_show_codec_priority_scores), + findViewById(R.id.check_grab_session_stats), + findViewById(R.id.check_dev_stream_dump), + findViewById(R.id.check_receiver_adaptive_display), + findViewById(R.id.check_dev_backend_ntp_sync)); + bindDiagPingSection(); + refreshOtaUi( + findViewById(R.id.text_ota_installed_version), + findViewById(R.id.edit_ota_manifest_url), + findViewById(R.id.check_ota_on_launch)); + bindAvPresets(); + bindRemoteAccessSection(); + bindSenderResolutionUiModeSection(); + bindWiredDisplaySection(); + bindAdbWifiSection(); + bindCommercialSection(); + } + + private void bindAdbWifiSection() { + if (!BuildConfig.DEBUG) { + android.view.View section = findViewById(R.id.check_dev_adb_wifi_keeper); + if (section != null) { + android.view.View parent = (android.view.View) section.getParent(); + // Hide adb wifi block in release UI if layout is shared. + section.setVisibility(android.view.View.GONE); + } + return; + } + CheckBox keeper = findViewById(R.id.check_dev_adb_wifi_keeper); + TextView status = findViewById(R.id.text_dev_adb_wifi_status); + Button refresh = findViewById(R.id.btn_dev_adb_wifi_refresh); + Button copy = findViewById(R.id.btn_dev_adb_wifi_copy); + if (keeper == null) { + return; + } + bindDeveloperCheckbox(keeper, AppPreferences.isDevAdbWifiKeeperEnabled(this), (ctx, on) -> { + AppPreferences.setDevAdbWifiKeeperEnabled(ctx, on); + DevAdbWifiKeeper.onPreferenceChanged(ctx, on); + refreshAdbWifiStatus(status); + }); + if (refresh != null) { + refresh.setOnClickListener(v -> { + DevAdbWifiKeeper.refreshNow(this, "dev-settings"); + status.postDelayed(() -> refreshAdbWifiStatus(status), 400L); + }); + } + if (copy != null) { + copy.setOnClickListener(v -> { + DevAdbWifiKeeper.copyPrimaryConnectLine(this); + Toast.makeText(this, R.string.dev_adb_wifi_copied, Toast.LENGTH_SHORT).show(); + }); + } + refreshAdbWifiStatus(status); + } + + private void refreshAdbWifiStatus(TextView status) { + if (status == null || !BuildConfig.DEBUG) { + return; + } + DevAdbConnectInfo info = DevAdbWifiKeeper.getLastInfo(this); + String line = info.primaryConnectLine(); + String headline = line.isEmpty() + ? getString(R.string.dev_adb_wifi_status_waiting) + : getString(R.string.dev_adb_wifi_status_line, line); + String detail = getString( + R.string.dev_adb_wifi_status_detail, + info.secureSettingsGranted ? "yes" : "no", + info.adbWifiEnabled ? "on" : "off", + info.connect.isEmpty() ? "no endpoints yet" : TextUtils.join(", ", info.connect)); + status.setText(headline + "\n" + detail); + } + + private void bindRemoteAccessSection() { + remoteAccessSpinner = findViewById(R.id.spinner_dev_remote_access_mode); + if (remoteAccessSpinner == null) { + return; + } + RemoteAccessMode[] modes = RemoteAccessMode.values(); + String[] labels = new String[]{ + getString(R.string.dev_remote_access_disabled), + getString(R.string.dev_remote_access_wireguard), + getString(R.string.dev_remote_access_rssh), + }; + ArrayAdapter adapter = new ArrayAdapter<>(this, + android.R.layout.simple_spinner_item, labels); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + remoteAccessSpinner.setAdapter(adapter); + RemoteAccessMode current = AppPreferences.getDevRemoteAccessMode(this); + suppressRemoteAccessSpinnerEvents = true; + remoteAccessSpinner.setOnItemSelectedListener(null); + remoteAccessSpinner.setSelection(current.ordinal(), false); + suppressRemoteAccessSpinnerEvents = false; + remoteAccessSpinner.setOnItemSelectedListener(new android.widget.AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(android.widget.AdapterView parent, android.view.View view, + int position, long id) { + if (suppressRemoteAccessSpinnerEvents) { + return; + } + RemoteAccessMode picked = modes[position]; + applyRemoteAccessMode(picked); + } + + @Override + public void onNothingSelected(android.widget.AdapterView parent) {} + }); + bindRemoteAccessVpnRoutingSection(); + } + + private void bindRemoteAccessVpnRoutingSection() { + remoteAccessVpnRouteLabel = findViewById(R.id.label_dev_remote_access_vpn_route); + remoteAccessVpnAppLabel = findViewById(R.id.label_dev_remote_access_vpn_app); + remoteAccessVpnRouteSpinner = findViewById(R.id.spinner_dev_remote_access_vpn_route); + remoteAccessVpnAppSpinner = findViewById(R.id.spinner_dev_remote_access_vpn_app_scope); + if (remoteAccessVpnRouteSpinner == null || remoteAccessVpnAppSpinner == null) { + return; + } + + final RemoteAccessVpnRouting.RouteScope[] routeScopes = RemoteAccessVpnRouting.RouteScope.values(); + String[] routeLabels = { + getString(R.string.dev_remote_access_vpn_route_hub_only), + getString(R.string.dev_remote_access_vpn_route_full_tunnel), + }; + ArrayAdapter routeAdapter = new ArrayAdapter<>(this, + android.R.layout.simple_spinner_item, routeLabels); + routeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + remoteAccessVpnRouteSpinner.setAdapter(routeAdapter); + remoteAccessVpnRouteSpinner.setOnItemSelectedListener(null); + remoteAccessVpnRouteSpinner.setSelection( + AppPreferences.getDevRemoteAccessVpnRouteScope(this).ordinal(), false); + remoteAccessVpnRouteSpinner.setOnItemSelectedListener(simpleSelection(() -> { + int pos = remoteAccessVpnRouteSpinner.getSelectedItemPosition(); + if (pos < 0 || pos >= routeScopes.length) { + return; + } + RemoteAccessVpnRouting.RouteScope picked = routeScopes[pos]; + if (picked == AppPreferences.getDevRemoteAccessVpnRouteScope(this)) { + return; + } + AppPreferences.setDevRemoteAccessVpnRouteScope(this, picked); + RemoteAccessCoordinator.onVpnRoutingPreferenceChanged(this); + Toast.makeText(this, R.string.dev_remote_access_vpn_routing_applied, Toast.LENGTH_SHORT).show(); + })); + + final RemoteAccessVpnRouting.AppScope[] appScopes = RemoteAccessVpnRouting.AppScope.values(); + String[] appLabels = { + getString(R.string.dev_remote_access_vpn_app_all), + getString(R.string.dev_remote_access_vpn_app_this_only), + }; + ArrayAdapter appAdapter = new ArrayAdapter<>(this, + android.R.layout.simple_spinner_item, appLabels); + appAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + remoteAccessVpnAppSpinner.setAdapter(appAdapter); + remoteAccessVpnAppSpinner.setOnItemSelectedListener(null); + remoteAccessVpnAppSpinner.setSelection( + AppPreferences.getDevRemoteAccessVpnAppScope(this).ordinal(), false); + remoteAccessVpnAppSpinner.setOnItemSelectedListener(simpleSelection(() -> { + int pos = remoteAccessVpnAppSpinner.getSelectedItemPosition(); + if (pos < 0 || pos >= appScopes.length) { + return; + } + RemoteAccessVpnRouting.AppScope picked = appScopes[pos]; + if (picked == AppPreferences.getDevRemoteAccessVpnAppScope(this)) { + return; + } + AppPreferences.setDevRemoteAccessVpnAppScope(this, picked); + RemoteAccessCoordinator.onVpnRoutingPreferenceChanged(this); + Toast.makeText(this, R.string.dev_remote_access_vpn_routing_applied, Toast.LENGTH_SHORT).show(); + })); + + updateRemoteAccessVpnRoutingEnabled(); + } + + private void updateRemoteAccessVpnRoutingEnabled() { + boolean wg = AppPreferences.getDevRemoteAccessMode(this) == RemoteAccessMode.WIREGUARD; + if (remoteAccessVpnRouteSpinner != null) { + remoteAccessVpnRouteSpinner.setEnabled(wg); + } + if (remoteAccessVpnAppSpinner != null) { + remoteAccessVpnAppSpinner.setEnabled(wg); + } + if (remoteAccessVpnRouteLabel != null) { + remoteAccessVpnRouteLabel.setEnabled(wg); + } + if (remoteAccessVpnAppLabel != null) { + remoteAccessVpnAppLabel.setEnabled(wg); + } + } + + private void applyRemoteAccessMode(RemoteAccessMode mode) { + if (mode == RemoteAccessMode.WIREGUARD) { + android.content.Intent prep = android.net.VpnService.prepare(this); + if (prep != null) { + pendingRemoteAccessMode = mode; + startActivityForResult(prep, REQUEST_VPN_PREPARE); + return; + } + } + AppPreferences.setDevRemoteAccessMode(this, mode); + RemoteAccessCoordinator.applyMode(this, mode); + updateRemoteAccessVpnRoutingEnabled(); + Toast.makeText(this, getString(R.string.dev_remote_access_applied, mode.name()), Toast.LENGTH_SHORT).show(); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, android.content.Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == REQUEST_VPN_PREPARE && pendingRemoteAccessMode != null) { + RemoteAccessMode mode = pendingRemoteAccessMode; + pendingRemoteAccessMode = null; + if (resultCode == RESULT_OK) { + AppPreferences.setDevRemoteAccessMode(this, mode); + RemoteAccessCoordinator.applyMode(this, mode); + updateRemoteAccessVpnRoutingEnabled(); + } else { + bindRemoteAccessSection(); + Toast.makeText(this, R.string.dev_remote_access_vpn_denied, Toast.LENGTH_LONG).show(); + } + } + } + + private void bindDiagPingSection() { + CheckBox enabled = findViewById(R.id.check_dev_diag_ping_pong); + bindDeveloperCheckbox(enabled, AppPreferences.isDevDiagPingPongEnabled(this), + AppPreferences::setDevDiagPingPongEnabled); + Spinner spinner = findViewById(R.id.spinner_dev_diag_ping_response_mode); + if (spinner == null) { + return; + } + final byte[] modes = { + CastDiagPing.DIR_MIRROR_AS_IS, + CastDiagPing.DIR_MIRROR_SMART, + CastDiagPing.DIR_REPLY_WITH + }; + String[] labels = { + getString(R.string.dev_diag_ping_response_mirror), + getString(R.string.dev_diag_ping_response_smart), + getString(R.string.dev_diag_ping_response_reply) + }; + ArrayAdapter adapter = new ArrayAdapter<>(this, + android.R.layout.simple_spinner_item, labels); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinner.setAdapter(adapter); + spinner.setOnItemSelectedListener(null); + byte current = AppPreferences.getDevDiagPingResponseMode(this); + int selection = 1; + for (int i = 0; i < modes.length; i++) { + if (modes[i] == current) { + selection = i; + break; + } + } + spinner.setSelection(selection, false); + spinner.setOnItemSelectedListener(simpleSelection(() -> { + int pos = spinner.getSelectedItemPosition(); + if (pos >= 0 && pos < modes.length) { + AppPreferences.setDevDiagPingResponseMode(this, modes[pos]); + } + })); + } + + private void bindSenderResolutionUiModeSection() { + Spinner spinner = findViewById(R.id.spinner_dev_sender_resolution_ui_mode); + if (spinner == null) { + return; + } + final SenderResolutionUiMode[] modes = SenderResolutionUiMode.values(); + String[] labels = { + getString(R.string.dev_sender_resolution_ui_separated), + getString(R.string.dev_sender_resolution_ui_legacy), + getString(R.string.dev_sender_resolution_ui_combined), + }; + ArrayAdapter adapter = new ArrayAdapter<>(this, + android.R.layout.simple_spinner_item, labels); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinner.setAdapter(adapter); + spinner.setOnItemSelectedListener(null); + SenderResolutionUiMode current = AppPreferences.getDevSenderResolutionUiMode(this); + spinner.setSelection(current.ordinal(), false); + spinner.setOnItemSelectedListener(simpleSelection(() -> { + int pos = spinner.getSelectedItemPosition(); + if (pos >= 0 && pos < modes.length) { + AppPreferences.setDevSenderResolutionUiMode(this, modes[pos]); + } + })); + } + + private void bindWiredDisplaySection() { + TextView status = findViewById(R.id.text_wired_display_status); + if (status != null) { + status.setText(WiredDisplayMonitor.getInstance(this).getSummaryLine()); + } + CheckBox hints = findViewById(R.id.check_wired_display_hints); + bindDeveloperCheckbox(hints, AppPreferences.isDevWiredDisplayHintsEnabled(this), + AppPreferences::setDevWiredDisplayHintsEnabled); + + Spinner policySpinner = findViewById(R.id.spinner_external_capture_policy); + TextView policyNote = findViewById(R.id.text_external_capture_policy_note); + if (policySpinner != null) { + String[] labels = { + getString(R.string.dev_capture_policy_default), + getString(R.string.dev_capture_policy_prefer_external), + getString(R.string.dev_capture_policy_external_experimental) + }; + ArrayAdapter adapter = new ArrayAdapter<>(this, + android.R.layout.simple_spinner_item, labels); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + policySpinner.setAdapter(adapter); + policySpinner.setSelection(AppPreferences.getExternalDisplayCapturePolicy(this).ordinal()); + policySpinner.setOnItemSelectedListener(simpleSelection(() -> { + ExternalDisplayCapturePolicy p = ExternalDisplayCapturePolicy.values()[ + policySpinner.getSelectedItemPosition()]; + AppPreferences.setExternalDisplayCapturePolicy(this, p); + if (policyNote != null) { + policyNote.setText(p.implementationNote()); + } + })); + if (policyNote != null) { + policyNote.setText(AppPreferences.getExternalDisplayCapturePolicy(this).implementationNote()); + } + } + + CheckBox usbTether = findViewById(R.id.check_usb_tether_transport); + bindDeveloperCheckbox(usbTether, AppPreferences.isDevUsbTetherTransportEnabled(this), + AppPreferences::setDevUsbTetherTransportEnabled); + } + + private void bindCommercialSection() { + CheckBox ads = findViewById(R.id.check_commercial_ads); + CheckBox iap = findViewById(R.id.check_commercial_iap); + CheckBox play = findViewById(R.id.check_commercial_play_store); + bindDeveloperCheckbox(ads, AppPreferences.isDevCommercialAdsEnabled(this), (ctx, on) -> { + AppPreferences.setDevCommercialAdsEnabled(ctx, on); + CommercialFeatures.refreshFromPreferences(ctx); + }); + bindDeveloperCheckbox(iap, AppPreferences.isDevCommercialIapEnabled(this), (ctx, on) -> { + AppPreferences.setDevCommercialIapEnabled(ctx, on); + CommercialFeatures.refreshFromPreferences(ctx); + }); + bindDeveloperCheckbox(play, AppPreferences.isDevCommercialPlayStoreEnabled(this), (ctx, on) -> { + AppPreferences.setDevCommercialPlayStoreEnabled(ctx, on); + CommercialFeatures.refreshFromPreferences(ctx); + }); + + Button listing = findViewById(R.id.btn_open_play_store_listing); + if (listing != null) { + listing.setOnClickListener(v -> { + if (!CommercialFeatures.isPlayStoreIntegrationEnabled(this)) { + Toast.makeText(this, R.string.dev_commercial_enable_play_first, Toast.LENGTH_SHORT).show(); + return; + } + PlayStoreIntegration.getInstance(this).openAppListing(this); + }); + } + Button review = findViewById(R.id.btn_request_play_review); + if (review != null) { + review.setOnClickListener(v -> { + if (!CommercialFeatures.isPlayStoreIntegrationEnabled(this)) { + Toast.makeText(this, R.string.dev_commercial_enable_play_first, Toast.LENGTH_SHORT).show(); + return; + } + PlayStoreIntegration.getInstance(this).requestInAppReviewIfAvailable(this); + }); + } + Button queryIap = findViewById(R.id.btn_query_iap_products); + if (queryIap != null) { + queryIap.setOnClickListener(v -> { + if (!CommercialFeatures.isInAppPurchaseEnabled(this)) { + Toast.makeText(this, R.string.dev_commercial_enable_iap_first, Toast.LENGTH_SHORT).show(); + return; + } + InAppPurchaseCoordinator.getInstance(this).queryPremiumProduct(() -> + Toast.makeText(this, R.string.dev_iap_query_done, Toast.LENGTH_SHORT).show()); + }); + } + } + + private void bindAvPresets() { + videoPresetSpinner = findViewById(R.id.spinner_dev_video_preset); + audioPresetSpinner = findViewById(R.id.spinner_dev_audio_preset); + intensitySeek = findViewById(R.id.seek_dev_av_intensity); + intensityValue = findViewById(R.id.text_dev_av_intensity_value); + + if (videoPresetSpinner != null) { + String[] labels = { + getString(R.string.dev_av_video_default), + getString(R.string.dev_av_video_immersive), + getString(R.string.dev_av_video_hdr) + }; + ArrayAdapter adapter = new ArrayAdapter<>(this, + android.R.layout.simple_spinner_item, labels); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + videoPresetSpinner.setAdapter(adapter); + videoPresetSpinner.setSelection(AppPreferences.getReceiverVideoPreset(this).ordinal()); + videoPresetSpinner.setOnItemSelectedListener(simpleSelection(() -> updateIntensityEnabled())); + } + if (audioPresetSpinner != null) { + String[] labels = { + getString(R.string.dev_av_audio_default), + getString(R.string.dev_av_audio_bass_boost), + getString(R.string.dev_av_audio_immersive), + getString(R.string.dev_av_audio_dolby_51), + getString(R.string.dev_av_audio_dolby_71) + }; + ArrayAdapter adapter = new ArrayAdapter<>(this, + android.R.layout.simple_spinner_item, labels); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + audioPresetSpinner.setAdapter(adapter); + audioPresetSpinner.setSelection(AppPreferences.getReceiverAudioPreset(this).ordinal()); + audioPresetSpinner.setOnItemSelectedListener(simpleSelection(() -> updateIntensityEnabled())); + } + if (intensitySeek != null) { + intensitySeek.setProgress(AppPreferences.getReceiverAvIntensity(this)); + intensitySeek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + updateIntensityLabel(progress); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) {} + + @Override + public void onStopTrackingTouch(SeekBar seekBar) {} + }); + } + updateIntensityEnabled(); + updateIntensityLabel(intensitySeek != null ? intensitySeek.getProgress() : 0); + } + + private void saveAvPresets() { + if (videoPresetSpinner != null) { + AppPreferences.setReceiverVideoPreset(this, + ReceiverVideoPreset.values()[videoPresetSpinner.getSelectedItemPosition()]); + } + if (audioPresetSpinner != null) { + AppPreferences.setReceiverAudioPreset(this, + ReceiverAudioPreset.values()[audioPresetSpinner.getSelectedItemPosition()]); + } + if (intensitySeek != null) { + AppPreferences.setReceiverAvIntensity(this, intensitySeek.getProgress()); + } + ReceiverAvRuntime.reload(this); + } + + private void updateIntensityEnabled() { + boolean audioOn = audioPresetSpinner != null + && ReceiverAudioPreset.values()[audioPresetSpinner.getSelectedItemPosition()] + .supportsIntensity(); + boolean videoOn = videoPresetSpinner != null + && ReceiverVideoPreset.values()[videoPresetSpinner.getSelectedItemPosition()] + .supportsIntensity(); + boolean on = audioOn || videoOn; + if (intensitySeek != null) { + intensitySeek.setEnabled(on); + } + TextView label = findViewById(R.id.label_dev_av_intensity); + if (label != null) { + label.setEnabled(on); + } + } + + private void updateIntensityLabel(int progress) { + if (intensityValue != null) { + intensityValue.setText(getString(R.string.dev_av_intensity_value, progress)); + } + } + + private android.widget.AdapterView.OnItemSelectedListener simpleSelection(Runnable after) { + return new android.widget.AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(android.widget.AdapterView parent, android.view.View view, + int position, long id) { + after.run(); + } + + @Override + public void onNothingSelected(android.widget.AdapterView parent) {} + }; + } + + private void refreshOtaUi(TextView installedVersion, TextInputEditText manifestUrl, CheckBox otaOnLaunch) { + if (installedVersion != null) { + installedVersion.setText(getString(R.string.ota_installed_version, + OtaUpdateChecker.installedVersionName(this), + OtaUpdateChecker.installedVersionCode(this))); + } + if (manifestUrl != null) { + String url = AppPreferences.getOtaChannelUrl(this); + if (url.isEmpty() && BuildConfig.OTA_CHANNEL_URL_DEFAULT != null) { + url = BuildConfig.OTA_CHANNEL_URL_DEFAULT.trim(); + } + if (url.isEmpty() && BuildConfig.OTA_MANIFEST_URL_DEFAULT != null) { + url = BuildConfig.OTA_MANIFEST_URL_DEFAULT.trim(); + } + manifestUrl.setText(url); + } + if (otaOnLaunch != null) { + otaOnLaunch.setOnCheckedChangeListener(null); + otaOnLaunch.setChecked(AppPreferences.isOtaCheckOnLaunch(this)); + otaOnLaunch.setOnCheckedChangeListener((buttonView, isChecked) -> + AppPreferences.setOtaCheckOnLaunch(this, isChecked)); + } + } + + private void refreshFromPreferences(CheckBox debugOverlay, CheckBox codecScores, CheckBox sessionStats, + CheckBox streamDump, CheckBox adaptiveDisplay, CheckBox backendNtpSync) { + bindDeveloperCheckbox(debugOverlay, AppPreferences.isShowReceiverDebugOverlay(this), + AppPreferences::setShowReceiverDebugOverlay); + bindDeveloperCheckbox(codecScores, AppPreferences.isShowCodecPriorityScores(this), + AppPreferences::setShowCodecPriorityScores); + bindDeveloperCheckbox(sessionStats, AppPreferences.isGrabSessionStats(this), + AppPreferences::setGrabSessionStats); + bindDeveloperCheckbox(streamDump, AppPreferences.isDevStreamDumpEnabled(this), + AppPreferences::setDevStreamDumpEnabled); + bindDeveloperCheckbox(adaptiveDisplay, AppPreferences.isDevReceiverAdaptiveDisplay(this), + AppPreferences::setDevReceiverAdaptiveDisplay); + bindDeveloperCheckbox(backendNtpSync, AppPreferences.isDevBackendNtpSyncEnabled(this), + AppPreferences::setDevBackendNtpSyncEnabled); + } + + private interface BoolPrefWriter { + void write(Context context, boolean value); + } + + private void bindDeveloperTabs() { + TabLayout tabs = findViewById(R.id.dev_settings_tabs); + if (tabs == null) { + return; + } + tabs.addTab(tabs.newTab().setText(R.string.dev_tab_settings)); + tabs.addTab(tabs.newTab().setText(R.string.dev_tab_diagnostics)); + tabs.addTab(tabs.newTab().setText(R.string.dev_tab_network_self_test)); + tabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + int pos = tab.getPosition(); + boolean diagnostics = pos == 1; + boolean selfTest = pos == 2; + settingsPanel.setVisibility((diagnostics || selfTest) ? android.view.View.GONE : android.view.View.VISIBLE); + diagnosticsPanel.setVisibility(diagnostics ? android.view.View.VISIBLE : android.view.View.GONE); + networkSelfTestPanel.setVisibility(selfTest ? android.view.View.VISIBLE : android.view.View.GONE); + if (diagnostics) { + diagnosticsController.onDiagnosticsTabShown(); + } + if (selfTest) { + networkSelfTestController.onSelfTestTabShown(); + } + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) {} + + @Override + public void onTabReselected(TabLayout.Tab tab) { + if (tab.getPosition() == 1) { + diagnosticsController.onDiagnosticsTabShown(); + } else if (tab.getPosition() == 2) { + networkSelfTestController.onSelfTestTabShown(); + } + } + }); + } + + private void bindDeveloperCheckbox(CheckBox box, boolean checked, BoolPrefWriter writer) { + if (box == null) { + return; + } + box.setOnCheckedChangeListener(null); + box.setChecked(checked); + box.setOnCheckedChangeListener((buttonView, isChecked) -> writer.write(this, isChecked)); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/DeviceInfo.java b/app/src/main/java/com/foxx/androidcast/DeviceInfo.java new file mode 100644 index 0000000..c8c3706 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/DeviceInfo.java @@ -0,0 +1,139 @@ +package com.foxx.androidcast; + +/********************************************************************* + * DeviceInfo.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class DeviceInfo + * Contributors: + * - Anton Afanasyeu (2 commits, 135 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 b71e7b9724e505fccce802ab5ea188575fbbb3e33d978f19dcbc5a11e1b8dacb +**********************************************************************/ +import android.content.Context; +import android.content.SharedPreferences; +import android.media.MediaDrm; +import android.os.Build; +import android.provider.Settings; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Locale; +import java.util.UUID; + +/** + * Stable device identity for cast handshakes. Survives app reinstall when possible + * (Widevine ID + per-app ANDROID_ID hash). Cached in {@link SharedPreferences}. + */ +public final class DeviceInfo { + private static final String PREFS = "androidcast_device"; + private static final String KEY_UUID = "device_uuid"; + private static final UUID WIDEVINE_UUID = + UUID.fromString("edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"); + + private static volatile String cachedUuid; + + private DeviceInfo() {} + + /** Returns a stable UUID string for this device (app-singleton). */ + public static String getDeviceUuid(Context context) { + if (cachedUuid != null) { + return cachedUuid; + } + synchronized (DeviceInfo.class) { + if (cachedUuid != null) { + return cachedUuid; + } + Context app = context.getApplicationContext(); + SharedPreferences prefs = app.getSharedPreferences(PREFS, Context.MODE_PRIVATE); + String stored = prefs.getString(KEY_UUID, null); + if (stored != null && !stored.isEmpty()) { + cachedUuid = stored; + return cachedUuid; + } + String generated = generateStableUuid(app); + prefs.edit().putString(KEY_UUID, generated).apply(); + cachedUuid = generated; + return cachedUuid; + } + } + + /** Lower 32 bits of hashed UUID for {@code placeholder_id} in proto headers. */ + public static int getPlaceholderId(Context context) { + return (int) (hashUuid(getDeviceUuid(context)) & 0xFFFFFFFFL); + } + + private static String generateStableUuid(Context context) { + StringBuilder material = new StringBuilder(); + material.append("androidcast:"); + String androidId = Settings.Secure.getString( + context.getContentResolver(), Settings.Secure.ANDROID_ID); + if (androidId != null && !androidId.isEmpty()) { + material.append(androidId); + } + byte[] widevine = readWidevineId(); + if (widevine != null && widevine.length > 0) { + material.append(':'); + for (byte b : widevine) { + material.append(String.format(Locale.US, "%02x", b)); + } + } + material.append(':').append(Build.BOARD).append(':').append(Build.DEVICE); + return uuidFromSha256(material.toString()); + } + + private static byte[] readWidevineId() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) { + return null; + } + MediaDrm drm = null; + try { + drm = new MediaDrm(WIDEVINE_UUID); + return drm.getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID); + } catch (Exception ignored) { + return null; + } finally { + if (drm != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + drm.close(); + } else { + drm.release(); + } + } + } + } + + private static String uuidFromSha256(String material) { + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] digest = md.digest(material.getBytes(StandardCharsets.UTF_8)); + long msb = 0; + long lsb = 0; + for (int i = 0; i < 8; i++) { + msb = (msb << 8) | (digest[i] & 0xff); + } + for (int i = 8; i < 16; i++) { + lsb = (lsb << 8) | (digest[i] & 0xff); + } + return new UUID(msb, lsb).toString(); + } catch (NoSuchAlgorithmException e) { + return UUID.randomUUID().toString(); + } + } + + private static long hashUuid(String uuid) { + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] digest = md.digest(uuid.getBytes(StandardCharsets.UTF_8)); + long h = 0; + for (int i = 0; i < 8; i++) { + h = (h << 8) | (digest[i] & 0xff); + } + return h; + } catch (NoSuchAlgorithmException e) { + return uuid.hashCode(); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/DrawerHostActivity.java b/app/src/main/java/com/foxx/androidcast/DrawerHostActivity.java new file mode 100644 index 0000000..142bbc1 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/DrawerHostActivity.java @@ -0,0 +1,131 @@ +package com.foxx.androidcast; + +/********************************************************************* + * DrawerHostActivity.java + * Created at: Sun 17 May 2026 18:17:14 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * Contributors: + * - Anton Afanasyeu (3 commits, 127 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 e92beee804af837a428b8585f08940622843118e465cb20652c06d90785ef2d9 +**********************************************************************/ +import android.content.Context; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; + +import androidx.activity.OnBackPressedCallback; +import androidx.annotation.LayoutRes; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.view.GravityCompat; +import androidx.drawerlayout.widget.DrawerLayout; +import androidx.fragment.app.Fragment; + +/** + * Hosts main content and a start-edge settings drawer. + * TV / remote: tap or drag the left-edge handle, or press DPAD_LEFT, to open settings. + */ +public abstract class DrawerHostActivity extends AppCompatActivity { + private static final float HANDLE_DRAG_OPEN_PX = 48f; + + private DrawerLayout drawerLayout; + private View settingsHandle; + private float handleDragStartX; + + @Override + protected void attachBaseContext(Context newBase) { + super.attachBaseContext(CastLocaleHelper.attach(newBase)); + } + + protected void applyActivityTheme() { + CastThemeHelper.applyTheme(this); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + applyActivityTheme(); + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_drawer_host); + + drawerLayout = findViewById(R.id.drawer_layout); + android.view.ViewGroup contentRoot = findViewById(R.id.content_root); + getLayoutInflater().inflate(getContentLayoutId(), contentRoot, true); + + if (savedInstanceState == null) { + getSupportFragmentManager().beginTransaction() + .replace(R.id.settings_drawer_container, new CastSettingsFragment()) + .commit(); + } + + drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); + wireSettingsHandle(); + getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (drawerLayout.isDrawerOpen(GravityCompat.START)) { + drawerLayout.closeDrawer(GravityCompat.START); + } else { + setEnabled(false); + getOnBackPressedDispatcher().onBackPressed(); + } + } + }); + } + + private void wireSettingsHandle() { + settingsHandle = findViewById(R.id.settings_drawer_handle); + if (settingsHandle == null) { + return; + } + settingsHandle.setOnClickListener(v -> openSettingsDrawer()); + settingsHandle.setOnTouchListener((v, event) -> { + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + handleDragStartX = event.getRawX(); + return false; + case MotionEvent.ACTION_UP: + if (event.getRawX() - handleDragStartX >= HANDLE_DRAG_OPEN_PX) { + openSettingsDrawer(); + return true; + } + return false; + default: + return false; + } + }); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_DOWN + && event.getKeyCode() == KeyEvent.KEYCODE_DPAD_LEFT + && drawerLayout != null + && !drawerLayout.isDrawerOpen(GravityCompat.START)) { + openSettingsDrawer(); + return true; + } + return super.dispatchKeyEvent(event); + } + + @Override + protected void onResume() { + super.onResume(); + CastActivityTracker.onResume(this); + } + + protected void openSettingsDrawer() { + if (drawerLayout != null) { + drawerLayout.openDrawer(GravityCompat.START); + } + } + + protected void closeSettingsDrawer() { + if (drawerLayout != null) { + drawerLayout.closeDrawer(GravityCompat.START); + } + } + + protected abstract @LayoutRes int getContentLayoutId(); +} diff --git a/app/src/main/java/com/foxx/androidcast/IntentExtras.java b/app/src/main/java/com/foxx/androidcast/IntentExtras.java new file mode 100644 index 0000000..736416c --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/IntentExtras.java @@ -0,0 +1,55 @@ +package com.foxx.androidcast; + +/********************************************************************* + * IntentExtras.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class IntentExtras + * Contributors: + * - Anton Afanasyeu (3 commits, 51 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 19f9b1ab3e5b3ce7eb7623e31f52e5a116a4cde8c0a58da6e3c320e807bb6b8a +**********************************************************************/ +import android.content.Intent; +import android.os.Build; + +import com.foxx.androidcast.sender.CastReceiverTarget; + +import java.util.ArrayList; + +/** API 33+ safe extras helpers. */ +public final class IntentExtras { + private IntentExtras() {} + + public static Intent getParcelableIntent(Intent intent, String key) { + if (intent == null) { + return null; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + return intent.getParcelableExtra(key, Intent.class); + } + return intent.getParcelableExtra(key); + } + + public static CastSettings getCastSettings(Intent intent) { + if (intent == null) { + return null; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + return intent.getSerializableExtra(CastSettings.EXTRA, CastSettings.class); + } + return (CastSettings) intent.getSerializableExtra(CastSettings.EXTRA); + } + + @SuppressWarnings("unchecked") + public static ArrayList getReceiverTargets(Intent intent, String key) { + if (intent == null) { + return null; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + return intent.getSerializableExtra(key, ArrayList.class); + } + return (ArrayList) intent.getSerializableExtra(key); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/LicensesActivity.java b/app/src/main/java/com/foxx/androidcast/LicensesActivity.java new file mode 100644 index 0000000..bf074bc --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/LicensesActivity.java @@ -0,0 +1,54 @@ +package com.foxx.androidcast; + +/********************************************************************* + * LicensesActivity.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class LicensesActivity + * Contributors: + * - Anton Afanasyeu (2 commits, 50 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 72a98b360bec090e011d284c520b22c97f8868107bb7fdda60be226835f2d3b0 +**********************************************************************/ +import android.os.Bundle; +import android.widget.Button; +import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.text.HtmlCompat; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; + +/** Full-screen third-party and app license notice. */ +public class LicensesActivity extends AppCompatActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_licenses); + setTitle(R.string.licenses_title); + + TextView body = findViewById(R.id.text_licenses); + body.setText(HtmlCompat.fromHtml(loadLicensesHtml(), HtmlCompat.FROM_HTML_MODE_LEGACY)); + + findViewById(R.id.btn_licenses_accept).setOnClickListener(v -> finish()); + } + + private String loadLicensesHtml() { + try (InputStream in = getAssets().open("licenses/combined.html"); + BufferedReader reader = new BufferedReader( + new InputStreamReader(in, StandardCharsets.UTF_8))) { + StringBuilder sb = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + sb.append(line).append('\n'); + } + return sb.toString(); + } catch (Exception e) { + return "

" + getString(R.string.licenses_load_error) + "

"; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/MainActivity.java b/app/src/main/java/com/foxx/androidcast/MainActivity.java new file mode 100644 index 0000000..db618c8 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/MainActivity.java @@ -0,0 +1,125 @@ +package com.foxx.androidcast; + +/********************************************************************* + * MainActivity.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class MainActivity + * Contributors: + * - Anton Afanasyeu (7 commits, 97 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 c8972fea6ecc9a1dafb049d3acb1b2a3214e6d407444d6d48f216bb16a588d70 +**********************************************************************/ +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Build; +import android.os.Bundle; + +import com.foxx.androidcast.dev.DevInstallWakeHelper; +import com.foxx.androidcast.ota.OtaManifest; +import com.foxx.androidcast.ota.OtaUpdateCoordinator; +import com.foxx.androidcast.ota.OtaUpdateService; +import com.foxx.androidcast.receiver.ReceiverPlaybackActivity; +import com.foxx.androidcast.sender.SenderActivity; +import com.foxx.androidcast.stats.SessionStatsStore; + +public class MainActivity extends DrawerHostActivity { + private final BroadcastReceiver otaUpdateReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (OtaUpdateService.ACTION_UPDATE_AVAILABLE.equals(intent.getAction())) { + String json = intent.getStringExtra(OtaUpdateService.EXTRA_MANIFEST_JSON); + String sourceUrl = intent.getStringExtra(OtaUpdateService.EXTRA_SOURCE_URL); + boolean trustedSource = intent.getBooleanExtra( + OtaUpdateService.EXTRA_TRUSTED_SOURCE, + false); + OtaManifest manifest = OtaManifest.fromJsonString(json); + if (manifest != null && !isFinishing()) { + OtaUpdateCoordinator.presentUpdateDialog( + MainActivity.this, + manifest, + sourceUrl != null ? sourceUrl : "", + trustedSource); + } + } + } + }; + + @Override + protected int getContentLayoutId() { + return R.layout.activity_main; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + if (DevInstallWakeHelper.shouldShowAfterDeploy(getIntent())) { + DevInstallWakeHelper.prepareActivityShowOnDeploy(this); + } + super.onCreate(savedInstanceState); + if (AppPreferences.isGrabSessionStats(this)) { + SessionStatsStore.pruneOnAppStart(this); + } + com.foxx.androidcast.network.CastTransportFactory.init(this); + PermissionHelper.request(this); + + findViewById(R.id.btn_send).setOnClickListener(v -> + startActivity(new Intent(this, SenderActivity.class))); + findViewById(R.id.btn_receive).setOnClickListener(v -> { + Intent i = new Intent(this, ReceiverPlaybackActivity.class); + i.putExtra(ReceiverPlaybackActivity.EXTRA_AUTO_START_LISTENING, true); + startActivity(i); + }); + } + + @Override + protected void onStart() { + super.onStart(); + IntentFilter filter = new IntentFilter(OtaUpdateService.ACTION_UPDATE_AVAILABLE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + registerReceiver(otaUpdateReceiver, filter, Context.RECEIVER_NOT_EXPORTED); + } else { + registerReceiver(otaUpdateReceiver, filter); + } + } + + @Override + protected void onStop() { + unregisterReceiver(otaUpdateReceiver); + super.onStop(); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + setIntent(intent); + if (DevInstallWakeHelper.shouldShowAfterDeploy(intent)) { + DevInstallWakeHelper.prepareActivityShowOnDeploy(this); + } + } + + @Override + protected void onResume() { + super.onResume(); + if (DevInstallWakeHelper.shouldShowAfterDeploy(getIntent())) { + DevInstallWakeHelper.prepareActivityShowOnDeploy(this); + } + PermissionHelper.remindIfMissing(this, false); + OtaUpdateCoordinator.requestCheckOnLaunch(this); + } + + @Override + protected void onDestroy() { + if (isFinishing() && DevInstallWakeHelper.shouldShowAfterDeploy(getIntent())) { + DevInstallWakeHelper.releaseWakeLock(); + } + super.onDestroy(); + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/NetworkConditions.java b/app/src/main/java/com/foxx/androidcast/NetworkConditions.java new file mode 100644 index 0000000..2d5b1fd --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/NetworkConditions.java @@ -0,0 +1,58 @@ +package com.foxx.androidcast; + +import android.os.Parcel; +import android.os.Parcelable; + +/** Parcelable network self-test snapshot shared over AIDL. */ +public final class NetworkConditions implements Parcelable { + public static final Creator CREATOR = new Creator() { + @Override + public NetworkConditions createFromParcel(Parcel in) { + return new NetworkConditions(in); + } + + @Override + public NetworkConditions[] newArray(int size) { + return new NetworkConditions[size]; + } + }; + + public long collectedAtMs; + public String fingerprint; + public String reportText; + public boolean refreshing; + + public NetworkConditions() { + this.collectedAtMs = 0L; + this.fingerprint = ""; + this.reportText = ""; + this.refreshing = false; + } + + public NetworkConditions(long collectedAtMs, String fingerprint, String reportText, boolean refreshing) { + this.collectedAtMs = collectedAtMs; + this.fingerprint = fingerprint != null ? fingerprint : ""; + this.reportText = reportText != null ? reportText : ""; + this.refreshing = refreshing; + } + + private NetworkConditions(Parcel in) { + collectedAtMs = in.readLong(); + fingerprint = in.readString(); + reportText = in.readString(); + refreshing = in.readInt() != 0; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeLong(collectedAtMs); + dest.writeString(fingerprint); + dest.writeString(reportText); + dest.writeInt(refreshing ? 1 : 0); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/PermissionHelper.java b/app/src/main/java/com/foxx/androidcast/PermissionHelper.java new file mode 100644 index 0000000..47a4e7c --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/PermissionHelper.java @@ -0,0 +1,175 @@ +package com.foxx.androidcast; + +/********************************************************************* + * PermissionHelper.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class PermissionHelper + * Contributors: + * - Anton Afanasyeu (5 commits, 171 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 3d735c673c6958e683b2771b55d77a646a66f63c121c5c7542293fb707bede5f +**********************************************************************/ +import android.Manifest; +import android.app.Activity; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; +import android.provider.Settings; + +import androidx.appcompat.app.AlertDialog; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import java.util.ArrayList; +import java.util.List; + +/** Requests and explains runtime permissions for LAN cast. */ +public final class PermissionHelper { + public static final int REQUEST_CODE = 1001; + public static final int REQUEST_RECEIVER_PLAYBACK = 1002; + + public static final class PermissionItem { + public final String permission; + public final String label; + public final boolean required; + + PermissionItem(String permission, String label, boolean required) { + this.permission = permission; + this.label = label; + this.required = required; + } + } + + private PermissionHelper() {} + + public static boolean hasAll(Activity activity) { + return missing(activity, false).isEmpty(); + } + + public static boolean hasAllForAudio(Activity activity) { + return missing(activity, true).isEmpty(); + } + + public static void request(Activity activity) { + request(activity, false); + } + + public static void requestForCast(Activity activity, boolean audioEnabled) { + request(activity, audioEnabled); + } + + /** Shows a dialog listing missing permissions; offers request or app settings. */ + public static void remindIfMissing(Activity activity, boolean includeAudio) { + List missing = describeMissing(activity, includeAudio); + if (missing.isEmpty()) { + return; + } + StringBuilder body = new StringBuilder(); + for (PermissionItem item : missing) { + body.append("• ").append(item.label); + body.append(item.required ? " (required)\n" : " (recommended)\n"); + } + new AlertDialog.Builder(activity) + .setTitle(R.string.permissions_missing_title) + .setMessage(body.toString().trim()) + .setPositiveButton(R.string.permissions_grant, (d, w) -> + ActivityCompat.requestPermissions(activity, + permissionsOnly(missing), REQUEST_CODE)) + .setNeutralButton(R.string.permissions_app_settings, (d, w) -> openAppSettings(activity)) + .setNegativeButton(android.R.string.cancel, null) + .show(); + } + + private static void request(Activity activity, boolean includeAudio) { + List missing = missing(activity, includeAudio); + if (!missing.isEmpty()) { + ActivityCompat.requestPermissions( + activity, missing.toArray(new String[0]), REQUEST_CODE); + } + } + + private static List missing(Activity activity, boolean includeAudio) { + List items = describeMissing(activity, includeAudio); + List perms = new ArrayList<>(); + for (PermissionItem item : items) { + perms.add(item.permission); + } + return perms; + } + + private static List describeMissing(Activity activity, boolean includeAudio) { + List needed = new ArrayList<>(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (ContextCompat.checkSelfPermission(activity, Manifest.permission.POST_NOTIFICATIONS) + != PackageManager.PERMISSION_GRANTED) { + needed.add(new PermissionItem(Manifest.permission.POST_NOTIFICATIONS, + "Notifications (cast status)", true)); + } + } + if (includeAudio && PlatformCastSupport.isAudioCaptureSupported()) { + if (ContextCompat.checkSelfPermission(activity, Manifest.permission.RECORD_AUDIO) + != PackageManager.PERMISSION_GRANTED) { + needed.add(new PermissionItem(Manifest.permission.RECORD_AUDIO, + "Microphone (fallback when no app audio)", false)); + } + } + return needed; + } + + private static String[] permissionsOnly(List items) { + String[] arr = new String[items.size()]; + for (int i = 0; i < items.size(); i++) { + arr[i] = items.get(i).permission; + } + return arr; + } + + public static void openAppSettings(Activity activity) { + Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.setData(Uri.fromParts("package", activity.getPackageName(), null)); + activity.startActivity(intent); + } + + /** Permissions needed before receiver cast / PiP (notifications for foreground service). */ + public static boolean hasReceiverPlaybackReady(android.content.Context context) { + return missingForReceiverPlayback(context).isEmpty(); + } + + public static void remindForReceiverPlayback(Activity activity) { + List missing = missingForReceiverPlayback(activity); + if (missing.isEmpty()) { + return; + } + StringBuilder body = new StringBuilder(activity.getString(R.string.pip_permissions_hint)); + body.append("\n\n"); + for (PermissionItem item : missing) { + body.append("• ").append(item.label).append('\n'); + } + new AlertDialog.Builder(activity) + .setTitle(R.string.permissions_missing_title) + .setMessage(body.toString().trim()) + .setPositiveButton(R.string.permissions_grant, (d, w) -> + ActivityCompat.requestPermissions(activity, + permissionsOnly(missing), REQUEST_RECEIVER_PLAYBACK)) + .setNeutralButton(R.string.permissions_app_settings, (d, w) -> openAppSettings(activity)) + .setNegativeButton(android.R.string.cancel, null) + .show(); + } + + private static List missingForReceiverPlayback(android.content.Context context) { + List needed = new ArrayList<>(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) + != PackageManager.PERMISSION_GRANTED) { + String label = context instanceof Activity + ? ((Activity) context).getString(R.string.permission_notifications_cast) + : "Notifications (cast status)"; + needed.add(new PermissionItem(Manifest.permission.POST_NOTIFICATIONS, label, true)); + } + } + return needed; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/PictureInPictureHelper.java b/app/src/main/java/com/foxx/androidcast/PictureInPictureHelper.java new file mode 100644 index 0000000..561be71 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/PictureInPictureHelper.java @@ -0,0 +1,113 @@ +package com.foxx.androidcast; + +/********************************************************************* + * PictureInPictureHelper.java + * Created at: Mon 18 May 2026 17:35:14 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class PictureInPictureHelper + * Contributors: + * - Anton Afanasyeu (3 commits, 109 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 d3227a4c9a0c426a1b82d17b36a16927cf4534dbd7e10553e6804b583ee8e161 +**********************************************************************/ +import android.app.Activity; +import android.app.AppOpsManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; +import android.util.Rational; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; + +import android.app.PictureInPictureParams; + +/** + * Picture-in-picture for receiver playback (API 26+). No runtime permission; user can disable PiP per app. + */ +public final class PictureInPictureHelper { + private PictureInPictureHelper() {} + + public static boolean isSupported() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O; + } + + /** Whether the app is allowed to enter PiP (system / user app-ops). */ + public static boolean isAllowedForApp(@NonNull Context context) { + if (!isSupported()) { + return false; + } + PackageManager pm = context.getPackageManager(); + if (!pm.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)) { + return false; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); + if (appOps == null) { + return true; + } + int mode = appOps.unsafeCheckOpNoThrow(AppOpsManager.OPSTR_PICTURE_IN_PICTURE, + android.os.Process.myUid(), context.getPackageName()); + return mode == AppOpsManager.MODE_ALLOWED; + } + return true; + } + + public static PictureInPictureParams buildParams(Context context, int videoWidth, int videoHeight) { + PictureInPictureParams.Builder builder = new PictureInPictureParams.Builder() + .setAspectRatio(aspectRatio(videoWidth, videoHeight)); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + boolean allowed = isAllowedForApp(context); + builder.setAutoEnterEnabled(allowed); + builder.setSeamlessResizeEnabled(allowed); + } + return builder.build(); + } + + public static void applyParams(@NonNull Activity activity, int videoWidth, int videoHeight) { + if (!isSupported()) { + return; + } + activity.setPictureInPictureParams(buildParams(activity, videoWidth, videoHeight)); + } + + public static boolean enter(@NonNull Activity activity, int videoWidth, int videoHeight) { + if (!isSupported() || !isAllowedForApp(activity)) { + return false; + } + try { + return activity.enterPictureInPictureMode(buildParams(activity, videoWidth, videoHeight)); + } catch (IllegalStateException e) { + return false; + } + } + + public static void showEnableInSettingsDialog(@NonNull Activity activity) { + new AlertDialog.Builder(activity) + .setTitle(R.string.pip_disabled_title) + .setMessage(R.string.pip_disabled_message) + .setPositiveButton(R.string.permissions_app_settings, (d, w) -> openPipSettings(activity)) + .setNegativeButton(android.R.string.cancel, null) + .show(); + } + + public static void openPipSettings(@NonNull Activity activity) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Intent intent = new Intent("android.settings.APP_PICTURE_IN_PICTURE_SETTINGS", + Uri.fromParts("package", activity.getPackageName(), null)); + activity.startActivity(intent); + } else { + PermissionHelper.openAppSettings(activity); + } + } + + private static Rational aspectRatio(int width, int height) { + if (width > 0 && height > 0) { + return new Rational(width, height); + } + return new Rational(16, 9); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/PinAuth.java b/app/src/main/java/com/foxx/androidcast/PinAuth.java new file mode 100644 index 0000000..1a172e8 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/PinAuth.java @@ -0,0 +1,49 @@ +package com.foxx.androidcast; + +/********************************************************************* + * PinAuth.java + * Created at: Sun 17 May 2026 18:17:14 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class PinAuth + * Contributors: + * - Anton Afanasyeu (2 commits, 45 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 3641153433384df49669b313d653fbb49335b7c7b8d002c671bcf994215e5896 +**********************************************************************/ +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** PIN hashing for discovery and handshake (never send raw PIN on LAN). */ +public final class PinAuth { + private PinAuth() {} + + public static String hash(String pin) { + if (pin == null) { + pin = ""; + } + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] digest = md.digest(pin.getBytes(StandardCharsets.UTF_8)); + StringBuilder sb = new StringBuilder(digest.length * 2); + for (byte b : digest) { + sb.append(String.format("%02x", b & 0xff)); + } + return sb.toString(); + } catch (NoSuchAlgorithmException e) { + return Integer.toHexString(pin.hashCode()); + } + } + + public static boolean matches(String pin, String expectedHash) { + if (expectedHash == null || expectedHash.isEmpty()) { + return true; + } + return hash(pin).equals(expectedHash); + } + + public static boolean isProtected(String pin) { + return pin != null && !pin.isEmpty(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/PlatformCastSupport.java b/app/src/main/java/com/foxx/androidcast/PlatformCastSupport.java new file mode 100644 index 0000000..1fa48c7 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/PlatformCastSupport.java @@ -0,0 +1,107 @@ +package com.foxx.androidcast; + +/********************************************************************* + * PlatformCastSupport.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class PlatformCastSupport + * Contributors: + * - Anton Afanasyeu (5 commits, 103 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 437f440f8e8e0b7da97a9af34bdb2977ccf1493541ca31bd33634cd45db53273 +**********************************************************************/ +import android.os.Build; +import android.widget.CheckBox; + +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; + +/** Platform capabilities for cast (audio requires Android 10 / API 29+). */ +public final class PlatformCastSupport { + private PlatformCastSupport() {} + + public static boolean isAudioCaptureSupported() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q; + } + + /** Per-app / window picker for MediaProjection (Android 14+). */ + public static boolean isCaptureUserChoiceSupported() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE; + } + + public static CastSettings.CaptureMode defaultCaptureMode() { + return isCaptureUserChoiceSupported() + ? CastSettings.CaptureMode.USER_CHOICE + : CastSettings.CaptureMode.FULL_SCREEN; + } + + /** + * Camera2 as a video source is separate from MediaProjection (app picker cannot select camera only). + */ + public static boolean isCameraCaptureModeSupported() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q; + } + + public static boolean hasFrontCamera(android.content.Context context) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + return false; + } + try { + android.hardware.camera2.CameraManager mgr = + context.getSystemService(android.hardware.camera2.CameraManager.class); + if (mgr == null) { + return false; + } + for (String id : mgr.getCameraIdList()) { + android.hardware.camera2.CameraCharacteristics chars = mgr.getCameraCharacteristics(id); + Integer facing = chars.get(android.hardware.camera2.CameraCharacteristics.LENS_FACING); + if (facing != null + && facing == android.hardware.camera2.CameraCharacteristics.LENS_FACING_FRONT) { + return true; + } + } + } catch (Exception ignored) { + } + return false; + } + + /** Applies default audio flag: on for Android 10+, off otherwise. */ + public static void applyDefaultAudioSetting(CastSettings settings) { + settings.setAudioEnabled(isAudioCaptureSupported()); + } + + /** Disables audio UI and forces video-only when capture is unavailable. */ + public static void bindAudioCheckbox(AppCompatActivity activity, CheckBox audio, CastSettings settings) { + applyDefaultAudioSetting(settings); + if (isAudioCaptureSupported()) { + audio.setEnabled(true); + audio.setText(R.string.label_audio); + audio.setChecked(settings.isAudioEnabled()); + audio.setOnCheckedChangeListener((btn, checked) -> settings.setAudioEnabled(checked)); + } else { + settings.setAudioEnabled(false); + audio.setEnabled(false); + audio.setChecked(false); + audio.setText(R.string.label_audio_unavailable); + } + } + + /** + * If audio is unavailable, warns the user and runs {@code onContinue} only when they accept video-only. + * On Android 10+, runs {@code onContinue} immediately. + */ + public static void runWithAudioPolicy(AppCompatActivity activity, CastSettings settings, Runnable onContinue) { + if (isAudioCaptureSupported()) { + onContinue.run(); + return; + } + settings.setAudioEnabled(false); + new AlertDialog.Builder(activity) + .setTitle(R.string.audio_unavailable_title) + .setMessage(R.string.audio_unavailable_message) + .setPositiveButton(R.string.continue_video_only, (d, w) -> onContinue.run()) + .setNegativeButton(android.R.string.cancel, null) + .show(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/SettingsUi.java b/app/src/main/java/com/foxx/androidcast/SettingsUi.java new file mode 100644 index 0000000..4d22496 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/SettingsUi.java @@ -0,0 +1,293 @@ +package com.foxx.androidcast; + +/********************************************************************* + * SettingsUi.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SettingsUi + * Contributors: + * - Anton Afanasyeu (7 commits, 289 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 4a7ecb185f2d81d364cd5b3601e95e04607c1d2a1f5a7153e32928d1fba6c731 +**********************************************************************/ +import android.os.Build; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.CheckBox; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; + +import com.foxx.androidcast.sender.CodecCatalog; + +import java.util.ArrayList; +import java.util.List; +/** Binds cast option spinners/checkbox to {@link CastSettings}. */ +public final class SettingsUi { + private SettingsUi() {} + + public static void bindSender(AppCompatActivity activity, CastSettings settings) { + bindCommon(activity, settings); + bindCaptureModeSender(activity, settings); + PlatformCastSupport.bindAudioCheckbox(activity, activity.findViewById(R.id.checkbox_audio), settings); + } + + public static void bindReceiver(AppCompatActivity activity, CastSettings settings) { + bindCommon(activity, settings); + View captureRow = activity.findViewById(R.id.layout_capture_mode); + if (captureRow != null) { + captureRow.setVisibility(View.GONE); + } + PlatformCastSupport.bindAudioCheckbox(activity, activity.findViewById(R.id.checkbox_audio), settings); + } + + /** @deprecated use {@link #bindSender} or {@link #bindReceiver} */ + @Deprecated + public static void bind(AppCompatActivity activity, CastSettings settings) { + bindSender(activity, settings); + } + + private static void bindCommon(AppCompatActivity activity, CastSettings settings) { + PlatformCastSupport.applyDefaultAudioSetting(settings); + + Spinner transport = activity.findViewById(R.id.spinner_transport); + Spinner videoCodec = activity.findViewById(R.id.spinner_video_codec); + Spinner adjustment = activity.findViewById(R.id.spinner_adjustment); + Spinner bitrateMode = activity.findViewById(R.id.spinner_bitrate_mode); + Spinner quality = activity.findViewById(R.id.spinner_quality); + Spinner networkAdoption = activity.findViewById(R.id.spinner_network_adoption); + Spinner resolution = activity.findViewById(R.id.spinner_resolution); + + bindSpinner(activity, transport, new String[]{ + activity.getString(R.string.transport_udp), + activity.getString(R.string.transport_tcp), + activity.getString(R.string.transport_quic), + activity.getString(R.string.transport_webrtc) + }, position -> { + switch (position) { + case 1: + settings.setTransport(CastConfig.TRANSPORT_TCP); + break; + case 2: + settings.setTransport(CastConfig.TRANSPORT_QUIC); + break; + case 3: + settings.setTransport(CastConfig.TRANSPORT_WEBRTC); + break; + case 0: + default: + settings.setTransport(CastConfig.TRANSPORT_UDP); + break; + } + }); + int transportIndex = 0; + if (CastConfig.TRANSPORT_TCP.equals(settings.getTransport())) { + transportIndex = 1; + } else if (CastConfig.TRANSPORT_QUIC.equals(settings.getTransport())) { + transportIndex = 2; + } else if (CastConfig.TRANSPORT_WEBRTC.equals(settings.getTransport())) { + transportIndex = 3; + } + transport.setSelection(transportIndex); + + List codecs = CodecCatalog.supportedChoices(); + List codecLabels = new ArrayList<>(); + for (CastSettings.VideoCodec c : codecs) { + codecLabels.add(labelVideoCodec(activity, c)); + } + bindSpinner(activity, videoCodec, codecLabels.toArray(new String[0]), position -> { + if (position >= 0 && position < codecs.size()) { + settings.setVideoCodec(codecs.get(position)); + } + }); + selectCodecSpinner(videoCodec, codecs, settings.getVideoCodec()); + + bindEnumSpinner(activity, adjustment, CastSettings.AdjustmentPreset.values(), + SettingsUi::labelAdjustment, settings.getAdjustmentPreset().ordinal(), + p -> settings.setAdjustmentPreset(CastSettings.AdjustmentPreset.values()[p])); + + bindEnumSpinner(activity, bitrateMode, CastSettings.BitrateMode.values(), + SettingsUi::labelBitrateMode, settings.getBitrateMode().ordinal(), + p -> settings.setBitrateMode(CastSettings.BitrateMode.values()[p])); + + bindSpinner(activity, quality, new String[]{ + activity.getString(R.string.quality_low), + activity.getString(R.string.quality_medium), + activity.getString(R.string.quality_high) + }, position -> settings.setQuality(CastSettings.Quality.values()[position])); + quality.setSelection(CastSettings.Quality.MEDIUM.ordinal()); + + bindEnumSpinner(activity, networkAdoption, CastSettings.NetworkAdoption.values(), + SettingsUi::labelNetworkAdoption, settings.getNetworkAdoption().ordinal(), + p -> settings.setNetworkAdoption(CastSettings.NetworkAdoption.values()[p])); + + String[] resolutions = { + activity.getString(R.string.resolution_full), + activity.getString(R.string.resolution_75), + activity.getString(R.string.resolution_half), + activity.getString(R.string.resolution_720p), + activity.getString(R.string.resolution_fixed_1080p), + activity.getString(R.string.resolution_fixed_720p), + activity.getString(R.string.resolution_adaptive) + }; + bindSpinner(activity, resolution, resolutions, + position -> settings.setResolution(CastSettings.Resolution.values()[position])); + resolution.setSelection(CastSettings.Resolution.HD_720P.ordinal()); + } + + private static void bindCaptureModeSender(AppCompatActivity activity, CastSettings settings) { + Spinner captureMode = activity.findViewById(R.id.spinner_capture_mode); + TextView label = activity.findViewById(R.id.text_capture_mode_label); + if (captureMode == null) { + return; + } + java.util.List modes = new java.util.ArrayList<>(); + java.util.List modeValues = new java.util.ArrayList<>(); + modes.add(activity.getString(R.string.capture_full_screen)); + modeValues.add(CastSettings.CaptureMode.FULL_SCREEN); + if (PlatformCastSupport.isCaptureUserChoiceSupported()) { + modes.add(activity.getString(R.string.capture_user_choice)); + modeValues.add(CastSettings.CaptureMode.USER_CHOICE); + } else { + modes.add(activity.getString(R.string.capture_user_choice_unavailable, Build.VERSION.SDK_INT)); + modeValues.add(CastSettings.CaptureMode.FULL_SCREEN); + } + modes.add(activity.getString(R.string.capture_calibration_test)); + modeValues.add(CastSettings.CaptureMode.CALIBRATION_TEST); + if (PlatformCastSupport.isCameraCaptureModeSupported()) { + modes.add(activity.getString(R.string.capture_camera)); + modeValues.add(CastSettings.CaptureMode.CAMERA); + } else { + modes.add(activity.getString(R.string.capture_camera_unavailable)); + modeValues.add(CastSettings.CaptureMode.FULL_SCREEN); + } + bindSpinner(activity, captureMode, modes.toArray(new String[0]), position -> { + if (position >= 0 && position < modeValues.size()) { + settings.setCaptureMode(modeValues.get(position)); + } + }); + int sel = 0; + for (int i = 0; i < modeValues.size(); i++) { + if (modeValues.get(i) == settings.getCaptureMode()) { + sel = i; + break; + } + } + captureMode.setSelection(sel); + captureMode.setEnabled(true); + if (label != null) { + label.setText(R.string.label_capture_mode); + } + } + + private interface IntConsumer { + void accept(int position); + } + + private interface LabelProvider { + String label(AppCompatActivity activity, T value); + } + + private static > void bindEnumSpinner(AppCompatActivity activity, Spinner spinner, + T[] values, LabelProvider labels, int selection, IntConsumer onSelect) { + String[] items = new String[values.length]; + for (int i = 0; i < values.length; i++) { + items[i] = labels.label(activity, values[i]); + } + bindSpinner(activity, spinner, items, onSelect); + if (selection >= 0 && selection < values.length) { + spinner.setSelection(selection); + } + } + + private static void bindSpinner(AppCompatActivity activity, Spinner spinner, String[] items, + IntConsumer onSelect) { + spinner.setAdapter(new ArrayAdapter<>(activity, android.R.layout.simple_spinner_dropdown_item, items)); + spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + onSelect.accept(position); + } + + @Override + public void onNothingSelected(AdapterView parent) {} + }); + } + + private static void selectCodecSpinner(Spinner spinner, List codecs, + CastSettings.VideoCodec selected) { + for (int i = 0; i < codecs.size(); i++) { + if (codecs.get(i) == selected) { + spinner.setSelection(i); + return; + } + } + } + + private static String labelVideoCodec(AppCompatActivity activity, CastSettings.VideoCodec codec) { + switch (codec) { + case H264: + return activity.getString(R.string.codec_h264); + case H265: + return activity.getString(R.string.codec_h265); + case PASSTHROUGH: + return activity.getString(R.string.codec_passthrough); + case AUTO: + default: + return activity.getString(R.string.option_auto); + } + } + + private static String labelAdjustment(AppCompatActivity activity, CastSettings.AdjustmentPreset p) { + switch (p) { + case NONE: + return activity.getString(R.string.option_none); + case QUALITY: + return activity.getString(R.string.option_quality); + case SPEED: + return activity.getString(R.string.option_speed); + case PERFORMANCE: + return activity.getString(R.string.option_performance); + case AUTO: + default: + return activity.getString(R.string.option_auto); + } + } + + private static String labelBitrateMode(AppCompatActivity activity, CastSettings.BitrateMode m) { + switch (m) { + case NONE: + return activity.getString(R.string.option_none); + case QUALITY: + return activity.getString(R.string.option_quality); + case SPEED: + return activity.getString(R.string.option_speed); + case BALANCED: + return activity.getString(R.string.option_balanced); + case ROBUST_LESS: + return activity.getString(R.string.option_robust_less); + case ESTIMATED: + return activity.getString(R.string.option_estimated); + case AUTO: + default: + return activity.getString(R.string.option_auto); + } + } + + private static String labelNetworkAdoption(AppCompatActivity activity, CastSettings.NetworkAdoption n) { + switch (n) { + case QUALITY: + return activity.getString(R.string.option_quality); + case SPEED: + return activity.getString(R.string.option_speed); + case ESTIMATED: + return activity.getString(R.string.option_estimated); + case AUTO: + default: + return activity.getString(R.string.option_auto); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/TrayForegroundService.java b/app/src/main/java/com/foxx/androidcast/TrayForegroundService.java new file mode 100644 index 0000000..65a60c3 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/TrayForegroundService.java @@ -0,0 +1,60 @@ +package com.foxx.androidcast; + +import android.app.Service; +import android.content.Intent; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; + +import androidx.annotation.Nullable; + +/** + * Holds the persistent tray notification so it cannot be swiped away + * (non-FGS status notifications are dismissible on Android 13+). + */ +public class TrayForegroundService extends Service { + private static final long HEARTBEAT_MS = 90_000L; + + private final Handler handler = new Handler(Looper.getMainLooper()); + private final Runnable heartbeat = new Runnable() { + @Override + public void run() { + if (!CastTrayNotifier.shouldMaintainTray(TrayForegroundService.this)) { + stopSelf(); + return; + } + CastTrayNotifier.startForegroundTray(TrayForegroundService.this); + handler.postDelayed(this, HEARTBEAT_MS); + } + }; + + @Override + public void onCreate() { + super.onCreate(); + CastTrayNotifier.startForegroundTray(this); + handler.postDelayed(heartbeat, HEARTBEAT_MS); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (!CastTrayNotifier.shouldMaintainTray(this)) { + stopSelf(); + return START_NOT_STICKY; + } + CastTrayNotifier.startForegroundTray(this); + return START_STICKY; + } + + @Override + public void onDestroy() { + handler.removeCallbacks(heartbeat); + stopForeground(STOP_FOREGROUND_REMOVE); + super.onDestroy(); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/TrayNotificationReceiver.java b/app/src/main/java/com/foxx/androidcast/TrayNotificationReceiver.java new file mode 100644 index 0000000..7ecd6e9 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/TrayNotificationReceiver.java @@ -0,0 +1,30 @@ +package com.foxx.androidcast; + +/********************************************************************* + * TrayNotificationReceiver.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class TrayNotificationReceiver + * Contributors: + * - Anton Afanasyeu (2 commits, 26 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 937557e0d1e01790d07521d21197c6193d1e89f617d76d4edb29ff9dfe55aaf7 +**********************************************************************/ +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Build; + +/** + * Re-posts tray notification if the user dismisses it (backup for OEMs that allow swipe). + */ +public class TrayNotificationReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if (!AppPreferences.isShowTrayIcon(context)) { + return; + } + CastTrayNotifier.refresh(context); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/VersionInfo.java b/app/src/main/java/com/foxx/androidcast/VersionInfo.java new file mode 100644 index 0000000..02fa893 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/VersionInfo.java @@ -0,0 +1,44 @@ +package com.foxx.androidcast; + +/********************************************************************* + * VersionInfo.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class VersionInfo + * Contributors: + * - Anton Afanasyeu (3 commits, 40 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 ddac5c47ccd6ac323acf3b75c252a1482e6c0a260fcffaaad227c2e00ba42538 +**********************************************************************/ +/** + * Application and protocol version strings (CI may replace via script). + * App and proto versions are independent. + */ +public final class VersionInfo { + /** Human-readable app release (default until CI injects). */ + public static final String APP_VERSION_STRING = "00.00.00.0000"; + + /** Human-readable wire protocol / header version. */ + public static final String PROTO_VERSION_STRING = "00.01.00.0001"; + + /** Short git commit at build time ({@link com.foxx.androidcast.BuildConfig#GIT_COMMIT_SHORT}). */ + public static final String GIT_COMMIT_SHORT = BuildConfig.GIT_COMMIT_SHORT; + + /** Author of the commit at build time ({@link com.foxx.androidcast.BuildConfig#GIT_COMMIT_AUTHOR}). */ + public static final String GIT_COMMIT_AUTHOR = BuildConfig.GIT_COMMIT_AUTHOR; + + /** Human-readable build timestamp with timezone ({@link BuildConfig#BUILD_TIME_DISPLAY}). */ + public static final String BUILD_TIME_DISPLAY = BuildConfig.BUILD_TIME_DISPLAY; + + /** Build instant (epoch ms) ({@link BuildConfig#BUILD_TIME_EPOCH_MS}). */ + public static final long BUILD_TIME_EPOCH_MS = BuildConfig.BUILD_TIME_EPOCH_MS; + + /** Time zone id used for {@link #BUILD_TIME_DISPLAY} ({@link BuildConfig#BUILD_TIME_ZONE_ID}). */ + public static final String BUILD_TIME_ZONE_ID = BuildConfig.BUILD_TIME_ZONE_ID; + + public static final long APP_VERSION = VersionUtils.parseToInt(APP_VERSION_STRING); + public static final long PROTO_VERSION = VersionUtils.parseToInt(PROTO_VERSION_STRING); + + private VersionInfo() {} +} diff --git a/app/src/main/java/com/foxx/androidcast/VersionUtils.java b/app/src/main/java/com/foxx/androidcast/VersionUtils.java new file mode 100644 index 0000000..64052db --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/VersionUtils.java @@ -0,0 +1,75 @@ +package com.foxx.androidcast; + +/********************************************************************* + * VersionUtils.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class VersionUtils + * Contributors: + * - Anton Afanasyeu (2 commits, 71 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 fa3c418e4af4fb3f570ffff62380bae9f11c86b08ddc2d6cad397d4be2a9a435 +**********************************************************************/ +import java.util.Locale; + +/** + * Version string format {@code PP.MM.mmmm.BBBB} (e.g. {@code 00.01.0003.5621}) packed into uint64. + * Layout: placeholder(2) · major(2) · minor(4) · build(4) decimal digits. + */ +public final class VersionUtils { + private VersionUtils() {} + + public static String format(int placeholder, int major, int minor, int build) { + return String.format(Locale.US, "%02d.%02d.%04d.%04d", + clamp(placeholder, 0, 99), + clamp(major, 0, 99), + clamp(minor, 0, 9999), + clamp(build, 0, 9999)); + } + + public static long toInt(int placeholder, int major, int minor, int build) { + long ph = clamp(placeholder, 0, 99); + long maj = clamp(major, 0, 99); + long min = clamp(minor, 0, 9999); + long bld = clamp(build, 0, 9999); + return ph * 10_000_000_000L + maj * 100_000_000L + min * 10_000L + bld; + } + + public static long parseToInt(String version) { + if (version == null || version.isEmpty()) { + return 0L; + } + String[] parts = version.split("\\."); + int ph = parts.length > 0 ? parsePart(parts[0], 0) : 0; + int maj = parts.length > 1 ? parsePart(parts[1], 0) : 0; + int min = parts.length > 2 ? parsePart(parts[2], 0) : 0; + int bld = parts.length > 3 ? parsePart(parts[3], 0) : 0; + return toInt(ph, maj, min, bld); + } + + public static String formatFromInt(long packed) { + if (packed < 0) { + packed = 0; + } + int build = (int) (packed % 10_000L); + packed /= 10_000L; + int minor = (int) (packed % 10_000L); + packed /= 10_000L; + int major = (int) (packed % 100L); + int placeholder = (int) (packed / 100L); + return format(placeholder, major, minor, build); + } + + private static int parsePart(String s, int fallback) { + try { + return Integer.parseInt(s.trim()); + } catch (NumberFormatException e) { + return fallback; + } + } + + private static int clamp(int v, int min, int max) { + return Math.max(min, Math.min(max, v)); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/commercial/CommercialFeatures.java b/app/src/main/java/com/foxx/androidcast/commercial/CommercialFeatures.java new file mode 100644 index 0000000..40d63c8 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/commercial/CommercialFeatures.java @@ -0,0 +1,49 @@ +package com.foxx.androidcast.commercial; + +import android.content.Context; + +import com.foxx.androidcast.AppPreferences; + +/** + * Gates ads, in-app purchases, and Play Store integration. All off until enabled in + * developer settings (commercial release prep). + */ +public final class CommercialFeatures { + private CommercialFeatures() {} + + public static boolean isAdsEnabled(Context context) { + return AppPreferences.isDevCommercialAdsEnabled(context); + } + + public static boolean isInAppPurchaseEnabled(Context context) { + return AppPreferences.isDevCommercialIapEnabled(context); + } + + public static boolean isPlayStoreIntegrationEnabled(Context context) { + return AppPreferences.isDevCommercialPlayStoreEnabled(context); + } + + public static boolean isAnyCommercialFeatureEnabled(Context context) { + return isAdsEnabled(context) + || isInAppPurchaseEnabled(context) + || isPlayStoreIntegrationEnabled(context); + } + + /** Lazy-init billing / ads / review helpers when flags are turned on. */ + public static void refreshFromPreferences(Context context) { + Context app = context.getApplicationContext(); + if (isInAppPurchaseEnabled(app)) { + InAppPurchaseCoordinator.getInstance(app).ensureInitialized(); + } else { + InAppPurchaseCoordinator.getInstance(app).shutdown(); + } + if (isAdsEnabled(app)) { + InAppAdCoordinator.getInstance(app).ensureInitialized(); + } else { + InAppAdCoordinator.getInstance(app).shutdown(); + } + if (isPlayStoreIntegrationEnabled(app)) { + PlayStoreIntegration.getInstance(app).ensureInitialized(); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/commercial/InAppAdCoordinator.java b/app/src/main/java/com/foxx/androidcast/commercial/InAppAdCoordinator.java new file mode 100644 index 0000000..2d91511 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/commercial/InAppAdCoordinator.java @@ -0,0 +1,68 @@ +package com.foxx.androidcast.commercial; + +import android.app.Activity; +import android.content.Context; +import android.util.Log; +import android.view.ViewGroup; + +import com.foxx.androidcast.R; + +/** + * In-app ads placeholder. No AdMob SDK wired yet — when {@link CommercialFeatures#isAdsEnabled} + * is true, logs and reserves UI hooks for a future banner/interstitial integration. + */ +public final class InAppAdCoordinator { + private static final String TAG = "InAppAdCoordinator"; + private static volatile InAppAdCoordinator instance; + + private final Context appContext; + private boolean initialized; + + public static InAppAdCoordinator getInstance(Context context) { + if (instance == null) { + synchronized (InAppAdCoordinator.class) { + if (instance == null) { + instance = new InAppAdCoordinator(context.getApplicationContext()); + } + } + } + return instance; + } + + private InAppAdCoordinator(Context appContext) { + this.appContext = appContext; + } + + public void ensureInitialized() { + if (!CommercialFeatures.isAdsEnabled(appContext)) { + return; + } + if (initialized) { + return; + } + initialized = true; + Log.i(TAG, "Ads enabled (developer) — integrate AdMob App ID in manifest when ready."); + } + + public void shutdown() { + initialized = false; + } + + /** Attach a placeholder banner container (no network ads until SDK + unit IDs are added). */ + public void attachBannerPlaceholder(Activity activity, ViewGroup container) { + if (!CommercialFeatures.isAdsEnabled(appContext) || container == null) { + if (container != null) { + container.setVisibility(ViewGroup.GONE); + } + return; + } + ensureInitialized(); + container.setVisibility(ViewGroup.VISIBLE); + if (container.getChildCount() == 0) { + android.widget.TextView hint = new android.widget.TextView(activity); + hint.setText(R.string.commercial_ads_placeholder); + hint.setPadding(24, 16, 24, 16); + container.addView(hint); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/commercial/InAppPurchaseCoordinator.java b/app/src/main/java/com/foxx/androidcast/commercial/InAppPurchaseCoordinator.java new file mode 100644 index 0000000..382d30a --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/commercial/InAppPurchaseCoordinator.java @@ -0,0 +1,126 @@ +package com.foxx.androidcast.commercial; + +import android.app.Activity; +import android.content.Context; +import android.util.Log; + +import com.android.billingclient.api.BillingClient; +import com.android.billingclient.api.BillingClientStateListener; +import com.android.billingclient.api.BillingResult; +import com.android.billingclient.api.PendingPurchasesParams; +import com.android.billingclient.api.Purchase; +import com.android.billingclient.api.PurchasesUpdatedListener; +import com.android.billingclient.api.QueryProductDetailsParams; +import java.util.Collections; +import java.util.List; + +/** + * Google Play Billing wrapper — connects only when developer settings enable IAP. + * Product IDs are placeholders until Play Console SKUs exist. + */ +public final class InAppPurchaseCoordinator implements PurchasesUpdatedListener { + private static final String TAG = "InAppPurchaseCoordinator"; + + /** Example SKU — create matching in-app product in Play Console before release. */ + public static final String SKU_PREMIUM = "androidcast_premium"; + + private static volatile InAppPurchaseCoordinator instance; + + private final Context appContext; + private BillingClient billingClient; + private boolean initialized; + + public static InAppPurchaseCoordinator getInstance(Context context) { + if (instance == null) { + synchronized (InAppPurchaseCoordinator.class) { + if (instance == null) { + instance = new InAppPurchaseCoordinator(context.getApplicationContext()); + } + } + } + return instance; + } + + private InAppPurchaseCoordinator(Context appContext) { + this.appContext = appContext; + } + + public void ensureInitialized() { + if (!CommercialFeatures.isInAppPurchaseEnabled(appContext)) { + return; + } + if (initialized && billingClient != null) { + return; + } + billingClient = BillingClient.newBuilder(appContext) + .setListener(this) + .enablePendingPurchases(PendingPurchasesParams.newBuilder().enableOneTimeProducts().build()) + .build(); + billingClient.startConnection(new BillingClientStateListener() { + @Override + public void onBillingSetupFinished(BillingResult billingResult) { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) { + initialized = true; + Log.i(TAG, "Billing connected (developer IAP enabled)"); + } else { + Log.w(TAG, "Billing setup: " + billingResult.getDebugMessage()); + } + } + + @Override + public void onBillingServiceDisconnected() { + initialized = false; + } + }); + } + + public void shutdown() { + if (billingClient != null) { + billingClient.endConnection(); + billingClient = null; + } + initialized = false; + } + + public boolean isReady() { + return initialized && billingClient != null && billingClient.isReady(); + } + + /** Query placeholder SKU for developer testing (no UI yet). */ + public void queryPremiumProduct(Runnable onDone) { + if (!isReady()) { + if (onDone != null) { + onDone.run(); + } + return; + } + QueryProductDetailsParams.Product product = QueryProductDetailsParams.Product.newBuilder() + .setProductId(SKU_PREMIUM) + .setProductType(BillingClient.ProductType.INAPP) + .build(); + QueryProductDetailsParams params = QueryProductDetailsParams.newBuilder() + .setProductList(Collections.singletonList(product)) + .build(); + billingClient.queryProductDetailsAsync(params, (billingResult, productDetailsList) -> { + if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK + && productDetailsList != null && !productDetailsList.isEmpty()) { + Log.i(TAG, "Product available: " + SKU_PREMIUM); + } else { + Log.w(TAG, "Product query: " + billingResult.getDebugMessage()); + } + if (onDone != null) { + onDone.run(); + } + }); + } + + @Override + public void onPurchasesUpdated(BillingResult billingResult, List purchases) { + if (billingResult.getResponseCode() != BillingClient.BillingResponseCode.OK || purchases == null) { + return; + } + for (Purchase purchase : purchases) { + Log.i(TAG, "Purchase state: " + purchase.getPurchaseState() + " products=" + purchase.getProducts()); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/commercial/PlayStoreIntegration.java b/app/src/main/java/com/foxx/androidcast/commercial/PlayStoreIntegration.java new file mode 100644 index 0000000..aa27cae --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/commercial/PlayStoreIntegration.java @@ -0,0 +1,80 @@ +package com.foxx.androidcast.commercial; + +import android.app.Activity; +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.util.Log; + +import com.google.android.play.core.review.ReviewInfo; +import com.google.android.play.core.review.ReviewManager; +import com.google.android.play.core.review.ReviewManagerFactory; + +/** + * Play Store listing and in-app review — active only when developer settings enable Play integration. + */ +public final class PlayStoreIntegration { + private static final String TAG = "PlayStoreIntegration"; + private static volatile PlayStoreIntegration instance; + + private final Context appContext; + private ReviewManager reviewManager; + private boolean initialized; + + public static PlayStoreIntegration getInstance(Context context) { + if (instance == null) { + synchronized (PlayStoreIntegration.class) { + if (instance == null) { + instance = new PlayStoreIntegration(context.getApplicationContext()); + } + } + } + return instance; + } + + private PlayStoreIntegration(Context appContext) { + this.appContext = appContext; + } + + public void ensureInitialized() { + if (!CommercialFeatures.isPlayStoreIntegrationEnabled(appContext)) { + return; + } + if (initialized) { + return; + } + reviewManager = ReviewManagerFactory.create(appContext); + initialized = true; + Log.i(TAG, "Play Store integration enabled (developer)"); + } + + public void openAppListing(Activity activity) { + if (!CommercialFeatures.isPlayStoreIntegrationEnabled(appContext)) { + return; + } + String pkg = appContext.getPackageName(); + try { + activity.startActivity(new Intent(Intent.ACTION_VIEW, + Uri.parse("market://details?id=" + pkg))); + } catch (ActivityNotFoundException e) { + activity.startActivity(new Intent(Intent.ACTION_VIEW, + Uri.parse("https://play.google.com/store/apps/details?id=" + pkg))); + } + } + + /** Launch Google Play in-app review flow when available (test via internal track). */ + public void requestInAppReviewIfAvailable(Activity activity) { + if (!CommercialFeatures.isPlayStoreIntegrationEnabled(appContext) || reviewManager == null) { + return; + } + reviewManager.requestReviewFlow().addOnCompleteListener(task -> { + if (!task.isSuccessful()) { + Log.w(TAG, "Review flow request failed"); + return; + } + ReviewInfo reviewInfo = task.getResult(); + reviewManager.launchReviewFlow(activity, reviewInfo); + }); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/crash/CrashNativeBridge.java b/app/src/main/java/com/foxx/androidcast/crash/CrashNativeBridge.java new file mode 100644 index 0000000..bc84723 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/crash/CrashNativeBridge.java @@ -0,0 +1,51 @@ +package com.foxx.androidcast.crash; + +/********************************************************************* + * CrashNativeBridge.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CrashNativeBridge + * Contributors: + * - Anton Afanasyeu (2 commits, 47 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 b476dd21b8dfd795a94780873f0b906d0c9a5f8559152368f661014481407275 +**********************************************************************/ +import android.content.Context; +import android.util.Log; + +/** Installs native SIG* handlers that write backtrace stubs for the watcher process. */ +public final class CrashNativeBridge { + private static final String TAG = "CrashNativeBridge"; + private static final String LIB = "androidcast_codecs"; + private static volatile boolean loaded; + + private CrashNativeBridge() {} + + public static void init(Context context) { + if (!ensureLoaded()) { + return; + } + try { + String dir = context.getFilesDir().getAbsolutePath() + "/crash_reports/native"; + nativeInstallCrashHook(dir); + } catch (Throwable t) { + Log.w(TAG, "nativeInstallCrashHook failed: " + t.getMessage()); + } + } + + private static boolean ensureLoaded() { + if (loaded) { + return true; + } + try { + System.loadLibrary(LIB); + loaded = true; + return true; + } catch (UnsatisfiedLinkError e) { + return false; + } + } + + private static native void nativeInstallCrashHook(String nativeReportDir); +} diff --git a/app/src/main/java/com/foxx/androidcast/crash/CrashReportBuilder.java b/app/src/main/java/com/foxx/androidcast/crash/CrashReportBuilder.java new file mode 100644 index 0000000..48cf999 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/crash/CrashReportBuilder.java @@ -0,0 +1,204 @@ +package com.foxx.androidcast.crash; + +/********************************************************************* + * CrashReportBuilder.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CrashReportBuilder + * Contributors: + * - Anton Afanasyeu (2 commits, 186 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 8e12433dd47e8151a7041287f523a113487e2aa03fed928e1ac5ca02d373440f +**********************************************************************/ +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.os.Build; + +import com.foxx.androidcast.BuildConfig; +import com.foxx.androidcast.stats.SessionStatsContext; +import com.foxx.androidcast.stats.SessionStatsRecorder; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.security.MessageDigest; +import java.util.Locale; + +/** Builds anonymous crash report JSON (schema v1). */ +public final class CrashReportBuilder { + private CrashReportBuilder() {} + + public static JSONObject buildJavaCrash(Context context, Thread thread, Throwable throwable) { + JSONObject root = baseReport(context, "java"); + try { + JSONObject java = new JSONObject(); + java.put("thread", thread != null ? thread.getName() : "unknown"); + java.put("exception", throwable.getClass().getName()); + String msg = throwable.getMessage(); + if (msg != null) { + java.put("message", msg); + } + JSONArray frames = new JSONArray(); + for (StackTraceElement el : throwable.getStackTrace()) { + frames.put(el.toString()); + } + Throwable cause = throwable.getCause(); + if (cause != null && cause != throwable) { + java.put("cause", cause.getClass().getName() + ": " + cause.getMessage()); + } + java.put("stack_frames", frames); + root.put("java", java); + root.put("fingerprint", fingerprintJava(throwable)); + } catch (Exception ignored) { + } + attachSessionContext(root); + return root; + } + + public static JSONObject buildNativeCrash(Context context, String signalName, String backtraceText) { + JSONObject root = baseReport(context, "native"); + try { + JSONObject nat = new JSONObject(); + nat.put("signal", signalName != null ? signalName : "UNKNOWN"); + JSONArray frames = new JSONArray(); + if (backtraceText != null) { + for (String line : backtraceText.split("\n")) { + String t = line.trim(); + if (!t.isEmpty()) { + frames.put(t); + } + } + } + nat.put("backtrace", frames); + root.put("native", nat); + root.put("fingerprint", fingerprintNative(signalName, backtraceText)); + } catch (Exception ignored) { + } + attachSessionContext(root); + return root; + } + + private static JSONObject baseReport(Context context, String crashType) { + JSONObject root = new JSONObject(); + try { + long now = System.currentTimeMillis(); + String stamp = CrashReportStore.formatTimestamp(now); + root.put("schema_version", 1); + root.put("report_id", stamp); + root.put("generated_at_epoch_ms", now); + root.put("crash_type", crashType); + root.put("scenario", CrashRuntimeContext.scenarioLabel()); + root.put("process", currentProcessName()); + root.put("device", deviceJson()); + root.put("app", appJson(context)); + root.put("build", buildJson()); + root.put("runtime_context", CrashRuntimeContext.snapshot(context)); + } catch (Exception ignored) { + } + return root; + } + + private static String currentProcessName() { + try { + Class at = Class.forName("android.app.ActivityThread"); + Object proc = at.getMethod("currentProcessName").invoke(null); + if (proc instanceof String && !((String) proc).isEmpty()) { + return (String) proc; + } + } catch (Exception ignored) { + } + return "main"; + } + + private static JSONObject deviceJson() throws Exception { + JSONObject d = new JSONObject(); + d.put("manufacturer", Build.MANUFACTURER); + d.put("brand", Build.BRAND); + d.put("model", Build.MODEL); + d.put("device", Build.DEVICE); + d.put("product", Build.PRODUCT); + d.put("sdk_int", Build.VERSION.SDK_INT); + d.put("release", Build.VERSION.RELEASE); + JSONArray abis = new JSONArray(); + for (String abi : Build.SUPPORTED_ABIS) { + abis.put(abi); + } + d.put("abis", abis); + return d; + } + + private static JSONObject appJson(Context context) throws Exception { + JSONObject a = new JSONObject(); + a.put("package", context.getPackageName()); + PackageManager pm = context.getPackageManager(); + PackageInfo info = pm.getPackageInfo(context.getPackageName(), 0); + a.put("version_name", info.versionName != null ? info.versionName : ""); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + a.put("version_code", info.getLongVersionCode()); + } else { + a.put("version_code", info.versionCode); + } + return a; + } + + private static JSONObject buildJson() throws Exception { + JSONObject b = new JSONObject(); + b.put("debug", BuildConfig.DEBUG); + b.put("git_commit", BuildConfig.GIT_COMMIT_SHORT); + return b; + } + + private static void attachSessionContext(JSONObject root) { + try { + SessionStatsRecorder recorder = SessionStatsContext.get(); + if (recorder == null) { + return; + } + JSONObject ctx = new JSONObject(); + ctx.put("direction", recorder.getDirection()); + ctx.put("role", "recv".equals(recorder.getDirection()) ? "receiver" : "sender"); + root.put("session_context", ctx); + } catch (Exception ignored) { + } + } + + static String fingerprintJava(Throwable t) { + StringBuilder sb = new StringBuilder(); + sb.append(t.getClass().getName()); + StackTraceElement[] st = t.getStackTrace(); + int limit = Math.min(8, st.length); + for (int i = 0; i < limit; i++) { + sb.append('|').append(st[i].getClassName()).append('.').append(st[i].getMethodName()); + } + return sha256Hex(sb.toString()); + } + + static String fingerprintNative(String signal, String backtrace) { + StringBuilder sb = new StringBuilder(); + sb.append(signal != null ? signal : ""); + if (backtrace != null) { + String[] lines = backtrace.split("\n"); + int limit = Math.min(6, lines.length); + for (int i = 0; i < limit; i++) { + sb.append('|').append(lines[i].trim()); + } + } + return sha256Hex(sb.toString()); + } + + private static String sha256Hex(String text) { + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] digest = md.digest(text.getBytes(java.nio.charset.StandardCharsets.UTF_8)); + StringBuilder sb = new StringBuilder(digest.length * 2); + for (byte b : digest) { + sb.append(String.format(Locale.US, "%02x", b & 0xff)); + } + return sb.toString(); + } catch (Exception e) { + return ""; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/crash/CrashReportStore.java b/app/src/main/java/com/foxx/androidcast/crash/CrashReportStore.java new file mode 100644 index 0000000..3e6f70c --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/crash/CrashReportStore.java @@ -0,0 +1,121 @@ +package com.foxx.androidcast.crash; + +/********************************************************************* + * CrashReportStore.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CrashReportStore + * Contributors: + * - Anton Afanasyeu (2 commits, 96 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 7400435fd42c6dca90ddf1cebec7691657b971ec10e059b599aa1287649642e3 +**********************************************************************/ +import org.json.JSONObject; + +import com.foxx.androidcast.util.IoUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +/** Pending/uploaded crash JSON in app-private storage (shared across processes). */ +public final class CrashReportStore { + private static final String ROOT = "crash_reports"; + private static final String PENDING = "pending"; + private static final String UPLOADED = "uploaded"; + /** Same stamp as {@code session_send_yyyyMMdd_HHmmss.json} / {@code session_recv_*.json}. */ + public static final String PREFIX = "crash_"; + private static final String SUFFIX = ".json"; + + private CrashReportStore() {} + + public static File pendingDir(File filesDir) { + File dir = new File(new File(filesDir, ROOT), PENDING); + if (!dir.exists()) { + dir.mkdirs(); + } + return dir; + } + + public static File uploadedDir(File filesDir) { + File dir = new File(new File(filesDir, ROOT), UPLOADED); + if (!dir.exists()) { + dir.mkdirs(); + } + return dir; + } + + public static String formatTimestamp(long epochMs) { + return new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date(epochMs)); + } + + /** {@code crash_yyyyMMdd_HHmmss.json} (suffix {@code _N} if the second collides). */ + public static File newPendingFile(File filesDir, long generatedAtMs) { + String base = PREFIX + formatTimestamp(generatedAtMs); + File dir = pendingDir(filesDir); + File candidate = new File(dir, base + SUFFIX); + int n = 1; + while (candidate.exists()) { + candidate = new File(dir, base + "_" + n + SUFFIX); + n++; + } + return candidate; + } + + public static void writeJson(File file, JSONObject json) throws Exception { + File parent = file.getParentFile(); + if (parent != null && !parent.exists()) { + parent.mkdirs(); + } + byte[] bytes = json.toString(2).getBytes(StandardCharsets.UTF_8); + try (FileOutputStream fos = new FileOutputStream(file)) { + fos.write(bytes); + } + } + + public static JSONObject readJson(File file) { + try (FileInputStream fis = new FileInputStream(file)) { + return new JSONObject(new String(IoUtils.readAllBytes(fis), StandardCharsets.UTF_8)); + } catch (Exception e) { + return null; + } + } + + public static List listPending(File filesDir) { + File dir = pendingDir(filesDir); + File[] files = dir.listFiles((d, n) -> n.startsWith(PREFIX) && n.endsWith(SUFFIX)); + if (files == null || files.length == 0) { + return Collections.emptyList(); + } + List list = new ArrayList<>(); + Collections.addAll(list, files); + list.sort(Comparator.comparing(File::getName)); + return list; + } + + public static void markUploaded(File filesDir, File pending, boolean prune) { + if (prune) { + pending.delete(); + return; + } + File dest = new File(uploadedDir(filesDir), pending.getName()); + pending.renameTo(dest); + } + + public static void pruneOldestPending(File filesDir, int maxFiles) { + List pending = listPending(filesDir); + while (pending.size() > maxFiles) { + pending.get(0).delete(); + pending = listPending(filesDir); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/crash/CrashReporter.java b/app/src/main/java/com/foxx/androidcast/crash/CrashReporter.java new file mode 100644 index 0000000..d7f5f9b --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/crash/CrashReporter.java @@ -0,0 +1,135 @@ +package com.foxx.androidcast.crash; + +import android.app.Application; +import android.content.Context; +import android.util.Log; + +import com.foxx.androidcast.stats.SessionStatsContext; + +import org.json.JSONObject; + +import java.io.File; + +/** + * Crash capture for main and monitored isolated processes ({@code :vpn}, {@code :netselftest}). + * Persists JSON to shared app storage and wakes {@link CrashWatcherService}. + */ +public final class CrashReporter { + private static final String TAG = "CrashReporter"; + + private CrashReporter() {} + + /** Install handlers appropriate for the current process. */ + public static void install(Context context) { + Context app = context.getApplicationContext(); + String proc = currentProcessName(); + if (isMainProcess(app, proc)) { + installMainProcess(app); + } else if (isMonitoredIsolatedProcess(proc)) { + installIsolatedProcess(app); + } + } + + private static void installMainProcess(Context app) { + if (app instanceof Application) { + CrashRuntimeContext.init((Application) app); + } + CrashNativeBridge.init(app); + final Thread.UncaughtExceptionHandler previous = + Thread.getDefaultUncaughtExceptionHandler(); + Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { + try { + SessionStatsContext.flushActiveOnUncaughtException(app); + } catch (Throwable ignored) { + } + try { + recordJavaCrash(app, thread, throwable); + } catch (Throwable t) { + Log.e(TAG, "recordJavaCrash failed", t); + } + if (previous != null) { + previous.uncaughtException(thread, throwable); + } + }); + CrashWatcherService.scheduleUploadSweep(app); + } + + private static void installIsolatedProcess(Context app) { + CrashNativeBridge.init(app); + final Thread.UncaughtExceptionHandler previous = + Thread.getDefaultUncaughtExceptionHandler(); + Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> { + try { + recordJavaCrash(app, thread, throwable); + } catch (Throwable t) { + Log.e(TAG, "isolated recordJavaCrash failed", t); + } + if (previous != null) { + previous.uncaughtException(thread, throwable); + } else { + System.exit(10); + } + }); + Log.i(TAG, "crash capture enabled in " + currentProcessName()); + } + + public static void recordJavaCrash(Context context, Thread thread, Throwable throwable) { + if (!CrashSettingsStore.load(context).enabled) { + return; + } + JSONObject report = CrashReportBuilder.buildJavaCrash(context, thread, throwable); + persistAndWake(context, report); + } + + public static void recordNativeCrash(Context context, String signalName, String backtrace) { + if (!CrashSettingsStore.load(context).enabled) { + return; + } + JSONObject report = CrashReportBuilder.buildNativeCrash(context, signalName, backtrace); + persistAndWake(context, report); + } + + static void persistAndWake(Context context, JSONObject report) { + if (report == null) { + return; + } + try { + long generatedAt = report.optLong("generated_at_epoch_ms", System.currentTimeMillis()); + File file = CrashReportStore.newPendingFile(context.getFilesDir(), generatedAt); + report.put("report_id", file.getName().substring( + CrashReportStore.PREFIX.length(), + file.getName().length() - ".json".length())); + report.put("report_file", file.getName()); + CrashReportStore.writeJson(file, report); + CrashReportStore.pruneOldestPending(context.getFilesDir(), + CrashSettingsStore.load(context).maxPendingFiles); + wakeWatcher(context); + } catch (Exception e) { + Log.e(TAG, "persist failed", e); + } + } + + private static void wakeWatcher(Context context) { + CrashWatcherService.requestImmediateSweep(context, true); + } + + public static boolean isMainProcess(Context context, String procName) { + return context.getPackageName().equals(procName); + } + + public static boolean isMonitoredIsolatedProcess(String procName) { + if (procName == null || procName.isEmpty()) { + return false; + } + return procName.endsWith(":vpn") || procName.endsWith(":netselftest") + || procName.endsWith(":ra_control"); + } + + public static String currentProcessName() { + try { + return Application.getProcessName(); + } catch (Exception e) { + return ""; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/crash/CrashRuntimeContext.java b/app/src/main/java/com/foxx/androidcast/crash/CrashRuntimeContext.java new file mode 100644 index 0000000..f27f183 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/crash/CrashRuntimeContext.java @@ -0,0 +1,115 @@ +package com.foxx.androidcast.crash; + +import android.app.Activity; +import android.app.Application; +import android.content.Context; +import android.os.Bundle; + +import com.foxx.androidcast.CastActiveState; +import com.foxx.androidcast.stats.SessionStatsContext; +import com.foxx.androidcast.stats.SessionStatsRecorder; +import com.foxx.androidcast.stats.SessionStatsStore; + +import org.json.JSONObject; + +import java.io.File; +import java.util.List; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; + +/** + * App-wide runtime snapshot for crash reports (cast idle, UI foreground, last session file). + * Updated from {@link AndroidCastApplication} lifecycle and cast services. + */ +public final class CrashRuntimeContext { + private static final AtomicLong APP_STARTED_MS = new AtomicLong(0L); + private static final AtomicReference LAST_ACTIVITY = new AtomicReference<>(""); + private CrashRuntimeContext() {} + + public static void init(Application app) { + APP_STARTED_MS.compareAndSet(0L, System.currentTimeMillis()); + app.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() { + @Override + public void onActivityResumed(Activity activity) { + LAST_ACTIVITY.set(activity.getClass().getSimpleName()); + } + + @Override + public void onActivityCreated(Activity a, Bundle b) {} + + @Override + public void onActivityStarted(Activity a) {} + + @Override + public void onActivityPaused(Activity a) {} + + @Override + public void onActivityStopped(Activity a) {} + + @Override + public void onActivitySaveInstanceState(Activity a, Bundle b) {} + + @Override + public void onActivityDestroyed(Activity a) {} + }); + } + + public static boolean isCastSessionActive() { + return CastActiveState.isSenderCasting() || CastActiveState.isReceiverListening(); + } + + /** JSON attached to every crash report (with or without an active cast stats recorder). */ + public static JSONObject snapshot(Context context) { + JSONObject runtime = new JSONObject(); + try { + long started = APP_STARTED_MS.get(); + if (started <= 0L) { + started = System.currentTimeMillis(); + } + runtime.put("app_started_epoch_ms", started); + runtime.put("last_activity", LAST_ACTIVITY.get()); + runtime.put("sender_cast_active", CastActiveState.isSenderCasting()); + runtime.put("receiver_cast_active", CastActiveState.isReceiverListening()); + runtime.put("cast_active", isCastSessionActive()); + + SessionStatsRecorder active = SessionStatsContext.get(); + runtime.put("session_stats_active", active != null); + if (active != null) { + runtime.put("session_direction", active.getDirection()); + } + + String lastSession = lastSessionFileName(context); + if (!lastSession.isEmpty()) { + runtime.put("last_session_file", lastSession); + } + } catch (Exception ignored) { + } + return runtime; + } + + public static String scenarioLabel() { + String proc = CrashReporter.currentProcessName(); + if (proc != null && proc.endsWith(":vpn")) { + return "vpn_service"; + } + if (proc != null && proc.endsWith(":netselftest")) { + return "net_selftest"; + } + if (SessionStatsContext.get() != null || isCastSessionActive()) { + return "cast_session"; + } + return "app_runtime"; + } + + private static String lastSessionFileName(Context context) { + try { + List files = SessionStatsStore.listSessionFiles(context); + if (files.isEmpty()) { + return ""; + } + return files.get(0).getName(); + } catch (Exception e) { + return ""; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/crash/CrashSettings.java b/app/src/main/java/com/foxx/androidcast/crash/CrashSettings.java new file mode 100644 index 0000000..982a2be --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/crash/CrashSettings.java @@ -0,0 +1,33 @@ +package com.foxx.androidcast.crash; + +/********************************************************************* + * CrashSettings.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CrashSettings + * Contributors: + * - Anton Afanasyeu (2 commits, 29 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 b34e77953e2e8e034a359a5f0d1a86a6a5fd915b2acbda19af1d07bb20cef58e +**********************************************************************/ +/** Crash reporter tuning from {@code settings.json} → {@code crash} (overrides app defaults). */ +public final class CrashSettings { + public static final String DEFAULT_UPLOAD_URL = + "https://apps.f0xx.org/app/androidcast_project/crashes/api/upload.php"; + + public final boolean enabled; + public final String uploadUrl; + public final boolean pruneAfterUpload; + public final long uploadIntervalMs; + public final int maxPendingFiles; + + public CrashSettings(boolean enabled, String uploadUrl, boolean pruneAfterUpload, + long uploadIntervalMs, int maxPendingFiles) { + this.enabled = enabled; + this.uploadUrl = uploadUrl != null ? uploadUrl.trim() : DEFAULT_UPLOAD_URL; + this.pruneAfterUpload = pruneAfterUpload; + this.uploadIntervalMs = Math.max(30_000L, uploadIntervalMs); + this.maxPendingFiles = Math.max(1, maxPendingFiles); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/crash/CrashSettingsStore.java b/app/src/main/java/com/foxx/androidcast/crash/CrashSettingsStore.java new file mode 100644 index 0000000..55a8e1d --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/crash/CrashSettingsStore.java @@ -0,0 +1,91 @@ +package com.foxx.androidcast.crash; + +/********************************************************************* + * CrashSettingsStore.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CrashSettingsStore + * Contributors: + * - Anton Afanasyeu (2 commits, 86 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 ac2e9d6760032dddd3a23524eda1c77f4424a11348d758e4f6592001d2d72fe6 +**********************************************************************/ +import android.content.Context; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.network.BackendEndpoints; +import com.foxx.androidcast.settings.AppSettingsJson; + +import org.json.JSONObject; + +/** Loads effective crash settings (preferences + settings.json overrides). */ +public final class CrashSettingsStore { + private static final long DEFAULT_UPLOAD_INTERVAL_MS = 5 * 60_000L; + private static final int DEFAULT_MAX_PENDING = 32; + + private CrashSettingsStore() {} + + public static CrashSettings load(Context context) { + boolean enabled = AppPreferences.isSendAnonymousCrashLogs(context); + String uploadUrl = CrashSettings.DEFAULT_UPLOAD_URL; + boolean prune = true; + long interval = DEFAULT_UPLOAD_INTERVAL_MS; + int maxPending = DEFAULT_MAX_PENDING; + + JSONObject crash = AppSettingsJson.section(context, "crash"); + if (crash != null) { + if (crash.has("enabled")) { + enabled = parseBool(crash.optString("enabled", "true"), enabled); + } + String url = crash.optString("upload_url", "").trim(); + if (!url.isEmpty()) { + uploadUrl = BackendEndpoints.normalizeCrashesUrl(url); + } + if (crash.has("prune_after_upload")) { + prune = parseBool(crash.optString("prune_after_upload", "true"), prune); + } + String intervalRaw = crash.optString("upload_interval", ""); + if (!intervalRaw.isEmpty()) { + interval = parseDurationMs(intervalRaw, interval); + } + maxPending = crash.optInt("max_pending", maxPending); + } + return new CrashSettings(enabled, uploadUrl, prune, interval, maxPending); + } + + private static boolean parseBool(String raw, boolean fallback) { + if (raw == null) { + return fallback; + } + String v = raw.trim().toLowerCase(); + if ("true".equals(v) || "1".equals(v) || "yes".equals(v)) { + return true; + } + if ("false".equals(v) || "0".equals(v) || "no".equals(v)) { + return false; + } + return fallback; + } + + private static long parseDurationMs(String raw, long fallback) { + try { + String t = raw.trim().toLowerCase(); + if (t.endsWith("ms")) { + return Long.parseLong(t.substring(0, t.length() - 2).trim()); + } + if (t.endsWith("s")) { + return Long.parseLong(t.substring(0, t.length() - 1).trim()) * 1000L; + } + if (t.endsWith("m")) { + return Long.parseLong(t.substring(0, t.length() - 1).trim()) * 60_000L; + } + if (t.endsWith("h")) { + return Long.parseLong(t.substring(0, t.length() - 1).trim()) * 3_600_000L; + } + return Long.parseLong(t); + } catch (Exception e) { + return fallback; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/crash/CrashUploadClient.java b/app/src/main/java/com/foxx/androidcast/crash/CrashUploadClient.java new file mode 100644 index 0000000..37c5a0b --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/crash/CrashUploadClient.java @@ -0,0 +1,79 @@ +package com.foxx.androidcast.crash; + +/********************************************************************* + * CrashUploadClient.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CrashUploadClient + * Contributors: + * - Anton Afanasyeu (2 commits, 64 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 b92a804c279390649ca8c27d041dbc2bac31f86968a009e12e7a7c679d718cc7 +**********************************************************************/ +import org.json.JSONObject; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.zip.GZIPOutputStream; + +/** POST crash JSON to the PHP receiver. */ +public final class CrashUploadClient { + private static final int CONNECT_MS = 12_000; + private static final int READ_MS = 20_000; + + private CrashUploadClient() {} + + private static byte[] gzip(byte[] plain) throws java.io.IOException { + ByteArrayOutputStream buf = new ByteArrayOutputStream(Math.max(256, plain.length / 4)); + try (GZIPOutputStream gz = new GZIPOutputStream(buf)) { + gz.write(plain); + } + return buf.toByteArray(); + } + + public static boolean upload(String uploadUrl, JSONObject report) { + if (uploadUrl == null || uploadUrl.isEmpty() || report == null) { + return false; + } + HttpURLConnection conn = null; + try { + conn = (HttpURLConnection) new URL(uploadUrl).openConnection(); + conn.setConnectTimeout(CONNECT_MS); + conn.setReadTimeout(READ_MS); + conn.setRequestMethod("POST"); + conn.setDoOutput(true); + conn.setRequestProperty("Content-Type", "application/json; charset=utf-8"); + conn.setRequestProperty("Accept", "application/json"); + conn.setRequestProperty("Content-Encoding", "gzip"); + byte[] json = report.toString().getBytes(StandardCharsets.UTF_8); + byte[] body = gzip(json); + try (OutputStream out = conn.getOutputStream()) { + out.write(body); + } + int code = conn.getResponseCode(); + if (code < 200 || code >= 300) { + return false; + } + try (BufferedInputStream in = new BufferedInputStream(conn.getInputStream()); + ByteArrayOutputStream buf = new ByteArrayOutputStream()) { + byte[] tmp = new byte[1024]; + int n; + while ((n = in.read(tmp)) != -1) { + buf.write(tmp, 0, n); + } + } + return true; + } catch (Exception e) { + return false; + } finally { + if (conn != null) { + conn.disconnect(); + } + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/crash/CrashWatcherService.java b/app/src/main/java/com/foxx/androidcast/crash/CrashWatcherService.java new file mode 100644 index 0000000..6949c9a --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/crash/CrashWatcherService.java @@ -0,0 +1,202 @@ +package com.foxx.androidcast.crash; + +/********************************************************************* + * CrashWatcherService.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CrashWatcherService + * Contributors: + * - Anton Afanasyeu (2 commits, 139 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 4135badad895535cd2635563f9b7a87da7ee1fdf4b1dd757f596d7eef67e82f6 +**********************************************************************/ +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.IBinder; +import android.os.SystemClock; +import android.util.Log; + +import com.foxx.androidcast.util.IoUtils; + +import org.json.JSONObject; + +import java.io.File; +import java.io.FileInputStream; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Standalone process ({@code :crashwatcher}) — uploads pending crash JSON even if the main + * cast process died. Reads {@code settings.json} crash overrides on each sweep. + */ +public final class CrashWatcherService extends Service { + private static final String TAG = "CrashWatcher"; + public static final String ACTION_UPLOAD_PENDING = "com.foxx.androidcast.crash.UPLOAD_PENDING"; + private static final int ALARM_REQUEST = 4102; + private static final long IMMEDIATE_DEBOUNCE_MS = 30_000L; + + private static final AtomicBoolean SWEEP_RUNNING = new AtomicBoolean(false); + private static volatile long lastImmediateRequestElapsedMs; + + /** One immediate sweep (debounced) plus the next periodic alarm. */ + public static void scheduleUploadSweep(Context context) { + Context app = context.getApplicationContext(); + schedulePeriodicAlarm(app); + requestImmediateSweep(app); + } + + /** Alarm-only periodic upload; does not start the service now. */ + public static void schedulePeriodicAlarm(Context context) { + Context app = context.getApplicationContext(); + CrashSettings settings = CrashSettingsStore.load(app); + AlarmManager alarm = (AlarmManager) app.getSystemService(Context.ALARM_SERVICE); + if (alarm == null) { + return; + } + PendingIntent pi = pendingAlarmIntent(app); + if (!settings.enabled) { + alarm.cancel(pi); + return; + } + long trigger = System.currentTimeMillis() + settings.uploadIntervalMs; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + alarm.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, trigger, pi); + } else { + alarm.set(AlarmManager.RTC_WAKEUP, trigger, pi); + } + } + + public static void requestImmediateSweep(Context context) { + requestImmediateSweep(context, false); + } + + /** Start a sweep now if one is not already running (coalesces duplicate requests). */ + public static void requestImmediateSweep(Context context, boolean bypassDebounce) { + Context app = context.getApplicationContext(); + if (!CrashSettingsStore.load(app).enabled) { + return; + } + if (!bypassDebounce) { + long now = SystemClock.elapsedRealtime(); + synchronized (CrashWatcherService.class) { + if (now - lastImmediateRequestElapsedMs < IMMEDIATE_DEBOUNCE_MS) { + return; + } + lastImmediateRequestElapsedMs = now; + } + } + if (SWEEP_RUNNING.get()) { + return; + } + try { + Intent i = new Intent(app, CrashWatcherService.class); + i.setAction(ACTION_UPLOAD_PENDING); + app.startService(i); + } catch (Exception e) { + Log.w(TAG, "requestImmediateSweep: " + e.getMessage()); + } + } + + private static PendingIntent pendingAlarmIntent(Context app) { + Intent periodic = new Intent(app, CrashWatcherService.class); + periodic.setAction(ACTION_UPLOAD_PENDING); + return PendingIntent.getService( + app, + ALARM_REQUEST, + periodic, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (!SWEEP_RUNNING.compareAndSet(false, true)) { + stopSelf(startId); + return START_NOT_STICKY; + } + new Thread(() -> { + try { + runSweep(); + } finally { + SWEEP_RUNNING.set(false); + schedulePeriodicAlarm(getApplicationContext()); + stopSelf(startId); + } + }, "CrashWatcherSweep").start(); + return START_NOT_STICKY; + } + + private void runSweep() { + CrashSettings settings = CrashSettingsStore.load(this); + if (!settings.enabled) { + return; + } + ingestNativeStubs(getFilesDir()); + List pending = CrashReportStore.listPending(getFilesDir()); + for (File file : pending) { + JSONObject report = CrashReportStore.readJson(file); + if (report == null) { + file.delete(); + continue; + } + boolean ok = CrashUploadClient.upload(settings.uploadUrl, report); + if (ok) { + CrashReportStore.markUploaded(getFilesDir(), file, settings.pruneAfterUpload); + Log.i(TAG, "Uploaded " + file.getName()); + } else { + Log.w(TAG, "Upload failed for " + file.getName()); + } + } + } + + /** Converts native stub text files (written from JNI signal handler) into pending JSON. */ + private void ingestNativeStubs(File filesDir) { + File nativeDir = new File(new File(filesDir, "crash_reports"), "native"); + if (!nativeDir.exists()) { + return; + } + File[] stubs = nativeDir.listFiles((d, n) -> n.endsWith(".txt")); + if (stubs == null) { + return; + } + for (File stub : stubs) { + try { + byte[] buf; + try (FileInputStream fis = new FileInputStream(stub)) { + buf = IoUtils.readAllBytes(fis); + } + String text = new String(buf, StandardCharsets.UTF_8); + String signal = "UNKNOWN"; + int sigIdx = text.indexOf("signal="); + if (sigIdx >= 0) { + int end = text.indexOf('\n', sigIdx); + signal = text.substring(sigIdx + 7, end > sigIdx ? end : text.length()).trim(); + } + JSONObject report = CrashReportBuilder.buildNativeCrash(this, signal, text); + long generatedAt = report.optLong("generated_at_epoch_ms", stub.lastModified()); + if (generatedAt <= 0L) { + generatedAt = System.currentTimeMillis(); + } + File pending = CrashReportStore.newPendingFile(filesDir, generatedAt); + report.put("report_id", pending.getName().substring( + CrashReportStore.PREFIX.length(), + pending.getName().length() - ".json".length())); + report.put("report_file", pending.getName()); + CrashReportStore.writeJson(pending, report); + stub.delete(); + } catch (Exception e) { + Log.w(TAG, "ingest native stub failed: " + stub.getName()); + } + } + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DebugDeployWakeReceiver.java b/app/src/main/java/com/foxx/androidcast/dev/DebugDeployWakeReceiver.java new file mode 100644 index 0000000..e14c83d --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DebugDeployWakeReceiver.java @@ -0,0 +1,29 @@ +package com.foxx.androidcast.dev; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +import com.foxx.androidcast.BuildConfig; + +/** + * Debug: wake on {@link DevInstallWakeHelper#ACTION_PREPARE_FOR_DEPLOY} (before adb install) + * and relaunch UI on {@link Intent#ACTION_MY_PACKAGE_REPLACED}. + */ +public final class DebugDeployWakeReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if (!BuildConfig.DEBUG || intent == null) { + return; + } + String action = intent.getAction(); + if (DevInstallWakeHelper.ACTION_PREPARE_FOR_DEPLOY.equals(action)) { + DevInstallWakeHelper.wakeForDeploy(context, "prepare-broadcast"); + return; + } + if (Intent.ACTION_MY_PACKAGE_REPLACED.equals(action)) { + DevInstallWakeHelper.wakeForDeploy(context, "package-replaced"); + DevInstallWakeHelper.launchMainAfterDeploy(context); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevAdbConnectHttpServer.java b/app/src/main/java/com/foxx/androidcast/dev/DevAdbConnectHttpServer.java new file mode 100644 index 0000000..6a7430d --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevAdbConnectHttpServer.java @@ -0,0 +1,115 @@ +package com.foxx.androidcast.dev; + +import android.util.Log; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.atomic.AtomicReference; + +/** Tiny LAN HTTP server so rebuild.sh can fetch adb connect lines without adb. */ +final class DevAdbConnectHttpServer implements Runnable { + private final AtomicReference payload = new AtomicReference<>("{}"); + private volatile ServerSocket serverSocket; + private volatile Thread thread; + + void updatePayload(String json) { + payload.set(json != null ? json : "{}"); + } + + synchronized void start() { + if (thread != null && thread.isAlive()) { + return; + } + thread = new Thread(this, "DevAdbConnectHttp"); + thread.setDaemon(true); + thread.start(); + } + + synchronized void stop() { + Thread local = thread; + thread = null; + ServerSocket socket = serverSocket; + serverSocket = null; + if (socket != null) { + try { + socket.close(); + } catch (IOException ignored) { + } + } + if (local != null) { + local.interrupt(); + } + } + + @Override + public void run() { + try (ServerSocket socket = new ServerSocket()) { + socket.setReuseAddress(true); + socket.bind(new InetSocketAddress(DevAdbConnectInfo.HTTP_PORT)); + serverSocket = socket; + Log.i(DevAdbConnectInfo.LOG_TAG, + "HTTP adb info on :" + DevAdbConnectInfo.HTTP_PORT + "/adb.json"); + while (!Thread.currentThread().isInterrupted()) { + try (Socket client = socket.accept()) { + client.setSoTimeout(5_000); + handleClient(client); + } catch (IOException e) { + if (!Thread.currentThread().isInterrupted()) { + Log.d(DevAdbConnectInfo.LOG_TAG, "HTTP client error", e); + } + } + } + } catch (IOException e) { + Log.w(DevAdbConnectInfo.LOG_TAG, "HTTP server stopped", e); + } finally { + serverSocket = null; + } + } + + private void handleClient(Socket client) throws IOException { + String path = readRequestPath(client); + String body = payload.get(); + if (body == null || body.isEmpty()) { + body = "{}"; + } + if (!"/adb.json".equals(path) && !"/".equals(path)) { + writeResponse(client, 404, "text/plain", "not found"); + return; + } + writeResponse(client, 200, "application/json; charset=utf-8", body); + } + + private static String readRequestPath(Socket client) throws IOException { + byte[] buffer = new byte[1024]; + int read = client.getInputStream().read(buffer); + if (read <= 0) { + return "/"; + } + String request = new String(buffer, 0, read, StandardCharsets.US_ASCII); + int lineEnd = request.indexOf('\n'); + String firstLine = lineEnd >= 0 ? request.substring(0, lineEnd) : request; + String[] parts = firstLine.split(" "); + if (parts.length >= 2) { + return parts[1].trim(); + } + return "/"; + } + + private static void writeResponse(Socket client, int code, String contentType, String body) + throws IOException { + byte[] bytes = body.getBytes(StandardCharsets.UTF_8); + String status = code == 200 ? "200 OK" : "404 Not Found"; + String headers = "HTTP/1.1 " + status + "\r\n" + + "Content-Type: " + contentType + "\r\n" + + "Content-Length: " + bytes.length + "\r\n" + + "Connection: close\r\n\r\n"; + OutputStream out = client.getOutputStream(); + out.write(headers.getBytes(StandardCharsets.US_ASCII)); + out.write(bytes); + out.flush(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevAdbConnectInfo.java b/app/src/main/java/com/foxx/androidcast/dev/DevAdbConnectInfo.java new file mode 100644 index 0000000..03460c1 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevAdbConnectInfo.java @@ -0,0 +1,181 @@ +package com.foxx.androidcast.dev; + +import android.text.TextUtils; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +/** Snapshot of wireless adb endpoints for rebuild.sh / curl when adb is down. */ +public final class DevAdbConnectInfo { + public static final int HTTP_PORT = 5039; + public static final int LEGACY_TCP_PORT = 5555; + public static final String LOG_TAG = "DevAdbConnect"; + public static final String ACTION_REFRESH = "com.foxx.androidcast.dev.REFRESH_ADB_WIFI"; + public static final String RELATIVE_JSON_PATH = "dev/adb_connect.json"; + + public final List ips; + public final List connect; + public final boolean adbEnabled; + public final boolean adbWifiEnabled; + public final boolean secureSettingsGranted; + public final int legacyPort; + public final long updatedMs; + public final RaControlEndpoint raControl; + + /** Live RA control HTTP endpoint (random port per session). */ + public static final class RaControlEndpoint { + public final int port; + public final String token; + public final List baseUrls; + + public RaControlEndpoint(int port, String token, List baseUrls) { + this.port = port; + this.token = token != null ? token : ""; + this.baseUrls = baseUrls != null ? baseUrls : Collections.emptyList(); + } + } + + public DevAdbConnectInfo( + List ips, + List connect, + boolean adbEnabled, + boolean adbWifiEnabled, + boolean secureSettingsGranted, + int legacyPort, + long updatedMs) { + this(ips, connect, adbEnabled, adbWifiEnabled, secureSettingsGranted, legacyPort, updatedMs, null); + } + + public DevAdbConnectInfo( + List ips, + List connect, + boolean adbEnabled, + boolean adbWifiEnabled, + boolean secureSettingsGranted, + int legacyPort, + long updatedMs, + RaControlEndpoint raControl) { + this.ips = ips != null ? ips : Collections.emptyList(); + this.connect = connect != null ? connect : Collections.emptyList(); + this.adbEnabled = adbEnabled; + this.adbWifiEnabled = adbWifiEnabled; + this.secureSettingsGranted = secureSettingsGranted; + this.legacyPort = legacyPort; + this.updatedMs = updatedMs; + this.raControl = raControl; + } + + public String primaryConnectLine() { + return connect.isEmpty() ? "" : connect.get(0); + } + + public String toJson() { + try { + JSONObject root = new JSONObject(); + root.put("package", "com.foxx.androidcast"); + root.put("http_port", HTTP_PORT); + root.put("legacy_port", legacyPort); + root.put("adb_enabled", adbEnabled); + root.put("adb_wifi_enabled", adbWifiEnabled); + root.put("secure_settings_granted", secureSettingsGranted); + root.put("updated_ms", updatedMs); + root.put("ips", toJsonArray(ips)); + root.put("connect", toJsonArray(connect)); + root.put("tls_port", + findFirstNonLegacyPort(connect)); + root.put("needs_secure_grant", !secureSettingsGranted); + JSONArray commands = new JSONArray(); + for (String endpoint : connect) { + if (!TextUtils.isEmpty(endpoint)) { + commands.put("adb connect " + endpoint); + } + } + root.put("commands", commands); + root.put("hint", "Grant WRITE_SECURE_SETTINGS once via USB; use tls_port " + + "(not 5555) on Android 11+. Host: avahi-browse -rpt _adb-tls-connect._tcp"); + if (raControl != null && raControl.port > 0) { + JSONObject ra = new JSONObject(); + ra.put("port", raControl.port); + ra.put("token", raControl.token); + JSONArray raUrls = new JSONArray(); + for (String ip : ips) { + if (!TextUtils.isEmpty(ip)) { + raUrls.put("http://" + ip + ":" + raControl.port + "/?token=" + raControl.token); + } + } + raUrls.put("http://127.0.0.1:" + raControl.port + "/?token=" + raControl.token); + for (String url : raControl.baseUrls) { + if (!TextUtils.isEmpty(url)) { + raUrls.put(url); + } + } + ra.put("urls", raUrls); + root.put("ra_control", ra); + } + return root.toString(2); + } catch (JSONException e) { + return "{}"; + } + } + + public String toLogLine() { + return "ADB_JSON " + toJson().replace('\n', ' '); + } + + private static int findFirstNonLegacyPort(List connect) { + for (String endpoint : connect) { + if (TextUtils.isEmpty(endpoint) || !endpoint.contains(":")) { + continue; + } + int port = parsePort(endpoint); + if (port > 0 && port != LEGACY_TCP_PORT) { + return port; + } + } + return -1; + } + + private static int parsePort(String endpoint) { + int idx = endpoint.lastIndexOf(':'); + if (idx < 0) { + return -1; + } + try { + return Integer.parseInt(endpoint.substring(idx + 1)); + } catch (NumberFormatException e) { + return -1; + } + } + + private static JSONArray toJsonArray(List values) { + JSONArray array = new JSONArray(); + for (String value : values) { + if (!TextUtils.isEmpty(value)) { + array.put(value); + } + } + return array; + } + + public static List mergeEndpoints(List ips, List ports) { + Set out = new LinkedHashSet<>(); + for (String ip : ips) { + if (TextUtils.isEmpty(ip)) { + continue; + } + for (Integer port : ports) { + if (port != null && port > 0 && port < 65536) { + out.add(ip + ":" + port); + } + } + } + return new ArrayList<>(out); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevAdbMdnsProbe.java b/app/src/main/java/com/foxx/androidcast/dev/DevAdbMdnsProbe.java new file mode 100644 index 0000000..5be8de0 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevAdbMdnsProbe.java @@ -0,0 +1,117 @@ +package com.foxx.androidcast.dev; + +import android.content.Context; +import android.net.nsd.NsdManager; +import android.net.nsd.NsdServiceInfo; +import android.os.Build; +import android.util.Log; + +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +/** Discover local wireless-adb ports via mDNS (_adb-tls-connect._tcp, legacy _adb._tcp). */ +final class DevAdbMdnsProbe { + private static final String[] SERVICE_TYPES = { + "_adb-tls-connect._tcp", + "_adb._tcp", + "_adb-tls-pairing._tcp", + }; + + private DevAdbMdnsProbe() {} + + static List discoverPorts(Context context, long timeoutMs) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { + return new ArrayList<>(); + } + NsdManager nsd = (NsdManager) context.getSystemService(Context.NSD_SERVICE); + if (nsd == null) { + return new ArrayList<>(); + } + Set ports = new LinkedHashSet<>(); + Set localIps = new LinkedHashSet<>(DevAdbWifiHelper.collectWifiIpv4Addresses(context)); + CountDownLatch done = new CountDownLatch(1); + AtomicBoolean stopped = new AtomicBoolean(false); + + NsdManager.DiscoveryListener listener = new NsdManager.DiscoveryListener() { + @Override + public void onDiscoveryStarted(String serviceType) { + Log.d(DevAdbConnectInfo.LOG_TAG, "mDNS discovery started: " + serviceType); + } + + @Override + public void onServiceFound(NsdServiceInfo serviceInfo) { + nsd.resolveService(serviceInfo, new NsdManager.ResolveListener() { + @Override + public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { + Log.d(DevAdbConnectInfo.LOG_TAG, + "mDNS resolve failed code=" + errorCode); + } + + @Override + public void onServiceResolved(NsdServiceInfo info) { + int port = info.getPort(); + if (port <= 0 || port >= 65536) { + return; + } + String host = info.getHost() != null ? info.getHost().getHostAddress() : ""; + if (!localIps.isEmpty() + && host != null + && !host.isEmpty() + && !localIps.contains(host)) { + return; + } + ports.add(port); + Log.i(DevAdbConnectInfo.LOG_TAG, + "mDNS adb port " + port + " type=" + info.getServiceType()); + } + }); + } + + @Override + public void onServiceLost(NsdServiceInfo serviceInfo) {} + + @Override + public void onDiscoveryStopped(String serviceType) { + if (stopped.compareAndSet(false, true)) { + done.countDown(); + } + } + + @Override + public void onStartDiscoveryFailed(String serviceType, int errorCode) { + Log.d(DevAdbConnectInfo.LOG_TAG, + "mDNS start failed type=" + serviceType + " code=" + errorCode); + if (stopped.compareAndSet(false, true)) { + done.countDown(); + } + } + + @Override + public void onStopDiscoveryFailed(String serviceType, int errorCode) { + if (stopped.compareAndSet(false, true)) { + done.countDown(); + } + } + }; + + try { + nsd.discoverServices(SERVICE_TYPES[0], NsdManager.PROTOCOL_DNS_SD, listener); + if (!done.await(timeoutMs, TimeUnit.MILLISECONDS)) { + Log.d(DevAdbConnectInfo.LOG_TAG, "mDNS discovery timed out"); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } finally { + try { + nsd.stopServiceDiscovery(listener); + } catch (Exception ignored) { + } + } + return new ArrayList<>(ports); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiHelper.java b/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiHelper.java new file mode 100644 index 0000000..4a421d9 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiHelper.java @@ -0,0 +1,294 @@ +package com.foxx.androidcast.dev; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.net.ConnectivityManager; +import android.net.LinkAddress; +import android.net.LinkProperties; +import android.net.Network; +import android.net.NetworkCapabilities; +import android.os.Build; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; + +import com.foxx.androidcast.remoteaccess.control.RemoteAccessControlClient; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.lang.reflect.Method; +import java.net.Inet4Address; +import java.net.InetAddress; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** Re-enable adb / wireless debugging and collect adb connect endpoints (debug builds). */ +public final class DevAdbWifiHelper { + private static final String GLOBAL_ADB_WIFI_ENABLED = "adb_wifi_enabled"; + private static final Pattern ENDPOINT_PATTERN = + Pattern.compile("(\\d{1,3}(?:\\.\\d{1,3}){3}):(\\d{2,5})"); + + private DevAdbWifiHelper() {} + + public static DevAdbConnectInfo refresh(Context context) { + Context app = context.getApplicationContext(); + boolean secure = hasWriteSecureSettings(app); + boolean adbEnabled = isGlobalFlagOn(app, Settings.Global.ADB_ENABLED); + boolean adbWifiEnabled = Build.VERSION.SDK_INT < 30 + || isGlobalFlagOn(app, GLOBAL_ADB_WIFI_ENABLED); + + if (secure) { + enableDeveloperAdb(app); + adbEnabled = isGlobalFlagOn(app, Settings.Global.ADB_ENABLED); + adbWifiEnabled = Build.VERSION.SDK_INT < 30 + || isGlobalFlagOn(app, GLOBAL_ADB_WIFI_ENABLED); + } else { + Log.w(DevAdbConnectInfo.LOG_TAG, + "WRITE_SECURE_SETTINGS not granted — cannot auto re-enable adb wifi"); + } + + List ips = collectWifiIpv4Addresses(app); + List ports = discoverPorts(app); + ports.addAll(DevAdbMdnsProbe.discoverPorts(app, 2500L)); + List connect = buildConnectEndpoints(ips, ports); + connect.addAll(parseDumpsysEndpoints(runDumpsysAdb(app))); + + List dedupedConnect = orderConnectEndpoints(dedupe(connect), ports); + long now = System.currentTimeMillis(); + DevAdbConnectInfo.RaControlEndpoint raControl = RemoteAccessControlClient.snapshotForAdb(app); + return new DevAdbConnectInfo( + ips, + dedupedConnect, + adbEnabled, + adbWifiEnabled, + secure, + DevAdbConnectInfo.LEGACY_TCP_PORT, + now, + raControl); + } + + private static void enableDeveloperAdb(Context context) { + try { + Settings.Global.putInt( + context.getContentResolver(), + Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, + 1); + if (Build.VERSION.SDK_INT >= 30) { + Settings.Global.putInt(context.getContentResolver(), GLOBAL_ADB_WIFI_ENABLED, 1); + } + // Toggle USB debugging on to kick adbd after Wi-Fi drops. + Settings.Global.putInt(context.getContentResolver(), Settings.Global.ADB_ENABLED, 0); + Settings.Global.putInt(context.getContentResolver(), Settings.Global.ADB_ENABLED, 1); + if (Build.VERSION.SDK_INT >= 30) { + Settings.Global.putInt(context.getContentResolver(), GLOBAL_ADB_WIFI_ENABLED, 1); + } + } catch (SecurityException e) { + Log.w(DevAdbConnectInfo.LOG_TAG, "enableDeveloperAdb denied", e); + } + } + + public static boolean hasWriteSecureSettings(Context context) { + return context.checkSelfPermission("android.permission.WRITE_SECURE_SETTINGS") + == PackageManager.PERMISSION_GRANTED; + } + + private static boolean isGlobalFlagOn(Context context, String key) { + try { + return Settings.Global.getInt(context.getContentResolver(), key, 0) == 1; + } catch (Exception e) { + return false; + } + } + + static List collectWifiIpv4Addresses(Context context) { + Set ips = new LinkedHashSet<>(); + ConnectivityManager cm = + (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm == null) { + return new ArrayList<>(); + } + for (Network network : cm.getAllNetworks()) { + NetworkCapabilities caps = cm.getNetworkCapabilities(network); + if (caps == null || !caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + continue; + } + LinkProperties props = cm.getLinkProperties(network); + if (props == null) { + continue; + } + for (LinkAddress link : props.getLinkAddresses()) { + InetAddress address = link.getAddress(); + if (address instanceof Inet4Address && !address.isLoopbackAddress()) { + ips.add(address.getHostAddress()); + } + } + } + return new ArrayList<>(ips); + } + + private static List discoverPorts(Context context) { + Set ports = new LinkedHashSet<>(); + + int tlsProp = parsePositiveInt(readSystemProperty("service.adb.tls.port")); + if (tlsProp > 0) { + ports.add(tlsProp); + } + int tcpProp = parsePositiveInt(readSystemProperty("service.adb.tcp.port")); + if (tcpProp > 0) { + ports.add(tcpProp); + } + int persistTls = parsePositiveInt(readSystemProperty("persist.adb.tls_server.port")); + if (persistTls > 0) { + ports.add(persistTls); + } + + for (String key : new String[] {"adb_wifi_port", "adb_wifi_tls_port", "adb_port"}) { + int fromSettings = readGlobalInt(context, key, -1); + if (fromSettings > 0) { + ports.add(fromSettings); + } + String asString = readGlobalString(context, key); + int parsed = parsePositiveInt(asString); + if (parsed > 0) { + ports.add(parsed); + } + } + if (ports.isEmpty()) { + ports.add(DevAdbConnectInfo.LEGACY_TCP_PORT); + } + return new ArrayList<>(ports); + } + + private static List buildConnectEndpoints(List ips, List ports) { + List endpoints = DevAdbConnectInfo.mergeEndpoints(ips, ports); + if (endpoints.isEmpty() && !ips.isEmpty()) { + endpoints.add(ips.get(0) + ":" + DevAdbConnectInfo.LEGACY_TCP_PORT); + } + return endpoints; + } + + /** Prefer TLS / mDNS ports over legacy :5555 guesses. */ + private static List orderConnectEndpoints(List endpoints, List ports) { + boolean hasNonLegacy = false; + for (Integer port : ports) { + if (port != null && port != DevAdbConnectInfo.LEGACY_TCP_PORT) { + hasNonLegacy = true; + break; + } + } + if (!hasNonLegacy) { + return endpoints; + } + List preferred = new ArrayList<>(); + List legacy = new ArrayList<>(); + for (String endpoint : endpoints) { + if (endpoint.endsWith(":" + DevAdbConnectInfo.LEGACY_TCP_PORT)) { + legacy.add(endpoint); + } else { + preferred.add(endpoint); + } + } + preferred.addAll(legacy); + return preferred; + } + + private static String readSystemProperty(String key) { + try { + Class clazz = Class.forName("android.os.SystemProperties"); + Method get = clazz.getMethod("get", String.class, String.class); + Object value = get.invoke(null, key, ""); + return value != null ? value.toString() : ""; + } catch (Exception ignored) { + return ""; + } + } + + private static int readGlobalInt(Context context, String key, int def) { + try { + return Settings.Global.getInt(context.getContentResolver(), key, def); + } catch (Exception e) { + return def; + } + } + + private static String readGlobalString(Context context, String key) { + try { + String value = Settings.Global.getString(context.getContentResolver(), key); + return value != null ? value : ""; + } catch (Exception e) { + return ""; + } + } + + private static int parsePositiveInt(String raw) { + if (TextUtils.isEmpty(raw)) { + return -1; + } + try { + int value = Integer.parseInt(raw.trim()); + return value > 0 ? value : -1; + } catch (NumberFormatException e) { + return -1; + } + } + + private static String runDumpsysAdb(Context context) { + if (context.checkSelfPermission("android.permission.DUMP") + != PackageManager.PERMISSION_GRANTED) { + return ""; + } + Process process = null; + try { + process = new ProcessBuilder("dumpsys", "adb") + .redirectErrorStream(true) + .start(); + if (!process.waitFor(3, TimeUnit.SECONDS)) { + process.destroyForcibly(); + return ""; + } + StringBuilder out = new StringBuilder(); + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(process.getInputStream()))) { + String line; + while ((line = reader.readLine()) != null) { + out.append(line).append('\n'); + } + } + return out.toString(); + } catch (Exception e) { + Log.d(DevAdbConnectInfo.LOG_TAG, "dumpsys adb unavailable", e); + return ""; + } finally { + if (process != null) { + process.destroy(); + } + } + } + + static List parseDumpsysEndpoints(String dumpsys) { + Set endpoints = new LinkedHashSet<>(); + if (TextUtils.isEmpty(dumpsys)) { + return new ArrayList<>(); + } + Matcher matcher = ENDPOINT_PATTERN.matcher(dumpsys); + while (matcher.find()) { + endpoints.add(matcher.group(1) + ":" + matcher.group(2)); + } + return new ArrayList<>(endpoints); + } + + private static List dedupe(List values) { + Set out = new LinkedHashSet<>(); + for (String value : values) { + if (!TextUtils.isEmpty(value)) { + out.add(value.trim()); + } + } + return new ArrayList<>(out); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiKeeper.java b/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiKeeper.java new file mode 100644 index 0000000..488f773 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiKeeper.java @@ -0,0 +1,225 @@ +package com.foxx.androidcast.dev; + +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.Network; +import android.net.NetworkCapabilities; +import android.net.NetworkRequest; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.BuildConfig; +import com.foxx.androidcast.CastTrayNotifier; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** Debug-only: re-enable adb wifi on network changes and publish connect info. */ +public final class DevAdbWifiKeeper { + private static final ExecutorService WORKER = Executors.newSingleThreadExecutor(r -> { + Thread t = new Thread(r, "DevAdbWifiKeeper"); + t.setDaemon(true); + return t; + }); + private static final Handler MAIN = new Handler(Looper.getMainLooper()); + + private static volatile DevAdbWifiKeeper instance; + + private final Context appContext; + private final DevAdbConnectHttpServer httpServer = new DevAdbConnectHttpServer(); + private final ConnectivityManager.NetworkCallback networkCallback = + new ConnectivityManager.NetworkCallback() { + @Override + public void onAvailable(Network network) { + scheduleRefresh("network-available"); + } + + @Override + public void onCapabilitiesChanged(Network network, NetworkCapabilities caps) { + if (caps != null && caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) { + scheduleRefresh("network-validated"); + } + } + + @Override + public void onLost(Network network) { + scheduleRefresh("network-lost"); + } + }; + + private DevAdbConnectInfo lastInfo = new DevAdbConnectInfo( + null, null, false, false, false, DevAdbConnectInfo.LEGACY_TCP_PORT, 0L); + private boolean registered; + + private DevAdbWifiKeeper(Context context) { + appContext = context.getApplicationContext(); + } + + public static void ensureStarted(Context context) { + if (!BuildConfig.DEBUG) { + return; + } + if (!AppPreferences.isDevAdbWifiKeeperEnabled(context)) { + stop(context); + return; + } + if (instance == null) { + synchronized (DevAdbWifiKeeper.class) { + if (instance == null) { + instance = new DevAdbWifiKeeper(context); + } + } + } + instance.start(); + } + + public static void stop(Context context) { + DevAdbWifiKeeper keeper = instance; + if (keeper != null) { + keeper.shutdown(); + } + instance = null; + } + + public static void onPreferenceChanged(Context context, boolean enabled) { + if (!BuildConfig.DEBUG) { + return; + } + if (enabled) { + ensureStarted(context); + refreshNow(context, "preference-enabled"); + } else { + stop(context); + } + } + + public static void refreshNow(Context context, String reason) { + if (!BuildConfig.DEBUG) { + return; + } + ensureStarted(context); + DevAdbWifiKeeper keeper = instance; + if (keeper != null) { + keeper.scheduleRefresh(reason); + } + } + + public static DevAdbConnectInfo getLastInfo(Context context) { + DevAdbWifiKeeper keeper = instance; + if (keeper != null) { + return keeper.lastInfo; + } + return DevAdbWifiHelper.refresh(context); + } + + public static void copyPrimaryConnectLine(Context context) { + DevAdbConnectInfo info = getLastInfo(context); + String line = info.primaryConnectLine(); + if (line.isEmpty()) { + return; + } + ClipboardManager clipboard = + (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + if (clipboard != null) { + clipboard.setPrimaryClip(ClipData.newPlainText("adb connect", "adb connect " + line)); + } + } + + private void start() { + loadCachedJsonIntoHttpServer(); + httpServer.start(); + registerNetworkCallback(); + scheduleRefresh("keeper-start"); + } + + private void loadCachedJsonIntoHttpServer() { + File cached = new File(appContext.getFilesDir(), "dev/adb_connect.json"); + if (!cached.isFile()) { + return; + } + try { + byte[] bytes = java.nio.file.Files.readAllBytes(cached.toPath()); + String json = new String(bytes, StandardCharsets.UTF_8).trim(); + if (!json.isEmpty()) { + httpServer.updatePayload(json); + } + } catch (IOException e) { + Log.d(DevAdbConnectInfo.LOG_TAG, "no cached adb_connect.json", e); + } + } + + private void shutdown() { + unregisterNetworkCallback(); + httpServer.stop(); + CastTrayNotifier.refresh(appContext); + } + + private void registerNetworkCallback() { + if (registered) { + return; + } + ConnectivityManager cm = + (ConnectivityManager) appContext.getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm == null) { + return; + } + NetworkRequest request = new NetworkRequest.Builder() + .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) + .build(); + cm.registerNetworkCallback(request, networkCallback); + registered = true; + } + + private void unregisterNetworkCallback() { + if (!registered) { + return; + } + ConnectivityManager cm = + (ConnectivityManager) appContext.getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + try { + cm.unregisterNetworkCallback(networkCallback); + } catch (Exception ignored) { + } + } + registered = false; + } + + private void scheduleRefresh(String reason) { + WORKER.execute(() -> performRefresh(reason)); + } + + private void performRefresh(String reason) { + DevAdbConnectInfo info = DevAdbWifiHelper.refresh(appContext); + lastInfo = info; + String json = info.toJson(); + httpServer.updatePayload(json); + writeJsonFile(json); + Log.i(DevAdbConnectInfo.LOG_TAG, info.toLogLine()); + Log.d(DevAdbConnectInfo.LOG_TAG, "refresh reason=" + reason + + " secure=" + info.secureSettingsGranted + + " connect=" + info.connect); + MAIN.post(() -> CastTrayNotifier.refresh(appContext)); + } + + private void writeJsonFile(String json) { + File dir = new File(appContext.getFilesDir(), "dev"); + if (!dir.exists() && !dir.mkdirs()) { + return; + } + File out = new File(dir, "adb_connect.json"); + try (FileOutputStream fos = new FileOutputStream(out, false)) { + fos.write(json.getBytes(StandardCharsets.UTF_8)); + } catch (IOException e) { + Log.w(DevAdbConnectInfo.LOG_TAG, "write adb_connect.json failed", e); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiReceiver.java b/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiReceiver.java new file mode 100644 index 0000000..b32fd07 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevAdbWifiReceiver.java @@ -0,0 +1,18 @@ +package com.foxx.androidcast.dev; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +import com.foxx.androidcast.BuildConfig; + +/** adb shell am broadcast -a com.foxx.androidcast.dev.REFRESH_ADB_WIFI */ +public final class DevAdbWifiReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if (!BuildConfig.DEBUG) { + return; + } + DevAdbWifiKeeper.refreshNow(context, "broadcast"); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevDiagnosticsController.java b/app/src/main/java/com/foxx/androidcast/dev/DevDiagnosticsController.java new file mode 100644 index 0000000..52cb1a1 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevDiagnosticsController.java @@ -0,0 +1,179 @@ +package com.foxx.androidcast.dev; + +import android.os.Handler; +import android.os.Looper; +import android.view.View; +import android.widget.Button; +import android.widget.ProgressBar; +import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; + +import com.foxx.androidcast.R; + +import java.util.LinkedHashMap; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicBoolean; + +/** Runs async diagnostics and binds results to the Diagnostics tab cards. */ +public final class DevDiagnosticsController { + public enum Section { + HW(R.id.dev_diag_hw, R.string.dev_diag_hw_title), + CAMERA(R.id.dev_diag_camera, R.string.dev_diag_camera_title), + AUDIO(R.id.dev_diag_audio, R.string.dev_diag_audio_title), + AUDIO_CODECS(R.id.dev_diag_audio_codecs, R.string.dev_diag_audio_codecs_title), + NETWORK(R.id.dev_diag_network, R.string.dev_diag_network_title), + CASTING(R.id.dev_diag_casting, R.string.dev_diag_casting_title), + ADVERTISEMENT(R.id.dev_diag_advertisement, R.string.dev_diag_advertisement_title); + + final int includeId; + final int titleRes; + + Section(int includeId, int titleRes) { + this.includeId = includeId; + this.titleRes = titleRes; + } + } + + private final AppCompatActivity activity; + private final View diagnosticsRoot; + private final Map cards = new LinkedHashMap<>(); + private final ExecutorService executor = Executors.newSingleThreadExecutor(); + private final Handler main = new Handler(Looper.getMainLooper()); + private final AtomicBoolean cancel = new AtomicBoolean(false); + private final AtomicBoolean running = new AtomicBoolean(false); + + private DevDiagnosticsReport lastReport; + + public DevDiagnosticsController(AppCompatActivity activity) { + this.activity = activity; + this.diagnosticsRoot = activity.findViewById(R.id.dev_panel_diagnostics); + for (Section s : Section.values()) { + View cardRoot = diagnosticsRoot.findViewById(s.includeId); + TextView title = cardRoot.findViewById(R.id.dev_diag_card_title); + TextView body = cardRoot.findViewById(R.id.dev_diag_card_body); + ProgressBar spinner = cardRoot.findViewById(R.id.dev_diag_card_spinner); + title.setText(activity.getString(s.titleRes)); + body.setText(R.string.dev_diag_pending); + cards.put(s, new CardViews(activity, body, spinner)); + } + Button stop = diagnosticsRoot.findViewById(R.id.btn_dev_diag_stop); + stop.setOnClickListener(v -> stopTests()); + } + + public void onDiagnosticsTabShown() { + if (!running.get()) { + startTests(); + } + } + + public void onDestroy() { + cancel.set(true); + executor.shutdownNow(); + } + + public void stopTests() { + cancel.set(true); + } + + /** Last completed report (for future BE upload). */ + public DevDiagnosticsReport getLastReport() { + return lastReport; + } + + private void startTests() { + cancel.set(false); + running.set(true); + for (CardViews c : cards.values()) { + c.showRunning(); + } + executor.execute(this::runSuite); + } + + private void runSuite() { + Map sectionText = new LinkedHashMap<>(); + try { + runSection(Section.HW, () -> + DevDiagnosticsProbe.probeHardwareAcceleration(activity), sectionText); + runSection(Section.CAMERA, () -> + DevDiagnosticsProbe.probeCameraCapture(activity), sectionText); + runSection(Section.AUDIO, () -> + DevDiagnosticsProbe.probeAudioCapture(activity), sectionText); + runSection(Section.AUDIO_CODECS, () -> + DevDiagnosticsProbe.probeAudioCodecs(activity), sectionText); + runSection(Section.NETWORK, () -> + DevDiagnosticsProbe.probeNetwork(activity, cancel), sectionText); + runSection(Section.CASTING, () -> + DevDiagnosticsProbe.probeCastingExtras(activity), sectionText); + runSection(Section.ADVERTISEMENT, () -> + DevDiagnosticsProbe.probeFullAdvertisementInfo(activity), sectionText); + } finally { + if (!cancel.get()) { + lastReport = new DevDiagnosticsReport(System.currentTimeMillis(), sectionText); + } + main.post(() -> { + running.set(false); + if (cancel.get()) { + for (CardViews c : cards.values()) { + c.showStopped(); + } + } + }); + } + } + + private void runSection(Section section, Probe probe, Map out) { + if (cancel.get()) { + main.post(() -> cards.get(section).showStopped()); + return; + } + main.post(() -> cards.get(section).showRunning()); + String text; + try { + text = probe.run(); + } catch (Exception e) { + text = "Error: " + e.getMessage(); + } + if (cancel.get()) { + main.post(() -> cards.get(section).showStopped()); + return; + } + out.put(section.name().toLowerCase(Locale.ROOT), text); + String finalText = text; + main.post(() -> cards.get(section).showResult(finalText)); + } + + private interface Probe { + String run(); + } + + private static final class CardViews { + private final AppCompatActivity activity; + private final TextView body; + private final ProgressBar spinner; + + CardViews(AppCompatActivity activity, TextView body, ProgressBar spinner) { + this.activity = activity; + this.body = body; + this.spinner = spinner; + } + + void showRunning() { + spinner.setVisibility(View.VISIBLE); + body.setText(activity.getString(R.string.dev_diag_running)); + } + + void showResult(String text) { + spinner.setVisibility(View.GONE); + body.setText(text); + } + + void showStopped() { + spinner.setVisibility(View.GONE); + body.setText(activity.getString(R.string.dev_diag_stopped)); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevDiagnosticsProbe.java b/app/src/main/java/com/foxx/androidcast/dev/DevDiagnosticsProbe.java new file mode 100644 index 0000000..c1f95ce --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevDiagnosticsProbe.java @@ -0,0 +1,447 @@ +package com.foxx.androidcast.dev; + +import android.Manifest; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraManager; +import android.hardware.camera2.params.StreamConfigurationMap; +import android.media.MediaCodecInfo; +import android.media.MediaCodecList; +import android.media.MediaFormat; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; +import android.net.Uri; +import android.os.Build; +import android.util.Size; + +import androidx.core.content.ContextCompat; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.BuildConfig; +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.PlatformCastSupport; +import com.foxx.androidcast.crash.CrashSettingsStore; +import com.foxx.androidcast.display.WiredDisplayMonitor; +import com.foxx.androidcast.media.CodecPriorityCatalog; +import com.foxx.androidcast.media.CodecTier; +import com.foxx.androidcast.media.codec.jni.NativeCodecBridge; +import com.foxx.androidcast.network.CastCodecFlags; +import com.foxx.androidcast.network.transport.StreamProtectionCapability; +import com.foxx.androidcast.sender.CodecCatalog; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.InetAddress; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.atomic.AtomicBoolean; + +/** Read-only device probes for developer diagnostics (no user interaction). */ +public final class DevDiagnosticsProbe { + private static final int HTTP_TIMEOUT_MS = 6_000; + + private DevDiagnosticsProbe() {} + + public static String probeHardwareAcceleration(Context context) { + CodecCatalog.invalidateCapabilities(); + CastSettings settings = AppPreferences.loadSenderDefaults(context); + StringBuilder sb = new StringBuilder(); + sb.append("API ").append(Build.VERSION.SDK_INT).append('\n'); + sb.append("Native JNI probes:\n"); + sb.append(" libvpx: ").append(NativeCodecBridge.isLibvpxAvailable() ? "yes" : "no").append('\n'); + sb.append(" Opus: ").append(NativeCodecBridge.isOpusAvailable() ? "yes (lib linked)" : "no (stub→AAC)") + .append('\n'); + sb.append(" Speex: ").append(NativeCodecBridge.isSpeexAvailable() ? "yes (lib linked)" : "no (stub→AAC)") + .append('\n'); + sb.append('\n').append("Video encoders (MediaCodec):\n"); + appendVideoCodecLines(sb, true, settings); + List swEnc = CodecCatalog.localNativeSoftwareVideoLines(settings); + if (!swEnc.isEmpty()) { + sb.append('\n').append("Video encoders (bundled SW, not in MediaCodec list):\n"); + for (String line : swEnc) { + sb.append(line).append('\n'); + } + } + sb.append('\n').append("Video decoders (MediaCodec):\n"); + appendVideoCodecLines(sb, false, settings); + if (!swEnc.isEmpty()) { + sb.append('\n').append("Video decoders (bundled SW):\n"); + for (String line : CodecCatalog.localNativeSoftwareVideoDecoderLines(settings)) { + sb.append(line).append('\n'); + } + } + sb.append('\n').append("MIME summary (catalog):\n"); + sb.append(" advertised enc: ").append(join(CodecCatalog.localEncoderMimes())).append('\n'); + sb.append(" advertised dec: ").append(join(CodecCatalog.localDecoderMimes())); + if (NativeCodecBridge.isLibvpxAvailable()) { + sb.append('\n').append(" native SW: video/vp8, video/vp9 (libvpx JNI)"); + } + return sb.toString().trim(); + } + + public static String probeCameraCapture(Context context) { + StringBuilder sb = new StringBuilder(); + sb.append("Camera2 capture modes (cast settings):\n"); + List modes = new ArrayList<>(); + modes.add(context.getString(com.foxx.androidcast.R.string.capture_full_screen)); + if (PlatformCastSupport.isCaptureUserChoiceSupported()) { + modes.add(context.getString(com.foxx.androidcast.R.string.capture_user_choice)); + } else { + modes.add(context.getString(com.foxx.androidcast.R.string.capture_user_choice_unavailable, + Build.VERSION.SDK_INT)); + } + if (PlatformCastSupport.isCameraCaptureModeSupported()) { + modes.add(context.getString(com.foxx.androidcast.R.string.capture_camera_rear)); + if (PlatformCastSupport.hasFrontCamera(context)) { + modes.add(context.getString(com.foxx.androidcast.R.string.capture_camera_front)); + } + } else { + modes.add(context.getString(com.foxx.androidcast.R.string.capture_camera_unavailable)); + } + modes.add(context.getString(com.foxx.androidcast.R.string.capture_calibration_test)); + for (String m : modes) { + sb.append(" • ").append(m).append('\n'); + } + sb.append('\n').append("Physical cameras:\n"); + appendCameraDevices(context, sb); + return sb.toString().trim(); + } + + public static String probeAudioCapture(Context context) { + StringBuilder sb = new StringBuilder(); + boolean api = PlatformCastSupport.isAudioCaptureSupported(); + sb.append("Playback capture (MediaProjection): ") + .append(api ? "supported (API 29+)" : "unavailable").append('\n'); + boolean micPerm = ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO) + == PackageManager.PERMISSION_GRANTED; + sb.append("RECORD_AUDIO granted: ").append(micPerm ? "yes" : "no").append('\n'); + sb.append('\n').append("Runtime modes (AudioCapture):\n"); + if (!api) { + sb.append(" • (none — API < 29)\n"); + } else { + sb.append(" • playback\n"); + sb.append(" • playback+mic (when mic available)\n"); + sb.append(" • mic (calibration / no projection)\n"); + } + return sb.toString().trim(); + } + + public static String probeAudioCodecs(Context context) { + CastSettings settings = AppPreferences.loadSenderDefaults(context); + StringBuilder sb = new StringBuilder(); + sb.append("User preference (sender): ").append(settings.getAudioCodec().name()).append('\n'); + sb.append("Wire mask: 0x").append(Integer.toHexString(CastCodecFlags.localAudioMask())).append('\n'); + sb.append('\n').append("Settings choices (priority order after AUTO):\n"); + for (CodecCatalog.AudioCodecChoice c : CodecCatalog.audioCodecChoicesForUi(settings)) { + if (c.codec == CastSettings.AudioCodec.AUTO) { + sb.append(" • AUTO\n"); + continue; + } + String marker = c.codec == settings.getAudioCodec() ? " ← user" : ""; + sb.append(String.format(Locale.US, " • %s pri=%d%s\n", + c.codec.name(), c.priorityScore, marker)); + } + sb.append('\n').append("MIME summary (catalog):\n"); + sb.append(" advertised enc:\n"); + for (String line : CodecCatalog.localAdvertisedAudioEncoderLines(settings)) { + sb.append(line).append('\n'); + } + sb.append(" advertised dec:\n"); + for (String line : CodecCatalog.localAdvertisedAudioDecoderLines(settings)) { + sb.append(line).append('\n'); + } + sb.append('\n').append("Audio encoders (MediaCodec):\n"); + appendAudioCodecLines(sb, true); + sb.append('\n').append("Audio decoders (MediaCodec):\n"); + appendAudioCodecLines(sb, false); + return sb.toString().trim(); + } + + public static String probeNetwork(Context context, AtomicBoolean cancel) { + StringBuilder sb = new StringBuilder(); + sb.append(connectivitySummary(context)).append('\n'); + String crashUrl = resolveCrashUploadUrl(context); + sb.append('\n').append(probeHttp("Crash upload", crashUrl, cancel)); + appendOtaProbe(sb, context, cancel); + sb.append('\n').append("-----").append('\n'); + sb.append(DevVpnStatusProbe.formatForDiagnostics(context)); + return sb.toString().trim(); + } + + private static void appendOtaProbe(StringBuilder sb, Context context, AtomicBoolean cancel) { + String otaUrl = resolveOtaUrl(context); + if (otaUrl.isEmpty()) { + sb.append('\n').append("OTA channel: (not configured — ok for debug)"); + return; + } + String trimmed = otaUrl.trim(); + String host = null; + try { + host = Uri.parse(trimmed).getHost(); + } catch (Exception ignored) { + // fall through + } + if (host == null || host.isEmpty()) { + String shown = trimmed.length() > 96 ? trimmed.substring(0, 96) + "…" : trimmed; + sb.append('\n').append("OTA channel: (invalid URL — ").append(shown) + .append("; ok if OTA unused)"); + return; + } + if (cancel != null && cancel.get()) { + sb.append('\n').append("OTA channel: stopped"); + return; + } + sb.append('\n').append(probeHttp("OTA channel", trimmed, cancel)); + } + + /** Wire advertisement summary (last card on diagnostics tab). */ + public static String probeFullAdvertisementInfo(Context context) { + CastSettings settings = AppPreferences.loadSenderDefaults(context); + StringBuilder sb = new StringBuilder(); + sb.append("[audio adv] ").append(join(CodecCatalog.localAdvertisedAudioCodecsInOrder(settings))) + .append(" · mask 0x") + .append(Integer.toHexString(CastCodecFlags.localAudioMask())) + .append('\n'); + List videoMimes = CodecCatalog.localAdvertisedVideoMimesInOrder(); + sb.append("[video adv] ").append(join(videoMimes)); + List videoCodecs = CodecCatalog.localAdvertisedVideoCodecsInOrder(settings); + if (!videoCodecs.isEmpty()) { + sb.append(" (").append(join(videoCodecs)).append(')'); + } + sb.append('\n'); + sb.append("[protection adv] ").append(join(StreamProtectionCapability.advertisedProtectionInOrder())) + .append('\n'); + sb.append("-----"); + return sb.toString(); + } + + public static String probeCastingExtras(Context context) { + StringBuilder sb = new StringBuilder(); + PackageManager pm = context.getPackageManager(); + sb.append("Wi‑Fi Direct (OS): ") + .append(pm.hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT) ? "yes" : "no") + .append('\n'); + sb.append("Miracast / Wi‑Fi Display: ") + .append(miracastSummary(pm)) + .append(" (in-app cast uses MediaProjection, not WFD)\n"); + WiredDisplayMonitor monitor = WiredDisplayMonitor.getInstance(context); + monitor.ensureRegistered(); + sb.append('\n').append("HDMI / external display:\n ") + .append(monitor.getSummaryLine().replace("\n", "\n ")) + .append('\n'); + sb.append('\n').append("MediaProjection screen capture: ") + .append(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? "available" : "N/A") + .append('\n'); + sb.append("App/screen picker (API 34+): ") + .append(PlatformCastSupport.isCaptureUserChoiceSupported() ? "yes" : "no") + .append('\n'); + sb.append("Google Cast resolver: ") + .append(resolveCastIntent(pm) ? "activity found" : "none") + .append('\n'); + sb.append("Nearby / Share resolver: ") + .append(resolveNearbyShare(pm) ? "activity found" : "none"); + return sb.toString().trim(); + } + + private static void appendVideoCodecLines(StringBuilder sb, boolean encoder, CastSettings settings) { + List lines = new ArrayList<>(); + MediaCodecList list = new MediaCodecList(MediaCodecList.REGULAR_CODECS); + for (MediaCodecInfo info : list.getCodecInfos()) { + if (info.isEncoder() != encoder) { + continue; + } + boolean hw = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && info.isHardwareAccelerated(); + CodecTier tier = hw ? CodecTier.HARDWARE : CodecTier.SOFTWARE; + String tierTag = hw ? "HW" : "SW"; + for (String type : info.getSupportedTypes()) { + if (type == null || !type.startsWith("video/")) { + continue; + } + int score = CodecPriorityCatalog.priorityScoreForVideoMime(type, tier, settings); + lines.add(formatCodecDiagLine(tierTag, score, type, info.getName())); + } + } + if (lines.isEmpty()) { + sb.append(" (none)\n"); + return; + } + for (String line : lines) { + sb.append(line).append('\n'); + } + } + + /** `[HW:0042] MIME: 'video/avc', c2.unisoc.avc.encoder` — tier tag + catalog priority score. */ + private static String formatCodecDiagLine(String tierTag, int priorityScore, String mime, String codecName) { + return String.format(Locale.US, " [%s:%04d] MIME: '%s', %s", tierTag, priorityScore, mime, codecName); + } + + private static void appendAudioCodecLines(StringBuilder sb, boolean encoder) { + List lines = new ArrayList<>(); + MediaCodecList list = new MediaCodecList(MediaCodecList.REGULAR_CODECS); + for (MediaCodecInfo info : list.getCodecInfos()) { + if (info.isEncoder() != encoder) { + continue; + } + boolean hw = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && info.isHardwareAccelerated(); + for (String type : info.getSupportedTypes()) { + if (type == null || !type.startsWith("audio/")) { + continue; + } + lines.add(String.format(Locale.US, " %s [%s] %s", type, hw ? "HW" : "SW", info.getName())); + } + } + if (lines.isEmpty()) { + sb.append(" (none)\n"); + return; + } + for (String line : lines) { + sb.append(line).append('\n'); + } + } + + private static void appendCameraDevices(Context context, StringBuilder sb) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + sb.append(" (Camera2 modes need API 29+)\n"); + return; + } + try { + CameraManager mgr = context.getSystemService(CameraManager.class); + if (mgr == null) { + sb.append(" (no CameraManager)\n"); + return; + } + for (String id : mgr.getCameraIdList()) { + CameraCharacteristics ch = mgr.getCameraCharacteristics(id); + Integer facing = ch.get(CameraCharacteristics.LENS_FACING); + String facingStr = facing == null ? "?" : + facing == CameraCharacteristics.LENS_FACING_FRONT ? "front" : + facing == CameraCharacteristics.LENS_FACING_BACK ? "back" : "other"; + StreamConfigurationMap map = ch.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); + int outputs = 0; + if (map != null) { + Size[] sizes = map.getOutputSizes(android.graphics.ImageFormat.YUV_420_888); + outputs = sizes != null ? sizes.length : 0; + } + sb.append(" • id=").append(id) + .append(" ").append(facingStr) + .append(", YUV outputs=").append(outputs) + .append('\n'); + } + } catch (CameraAccessException | SecurityException e) { + sb.append(" Error: ").append(e.getMessage()).append('\n'); + } + } + + private static String connectivitySummary(Context context) { + ConnectivityManager cm = context.getSystemService(ConnectivityManager.class); + if (cm == null) { + return "Connectivity: unknown"; + } + android.net.Network net = cm.getActiveNetwork(); + if (net == null) { + return "Connectivity: no active network"; + } + NetworkCapabilities caps = cm.getNetworkCapabilities(net); + if (caps == null) { + return "Connectivity: active network (no caps)"; + } + List parts = new ArrayList<>(); + if (caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + parts.add("Wi‑Fi"); + } + if (caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + parts.add("cellular"); + } + if (caps.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) { + parts.add("ethernet"); + } + if (caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) { + parts.add("internet"); + } + return "Connectivity: " + (parts.isEmpty() ? "other" : String.join(", ", parts)); + } + + private static String probeHttp(String label, String url, AtomicBoolean cancel) { + if (cancel != null && cancel.get()) { + return label + ": stopped"; + } + if (url == null || url.trim().isEmpty()) { + return label + ": (no URL configured)"; + } + String trimmed = url.trim(); + long t0 = System.currentTimeMillis(); + try { + String host = Uri.parse(trimmed).getHost(); + if (host != null && !host.isEmpty()) { + InetAddress addr = InetAddress.getByName(host); + long dnsMs = System.currentTimeMillis() - t0; + if (cancel != null && cancel.get()) { + return label + ": stopped"; + } + HttpURLConnection conn = (HttpURLConnection) new URL(trimmed).openConnection(); + conn.setConnectTimeout(HTTP_TIMEOUT_MS); + conn.setReadTimeout(HTTP_TIMEOUT_MS); + conn.setRequestMethod("HEAD"); + conn.setInstanceFollowRedirects(true); + int code = conn.getResponseCode(); + long totalMs = System.currentTimeMillis() - t0; + conn.disconnect(); + return label + ": HTTP " + code + ", DNS " + dnsMs + " ms, total " + totalMs + " ms" + + " (" + addr.getHostAddress() + ")"; + } + return label + ": invalid URL"; + } catch (IOException e) { + return label + ": fail — " + e.getClass().getSimpleName() + ": " + e.getMessage() + + " (" + (System.currentTimeMillis() - t0) + " ms)"; + } + } + + private static String resolveCrashUploadUrl(Context context) { + return CrashSettingsStore.load(context).uploadUrl; + } + + private static String resolveOtaUrl(Context context) { + String url = AppPreferences.getOtaChannelUrl(context); + if (url.isEmpty() && BuildConfig.OTA_CHANNEL_URL_DEFAULT != null) { + url = BuildConfig.OTA_CHANNEL_URL_DEFAULT.trim(); + } + return url; + } + + private static String miracastSummary(PackageManager pm) { + if (pm.hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT)) { + return "likely via OS Wi‑Fi Display stack"; + } + return "not reported"; + } + + private static boolean resolveCastIntent(PackageManager pm) { + Intent i = new Intent("android.settings.CAST_SETTINGS"); + return i.resolveActivity(pm) != null; + } + + private static boolean resolveNearbyShare(PackageManager pm) { + Intent i = new Intent(Intent.ACTION_SEND); + i.setType("video/*"); + return i.resolveActivity(pm) != null; + } + + private static String join(List list) { + if (list == null || list.isEmpty()) { + return "(none)"; + } + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < list.size(); i++) { + if (i > 0) { + sb.append(", "); + } + sb.append(list.get(i)); + } + return sb.toString(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevDiagnosticsReport.java b/app/src/main/java/com/foxx/androidcast/dev/DevDiagnosticsReport.java new file mode 100644 index 0000000..d510088 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevDiagnosticsReport.java @@ -0,0 +1,60 @@ +package com.foxx.androidcast.dev; + +import android.os.Build; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * In-memory diagnostics snapshot for developer settings. + * {@link #toJson()} is ready for a future BE upload endpoint (not wired yet). + */ +public final class DevDiagnosticsReport { + public final long collectedAtEpochMs; + public final String deviceModel; + public final int sdkInt; + public final Map sections; + + public DevDiagnosticsReport(long collectedAtEpochMs, Map sections) { + this.collectedAtEpochMs = collectedAtEpochMs; + this.deviceModel = Build.MANUFACTURER + " " + Build.MODEL; + this.sdkInt = Build.VERSION.SDK_INT; + this.sections = new LinkedHashMap<>(sections); + } + + public JSONObject toJson() { + JSONObject root = new JSONObject(); + try { + root.put("schema_version", 1); + root.put("kind", "dev_diagnostics"); + root.put("collected_at_ms", collectedAtEpochMs); + root.put("device_model", deviceModel); + root.put("sdk_int", sdkInt); + JSONObject body = new JSONObject(); + for (Map.Entry e : sections.entrySet()) { + body.put(e.getKey(), e.getValue()); + } + root.put("sections", body); + root.put("sections_array", sectionsToArray()); + } catch (Exception ignored) { + } + return root; + } + + private JSONArray sectionsToArray() { + JSONArray arr = new JSONArray(); + for (Map.Entry e : sections.entrySet()) { + JSONObject item = new JSONObject(); + try { + item.put("id", e.getKey()); + item.put("text", e.getValue()); + arr.put(item); + } catch (Exception ignored) { + } + } + return arr; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevInstallWakeHelper.java b/app/src/main/java/com/foxx/androidcast/dev/DevInstallWakeHelper.java new file mode 100644 index 0000000..83a8573 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevInstallWakeHelper.java @@ -0,0 +1,94 @@ +package com.foxx.androidcast.dev; + +import android.app.Activity; +import android.app.KeyguardManager; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.PowerManager; +import android.util.Log; +import android.view.WindowManager; + +import com.foxx.androidcast.BuildConfig; +import com.foxx.androidcast.MainActivity; + +/** Debug deploy: wake screen, keep awake briefly, show UI over lockscreen after adb install. */ +public final class DevInstallWakeHelper { + public static final String ACTION_PREPARE_FOR_DEPLOY = + "com.foxx.androidcast.dev.PREPARE_FOR_DEPLOY"; + public static final String EXTRA_AFTER_DEPLOY = "after_deploy"; + private static final String TAG = "DevDeployWake"; + private static final long WAKE_MS = 45_000L; + + private static PowerManager.WakeLock deployWakeLock; + + private DevInstallWakeHelper() {} + + /** Called from running app when adb install is about to start (broadcast from rebuild.sh). */ + public static void wakeForDeploy(Context context, String reason) { + if (!BuildConfig.DEBUG) { + return; + } + Context app = context.getApplicationContext(); + PowerManager pm = app.getSystemService(PowerManager.class); + if (pm == null) { + return; + } + releaseWakeLock(); + int flags = PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + @SuppressWarnings("deprecation") + int legacy = flags | PowerManager.ON_AFTER_RELEASE; + flags = legacy; + } + deployWakeLock = pm.newWakeLock(flags, "androidcast:deploy"); + deployWakeLock.acquire(WAKE_MS); + Log.i(TAG, "wake for deploy (" + reason + ")"); + } + + public static void prepareActivityShowOnDeploy(Activity activity) { + if (!BuildConfig.DEBUG || activity == null) { + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + activity.setShowWhenLocked(true); + activity.setTurnScreenOn(true); + } + activity.getWindow().addFlags( + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON + | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + KeyguardManager km = activity.getSystemService(KeyguardManager.class); + if (km != null && km.isKeyguardLocked()) { + km.requestDismissKeyguard(activity, null); + } + } + } + + public static void launchMainAfterDeploy(Context context) { + if (!BuildConfig.DEBUG) { + return; + } + Intent launch = new Intent(context, MainActivity.class); + launch.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_CLEAR_TOP + | Intent.FLAG_ACTIVITY_SINGLE_TOP); + launch.putExtra(EXTRA_AFTER_DEPLOY, true); + context.startActivity(launch); + Log.i(TAG, "launch MainActivity after deploy"); + } + + public static boolean shouldShowAfterDeploy(Intent intent) { + return intent != null && intent.getBooleanExtra(EXTRA_AFTER_DEPLOY, false); + } + + public static void releaseWakeLock() { + PowerManager.WakeLock lock = deployWakeLock; + deployWakeLock = null; + if (lock != null && lock.isHeld()) { + lock.release(); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevNetworkSelfTestController.java b/app/src/main/java/com/foxx/androidcast/dev/DevNetworkSelfTestController.java new file mode 100644 index 0000000..49e7cb2 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevNetworkSelfTestController.java @@ -0,0 +1,194 @@ +package com.foxx.androidcast.dev; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.RemoteException; +import android.view.View; +import android.widget.Button; +import android.widget.ProgressBar; +import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; + +import com.foxx.androidcast.INetworkChangeListener; +import com.foxx.androidcast.INetworkSelfTestService; +import com.foxx.androidcast.NetworkConditions; +import com.foxx.androidcast.R; +import com.foxx.androidcast.network.selftest.NetworkSelfTestService; + +/** Developer network self-test panel driven by standalone AIDL service cache. */ +public final class DevNetworkSelfTestController { + private final AppCompatActivity activity; + private final View panel; + private final TextView report; + private final ProgressBar spinner; + private final Handler main = new Handler(Looper.getMainLooper()); + private INetworkSelfTestService service; + private boolean bound; + + private final INetworkChangeListener listener = new INetworkChangeListener.Stub() { + @Override + public void onNetworkConditionChange(NetworkConditions aidlNetworkConditions) { + if (aidlNetworkConditions == null) { + return; + } + main.post(() -> { + spinner.setVisibility(View.GONE); + report.setText(render(aidlNetworkConditions)); + }); + } + }; + + private final Runnable refreshPoll = new Runnable() { + @Override + public void run() { + INetworkSelfTestService s = service; + if (s == null) { + spinner.setVisibility(View.GONE); + return; + } + try { + if (s.isRefreshing()) { + main.postDelayed(this, 700); + return; + } + NetworkConditions cached = s.getCachedConditions(); + spinner.setVisibility(View.GONE); + if (cached != null && cached.reportText != null && !cached.reportText.isEmpty()) { + report.setText(render(cached)); + } else { + report.setText(activity.getString(R.string.dev_network_selftest_pending)); + } + } catch (RemoteException e) { + spinner.setVisibility(View.GONE); + report.setText("Self-test service error: " + e.getMessage()); + } + } + }; + + private final ServiceConnection connection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder binder) { + service = INetworkSelfTestService.Stub.asInterface(binder); + try { + service.addListener(listener); + loadCachedOrRequest(); + } catch (RemoteException e) { + report.setText("Self-test bind failed: " + e.getMessage()); + } + } + + @Override + public void onServiceDisconnected(ComponentName name) { + service = null; + bound = false; + } + }; + + public DevNetworkSelfTestController(AppCompatActivity activity) { + this.activity = activity; + this.panel = activity.findViewById(R.id.dev_panel_network_selftest); + this.report = panel.findViewById(R.id.text_dev_network_selftest_report); + this.spinner = panel.findViewById(R.id.progress_dev_network_selftest); + Button run = panel.findViewById(R.id.btn_dev_network_selftest_force); + run.setOnClickListener(v -> requestForceRefresh()); + } + + public void onSelfTestTabShown() { + if (report.length() == 0) { + report.setText(activity.getString(R.string.dev_network_selftest_pending)); + } + ensureBound(); + loadCachedOrRequest(); + } + + public void onDestroy() { + main.removeCallbacks(refreshPoll); + if (service != null) { + try { + service.removeListener(listener); + } catch (RemoteException ignored) { + } + } + if (bound) { + try { + activity.unbindService(connection); + } catch (Exception ignored) { + } + bound = false; + } + service = null; + } + + private void ensureBound() { + if (bound) { + return; + } + Intent i = new Intent(activity, NetworkSelfTestService.class); + activity.startService(i); + bound = activity.bindService(i, connection, Context.BIND_AUTO_CREATE); + } + + private void loadCachedOrRequest() { + INetworkSelfTestService s = service; + if (s == null) { + return; + } + try { + NetworkConditions cached = s.getCachedConditions(); + if (cached != null && cached.reportText != null && !cached.reportText.isEmpty()) { + report.setText(render(cached)); + return; + } + requestForceRefresh(); + } catch (RemoteException e) { + report.setText("Self-test service error: " + e.getMessage()); + } + } + + private void requestForceRefresh() { + INetworkSelfTestService s = service; + if (s == null) { + ensureBound(); + s = service; + if (s == null) { + return; + } + } + spinner.setVisibility(View.VISIBLE); + report.setText(activity.getString(R.string.dev_network_selftest_running)); + try { + s.requestRefresh(); + } catch (RemoteException e) { + spinner.setVisibility(View.GONE); + report.setText("Self-test service error: " + e.getMessage()); + return; + } + main.removeCallbacks(refreshPoll); + main.postDelayed(refreshPoll, 700); + } + + private String render(NetworkConditions c) { + StringBuilder sb = new StringBuilder(); + long ageMs = Math.max(0L, System.currentTimeMillis() - c.collectedAtMs); + String age = ageMs < 60_000L + ? (ageMs / 1000L) + "s ago" + : (ageMs / 60_000L) + "m ago"; + String fp = c.fingerprint != null ? c.fingerprint : ""; + if (fp.length() > 10) { + fp = fp.substring(0, 10) + "…"; + } + sb.append("snapshot ").append(age).append(" · fp ").append(fp); + if (c.refreshing) { + sb.append(" · refreshing"); + } + sb.append("\n—\n"); + sb.append(c.reportText != null ? c.reportText : ""); + return sb.toString(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevNetworkSelfTestProbe.java b/app/src/main/java/com/foxx/androidcast/dev/DevNetworkSelfTestProbe.java new file mode 100644 index 0000000..8fb471a --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevNetworkSelfTestProbe.java @@ -0,0 +1,664 @@ +package com.foxx.androidcast.dev; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.LinkAddress; +import android.net.LinkProperties; +import android.net.Network; +import android.net.NetworkCapabilities; +import android.net.ProxyInfo; +import android.os.Build; +import android.os.PowerManager; +import android.telephony.TelephonyManager; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.CastConfig; +import com.foxx.androidcast.crash.CrashSettingsStore; +import com.foxx.androidcast.discovery.CastLanPeerProbe; +import com.foxx.androidcast.network.BackendEndpoints; +import com.foxx.androidcast.network.BackendNtpSync; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.atomic.AtomicBoolean; + +/** Focused network self-test for developer settings (compact structured report). */ +public final class DevNetworkSelfTestProbe { + private static final int HTTP_TIMEOUT_MS = 5_000; + private static final String API10_NA = "requires Android API 10+"; + + private DevNetworkSelfTestProbe() {} + + public static String run(Context context, AtomicBoolean cancel) { + DevNetworkSelfTestReport report = new DevNetworkSelfTestReport(); + report.header(); + + ConnectivityManager cm = context.getSystemService(ConnectivityManager.class); + Network active = cm != null ? cm.getActiveNetwork() : null; + NetworkCapabilities caps = (cm != null && active != null) ? cm.getNetworkCapabilities(active) : null; + LinkProperties lp = (cm != null && active != null) ? cm.getLinkProperties(active) : null; + + probeOverall(context, caps, cancel, report); + probeLink(context, caps, lp, report); + probeCaptive(caps, cancel, report); + probeIntraLan(context, lp, cancel, report); + probeBackend(context, cancel, report); + DevVpnStatusProbe.probe(context, report); + probeNtp(context, cancel, report); + probeNatExternal(caps, context, cancel, report); + probeMtu(lp, report); + probeBluetooth(caps, cancel, report); + + if (cancel != null && cancel.get()) { + report.itemWarn("run", "cancelled before completion"); + } + return report.build(); + } + + private static void probeOverall(Context context, NetworkCapabilities caps, AtomicBoolean cancel, + DevNetworkSelfTestReport r) { + r.section("AVAIL", "Availability"); + boolean online = caps != null && caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); + boolean validated = caps != null && caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); + if (!online) { + r.itemFail("internet", "no active route"); + } else if (!validated) { + r.itemWarn("internet", "online, not validated"); + } else { + r.itemPass("internet", "online + validated"); + } + r.itemBool(DevNetworkSelfTestReport.Level.PASS, "wifi", + hasTransport(caps, NetworkCapabilities.TRANSPORT_WIFI), "active", "off"); + r.itemBool(DevNetworkSelfTestReport.Level.PASS, "mobile", + hasTransport(caps, NetworkCapabilities.TRANSPORT_CELLULAR), "active", "off"); + r.itemBool(DevNetworkSelfTestReport.Level.PASS, "ethernet", + hasTransport(caps, NetworkCapabilities.TRANSPORT_ETHERNET), "active", "off"); + r.itemBool(DevNetworkSelfTestReport.Level.PASS, "bt-transport", + hasTransport(caps, NetworkCapabilities.TRANSPORT_BLUETOOTH), "active", "off"); + r.itemBool(DevNetworkSelfTestReport.Level.PASS, "bt-tether", + hasBtPanInterface(), "bt-pan up", "none"); + + PowerManager pm = context.getSystemService(PowerManager.class); + if (pm != null) { + r.itemBool(pm.isPowerSaveMode() ? DevNetworkSelfTestReport.Level.WARN : DevNetworkSelfTestReport.Level.PASS, + "power-save", true, pm.isPowerSaveMode() ? "on" : "off", "off"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + r.itemBool(pm.isDeviceIdleMode() ? DevNetworkSelfTestReport.Level.WARN : DevNetworkSelfTestReport.Level.PASS, + "doze", true, pm.isDeviceIdleMode() ? "active" : "off", "off"); + } else { + r.itemNa("doze", API10_NA); + } + } + if (cancel != null && cancel.get()) { + r.itemWarn("status", "stopped"); + } + } + + private static void probeLink(Context context, NetworkCapabilities caps, LinkProperties lp, + DevNetworkSelfTestReport r) { + r.section("LINK", "Link parameters"); + List modes = new ArrayList<>(); + if (hasTransport(caps, NetworkCapabilities.TRANSPORT_WIFI)) { + modes.add("wifi"); + } + if (hasTransport(caps, NetworkCapabilities.TRANSPORT_CELLULAR)) { + modes.add("mobile"); + } + if (hasTransport(caps, NetworkCapabilities.TRANSPORT_ETHERNET)) { + modes.add("ethernet"); + } + if (hasTransport(caps, NetworkCapabilities.TRANSPORT_BLUETOOTH)) { + modes.add("bluetooth"); + } + r.itemPass("mode", modes.isEmpty() ? "other/unknown" : String.join("+", modes)); + r.itemBool(hasTransport(caps, NetworkCapabilities.TRANSPORT_VPN) + ? DevNetworkSelfTestReport.Level.WARN : DevNetworkSelfTestReport.Level.PASS, + "vpn/tunnel", hasTransport(caps, NetworkCapabilities.TRANSPORT_VPN), "in use", "none"); + + if (lp == null) { + r.itemWarn("iface", "no link properties"); + return; + } + r.itemPass("iface", lp.getInterfaceName() != null ? lp.getInterfaceName() : "?"); + String ipv4 = firstIpv4Cidr(lp); + if (ipv4.isEmpty()) { + r.itemWarn("ipv4", "none"); + } else { + r.itemPass("ipv4", ipv4); + } + if (lp.getLinkAddresses().size() > 1) { + r.itemPass("cidr-all", joinCidrs(lp)); + } + if (lp.getDnsServers().isEmpty()) { + r.itemFail("dns", "none configured"); + } else { + List dns = new ArrayList<>(); + for (InetAddress addr : lp.getDnsServers()) { + dns.add(addr.getHostAddress()); + } + r.itemPass("dns", String.join(", ", dns)); + } + ProxyInfo proxy = lp.getHttpProxy(); + if (proxy != null && proxy.getHost() != null) { + r.itemWarn("http-proxy", proxy.getHost() + ":" + proxy.getPort()); + } else { + r.itemPass("http-proxy", "none"); + } + + TelephonyManager tm = context.getSystemService(TelephonyManager.class); + if (tm != null) { + String operator = tm.getNetworkOperatorName(); + r.itemPass("operator", operator == null || operator.isEmpty() ? "unknown" : operator); + r.itemNa("apn", API10_NA); + } + } + + private static void probeCaptive(NetworkCapabilities caps, AtomicBoolean cancel, DevNetworkSelfTestReport r) { + r.section("PORTAL", "Captive portal"); + boolean declared = caps != null && caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL); + if (declared) { + r.itemFail("os-flag", "captive portal declared"); + } else { + r.itemPass("os-flag", "clear"); + } + if (cancel != null && cancel.get()) { + r.itemWarn("probe", "stopped"); + return; + } + HttpResult probe = httpHead("http://connectivitycheck.gstatic.com/generate_204"); + if (probe.code == 204) { + r.itemPass("generate_204", probe.summary); + r.itemPass("heuristic", "no portal signs"); + } else if (probe.code > 0) { + r.itemWarn("generate_204", probe.summary); + r.itemWarn("heuristic", "possible captive portal"); + } else { + r.itemFail("generate_204", probe.summary); + } + } + + private static void probeIntraLan(Context context, LinkProperties lp, AtomicBoolean cancel, + DevNetworkSelfTestReport r) { + r.section("LAN", "Intra-network"); + String ip = firstIpv4Host(lp); + if (ip == null) { + r.itemNa("peer-scan", "no local IPv4"); + return; + } + if (cancel != null && cancel.get()) { + r.itemWarn("peer-scan", "stopped"); + return; + } + String[] parts = ip.split("\\."); + if (parts.length != 4) { + r.itemNa("peer-scan", "unsupported IPv4"); + return; + } + String prefix = parts[0] + "." + parts[1] + "." + parts[2] + "."; + r.itemPass("subnet", prefix + "x (self " + ip + ")"); + CastLanPeerProbe.Result scan = CastLanPeerProbe.scan(context, cancel); + r.itemPass("scan-ms", Long.toString(scan.elapsedMs)); + if (scan.peers == 0) { + r.itemWarn("cast-peers", + "0 on LAN (UDP :" + CastConfig.DISCOVERY_PORT + ", need peer listening/Receive)"); + } else { + r.itemPass("cast-peers", scan.peers + " · " + scan.summary); + } + } + + private static void probeBackend(Context context, AtomicBoolean cancel, DevNetworkSelfTestReport r) { + r.section("BACKEND", "Backend reachability"); + String heartbeat = BackendEndpoints.HEARTBEAT_URL; + r.itemPass("url", shortenUrl(heartbeat)); + String configured = BackendEndpoints.normalizeCrashesUrl( + CrashSettingsStore.load(context).uploadUrl); + if (!configured.isEmpty() && !configured.equals(BackendEndpoints.UPLOAD_URL)) { + r.itemWarn("configured", shortenUrl(configured) + " (legacy host; probe uses apps.f0xx.org)"); + } + if (cancel != null && cancel.get()) { + r.itemWarn("probe", "stopped"); + return; + } + HttpResult head = httpHead(BackendEndpoints.CRASHES_BASE + "/"); + reportHttp(r, "head", head.code, head.summary); + HttpReadResult read = httpRead(BackendEndpoints.CRASHES_BASE + "/", 32 * 1024); + reportHttpRead(r, "downlink", read.code, read.summary); + HttpResult uplink = httpPostJson(BackendEndpoints.HEARTBEAT_URL, + "{\"heartbeat\":{\"type\":\"ping\"}}"); + reportHttp(r, "uplink", uplink.code, uplink.summary); + } + + private static void probeNtp(Context context, AtomicBoolean cancel, DevNetworkSelfTestReport r) { + r.section("NTP", "Time sync"); + r.itemPass("utc-epoch", Long.toString(System.currentTimeMillis() / 1000L)); + int tzMin = java.util.TimeZone.getDefault().getOffset(System.currentTimeMillis()) / 60000; + r.itemPass("local-tz-offset", tzMin + " min"); + boolean enabled = AppPreferences.isDevBackendNtpSyncEnabled(context); + r.itemBool(enabled ? DevNetworkSelfTestReport.Level.PASS : DevNetworkSelfTestReport.Level.NA, + "be-ntp-sync", enabled, "enabled (±3 min threshold)", "disabled (dev setting)"); + if (!enabled) { + return; + } + String backend = BackendEndpoints.HEARTBEAT_URL; + if (cancel != null && cancel.get()) { + r.itemWarn("be-ntp", "stopped"); + return; + } + long clientEpochSec = System.currentTimeMillis() / 1000L; + String tz = new java.text.SimpleDateFormat("Z", Locale.US).format(new java.util.Date()); + String body = "{\"heartbeat\":{\"type\":\"ntp\",\"date\":" + clientEpochSec + + ",\"tz\":\"" + tz + "\",\"time_source\":\"device\"}}"; + long t0 = System.currentTimeMillis(); + HttpTextResult text = httpPostJsonText(backend, body); + long t1 = System.currentTimeMillis(); + if (!httpSuccess(text.code)) { + if (text.code == 404) { + r.itemFail("be-ntp", text.summary + " · heartbeat.php missing on host"); + } else if (text.code > 0) { + r.itemFail("be-ntp", text.summary); + } else { + r.itemFail("be-ntp", text.summary); + } + return; + } + BackendNtpSync.Result sync = BackendNtpSync.evaluateResponse( + context, t0, t1, clientEpochSec, text.body); + switch (sync.action) { + case SYNCED: + r.itemPass("be-ntp", text.summary); + r.itemPass("skew", sync.skewMs + " ms"); + r.itemPass("action", "synced (|skew| > 3 min) · offset=" + sync.appliedOffsetMs + " ms"); + break; + case WITHIN_THRESHOLD: + r.itemPass("be-ntp", text.summary); + r.itemPass("skew", sync.skewMs + " ms"); + r.itemPass("action", "within ±3 min · offset=" + sync.appliedOffsetMs + " ms"); + break; + case FAILED: + r.itemFail("be-ntp", sync.detail); + break; + default: + r.itemNa("be-ntp", sync.detail); + break; + } + if (!sync.serverWallBeTz.isEmpty()) { + r.itemPass("be-wall", sync.serverWallBeTz); + } + if (!sync.localWallBeTz.isEmpty()) { + r.itemPass("local-as-be", sync.localWallBeTz); + } + if (sync.detail != null && !sync.detail.isEmpty()) { + r.itemPass("detail", truncate(sync.detail, 160)); + } + long corrected = BackendNtpSync.correctedNowMs(context); + r.itemPass("corrected-utc", Long.toString(corrected / 1000L)); + } + + private static void probeNatExternal(NetworkCapabilities caps, Context context, AtomicBoolean cancel, + DevNetworkSelfTestReport r) { + r.section("WAN", "NAT / external IP"); + String nat; + if (hasTransport(caps, NetworkCapabilities.TRANSPORT_VPN)) { + nat = "vpn/tunnel"; + } else if (hasTransport(caps, NetworkCapabilities.TRANSPORT_CELLULAR)) { + nat = "likely CGNAT (mobile)"; + } else if (hasTransport(caps, NetworkCapabilities.TRANSPORT_WIFI)) { + nat = "likely router NAT"; + } else { + nat = "unknown"; + } + r.itemPass("nat", nat); + if (cancel != null && cancel.get()) { + r.itemWarn("external-ip", "stopped"); + return; + } + HttpTextResult viaBackend = httpPostJsonText(BackendEndpoints.HEARTBEAT_URL, + "{\"heartbeat\":{\"type\":\"ip\"}}"); + if (viaBackend.code < 0) { + r.itemFail("external-ip", viaBackend.summary); + } else if (!httpSuccess(viaBackend.code)) { + r.itemFail("external-ip", viaBackend.summary); + } else { + r.itemPass("external-ip", viaBackend.summary); + if (viaBackend.body != null && !viaBackend.body.isEmpty()) { + r.itemPass("be-ip-body", truncate(viaBackend.body, 80)); + } + } + } + + private static void probeMtu(LinkProperties lp, DevNetworkSelfTestReport r) { + r.section("MTU", "MTU"); + if (lp != null) { + r.itemPass("active-link", Integer.toString(lp.getMtu())); + } else { + r.itemNa("active-link", "n/a"); + } + try { + Enumeration en = NetworkInterface.getNetworkInterfaces(); + if (en == null) { + r.itemNa("ifaces", "unavailable"); + return; + } + List lines = new ArrayList<>(); + for (NetworkInterface nif : Collections.list(en)) { + if (!nif.isUp()) { + continue; + } + lines.add(nif.getName() + "=" + nif.getMTU()); + if (lines.size() >= 6) { + break; + } + } + if (lines.isEmpty()) { + r.itemWarn("ifaces", "none up"); + } else { + r.itemPass("ifaces", String.join(", ", lines)); + } + } catch (Exception e) { + r.itemFail("ifaces", e.getMessage()); + } + } + + private static void probeBluetooth(NetworkCapabilities caps, AtomicBoolean cancel, DevNetworkSelfTestReport r) { + r.section("BT", "Bluetooth"); + boolean btTransport = hasTransport(caps, NetworkCapabilities.TRANSPORT_BLUETOOTH); + boolean btPan = hasBtPanInterface(); + if (!btTransport && !btPan) { + r.itemNa("available", "no BT network iface"); + return; + } + r.itemPass("available", btTransport ? "transport+iface" : "bt-pan only"); + if (cancel != null && cancel.get()) { + r.itemWarn("bw-sample", "stopped"); + return; + } + long t0 = System.currentTimeMillis(); + int bytes = 0; + try { + InetAddress addr = InetAddress.getByName("1.1.1.1"); + if (addr.isReachable(350)) { + bytes = 512; + } + } catch (Exception ignored) { + } + long dt = Math.max(1L, System.currentTimeMillis() - t0); + double kbps = (bytes * 8.0) / dt; + r.itemPass("bw-sample", String.format(Locale.US, "~%.1f Kbit/s (rough)", kbps)); + } + + private static String firstIpv4Cidr(LinkProperties lp) { + if (lp == null) { + return ""; + } + for (LinkAddress la : lp.getLinkAddresses()) { + InetAddress addr = la.getAddress(); + if (addr instanceof Inet4Address && !addr.isLoopbackAddress()) { + return la.toString(); + } + } + return ""; + } + + private static String firstIpv4Host(LinkProperties lp) { + if (lp == null) { + return null; + } + for (LinkAddress la : lp.getLinkAddresses()) { + InetAddress addr = la.getAddress(); + if (addr instanceof Inet4Address && !addr.isLoopbackAddress()) { + return addr.getHostAddress(); + } + } + return null; + } + + private static String joinCidrs(LinkProperties lp) { + List out = new ArrayList<>(); + for (LinkAddress la : lp.getLinkAddresses()) { + out.add(la.toString()); + } + return String.join("; ", out); + } + + private static String shortenUrl(String url) { + if (url.length() <= 72) { + return url; + } + return url.substring(0, 69) + "..."; + } + + private static String truncate(String s, int max) { + if (s == null) { + return ""; + } + String oneLine = s.replace('\n', ' ').trim(); + if (oneLine.length() <= max) { + return oneLine; + } + return oneLine.substring(0, max - 3) + "..."; + } + + private static boolean hasTransport(NetworkCapabilities caps, int t) { + return caps != null && caps.hasTransport(t); + } + + private static boolean hasBtPanInterface() { + try { + Enumeration en = NetworkInterface.getNetworkInterfaces(); + if (en == null) { + return false; + } + for (NetworkInterface nif : Collections.list(en)) { + String n = nif.getName(); + if (n != null && (n.startsWith("bt-pan") || n.startsWith("bnep"))) { + return nif.isUp(); + } + } + } catch (Exception ignored) { + } + return false; + } + + private static boolean httpSuccess(int code) { + return code >= 200 && code < 300; + } + + /** 2xx pass; 404 fail; other 4xx warn (host answered, wrong path/method/body). */ + private static void reportHttp(DevNetworkSelfTestReport r, String key, int code, String summary) { + if (httpSuccess(code)) { + r.itemPass(key, summary); + } else if (code == 404) { + r.itemFail(key, summary + " · not found"); + } else if (code > 0 && code < 500) { + r.itemWarn(key, summary + " · reachable, unexpected status"); + } else { + r.itemFail(key, summary); + } + } + + private static void reportHttpRead(DevNetworkSelfTestReport r, String key, int code, String summary) { + if (summary.startsWith("fail")) { + r.itemFail(key, summary); + } else { + reportHttp(r, key, code, summary); + } + } + + private static HttpResult httpHead(String url) { + long t0 = System.currentTimeMillis(); + try { + HttpURLConnection c = (HttpURLConnection) new URL(url).openConnection(); + c.setRequestMethod("HEAD"); + c.setConnectTimeout(HTTP_TIMEOUT_MS); + c.setReadTimeout(HTTP_TIMEOUT_MS); + c.setInstanceFollowRedirects(true); + int code = c.getResponseCode(); + long ms = System.currentTimeMillis() - t0; + c.disconnect(); + return new HttpResult(code, "HTTP " + code + " · " + ms + " ms"); + } catch (Exception e) { + long ms = System.currentTimeMillis() - t0; + return new HttpResult(-1, "fail · " + e.getClass().getSimpleName() + " · " + ms + " ms"); + } + } + + private static HttpResult httpPostJson(String url, String body) { + long t0 = System.currentTimeMillis(); + try { + HttpURLConnection c = (HttpURLConnection) new URL(url).openConnection(); + c.setRequestMethod("POST"); + c.setConnectTimeout(HTTP_TIMEOUT_MS); + c.setReadTimeout(HTTP_TIMEOUT_MS); + c.setDoOutput(true); + c.setRequestProperty("Content-Type", "application/json"); + byte[] bytes = body.getBytes(StandardCharsets.UTF_8); + try (OutputStream os = c.getOutputStream()) { + os.write(bytes); + } + int code = c.getResponseCode(); + long ms = System.currentTimeMillis() - t0; + c.disconnect(); + return new HttpResult(code, "HTTP " + code + " · " + ms + " ms · " + bytes.length + " B"); + } catch (Exception e) { + long ms = System.currentTimeMillis() - t0; + return new HttpResult(-1, "fail · " + e.getClass().getSimpleName() + " · " + ms + " ms"); + } + } + + private static HttpReadResult httpRead(String url, int maxBytes) { + long t0 = System.currentTimeMillis(); + try { + HttpURLConnection c = (HttpURLConnection) new URL(url).openConnection(); + c.setRequestMethod("GET"); + c.setConnectTimeout(HTTP_TIMEOUT_MS); + c.setReadTimeout(HTTP_TIMEOUT_MS); + int code = c.getResponseCode(); + int read = 0; + try (InputStream in = c.getInputStream()) { + byte[] buf = new byte[4096]; + while (read < maxBytes) { + int n = in.read(buf, 0, Math.min(buf.length, maxBytes - read)); + if (n <= 0) { + break; + } + read += n; + } + } + long ms = Math.max(1L, System.currentTimeMillis() - t0); + double kbps = (read * 8.0) / ms; + c.disconnect(); + return new HttpReadResult(code, "HTTP " + code + " · " + read + " B · " + + String.format(Locale.US, "%.1f Kbit/s", kbps)); + } catch (Exception e) { + long ms = System.currentTimeMillis() - t0; + return new HttpReadResult(-1, "fail · " + e.getClass().getSimpleName() + " · " + ms + " ms"); + } + } + + private static HttpTextResult httpPostJsonText(String url, String body) { + long t0 = System.currentTimeMillis(); + try { + HttpURLConnection c = (HttpURLConnection) new URL(url).openConnection(); + c.setRequestMethod("POST"); + c.setConnectTimeout(HTTP_TIMEOUT_MS); + c.setReadTimeout(HTTP_TIMEOUT_MS); + c.setDoOutput(true); + c.setRequestProperty("Content-Type", "application/json"); + try (OutputStream os = c.getOutputStream()) { + os.write(body.getBytes(StandardCharsets.UTF_8)); + } + int code = c.getResponseCode(); + String text = readBody(c); + long ms = System.currentTimeMillis() - t0; + c.disconnect(); + return new HttpTextResult(code, "HTTP " + code + " · " + ms + " ms", text); + } catch (Exception e) { + long ms = System.currentTimeMillis() - t0; + return new HttpTextResult(-1, "fail · " + e.getClass().getSimpleName() + " · " + ms + " ms", ""); + } + } + + private static HttpTextResult httpGetText(String url) { + long t0 = System.currentTimeMillis(); + try { + HttpURLConnection c = (HttpURLConnection) new URL(url).openConnection(); + c.setRequestMethod("GET"); + c.setConnectTimeout(HTTP_TIMEOUT_MS); + c.setReadTimeout(HTTP_TIMEOUT_MS); + int code = c.getResponseCode(); + String text = readBody(c); + long ms = System.currentTimeMillis() - t0; + c.disconnect(); + return new HttpTextResult(code, "HTTP " + code + " · " + ms + " ms", text); + } catch (Exception e) { + long ms = System.currentTimeMillis() - t0; + return new HttpTextResult(-1, "fail · " + e.getClass().getSimpleName() + " · " + ms + " ms", ""); + } + } + + private static String readBody(HttpURLConnection c) { + try (BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream(), StandardCharsets.UTF_8))) { + StringBuilder sb = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + sb.append(line); + if (sb.length() > 2048) { + break; + } + } + return sb.toString(); + } catch (Exception e) { + try (BufferedReader br = new BufferedReader(new InputStreamReader(c.getErrorStream(), StandardCharsets.UTF_8))) { + String line = br.readLine(); + return line != null ? line : ""; + } catch (Exception ignored) { + return ""; + } + } + } + + private static final class HttpResult { + final int code; + final String summary; + + HttpResult(int code, String summary) { + this.code = code; + this.summary = summary; + } + } + + private static final class HttpReadResult { + final int code; + final String summary; + + HttpReadResult(int code, String summary) { + this.code = code; + this.summary = summary; + } + } + + private static final class HttpTextResult { + final int code; + final String summary; + final String body; + + HttpTextResult(int code, String summary, String body) { + this.code = code; + this.summary = summary; + this.body = body; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevNetworkSelfTestReport.java b/app/src/main/java/com/foxx/androidcast/dev/DevNetworkSelfTestReport.java new file mode 100644 index 0000000..c1897f7 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevNetworkSelfTestReport.java @@ -0,0 +1,69 @@ +package com.foxx.androidcast.dev; + +import java.util.Locale; + +/** Compact structured text report for network self-test. */ +final class DevNetworkSelfTestReport { + enum Level { + PASS, WARN, FAIL, NA; + + String tag() { + return name(); + } + } + + private final StringBuilder sb = new StringBuilder(2048); + private boolean hasSections; + + void header() { + sb.append("NETWORK SELF-TEST\n"); + } + + void section(String code, String title) { + if (hasSections) { + sb.append('\n'); + } + hasSections = true; + sb.append('[').append(code).append("] ").append(title).append('\n'); + } + + void item(Level level, String key, String value) { + String k = padKey(key); + sb.append(' ').append(level.tag()).append(" ").append(k).append(' ') + .append(value != null ? value : "").append('\n'); + } + + void itemPass(String key, String value) { + item(Level.PASS, key, value); + } + + void itemWarn(String key, String value) { + item(Level.WARN, key, value); + } + + void itemFail(String key, String value) { + item(Level.FAIL, key, value); + } + + void itemNa(String key, String value) { + item(Level.NA, key, value); + } + + void itemBool(Level yesLevel, String key, boolean yes, String yesText, String noText) { + item(yesLevel, key, yes ? yesText : noText); + } + + String build() { + return sb.toString().trim(); + } + + private static String padKey(String key) { + if (key == null) { + return " "; + } + if (key.length() >= 16) { + return key.substring(0, 16); + } + return String.format(Locale.US, "%-16s", key); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/DevVpnStatusProbe.java b/app/src/main/java/com/foxx/androidcast/dev/DevVpnStatusProbe.java new file mode 100644 index 0000000..990b916 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/DevVpnStatusProbe.java @@ -0,0 +1,367 @@ +package com.foxx.androidcast.dev; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; +import android.net.TrafficStats; +import android.os.Build; +import android.os.Process; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.crash.CrashReporter; +import com.foxx.androidcast.remoteaccess.RemoteAccessFailureReason; +import com.foxx.androidcast.remoteaccess.RemoteAccessMode; +import com.foxx.androidcast.remoteaccess.RemoteAccessStatusStore; +import com.foxx.androidcast.remoteaccess.RemoteAccessVpnRouting; +import com.foxx.androidcast.remoteaccess.ReverseSshTunnelBridge; +import com.foxx.androidcast.vpn.VpnServiceClient; +import com.foxx.androidcast.vpn.VpnState; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.util.Locale; +import java.util.concurrent.TimeUnit; + +/** VPN / remote-access snapshot for diagnostics and network self-test. */ +public final class DevVpnStatusProbe { + private DevVpnStatusProbe() {} + + /** Plain-text VPN section for the diagnostics network card. */ + public static String formatForDiagnostics(Context context) { + DevNetworkSelfTestReport r = new DevNetworkSelfTestReport(); + probe(context, r); + return r.build(); + } + + public static void probe(Context context, DevNetworkSelfTestReport r) { + r.section("VPN", "Remote access / VPN status"); + RemoteAccessMode mode = AppPreferences.getDevRemoteAccessMode(context); + RemoteAccessStatusStore.Snapshot last = RemoteAccessStatusStore.load(context); + boolean mainProcess = CrashReporter.isMainProcess(context, CrashReporter.currentProcessName()); + boolean osVpn = hasOsVpnTransport(context); + + String typeLabel = mode == RemoteAccessMode.DISABLED ? "off" : mode.name().toLowerCase(Locale.US); + r.itemPass("type", typeLabel); + + if (mode != RemoteAccessMode.DISABLED) { + r.itemPass( + "vpn-route-scope", + RemoteAccessVpnRouting.routeScopeLabel( + AppPreferences.getDevRemoteAccessVpnRouteScope(context))); + r.itemPass( + "vpn-app-scope", + RemoteAccessVpnRouting.appScopeLabel( + AppPreferences.getDevRemoteAccessVpnAppScope(context))); + } + + String vpnDetail = ""; + if (mainProcess && mode == RemoteAccessMode.WIREGUARD) { + vpnDetail = VpnServiceClient.get(context).getStateDetailIfBound(); + } + + String tunnelState = resolveTunnelState(context, mode, last, mainProcess, osVpn); + String controlPlane = resolveControlPlaneState(last); + + DevNetworkSelfTestReport.Level tunnelLevel; + if (mode == RemoteAccessMode.DISABLED) { + tunnelLevel = DevNetworkSelfTestReport.Level.NA; + } else if (RemoteAccessStatusStore.STATE_SUCCESS.equals(tunnelState)) { + tunnelLevel = DevNetworkSelfTestReport.Level.PASS; + } else if (RemoteAccessStatusStore.STATE_FAILURE.equals(tunnelState)) { + tunnelLevel = DevNetworkSelfTestReport.Level.FAIL; + } else if (RemoteAccessStatusStore.STATE_WAIT.equals(last.state) + && isAwaitingWhitelist(last.detail)) { + tunnelLevel = DevNetworkSelfTestReport.Level.PASS; + } else { + tunnelLevel = DevNetworkSelfTestReport.Level.WARN; + } + String tunnelLabel = formatTunnelStateLabel(tunnelState, last); + r.item(tunnelLevel, "tunnel-state", tunnelLabel); + + if (mode != RemoteAccessMode.DISABLED + && !RemoteAccessStatusStore.STATE_OFF.equals(controlPlane)) { + DevNetworkSelfTestReport.Level cpLevel; + if (controlPlane.startsWith("ok (")) { + cpLevel = DevNetworkSelfTestReport.Level.PASS; + } else if (RemoteAccessStatusStore.STATE_FAILURE.equals(last.state) + && RemoteAccessFailureReason.isControlPlaneMethod(last.method)) { + cpLevel = DevNetworkSelfTestReport.Level.FAIL; + } else if (RemoteAccessStatusStore.STATE_SUCCESS.equals(last.state)) { + cpLevel = DevNetworkSelfTestReport.Level.PASS; + } else { + cpLevel = DevNetworkSelfTestReport.Level.WARN; + } + r.item(cpLevel, "control-plane", controlPlane); + } + + r.itemPass("os-vpn-transport", osVpn ? "active" : "none"); + if (mainProcess && mode == RemoteAccessMode.WIREGUARD) { + boolean bound = VpnServiceClient.get(context).isBound(); + r.itemPass("vpn-process-bound", bound ? "yes (:vpn AIDL)" : "no (not bound — normal if idle)"); + } + if (!vpnDetail.isEmpty()) { + r.itemPass("detail", vpnDetail); + } + + String method = last.method; + if (method.isEmpty() && mode == RemoteAccessMode.WIREGUARD) { + method = "VpnServiceClient.applyWireGuardConfig"; + } else if (method.isEmpty() && mode == RemoteAccessMode.RSSH) { + method = "ReverseSshTunnelBridge.applyConfig"; + } else if (method.isEmpty()) { + method = "n/a"; + } + r.itemPass("method", method); + r.itemPass("initiator", formatInitiator(last.initiator, mode)); + + if (!last.sessionId.isEmpty()) { + r.itemPass("session", last.sessionId); + } + + String failReason = resolveDisplayedFailReason(context, mode, last, tunnelState, controlPlane); + if (failReason != null && !failReason.isEmpty()) { + r.itemFail("fail-reason", failReason); + } + + if (RemoteAccessFailureReason.isControlPlaneMethod(last.method) + && RemoteAccessStatusStore.STATE_FAILURE.equals(last.state)) { + r.itemPass("heartbeat-url", RemoteAccessFailureReason.heartbeatUrlForDiagnostics(context)); + } + + appendTraffic(r, context); + if (last.updatedMs > 0L) { + r.itemPass("last-event-age", formatAge(last.updatedMs)); + r.itemPass("last-event-ms", Long.toString(last.updatedMs)); + } + if (!mainProcess) { + r.itemPass("probe-process", CrashReporter.currentProcessName() + " (status store + OS VPN)"); + } + } + + /** Tunnel only — not heartbeat poll failures. */ + private static String resolveTunnelState( + Context context, + RemoteAccessMode mode, + RemoteAccessStatusStore.Snapshot last, + boolean mainProcess, + boolean osVpn) { + if (mode == RemoteAccessMode.DISABLED) { + return RemoteAccessStatusStore.STATE_OFF; + } + if (mode == RemoteAccessMode.WIREGUARD) { + int live = mainProcess ? VpnServiceClient.get(context).getStateIfBound() : VpnState.DOWN; + if (live == VpnState.UP || (osVpn && RemoteAccessStatusStore.STATE_SUCCESS.equals(last.state) + && RemoteAccessFailureReason.isTunnelMethod(last.method))) { + return RemoteAccessStatusStore.STATE_SUCCESS; + } + if (live == VpnState.ERROR) { + return RemoteAccessStatusStore.STATE_FAILURE; + } + if (live == VpnState.CONNECTING) { + return RemoteAccessStatusStore.STATE_CONNECTING; + } + if (RemoteAccessFailureReason.isTunnelMethod(last.method) + && RemoteAccessStatusStore.STATE_FAILURE.equals(last.state)) { + return RemoteAccessStatusStore.STATE_FAILURE; + } + if (RemoteAccessFailureReason.isTunnelMethod(last.method) + && RemoteAccessStatusStore.STATE_CONNECTING.equals(last.state)) { + return RemoteAccessStatusStore.STATE_CONNECTING; + } + return osVpn ? RemoteAccessStatusStore.STATE_SUCCESS : RemoteAccessStatusStore.STATE_IDLE; + } + + boolean rsshUp; + if (mainProcess) { + rsshUp = ReverseSshTunnelBridge.isConnected(); + } else { + rsshUp = RemoteAccessStatusStore.STATE_SUCCESS.equals(last.state) + && RemoteAccessFailureReason.isTunnelMethod(last.method); + } + if (rsshUp) { + return RemoteAccessStatusStore.STATE_SUCCESS; + } + if (RemoteAccessFailureReason.isTunnelMethod(last.method) + && RemoteAccessStatusStore.STATE_FAILURE.equals(last.state)) { + return RemoteAccessStatusStore.STATE_FAILURE; + } + if (RemoteAccessFailureReason.isTunnelMethod(last.method) + && RemoteAccessStatusStore.STATE_CONNECTING.equals(last.state)) { + return RemoteAccessStatusStore.STATE_CONNECTING; + } + return RemoteAccessStatusStore.STATE_IDLE; + } + + private static String resolveControlPlaneState(RemoteAccessStatusStore.Snapshot last) { + if (RemoteAccessStatusStore.STATE_WAIT.equals(last.state)) { + if (isAwaitingWhitelist(last.detail)) { + return "ok (awaiting whitelist)"; + } + if ("no_pending_session".equals(last.detail)) { + return "ok (awaiting operator session)"; + } + if ("rate_limited".equals(last.detail)) { + return "ok (poll rate limited)"; + } + return last.detail.isEmpty() ? RemoteAccessStatusStore.STATE_WAIT : last.detail; + } + if (!RemoteAccessFailureReason.isControlPlaneMethod(last.method)) { + if (RemoteAccessStatusStore.STATE_IDLE.equals(last.state) + || RemoteAccessStatusStore.STATE_SUCCESS.equals(last.state)) { + return last.state; + } + return RemoteAccessStatusStore.STATE_IDLE; + } + return last.state; + } + + private static boolean isAwaitingWhitelist(String detail) { + return "not_whitelisted".equals(detail); + } + + private static String formatTunnelStateLabel(String tunnelState, RemoteAccessStatusStore.Snapshot last) { + if (RemoteAccessStatusStore.STATE_WAIT.equals(last.state)) { + if (isAwaitingWhitelist(last.detail)) { + return "idle (awaiting whitelist — no tunnel expected)"; + } + if ("no_pending_session".equals(last.detail)) { + return "idle (awaiting operator open session)"; + } + } + return tunnelState; + } + + private static String resolveDisplayedFailReason( + Context context, + RemoteAccessMode mode, + RemoteAccessStatusStore.Snapshot last, + String tunnelState, + String controlPlane) { + if (mode == RemoteAccessMode.DISABLED) { + return ""; + } + if (!RemoteAccessStatusStore.STATE_FAILURE.equals(last.state)) { + return ""; + } + String expanded = RemoteAccessFailureReason.expandForDisplay(context, last.method, last.failReason); + + if (RemoteAccessFailureReason.isControlPlaneMethod(last.method)) { + if (!RemoteAccessStatusStore.STATE_SUCCESS.equals(tunnelState)) { + return "[heartbeat] " + expanded; + } + return "[heartbeat] " + expanded + " (tunnel not affected)"; + } + if (RemoteAccessFailureReason.isTunnelMethod(last.method) + && RemoteAccessStatusStore.STATE_FAILURE.equals(tunnelState)) { + return "[tunnel] " + expanded; + } + if (!expanded.isEmpty()) { + return "[heartbeat] " + expanded; + } + return ""; + } + + private static String formatAge(long updatedMs) { + long ago = System.currentTimeMillis() - updatedMs; + if (ago < 0) { + return "0s ago"; + } + if (ago < TimeUnit.MINUTES.toMillis(1)) { + return (ago / 1000L) + "s ago"; + } + if (ago < TimeUnit.HOURS.toMillis(1)) { + return (ago / TimeUnit.MINUTES.toMillis(1)) + "m ago"; + } + return (ago / TimeUnit.HOURS.toMillis(1)) + "h ago"; + } + + private static String formatInitiator(String stored, RemoteAccessMode mode) { + if (!stored.isEmpty()) { + switch (stored) { + case RemoteAccessStatusStore.INITIATOR_DEVICE: + return "device (polls BE heartbeat)"; + case RemoteAccessStatusStore.INITIATOR_BE: + return "backend (connect action)"; + case RemoteAccessStatusStore.INITIATOR_USER: + return "user (dev settings)"; + default: + return stored; + } + } + if (mode == RemoteAccessMode.DISABLED) { + return "n/a"; + } + return "device (heartbeat poll → BE connect)"; + } + + private static boolean hasOsVpnTransport(Context context) { + ConnectivityManager cm = context.getSystemService(ConnectivityManager.class); + if (cm == null) { + return false; + } + android.net.Network net = cm.getActiveNetwork(); + NetworkCapabilities caps = net != null ? cm.getNetworkCapabilities(net) : null; + return caps != null && caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN); + } + + private static void appendTraffic(DevNetworkSelfTestReport r, Context context) { + int uid = Process.myUid(); + long rx = TrafficStats.getUidRxBytes(uid); + long tx = TrafficStats.getUidTxBytes(uid); + if (rx == TrafficStats.UNSUPPORTED || tx == TrafficStats.UNSUPPORTED) { + r.itemNa("traffic", "uid stats unsupported"); + } else { + r.itemPass("uid-rx-tx", formatBytes(rx) + " / " + formatBytes(tx)); + if (Build.VERSION.SDK_INT >= 31) { + long rxPkt = TrafficStats.getUidRxPackets(uid); + long txPkt = TrafficStats.getUidTxPackets(uid); + if (rxPkt != TrafficStats.UNSUPPORTED && txPkt != TrafficStats.UNSUPPORTED) { + r.itemPass("uid-rx-tx-pkts", rxPkt + " / " + txPkt); + } + } + } + String tun = readTunIfaceStats(); + if (!tun.isEmpty()) { + r.itemPass("tun-iface", tun); + } + } + + private static String formatBytes(long bytes) { + if (bytes < 0) { + return "?"; + } + if (bytes < 1024) { + return bytes + " B"; + } + if (bytes < 1024 * 1024) { + return String.format(Locale.US, "%.1f KiB", bytes / 1024.0); + } + return String.format(Locale.US, "%.1f MiB", bytes / (1024.0 * 1024.0)); + } + + private static String readTunIfaceStats() { + try (BufferedReader br = new BufferedReader(new FileReader("/proc/net/dev"))) { + String line; + while ((line = br.readLine()) != null) { + String trimmed = line.trim(); + if (!trimmed.contains(":")) { + continue; + } + String name = trimmed.split(":", 2)[0].trim(); + if (!name.startsWith("tun") && !name.startsWith("wg")) { + continue; + } + String[] parts = trimmed.split(":\\s*"); + if (parts.length < 2) { + continue; + } + String[] cols = parts[1].trim().split("\\s+"); + if (cols.length >= 16) { + return name + " rx=" + cols[0] + " tx=" + cols[8] + " bytes"; + } + } + } catch (Exception ignored) { + } + return ""; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/dev/StreamDumpWriter.java b/app/src/main/java/com/foxx/androidcast/dev/StreamDumpWriter.java new file mode 100644 index 0000000..e585eed --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/dev/StreamDumpWriter.java @@ -0,0 +1,245 @@ +package com.foxx.androidcast.dev; + +import android.content.Context; +import android.util.Log; + +import com.foxx.androidcast.network.CastProtocol; + +import org.json.JSONObject; + +import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * FR 0.1 — length-prefixed elementary stream capture while casting (dev-only). + */ +public final class StreamDumpWriter { + private static final String TAG = "StreamDumpWriter"; + private static final int SCHEMA_VERSION = 1; + private static final long MAX_BYTES = 100L * 1024L * 1024L; + private static final long MAX_DURATION_MS = 5L * 60L * 1000L; + + private static final Object LOCK = new Object(); + private static StreamDumpWriter active; + + private final String sessionId; + private final String datePrefix; + private final long startedAtMs; + private final File audioFile; + private final File videoFile; + private final File workDir; + private BufferedOutputStream audioOut; + private BufferedOutputStream videoOut; + private final AtomicInteger audioFrames = new AtomicInteger(); + private final AtomicInteger videoFrames = new AtomicInteger(); + private final AtomicLong bytesWritten = new AtomicLong(); + private volatile boolean closed; + + private StreamDumpWriter(Context context) throws IOException { + startedAtMs = System.currentTimeMillis(); + SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US); + sessionId = fmt.format(new Date(startedAtMs)); + datePrefix = sessionId.substring(0, 8); + workDir = new File(context.getFilesDir(), "stream_dumps"); + if (!workDir.exists() && !workDir.mkdirs()) { + throw new IOException("cannot create stream_dumps dir"); + } + audioFile = new File(workDir, datePrefix + "_audio_stream.raw"); + videoFile = new File(workDir, datePrefix + "_video_stream.raw"); + audioOut = new BufferedOutputStream(new FileOutputStream(audioFile)); + videoOut = new BufferedOutputStream(new FileOutputStream(videoFile)); + } + + public static void startIfEnabled(Context context) { + if (!com.foxx.androidcast.AppPreferences.isDevStreamDumpEnabled(context)) { + return; + } + synchronized (LOCK) { + if (active != null) { + return; + } + try { + active = new StreamDumpWriter(context.getApplicationContext()); + Log.i(TAG, "recording " + active.sessionId); + } catch (IOException e) { + Log.w(TAG, "start failed: " + e.getMessage()); + } + } + } + + public static void finalizeIfActive(Context context) { + StreamDumpWriter w; + synchronized (LOCK) { + w = active; + active = null; + } + if (w != null) { + w.closeAndZip(context.getApplicationContext()); + } + } + + public static void recordFrame(byte type, byte[] payload) { + StreamDumpWriter w = active; + if (w == null || w.closed || payload == null) { + return; + } + w.append(type, payload); + } + + private void append(byte type, byte[] payload) { + if (closed) { + return; + } + if (bytesWritten.get() > MAX_BYTES + || System.currentTimeMillis() - startedAtMs > MAX_DURATION_MS) { + closed = true; + return; + } + boolean audio = type == CastProtocol.MSG_AUDIO_FRAME || type == CastProtocol.MSG_AUDIO_CONFIG; + boolean video = type == CastProtocol.MSG_VIDEO_FRAME; + if (!audio && !video) { + return; + } + byte[] frame = lengthPrefix(payload); + synchronized (LOCK) { + if (closed) { + return; + } + try { + if (audio) { + audioOut.write(frame); + audioFrames.incrementAndGet(); + } else { + videoOut.write(frame); + videoFrames.incrementAndGet(); + } + bytesWritten.addAndGet(frame.length); + } catch (IOException e) { + Log.w(TAG, "write failed: " + e.getMessage()); + closed = true; + } + } + } + + private static byte[] lengthPrefix(byte[] payload) { + ByteBuffer buf = ByteBuffer.allocate(4 + payload.length); + buf.putInt(payload.length); + buf.put(payload); + return buf.array(); + } + + private void closeAndZip(Context context) { + synchronized (LOCK) { + closed = true; + closeQuietly(audioOut); + closeQuietly(videoOut); + audioOut = null; + videoOut = null; + } + File zip = new File(workDir, sessionId + "_sess_record.zip"); + try { + writeZip(zip); + if (audioFile.exists()) { + audioFile.delete(); + } + if (videoFile.exists()) { + videoFile.delete(); + } + Log.i(TAG, "wrote " + zip.getAbsolutePath()); + } catch (IOException e) { + Log.w(TAG, "zip failed: " + e.getMessage()); + } + } + + private void writeZip(File zip) throws IOException { + JSONObject meta = new JSONObject(); + try { + meta.put("schema_version", SCHEMA_VERSION); + meta.put("session_id", sessionId); + meta.put("role", "sender"); + meta.put("record_mode", "raw_elementary"); + meta.put("started_at_epoch_ms", startedAtMs); + meta.put("ended_at_epoch_ms", System.currentTimeMillis()); + JSONObject audio = new JSONObject(); + audio.put("file", audioFile.getName()); + audio.put("format", "length_prefixed"); + audio.put("frame_count", audioFrames.get()); + meta.put("audio", audio); + JSONObject video = new JSONObject(); + video.put("file", videoFile.getName()); + video.put("format", "length_prefixed"); + video.put("frame_count", videoFrames.get()); + meta.put("video", video); + } catch (org.json.JSONException e) { + throw new IOException(e); + } + byte[] metaBytes; + try { + metaBytes = meta.toString(2).getBytes(java.nio.charset.StandardCharsets.UTF_8); + } catch (org.json.JSONException e) { + throw new IOException(e); + } + try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zip))) { + putEntry(zos, "meta.json", metaBytes); + if (audioFrames.get() > 0 && audioFile.isFile()) { + putFileEntry(zos, audioFile.getName(), audioFile); + } + if (videoFrames.get() > 0 && videoFile.isFile()) { + putFileEntry(zos, videoFile.getName(), videoFile); + } + } + } + + private static void putEntry(ZipOutputStream zos, String name, byte[] data) throws IOException { + zos.putNextEntry(new ZipEntry(name)); + zos.write(data); + zos.closeEntry(); + } + + private static void putFileEntry(ZipOutputStream zos, String name, File file) throws IOException { + zos.putNextEntry(new ZipEntry(name)); + byte[] buf = new byte[8192]; + try (java.io.FileInputStream in = new java.io.FileInputStream(file)) { + int n; + while ((n = in.read(buf)) >= 0) { + zos.write(buf, 0, n); + } + } + zos.closeEntry(); + } + + private static void closeQuietly(BufferedOutputStream out) { + if (out == null) { + return; + } + try { + out.flush(); + out.close(); + } catch (IOException ignored) { + } + } + + /** For unit tests. */ + static byte[] encodeLengthPrefixedFrame(byte[] payload) { + return lengthPrefix(payload); + } + + /** Exposed for tests — parse length-prefixed payload round-trip. */ + static int readLengthPrefix(byte[] framed) { + if (framed.length < 4) { + return -1; + } + return ByteBuffer.wrap(framed, 0, 4).getInt(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/diagnostics/CastDiagnosticsFormatter.java b/app/src/main/java/com/foxx/androidcast/diagnostics/CastDiagnosticsFormatter.java new file mode 100644 index 0000000..af40018 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/diagnostics/CastDiagnosticsFormatter.java @@ -0,0 +1,536 @@ +package com.foxx.androidcast.diagnostics; + +/********************************************************************* + * CastDiagnosticsFormatter.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastDiagnosticsFormatter + * Contributors: + * - Anton Afanasyeu (5 commits, 516 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 97b7c3221465ac0650199c90cb2a6cd2d8b1dfb27bffa97447139936130aad34 +**********************************************************************/ +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.CastTuningEngine; +import com.foxx.androidcast.media.CodecNegotiator; +import com.foxx.androidcast.media.codec.CodecSessionRegistry; +import com.foxx.androidcast.media.codec.PassthroughCodecPolicy; +import com.foxx.androidcast.media.codec.jni.NativeCodecBridge; +import com.foxx.androidcast.network.control.NetworkStatsSnapshot; +import com.foxx.androidcast.network.diag.DiagPingMetrics; +import com.foxx.androidcast.receiver.StreamMetrics; + +import java.util.ArrayList; +import java.util.List; + +/** Builds HTML diagnostics overlay with red highlights for out-of-range metrics. */ +public final class CastDiagnosticsFormatter { + private static final String COLOR_OK = "#E0FFE0"; + private static final String COLOR_WARN = "#FF6666"; + private static final String COLOR_DIM = "#AAAAAA"; + + private CastDiagnosticsFormatter() {} + + public static String formatHtml(StreamMetrics metrics, String transport, String videoCodec, + int streamW, int streamH, int renderW, int renderH, boolean idle, + CastSettings localSettings, CastSettings remoteSettings, + NetworkStatsSnapshot peer, NetworkStatsSnapshot lastLocal, int viewZoomPercent, + CastMtuSampler.Info mtuInfo) { + float inFps = metrics.getInFps(); + float renderFps = metrics.getRenderFps(); + int bwInKbps = metrics.getBwInKbps(); + long videoPackets = metrics.getVideoPackets(); + long audioPackets = metrics.getAudioPackets(); + long audioRendered = metrics.getAudioRenderedWrites(); + long audioPcmSilent = metrics.getAudioPcmSilentBlocks(); + long audioPcmAudible = metrics.getAudioPcmAudibleBlocks(); + int audioVu = metrics.getAudioVuPercent(); + float audioPeakDb = metrics.getAudioLastPeakDb(); + float audioRmsDb = metrics.getAudioLastRmsDb(); + long keyFrames = metrics.getKeyFrames(); + long deltaFrames = metrics.getDeltaFrames(); + int avgKb = metrics.getAvgKbPerFrame(); + long idleMs = metrics.getLastFrameIdleMs(); + int rttMs = metrics.getPeerRttMs(); + + CastSettings tuneSettings = remoteSettings != null ? remoteSettings : localSettings; + CastTuningEngine.EffectiveParams eff = CastTuningEngine.resolve(tuneSettings, peer); + int suggestedBwKbps = eff.videoBitrate / 1000; + int targetEncKbps = eff.videoBitrate / 1000; + int congestionLevel = 0; + float peerEncodeFps = 0f; + int peerSendKbps = metrics.getPeerSendKbps(); + int peerRecvKbps = metrics.getPeerRecvKbps(); + int peerQueue = 0; + int peerDroppedP = 0; + long peerAudioFrames = 0; + boolean peerAudioActive = false; + int peerCaptureVu = 0; + long peerCaptureSilent = 0; + long peerCaptureAudible = 0; + float peerCapturePeakDb = -96f; + float peerCaptureRmsDb = -96f; + + if (peer != null) { + if (peer.rttMs > 0) { + rttMs = peer.rttMs; + } + peerSendKbps = peer.sendBitrateKbps; + peerRecvKbps = peer.recvBitrateKbps; + peerEncodeFps = peer.encodeFps; + peerQueue = peer.encodeQueueDepth; + peerDroppedP = peer.droppedPFrames; + peerAudioFrames = peer.audioFramesSent; + peerAudioActive = peer.audioActive; + congestionLevel = peer.congestionLevel; + if (peer.suggestedBitrateKbps > 0) { + suggestedBwKbps = peer.suggestedBitrateKbps; + } + if (peer.targetBitrateKbps > 0) { + targetEncKbps = peer.targetBitrateKbps; + } + peerCaptureVu = peer.audioCaptureVuPercent; + peerCaptureSilent = peer.audioCaptureSilentBlocks; + peerCaptureAudible = peer.audioCaptureAudibleBlocks; + peerCapturePeakDb = peer.audioCapturePeakDb; + peerCaptureRmsDb = peer.audioCaptureRmsDb; + } + if (lastLocal != null) { + congestionLevel = Math.max(congestionLevel, lastLocal.congestionLevel); + } + + boolean audioRequested = remoteSettings != null && remoteSettings.isAudioRequested(); + List hints = buildHints(inFps, renderFps, bwInKbps, rttMs, videoPackets); + + int quality = CastDiagnosticsScorer.compute(inFps, renderFps, bwInKbps, suggestedBwKbps, + rttMs, congestionLevel, audioPackets, audioRequested); + String qualityColor = quality >= 70 ? COLOR_OK : (quality >= 45 ? "#FFCC66" : COLOR_WARN); + + String bitrateMode = CastDiagnosticsLabels.bitrateMode( + localSettings != null ? localSettings.getBitrateMode() : CastSettings.BitrateMode.AUTO); + String netAdopt = CastDiagnosticsLabels.networkAdoption( + localSettings != null ? localSettings.getNetworkAdoption() : CastSettings.NetworkAdoption.AUTO); + String ctrl = CastDiagnosticsLabels.congestionController(); + + StringBuilder html = new StringBuilder(); + html.append("Transport: ") + .append(escape(transport != null ? transport.toUpperCase() : "?")) + .append("
"); + appendMtuSection(html, mtuInfo); + + if (videoCodec != null && !videoCodec.isEmpty()) { + html.append("Codec: ") + .append(escape(CodecNegotiator.displayName(videoCodec))).append("
"); + } + appendCodecStackSection(html, localSettings, remoteSettings); + + html.append("Stream: ").append(streamW).append('x').append(streamH); + if (viewZoomPercent != 0) { + html.append(" (").append(viewZoomPercent > 0 ? "+" : "").append(viewZoomPercent).append("%)"); + } + if (renderW > 0 && renderH > 0 && (renderW != streamW || renderH != streamH)) { + html.append(" render: ").append(renderW).append('x').append(renderH); + } + html.append("
"); + + html.append("In FPS: ").append(colored(formatFloat(inFps), inFps > 0 && inFps < 15f)); + html.append(" Render FPS: ").append(colored(formatFloat(renderFps), + inFps > 8f && renderFps > 0 && renderFps < inFps * 0.75f)); + html.append("
"); + + html.append("BW in: ").append(colored(bwInKbps > 0 ? bwInKbps + " kbps" : "n/a", + suggestedBwKbps > 0 && bwInKbps > 0 && bwInKbps < suggestedBwKbps * 0.7f)); + html.append(" RTT: ").append(colored(rttMs > 0 ? rttMs + " ms" : "n/a", rttMs > 350)); + DiagPingMetrics.Snapshot diagPing = metrics.getDiagPing(); + if (diagPing.enabled && diagPing.pongsRx > 0) { + int pingRtt = diagPing.avgRttMs > 0 ? diagPing.avgRttMs : diagPing.lastRttMs; + html.append(" Diag ping: ") + .append(colored(pingRtt + " ms avg (" + diagPing.pongsRx + ")", pingRtt > 350)); + } + html.append("
"); + + html.append("Suggested BW: ").append(colored( + suggestedBwKbps > 0 ? suggestedBwKbps + " kbps" : "n/a", + bwInKbps > 0 && suggestedBwKbps > 0 && bwInKbps < suggestedBwKbps * 0.85f)); + html.append(" Target enc: ").append(colored( + targetEncKbps > 0 ? targetEncKbps + " kbps" : "n/a", false)); + html.append("
"); + + html.append("Congestion: ").append(colored(String.valueOf(congestionLevel), congestionLevel > 0)); + html.append("
"); + + appendUdpLossSection(html, peer, lastLocal); + appendProtectionSection(html, peer, lastLocal); + + html.append("Ctrl: ").append(escape(ctrl)); + html.append("
"); + html.append("Mode: ").append(escape(bitrateMode)); + html.append("
"); + html.append("Net: ").append(escape(netAdopt)); + html.append("
"); + + if (peerSendKbps > 0 || peerRecvKbps > 0 || peerEncodeFps > 0) { + html.append("Sender: "); + if (peerEncodeFps > 0) { + html.append("enc ").append(colored(formatFloat(peerEncodeFps), peerEncodeFps < 12f)); + html.append(' '); + } + html.append("tx ").append(peerSendKbps).append(" / rx ").append(peerRecvKbps).append(" kbps"); + if (peerQueue > 8 || peerDroppedP > 0) { + html.append(" q").append(peerQueue); + if (peerDroppedP > 0) { + html.append(" dropP=").append(peerDroppedP); + } + } + html.append("
"); + if (audioRequested && (peerCaptureSilent > 0 || peerCaptureAudible > 0 || peerCaptureVu > 0)) { + html.append("Sender cap VU: ").append(vuBarHtml(peerCaptureVu)).append(' ') + .append(colored(peerCaptureVu + "%", + peerCaptureVu < 3 && peerCaptureSilent > peerCaptureAudible)); + html.append(" peak ").append(formatDb(peerCapturePeakDb)) + .append(" rms ").append(formatDb(peerCaptureRmsDb)); + html.append("
Sender PCM: silent ") + .append(colored(String.valueOf(peerCaptureSilent), + peerCaptureSilent > 20 && peerCaptureAudible == 0)) + .append(" audible ").append(String.valueOf(peerCaptureAudible)); + if (peerCaptureSilent > 20 && peerCaptureAudible == 0) { + html.append(" ") + .append("(sender capture silent)") + .append(""); + } + html.append("
"); + } + } + + if (remoteSettings != null) { + html.append("Sender prefs:
") + .append(escape(CastDiagnosticsLabels.adjustmentPreset(remoteSettings.getAdjustmentPreset()))) + .append("
") + .append(escape(CastDiagnosticsLabels.bitrateMode(remoteSettings.getBitrateMode()))) + .append("
") + .append(escape(CastDiagnosticsLabels.resolution(remoteSettings.getResolution()))) + .append("
") + .append(escape(CastDiagnosticsLabels.videoCodec(remoteSettings.getVideoCodec()))) + .append("
") + .append(escape(CastDiagnosticsLabels.audioCodec(remoteSettings.getAudioCodec()))) + .append("
") + .append(escape(CastDiagnosticsLabels.captureMode(remoteSettings.getCaptureMode()))); + if (audioRequested) { + html.append(" · audio"); + if (peerAudioActive) { + html.append(" (").append(peerAudioFrames).append(" frm)"); + } + } + html.append("
"); + } + + html.append("Video pkts: ").append(videoPackets); + html.append(" (IDR ").append(keyFrames).append(" / P ").append(deltaFrames).append(')'); + if (videoPackets > 0) { + html.append(" ~").append(Math.max(1, avgKb)).append(" KB/frame"); + } + html.append("
"); + + html.append("Audio pkts: ").append(colored(String.valueOf(audioPackets), + audioRequested && audioPackets == 0 && videoPackets > 20)); + html.append(" rendered: ").append(colored(String.valueOf(audioRendered), + audioRequested && audioPackets > 5 && audioRendered == 0)); + if (audioRequested && audioPackets > 0 && audioRendered == 0) { + html.append(" (check receiver volume)"); + } + if (audioRequested && audioPackets == 0 && videoPackets > 20) { + html.append(" ") + .append("(play media on sender)") + .append(""); + } else if (audioRequested && audioPackets > 10 && audioRendered == 0) { + html.append(" ") + .append("(decode/render stalled)") + .append(""); + } else if (audioRequested && audioRendered > 15 && audioPcmAudible == 0 + && audioPcmSilent > 15) { + html.append(" ") + .append("(decoded PCM is silence)") + .append(""); + if (peerCaptureSilent > 20 && peerCaptureAudible == 0) { + html.append(" ") + .append("(fix on sender: Choose app, Android 14+)") + .append(""); + } + } + html.append("
"); + + if (audioRequested && audioRendered > 0) { + html.append("Audio VU: ").append(vuBarHtml(audioVu)).append(' ') + .append(colored(audioVu + "%", audioVu < 3 && audioPcmSilent > audioPcmAudible)); + html.append(" peak ").append(formatDb(audioPeakDb)) + .append(" rms ").append(formatDb(audioRmsDb)); + html.append("
PCM blocks: silent ") + .append(colored(String.valueOf(audioPcmSilent), + audioPcmSilent > 20 && audioPcmAudible == 0)) + .append(" audible ").append(String.valueOf(audioPcmAudible)); + html.append("
"); + } + + CpuLoadSampler.Sample cpu = CpuLoadSampler.sample(); + html.append("CPU: ").append(vuBarHtml(cpu.loadPercent)).append(' ') + .append(colored(cpu.loadPercent + "%", cpu.loadPercent > 85)) + .append(' ').append(CpuLoadSampler.formatCoreSuffix(cpu)); + html.append("
"); + + for (String hint : hints) { + html.append("") + .append(escape(hint)).append("
"); + } + + html.append("Quality: ") + .append(quality).append(" — ").append(CastDiagnosticsScorer.label(quality)) + .append("
"); + + html.append("State: ") + .append(idle ? "idle (awaiting)" : "streaming"); + if (idleMs >= 0) { + html.append(" last frame: ").append(idleMs).append(" ms ago"); + } + html.append(""); + + return html.toString(); + } + + private static void appendMtuSection(StringBuilder html, CastMtuSampler.Info mtu) { + if (mtu == null) { + return; + } + html.append("MTU: "); + if (mtu.interfaceName.length() > 0) { + html.append(escape(mtu.interfaceName)).append(' '); + } + if (mtu.linkMtu > 0) { + html.append("link ").append(mtu.linkMtu); + } else { + html.append("link ?"); + } + html.append(" · dg ").append(mtu.castDatagramBytes); + html.append(" frag ").append(mtu.castFragPayloadBytes); + html.append(" · IPv4 ").append(mtu.ipv4WireBytes); + if (mtu.headroomBytes >= 0) { + html.append(" · room ").append(colored(String.valueOf(mtu.headroomBytes), + mtu.headroomBytes < 100)); + } + html.append("
"); + } + + private static void appendUdpLossSection(StringBuilder html, NetworkStatsSnapshot peer, + NetworkStatsSnapshot local) { + long rx = pick(peer, local, true, false); + long tx = pick(peer, local, true, true); + long lost = val(peer, local, p -> p.udpReassemblyLost, l -> l.udpReassemblyLost); + long invalid = val(peer, local, p -> p.udpDatagramsInvalid, l -> l.udpDatagramsInvalid); + long dup = val(peer, local, p -> p.udpFragmentsDuplicate, l -> l.udpFragmentsDuplicate); + long wireDrop = val(peer, local, p -> p.udpWireDropped, l -> l.udpWireDropped); + long skipKey = val(peer, local, p -> p.recvVideoSkippedKey, l -> l.recvVideoSkippedKey); + long vDecErr = val(peer, local, p -> p.recvVideoDecodeErrors, l -> l.recvVideoDecodeErrors); + long aDecErr = val(peer, local, p -> p.recvAudioDecodeErrors, l -> l.recvAudioDecodeErrors); + long aDrop = val(peer, local, p -> p.recvAudioQueueDrops, l -> l.recvAudioQueueDrops); + long dropAudio = val(peer, local, p -> (long) p.droppedAudioFrames, l -> (long) l.droppedAudioFrames); + + if (rx == 0 && tx == 0 && lost == 0 && invalid == 0) { + return; + } + html.append("UDP: "); + html.append("rx ").append(rx).append(" / tx ").append(tx).append(" dg"); + if (lost > 0) { + html.append(" ").append(colored("reasm-lost " + lost, true)); + } + if (invalid > 0) { + html.append(" ").append(colored("bad " + invalid, true)); + } + if (dup > 0) { + html.append(" dup ").append(dup); + } + if (wireDrop > 0) { + html.append(" ").append(colored("sess-drop " + wireDrop, true)); + } + html.append("
"); + if (skipKey > 0 || vDecErr > 0 || aDecErr > 0 || aDrop > 0 || dropAudio > 0) { + html.append("App drops: "); + if (skipKey > 0) { + html.append(colored("vid-wait-key " + skipKey, skipKey > 50)); + } + if (vDecErr > 0) { + html.append(' ').append(colored("vid-dec " + vDecErr, true)); + } + if (aDecErr > 0) { + html.append(' ').append(colored("aud-dec " + aDecErr, true)); + } + if (aDrop > 0) { + html.append(' ').append(colored("aud-drop " + aDrop, true)); + } + if (dropAudio > 0) { + html.append(' ').append(colored("snd-aud " + dropAudio, true)); + } + html.append("
"); + } + } + + private static void appendCodecStackSection(StringBuilder html, CastSettings localSettings, + CastSettings remoteSettings) { + CastSettings prefs = remoteSettings != null ? remoteSettings : localSettings; + html.append("Video stack: "); + html.append(escape(CodecSessionRegistry.getVideoBackend().label)); + html.append(" · pref "); + html.append(escape(PassthroughCodecPolicy.displayVideoPreference( + prefs != null ? prefs.getVideoCodec() : CodecSessionRegistry.getVideoPreference()))); + String wire = CodecSessionRegistry.getNegotiatedVideoMime(); + if (wire != null && !wire.isEmpty()) { + html.append(" · wire ").append(escape(CodecNegotiator.displayName(wire))); + } + html.append("
"); + html.append("Audio stack: "); + html.append(escape(CodecSessionRegistry.getAudioBackend().label)); + html.append(" · pref "); + html.append(escape(PassthroughCodecPolicy.displayAudioPreference( + prefs != null ? prefs.getAudioCodec() : CodecSessionRegistry.getAudioPreference()))); + if (prefs != null && prefs.isAudioRequested()) { + CastSettings.AudioCodec ac = prefs.getAudioCodec(); + if (ac == CastSettings.AudioCodec.OPUS) { + if (NativeCodecBridge.isOpusAvailable()) { + html.append(" · Opus in-band FEC"); + } else { + html.append(" · Opus fallback AAC"); + } + } else if (ac == CastSettings.AudioCodec.SPEEX) { + if (NativeCodecBridge.isSpeexAvailable()) { + html.append(" · Speex FEC"); + } else { + html.append(" · Speex fallback AAC"); + } + } else { + html.append(" · AAC-LC (MediaCodec)"); + } + } + html.append("
"); + } + + private static void appendProtectionSection(StringBuilder html, NetworkStatsSnapshot peer, + NetworkStatsSnapshot local) { + String mode = str(peer, local, p -> p.protectionMode, l -> l.protectionMode, "NONE"); + String summary = CodecSessionRegistry.getProtectionSummary(); + html.append("Protect: "); + html.append(escape(mode)); + if (summary != null && !summary.isEmpty()) { + html.append(" · ").append(escape(summary)); + } + long fecPkts = val(peer, local, p -> p.fecStubPackets, l -> l.fecStubPackets); + long fecOk = val(peer, local, p -> p.fecPacketsDecoded, l -> l.fecPacketsDecoded); + long fecFail = val(peer, local, p -> p.fecDecodeFailures, l -> l.fecDecodeFailures); + long nackReq = val(peer, local, p -> p.nackStubRequests, l -> l.nackStubRequests); + if (fecPkts > 0 || fecOk > 0 || fecFail > 0) { + html.append("
FEC enc=").append(fecPkts).append(" dec=").append(fecOk); + if (fecFail > 0) { + html.append(" fail=").append(fecFail) + .append(""); + } + } + if (nackReq > 0) { + html.append("
NACK events=").append(nackReq); + } + html.append("
"); + } + + private static long pick(NetworkStatsSnapshot peer, NetworkStatsSnapshot local, + boolean preferLocal, boolean tx) { + if (preferLocal && local != null) { + return tx ? local.udpDatagramsTx : local.udpDatagramsRx; + } + if (peer != null) { + return tx ? peer.udpDatagramsTx : peer.udpDatagramsRx; + } + return local != null ? (tx ? local.udpDatagramsTx : local.udpDatagramsRx) : 0; + } + + private static long val(NetworkStatsSnapshot peer, NetworkStatsSnapshot local, + java.util.function.Function peerFn, + java.util.function.Function localFn) { + long v = 0; + if (local != null) { + v = Math.max(v, localFn.apply(local)); + } + if (peer != null) { + v = Math.max(v, peerFn.apply(peer)); + } + return v; + } + + private static String str(NetworkStatsSnapshot peer, NetworkStatsSnapshot local, + java.util.function.Function peerFn, + java.util.function.Function localFn, + String def) { + if (local != null && localFn.apply(local) != null && !localFn.apply(local).isEmpty()) { + return localFn.apply(local); + } + if (peer != null && peerFn.apply(peer) != null && !peerFn.apply(peer).isEmpty()) { + return peerFn.apply(peer); + } + return def; + } + + private static List buildHints(float inFps, float renderFps, int bwInKbps, + int rttMs, long videoPackets) { + List hints = new ArrayList<>(); + if (inFps > 0 && inFps < 8f) { + hints.add("Hint: low In FPS → sender encode stall / TCP backlog"); + } + if (bwInKbps > 0 && bwInKbps < 350 && inFps < 8f && videoPackets > 30) { + hints.add("Hint: very low BW — static screen or throttled encoder"); + } + if (rttMs > 450 && inFps < 15f) { + hints.add("Hint: high RTT — Wi‑Fi congestion"); + } + if (inFps > 12f && renderFps > 0 && renderFps < inFps * 0.7f) { + hints.add("Hint: decode slower than network (try H.264 or lower res)"); + } + return hints; + } + + private static String colored(String text, boolean bad) { + return "" + escape(text) + ""; + } + + private static String escape(String s) { + if (s == null) { + return ""; + } + return s.replace("&", "&").replace("<", "<"); + } + + private static String formatFloat(float v) { + if (v <= 0f) { + return "n/a"; + } + return String.format(java.util.Locale.US, "%.1f", v); + } + + private static String formatDb(float db) { + if (db <= -90f) { + return "-∞"; + } + return String.format(java.util.Locale.US, "%.0f dB", db); + } + + private static String vuBarHtml(int percent) { + int width = 16; + int filled = Math.min(width, (percent * width + 50) / 100); + StringBuilder b = new StringBuilder("["); + for (int i = 0; i < width; i++) { + if (i < filled) { + String c = i < width * 2 / 3 ? "#66FF66" : (i < width * 5 / 6 ? "#FFCC00" : "#FF4444"); + b.append(""); + } else { + b.append(""); + } + } + b.append("]"); + return b.toString(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/diagnostics/CastDiagnosticsLabels.java b/app/src/main/java/com/foxx/androidcast/diagnostics/CastDiagnosticsLabels.java new file mode 100644 index 0000000..7e30de5 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/diagnostics/CastDiagnosticsLabels.java @@ -0,0 +1,170 @@ +package com.foxx.androidcast.diagnostics; + +/********************************************************************* + * CastDiagnosticsLabels.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastDiagnosticsLabels + * Contributors: + * - Anton Afanasyeu (6 commits, 159 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 1c6f25ad871cb71788ed6fd1817d4d59d22d5ef6638704c9483937a2a9c15977 +**********************************************************************/ +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.media.codec.jni.NativeCodecBridge; + +/** Human-readable names for diagnostics (no bare AUTO enum tokens). */ +public final class CastDiagnosticsLabels { + private CastDiagnosticsLabels() {} + + public static String congestionController() { + return "PassThroughNetworkControlPlane (heartbeat stats)"; + } + + public static String bitrateMode(CastSettings.BitrateMode mode) { + if (mode == null) { + return "CastTuningEngine (default)"; + } + switch (mode) { + case NONE: + return "Uncapped encoder bitrate"; + case QUALITY: + return "Quality bias (+25% bitrate)"; + case SPEED: + return "Speed bias (−35% bitrate, ≤24 fps)"; + case BALANCED: + return "Balanced preset"; + case ROBUST_LESS: + return "RobustLess (UDP, −45% bitrate)"; + case ESTIMATED: + return "CastTuningEngine bandwidth estimate"; + case AUTO: + default: + return "CastTuningEngine (preset + peer stats)"; + } + } + + public static String networkAdoption(CastSettings.NetworkAdoption mode) { + if (mode == null) { + return "No extra network scaling"; + } + switch (mode) { + case QUALITY: + return "Quality bias (+10% bitrate)"; + case SPEED: + return "Speed bias (−30% bitrate)"; + case ESTIMATED: + return "CastTuningEngine recv-bitrate cap"; + case AUTO: + default: + return "No extra network scaling"; + } + } + + public static String adjustmentPreset(CastSettings.AdjustmentPreset preset) { + if (preset == null) { + return "CastTuningEngine default"; + } + switch (preset) { + case NONE: + return "No preset adjustments"; + case QUALITY: + return "Quality (+15% bitrate, +2 fps)"; + case SPEED: + return "Speed (−15% bitrate)"; + case PERFORMANCE: + return "Performance (−15% bitrate, stable fps)"; + case AUTO: + default: + return "CastTuningEngine adaptive preset"; + } + } + + public static String resolution(CastSettings.Resolution res) { + if (res == null) { + return "Device default"; + } + switch (res) { + case FULL: + return "Full display"; + case THREE_QUARTERS: + return "75% display scale"; + case HALF: + return "50% display scale"; + case HD_720P: + return "720p long-edge cap"; + case SD_480P: + return "480p long-edge cap"; + case FIXED_1080P: + return "Fixed 1080p box"; + case FIXED_720P: + return "Fixed 720p box"; + case ADAPTIVE: + return "Adaptive (CastTuningEngine + peer)"; + default: + return res.name(); + } + } + + public static String videoCodec(CastSettings.VideoCodec codec) { + if (codec == null) { + return "CodecNegotiator preference list"; + } + switch (codec) { + case H264: + return "H.264 (forced)"; + case H265: + return "H.265 (forced)"; + case PASSTHROUGH: + return "Passthrough (debug, unimplemented)"; + case LIBVPX_VP8: + return com.foxx.androidcast.media.codec.jni.NativeCodecBridge.isLibvpxAvailable() + ? "libvpx VP8" : "libvpx VP8 (HW fallback)"; + case LIBVPX_VP9: + return com.foxx.androidcast.media.codec.jni.NativeCodecBridge.isLibvpxAvailable() + ? "libvpx VP9" : "libvpx VP9 (HW fallback)"; + case AUTO: + default: + return "AUTO (lowest priority score wins)"; + } + } + + public static String audioCodec(CastSettings.AudioCodec codec) { + if (codec == null) { + return "AUTO (AAC via MediaCodec)"; + } + switch (codec) { + case AAC: + return "AAC-LC (forced)"; + case SPEEX: + return NativeCodecBridge.isSpeexAvailable() + ? "Speex (native)" : "Speex (fallback AAC)"; + case OPUS: + return NativeCodecBridge.isOpusAvailable() + ? "Opus + in-band FEC (native)" : "Opus (fallback AAC)"; + case PASSTHROUGH_DEBUG: + return "Passthrough AAC (debug)"; + case AUTO: + default: + return "AUTO (AAC via MediaCodec)"; + } + } + + public static String captureMode(CastSettings.CaptureMode mode) { + if (mode == null) { + return "Entire screen"; + } + switch (mode) { + case USER_CHOICE: + return "Choose app or screen (Android 14+)"; + case CALIBRATION_TEST: + return "Calibration test pattern"; + case CAMERA: + return "Camera (Camera2, planned)"; + case FULL_SCREEN: + default: + return "Entire screen"; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/diagnostics/CastDiagnosticsScorer.java b/app/src/main/java/com/foxx/androidcast/diagnostics/CastDiagnosticsScorer.java new file mode 100644 index 0000000..654af2b --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/diagnostics/CastDiagnosticsScorer.java @@ -0,0 +1,73 @@ +package com.foxx.androidcast.diagnostics; + +/********************************************************************* + * CastDiagnosticsScorer.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastDiagnosticsScorer + * Contributors: + * - Anton Afanasyeu (2 commits, 69 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 ee22fcdc1d1d6bce19746ebba8a85a125dee18c403318d0d38d7b5729b1929a2 +**********************************************************************/ +/** Heuristic stream quality score (0–100) from live metrics. */ +public final class CastDiagnosticsScorer { + private CastDiagnosticsScorer() {} + + public static int compute(float inFps, float renderFps, int bwInKbps, int suggestedBwKbps, + int rttMs, int congestionLevel, long audioPackets, boolean audioRequested) { + int score = 100; + if (inFps > 0 && inFps < 12f) { + score -= 25; + } else if (inFps > 0 && inFps < 20f) { + score -= 12; + } + if (inFps > 5f && renderFps > 0 && renderFps < inFps * 0.7f) { + score -= 22; + } else if (inFps > 5f && renderFps > 0 && renderFps < inFps * 0.85f) { + score -= 10; + } + if (suggestedBwKbps > 0 && bwInKbps > 0 && bwInKbps < suggestedBwKbps * 0.55f) { + score -= 20; + } else if (suggestedBwKbps > 0 && bwInKbps > 0 && bwInKbps < suggestedBwKbps * 0.75f) { + score -= 10; + } + if (rttMs > 600) { + score -= 18; + } else if (rttMs > 350) { + score -= 8; + } + if (congestionLevel >= 2) { + score -= 15; + } else if (congestionLevel >= 1) { + score -= 6; + } + if (audioRequested && audioPackets == 0) { + score -= 8; + } + if (score < 0) { + return 0; + } + if (score > 100) { + return 100; + } + return score; + } + + public static String label(int score) { + if (score >= 85) { + return "Excellent"; + } + if (score >= 70) { + return "Good"; + } + if (score >= 50) { + return "Fair"; + } + if (score >= 30) { + return "Poor"; + } + return "Bad"; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/diagnostics/CastMtuSampler.java b/app/src/main/java/com/foxx/androidcast/diagnostics/CastMtuSampler.java new file mode 100644 index 0000000..60f87f1 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/diagnostics/CastMtuSampler.java @@ -0,0 +1,78 @@ +package com.foxx.androidcast.diagnostics; + +/********************************************************************* + * CastMtuSampler.java + * Created at: Tue 19 May 2026 12:23:39 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastMtuSampler + * Contributors: + * - Anton Afanasyeu (2 commits, 74 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 7b7b6e645520691a03083a3dd11215e0c35ecea5c23544ae3ae7fc60cc8e999c +**********************************************************************/ +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.LinkProperties; +import android.net.Network; +import android.os.Build; + +import com.foxx.androidcast.CastConfig; + +/** + * Link MTU from the OS plus derived cast UDP sizing (see {@link com.foxx.androidcast.network.UdpCastTransport}). + */ +public final class CastMtuSampler { + /** ACUD header: magic(4) + type(1) + msgId(4) + fragIdx(2) + fragCnt(2) + totalLen(4). */ + public static final int ACUD_HEADER_BYTES = 17; + private static final int IPV4_UDP_OVERHEAD = 20 + 8; + + public static final class Info { + public final int linkMtu; + public final String interfaceName; + public final int castDatagramBytes; + public final int castFragPayloadBytes; + public final int ipv4WireBytes; + /** {@code linkMtu - ipv4WireBytes}, or {@code -1} when link MTU is unknown. */ + public final int headroomBytes; + + Info(int linkMtu, String interfaceName, int castDatagramBytes, int castFragPayloadBytes, + int ipv4WireBytes, int headroomBytes) { + this.linkMtu = linkMtu; + this.interfaceName = interfaceName != null ? interfaceName : ""; + this.castDatagramBytes = castDatagramBytes; + this.castFragPayloadBytes = castFragPayloadBytes; + this.ipv4WireBytes = ipv4WireBytes; + this.headroomBytes = headroomBytes; + } + } + + private CastMtuSampler() {} + + public static Info sample(Context context) { + int linkMtu = 0; + String iface = ""; + if (context != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + ConnectivityManager cm = context.getSystemService(ConnectivityManager.class); + if (cm != null) { + Network network = cm.getActiveNetwork(); + LinkProperties lp = network != null ? cm.getLinkProperties(network) : null; + if (lp != null) { + linkMtu = lp.getMtu(); + if (lp.getInterfaceName() != null) { + iface = lp.getInterfaceName(); + } + } + } + } + return calculate(linkMtu, iface); + } + + public static Info calculate(int linkMtu, String interfaceName) { + int datagram = CastConfig.UDP_CHUNK_SIZE; + int fragPayload = Math.max(0, datagram - ACUD_HEADER_BYTES); + int wire = datagram + IPV4_UDP_OVERHEAD; + int headroom = linkMtu > 0 ? linkMtu - wire : -1; + return new Info(linkMtu, interfaceName, datagram, fragPayload, wire, headroom); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/diagnostics/CpuLoadSampler.java b/app/src/main/java/com/foxx/androidcast/diagnostics/CpuLoadSampler.java new file mode 100644 index 0000000..8118171 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/diagnostics/CpuLoadSampler.java @@ -0,0 +1,245 @@ +package com.foxx.androidcast.diagnostics; + +/********************************************************************* + * CpuLoadSampler.java + * Created at: Tue 19 May 2026 12:23:39 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CpuLoadSampler + * Contributors: + * - Anton Afanasyeu (2 commits, 241 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 b012c6212636a1af22f16b9365b19616caff8d74b49746602b55735115a7f34c +**********************************************************************/ +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +/** Samples device or process CPU load (0–100% smoothed). */ +public final class CpuLoadSampler { + private static final long MIN_INTERVAL_MS = 200; + private static final int CORE_BUSY_THRESHOLD_PERCENT = 12; + private static final int USER_HZ = 100; + + private static final Object LOCK = new Object(); + private static long[] prevTotals; + private static long[][] prevPerCpu; + private static long prevSelfJiffies; + private static long lastSampleMs; + private static boolean procStatReadable = true; + private static Sample cached = new Sample(0, Runtime.getRuntime().availableProcessors(), -1); + + public static final class Sample { + public final int loadPercent; + public final int totalCores; + /** Cores above {@link #CORE_BUSY_THRESHOLD_PERCENT} usage; {@code -1} if unavailable. */ + public final int activeCores; + + Sample(int loadPercent, int totalCores, int activeCores) { + this.loadPercent = Math.max(0, Math.min(100, loadPercent)); + this.totalCores = Math.max(1, totalCores); + this.activeCores = activeCores; + } + } + + private CpuLoadSampler() {} + + /** Prime baseline so the first displayed sample is not stuck at 0%. */ + public static void warmUp() { + synchronized (LOCK) { + lastSampleMs = 0; + prevTotals = null; + prevPerCpu = null; + prevSelfJiffies = 0; + } + sample(); + try { + Thread.sleep(MIN_INTERVAL_MS + 50); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + sample(); + } + + public static Sample getCached() { + synchronized (LOCK) { + return cached; + } + } + + public static Sample sample() { + synchronized (LOCK) { + long now = System.currentTimeMillis(); + if (now - lastSampleMs < MIN_INTERVAL_MS && prevTotals != null) { + return cached; + } + int totalCores = Math.max(1, cached.totalCores); + int deviceLoad = -1; + int active = -1; + + if (procStatReadable) { + ProcStat current = readProcStat(); + if (current != null) { + totalCores = Math.max(1, current.perCpu.size()); + if (prevTotals != null) { + deviceLoad = percentDelta(prevTotals, current.totals); + active = countActiveCores(prevPerCpu, current.perCpu, totalCores); + } + prevTotals = current.totals; + prevPerCpu = copyPerCpu(current.perCpu); + } else { + procStatReadable = false; + } + } + + int processLoad = sampleProcessLoad(now); + int load = deviceLoad >= 0 ? deviceLoad : processLoad; + if (deviceLoad >= 0 && processLoad > load) { + load = processLoad; + } + + if (prevTotals != null || prevSelfJiffies > 0) { + cached = new Sample(load, totalCores, active); + } else if (processLoad > 0) { + cached = new Sample(processLoad, totalCores, -1); + } + lastSampleMs = now; + return cached; + } + } + + private static int sampleProcessLoad(long now) { + long jiffies = readSelfCpuJiffies(); + if (jiffies < 0) { + return 0; + } + int load = 0; + if (prevSelfJiffies > 0 && lastSampleMs > 0) { + long wallMs = now - lastSampleMs; + if (wallMs > 0) { + long delta = jiffies - prevSelfJiffies; + float pct = delta * 1000f * 100f / (USER_HZ * wallMs * cached.totalCores); + load = Math.round(Math.max(0f, Math.min(100f, pct))); + } + } + prevSelfJiffies = jiffies; + return load; + } + + private static long readSelfCpuJiffies() { + try (BufferedReader reader = new BufferedReader(new FileReader("/proc/self/stat"))) { + String line = reader.readLine(); + if (line == null) { + return -1; + } + int close = line.lastIndexOf(')'); + if (close < 0 || close + 2 >= line.length()) { + return -1; + } + String[] parts = line.substring(close + 2).split("\\s+"); + if (parts.length < 2) { + return -1; + } + return Long.parseLong(parts[0]) + Long.parseLong(parts[1]); + } catch (IOException | NumberFormatException ignored) { + return -1; + } + } + + private static int countActiveCores(long[][] prev, List curr, int totalCores) { + if (prev == null || curr.isEmpty() || prev.length != curr.size()) { + return -1; + } + int active = 0; + for (int i = 0; i < curr.size(); i++) { + if (percentDelta(prev[i], curr.get(i)) >= CORE_BUSY_THRESHOLD_PERCENT) { + active++; + } + } + return Math.min(active, totalCores); + } + + private static int percentDelta(long[] prev, long[] curr) { + long prevIdle = prev[3] + prev[4]; + long currIdle = curr[3] + curr[4]; + long prevTotal = sumTimes(prev); + long currTotal = sumTimes(curr); + long totalDelta = currTotal - prevTotal; + if (totalDelta <= 0) { + return 0; + } + long idleDelta = currIdle - prevIdle; + float busy = (totalDelta - idleDelta) * 100f / totalDelta; + return Math.round(Math.max(0f, Math.min(100f, busy))); + } + + private static long sumTimes(long[] times) { + long sum = 0; + for (long t : times) { + sum += t; + } + return sum; + } + + private static long[][] copyPerCpu(List list) { + long[][] out = new long[list.size()][]; + for (int i = 0; i < list.size(); i++) { + out[i] = list.get(i).clone(); + } + return out; + } + + private static ProcStat readProcStat() { + try (BufferedReader reader = new BufferedReader(new FileReader("/proc/stat"))) { + ProcStat stat = new ProcStat(); + String line; + while ((line = reader.readLine()) != null) { + if (line.startsWith("cpu ")) { + stat.totals = parseCpuLine(line); + } else if (line.startsWith("cpu") && line.length() > 3 && Character.isDigit(line.charAt(3))) { + long[] cpu = parseCpuLine(line); + if (cpu != null) { + stat.perCpu.add(cpu); + } + } else if (!line.startsWith("cpu")) { + break; + } + } + return stat.totals != null ? stat : null; + } catch (IOException ignored) { + return null; + } + } + + private static long[] parseCpuLine(String line) { + String[] parts = line.trim().split("\\s+"); + if (parts.length < 5) { + return null; + } + long[] times = new long[Math.min(10, parts.length - 1)]; + for (int i = 0; i < times.length; i++) { + try { + times[i] = Long.parseLong(parts[i + 1]); + } catch (NumberFormatException e) { + return null; + } + } + return times; + } + + private static final class ProcStat { + long[] totals; + final List perCpu = new ArrayList<>(); + } + + /** HTML suffix: {@code (2/8)} or {@code (8 cores)}. */ + public static String formatCoreSuffix(Sample sample) { + if (sample.activeCores >= 0 && sample.activeCores <= sample.totalCores) { + return String.format(Locale.US, "(%d/%d)", sample.activeCores, sample.totalCores); + } + return String.format(Locale.US, "(%d cores)", sample.totalCores); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/discovery/CastLanPeerProbe.java b/app/src/main/java/com/foxx/androidcast/discovery/CastLanPeerProbe.java new file mode 100644 index 0000000..0722ec0 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/discovery/CastLanPeerProbe.java @@ -0,0 +1,214 @@ +package com.foxx.androidcast.discovery; + +import android.content.Context; +import android.net.wifi.WifiManager; + +import com.foxx.androidcast.CastConfig; +import com.foxx.androidcast.network.CastProtoHeader; + +import org.json.JSONObject; + +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +/** Quick UDP cast discovery scan for developer network self-test. */ +public final class CastLanPeerProbe { + private static final int SCAN_MS = 2_500; + private static final int PROBE_INTERVAL_MS = 700; + + public static final class Result { + public final int peers; + public final String summary; + public final long elapsedMs; + + Result(int peers, String summary, long elapsedMs) { + this.peers = peers; + this.summary = summary; + this.elapsedMs = elapsedMs; + } + } + + private CastLanPeerProbe() {} + + public static Result scan(Context context, AtomicBoolean cancel) { + long t0 = System.currentTimeMillis(); + Map peers = new LinkedHashMap<>(); + WifiManager.MulticastLock lock = acquireMulticastLock(context); + try (DatagramSocket sock = openSocket()) { + if (sock == null) { + return new Result(0, "socket bind failed", System.currentTimeMillis() - t0); + } + sock.setSoTimeout(250); + byte[] buf = new byte[2048]; + long deadline = System.currentTimeMillis() + SCAN_MS; + long nextProbe = System.currentTimeMillis(); + while (System.currentTimeMillis() < deadline) { + if (cancel != null && cancel.get()) { + break; + } + long now = System.currentTimeMillis(); + if (now >= nextProbe) { + sendDiscoverProbe(sock); + nextProbe = now + PROBE_INTERVAL_MS; + } + DatagramPacket packet = new DatagramPacket(buf, buf.length); + try { + sock.receive(packet); + recordPeer(context, packet, peers); + } catch (java.net.SocketTimeoutException ignored) { + } catch (Exception ignored) { + } + } + } catch (Exception e) { + long ms = System.currentTimeMillis() - t0; + return new Result(0, e.getClass().getSimpleName(), ms); + } finally { + releaseMulticastLock(lock); + } + long ms = System.currentTimeMillis() - t0; + if (peers.isEmpty()) { + return new Result(0, "UDP :" + CastConfig.DISCOVERY_PORT + " · " + ms + " ms", ms); + } + StringBuilder names = new StringBuilder(); + for (Map.Entry e : peers.entrySet()) { + if (names.length() > 0) { + names.append(", "); + } + names.append(e.getValue()).append('@').append(e.getKey()); + if (names.length() > 96) { + names.append("…"); + break; + } + } + return new Result(peers.size(), names.toString(), ms); + } + + private static DatagramSocket openSocket() { + try { + DatagramSocket sock = new DatagramSocket(null); + sock.setReuseAddress(true); + sock.setBroadcast(true); + try { + sock.bind(new InetSocketAddress(CastConfig.DISCOVERY_PORT)); + } catch (Exception ignored) { + sock.bind(null); + } + return sock; + } catch (Exception e) { + return null; + } + } + + private static void sendDiscoverProbe(DatagramSocket sock) { + try { + JSONObject json = new JSONObject(); + json.put("magic", CastConfig.DISCOVERY_MAGIC); + json.put("discover", true); + byte[] bytes = json.toString().getBytes(StandardCharsets.UTF_8); + InetAddress broadcast = InetAddress.getByName("255.255.255.255"); + DatagramPacket packet = new DatagramPacket(bytes, bytes.length, broadcast, CastConfig.DISCOVERY_PORT); + sock.send(packet); + } catch (Exception ignored) { + } + } + + private static void recordPeer(Context context, DatagramPacket packet, Map peers) { + try { + JSONObject json = parseAnnounceJson(packet); + if (json == null) { + return; + } + if (!CastConfig.DISCOVERY_MAGIC.equals(json.optString("magic"))) { + return; + } + if (json.optBoolean("discover", false)) { + return; + } + String host = packet.getAddress().getHostAddress(); + String remoteUuid = json.optString("device_uuid", ""); + if (DiscoverySelfFilter.isSelf(context, host, remoteUuid)) { + return; + } + String name = json.optString("name", "Unknown"); + int port = json.optInt("port", CastConfig.CAST_PORT); + boolean listening = json.optBoolean("listening", true); + if (!listening) { + return; + } + peers.put(host + ":" + port, name); + } catch (Exception ignored) { + } + } + + private static JSONObject parseAnnounceJson(DatagramPacket packet) { + try { + byte[] raw = packet.getData(); + int off = packet.getOffset(); + int len = packet.getLength(); + String text; + if (len >= CastProtoHeader.HEADER_SIZE_V1 && readMagicLe(raw, off) == CastProtoHeader.MAGIC) { + CastProtoHeader hdr = CastProtoHeader.decode(raw, off, len); + int bodyOff = off + hdr.headerSize; + int bodyLen = len - hdr.headerSize; + if (bodyLen > 5) { + byte type = raw[bodyOff]; + int plen = readIntBe(raw, bodyOff + 1); + if (plen >= 0 && bodyOff + 5 + plen <= off + len) { + text = new String(raw, bodyOff + 5, plen, StandardCharsets.UTF_8); + } else { + text = new String(raw, bodyOff, bodyLen, StandardCharsets.UTF_8); + } + } else { + text = new String(raw, bodyOff, bodyLen, StandardCharsets.UTF_8); + } + } else { + text = new String(raw, off, len, StandardCharsets.UTF_8); + } + return new JSONObject(text); + } catch (Exception e) { + return null; + } + } + + private static int readMagicLe(byte[] b, int off) { + return (b[off] & 0xff) | ((b[off + 1] & 0xff) << 8) + | ((b[off + 2] & 0xff) << 16) | ((b[off + 3] & 0xff) << 24); + } + + private static int readIntBe(byte[] b, int off) { + return ((b[off] & 0xff) << 24) | ((b[off + 1] & 0xff) << 16) + | ((b[off + 2] & 0xff) << 8) | (b[off + 3] & 0xff); + } + + private static WifiManager.MulticastLock acquireMulticastLock(Context context) { + if (context == null) { + return null; + } + WifiManager wifi = context.getApplicationContext().getSystemService(WifiManager.class); + if (wifi == null) { + return null; + } + WifiManager.MulticastLock lock = wifi.createMulticastLock("androidcast-lan-probe"); + lock.setReferenceCounted(false); + lock.acquire(); + return lock; + } + + private static void releaseMulticastLock(WifiManager.MulticastLock lock) { + if (lock == null) { + return; + } + try { + if (lock.isHeld()) { + lock.release(); + } + } catch (RuntimeException ignored) { + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/discovery/DiscoveryManager.java b/app/src/main/java/com/foxx/androidcast/discovery/DiscoveryManager.java new file mode 100644 index 0000000..1318d7d --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/discovery/DiscoveryManager.java @@ -0,0 +1,551 @@ +package com.foxx.androidcast.discovery; + +/********************************************************************* + * DiscoveryManager.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class DiscoveryManager + * Contributors: + * - Anton Afanasyeu (10 commits, 536 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 401ea19fe075a36c392b8e5d32e8f55e2428f4bc2ee1f48fec96a7aca0ffcc51 +**********************************************************************/ +import android.content.Context; +import android.net.wifi.WifiManager; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; + +import com.foxx.androidcast.CastConfig; +import com.foxx.androidcast.DeviceInfo; +import com.foxx.androidcast.PinAuth; +import com.foxx.androidcast.network.CastCodecFlags; +import com.foxx.androidcast.network.CastPacketFramer; +import com.foxx.androidcast.network.CastProtoHeader; +import com.foxx.androidcast.network.CastProtocol; + +import org.json.JSONObject; + +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicBoolean; + +/** UDP broadcast discovery of receivers on the same LAN. */ +public class DiscoveryManager { + private static final String TAG = "DiscoveryManager"; + + public interface Listener { + void onDevicesUpdated(List devices); + + /** UDP browse socket is active. */ + default void onScanStarted() { + } + + /** Browse pass finished (timeout or {@link #stop()}). */ + default void onScanEnded() { + } + } + + public static final class DiscoveredDevice { + public final String name; + public final String host; + public final int port; + public final String transport; + public final long lastSeenMs; + public final int videoCodecs; + public final int audioCodecs; + public final int placeholderId; + public final long protoVersion; + /** SHA-256 hex of receiver PIN, empty if anonymous. */ + public final String pinAuth; + /** Shown from {@link PinnedReceiversStore} at top of sender list. */ + public boolean pinnedRecent; + /** LAN discovery device UUID when advertised by peer. */ + public final String deviceUuid; + + public DiscoveredDevice(String name, String host, int port, String transport, long lastSeenMs) { + this(name, host, port, transport, lastSeenMs, 0, 0, 0, 0L, "", ""); + } + + public DiscoveredDevice(String name, String host, int port, String transport, long lastSeenMs, + int videoCodecs, int audioCodecs, int placeholderId, long protoVersion) { + this(name, host, port, transport, lastSeenMs, videoCodecs, audioCodecs, placeholderId, protoVersion, ""); + } + + public DiscoveredDevice(String name, String host, int port, String transport, long lastSeenMs, + int videoCodecs, int audioCodecs, int placeholderId, long protoVersion, String pinAuth) { + this(name, host, port, transport, lastSeenMs, videoCodecs, audioCodecs, placeholderId, protoVersion, + pinAuth, ""); + } + + public DiscoveredDevice(String name, String host, int port, String transport, long lastSeenMs, + int videoCodecs, int audioCodecs, int placeholderId, long protoVersion, String pinAuth, + String deviceUuid) { + this.name = name; + this.host = host; + this.port = port; + this.transport = transport; + this.lastSeenMs = lastSeenMs; + this.videoCodecs = videoCodecs; + this.audioCodecs = audioCodecs; + this.placeholderId = placeholderId; + this.protoVersion = protoVersion; + this.pinAuth = pinAuth != null ? pinAuth : ""; + this.deviceUuid = deviceUuid != null ? deviceUuid : ""; + } + + public boolean pinMatches(String pin) { + return PinAuth.matches(pin, pinAuth); + } + } + + private final Context appContext; + private final Handler mainHandler = new Handler(Looper.getMainLooper()); + private final ExecutorService executor = Executors.newCachedThreadPool(); + private final AtomicBoolean running = new AtomicBoolean(false); + private final ConcurrentHashMap devices = new ConcurrentHashMap<>(); + + private Listener listener; + private volatile DatagramSocket socket; + private final Object lockGuard = new Object(); + private WifiManager.MulticastLock multicastLock; + private int multicastHolds; + private boolean burstScan; + private NsdCastDiscovery nsdDiscovery; + + public DiscoveryManager(Context context) { + this.appContext = context.getApplicationContext(); + } + + public void setListener(Listener listener) { + this.listener = listener; + } + + public boolean isBrowsing() { + return running.get(); + } + + public void startBrowsing() { + startBrowsing(false); + } + + /** @param burst shorter UDP pass + NSD (user Refresh). */ + public void startBrowsing(boolean burst) { + if (!running.compareAndSet(false, true)) { + return; + } + burstScan = burst; + purgeSelfFromDeviceMap(); + notifyScanStarted(); + startNsdBrowse(); + executor.execute(this::browseLoop); + } + + /** + * Stops discovery I/O. The background loop releases the multicast lock in its {@code finally} + * block — do not release here (double-release crashed the sender when cast started). + */ + public void stop() { + running.set(false); + stopNsdBrowse(); + stopNsdRegister(); + DatagramSocket toClose = socket; + socket = null; + if (toClose != null) { + try { + toClose.close(); + } catch (Exception ignored) { + } + } + devices.clear(); + } + + public void clearDevices() { + devices.clear(); + notifyListener(); + } + + public void startAnnouncing(String deviceName, int port, String transport) { + startAnnouncing(deviceName, port, transport, true); + } + + public void startAnnouncing(Context context, String deviceName, int port, String transport, + boolean listening) { + startAnnouncing(context, deviceName, port, transport, listening, ""); + } + + public void startAnnouncing(Context context, String deviceName, int port, String transport, + boolean listening, String pin) { + if (!running.compareAndSet(false, true)) { + return; + } + String pinHash = com.foxx.androidcast.PinAuth.isProtected(pin) + ? com.foxx.androidcast.PinAuth.hash(pin) : ""; + startNsdRegister(deviceName, port, transport, pinHash); + executor.execute(() -> announceLoop(context, deviceName, port, transport, listening, pin)); + } + + /** Merge device from NSD or pinned list into the browse map. */ + public void upsertExternal(DiscoveredDevice device) { + if (device == null || device.host == null || device.host.isEmpty()) { + return; + } + if (DiscoverySelfFilter.isSelf(appContext, device.host, null)) { + return; + } + String key = device.host + ":" + device.port; + devices.put(key, device); + notifyListener(); + } + + public void startAnnouncing(String deviceName, int port, String transport, boolean listening) { + startAnnouncing(appContext, deviceName, port, transport, listening, ""); + } + + private void browseLoop() { + acquireMulticastLock(); + try (DatagramSocket sock = new DatagramSocket(null)) { + socket = sock; + sock.setReuseAddress(true); + sock.bind(new InetSocketAddress(CastConfig.DISCOVERY_PORT)); + sock.setBroadcast(true); + sock.setSoTimeout(300); + byte[] buf = new byte[1024]; + long passMs = burstScan ? CastConfig.DISCOVERY_BURST_MS : CastConfig.DISCOVERY_SCAN_PASS_MS; + long probeInterval = burstScan ? CastConfig.DISCOVERY_BURST_PROBE_MS + : CastConfig.DISCOVERY_PROBE_INTERVAL_MS; + long deadline = System.currentTimeMillis() + passMs; + long nextProbeMs = System.currentTimeMillis(); + while (running.get() && System.currentTimeMillis() < deadline) { + long now = System.currentTimeMillis(); + if (now >= nextProbeMs) { + sendDiscoveryProbe(sock); + nextProbeMs = now + probeInterval; + } + DatagramPacket packet = new DatagramPacket(buf, buf.length); + try { + sock.receive(packet); + handlePacket(packet); + } catch (java.net.SocketTimeoutException ignored) { + // keep listening until pass ends + } + } + } catch (Exception e) { + if (running.get()) { + Log.e(TAG, "Browse failed", e); + } + } finally { + socket = null; + releaseMulticastLock(); + running.set(false); + notifyScanEnded(); + } + } + + private void notifyScanStarted() { + if (listener == null) { + return; + } + mainHandler.post(() -> { + if (listener != null) { + listener.onScanStarted(); + } + }); + } + + private void notifyScanEnded() { + if (listener == null) { + return; + } + mainHandler.post(() -> { + if (listener != null) { + listener.onScanEnded(); + } + }); + } + + private void announceLoop(Context context, String deviceName, int port, String transport, + boolean listening, String pin) { + acquireMulticastLock(); + int placeholderId = DeviceInfo.getPlaceholderId(context); + int videoMask = CastCodecFlags.localDecoderVideoMask(); + int audioMask = CastCodecFlags.localAudioMask(); + try (DatagramSocket sock = new DatagramSocket()) { + socket = sock; + sock.setBroadcast(true); + sock.setSoTimeout(400); + while (running.get()) { + sendAnnounce(sock, context, deviceName, port, transport, listening, pin, + placeholderId, videoMask, audioMask); + long listenUntil = System.currentTimeMillis() + 2_000; + while (running.get() && System.currentTimeMillis() < listenUntil) { + try { + byte[] buf = new byte[1024]; + DatagramPacket packet = new DatagramPacket(buf, buf.length); + sock.receive(packet); + if (isDiscoverProbe(packet)) { + sendAnnounce(sock, context, deviceName, port, transport, listening, pin, + placeholderId, videoMask, audioMask); + sendAnnounceUnicast(sock, context, deviceName, port, transport, listening, pin, + placeholderId, videoMask, audioMask, packet.getAddress()); + } + } catch (java.net.SocketTimeoutException ignored) { + } + } + } + } catch (Exception e) { + if (running.get()) { + Log.e(TAG, "Announce failed", e); + } + } finally { + socket = null; + releaseMulticastLock(); + running.set(false); + } + } + + private static void sendDiscoveryProbe(DatagramSocket sock) { + try { + JSONObject json = new JSONObject(); + json.put("magic", CastConfig.DISCOVERY_MAGIC); + json.put("discover", true); + byte[] bytes = json.toString().getBytes(StandardCharsets.UTF_8); + InetAddress broadcast = InetAddress.getByName("255.255.255.255"); + DatagramPacket packet = new DatagramPacket(bytes, bytes.length, broadcast, CastConfig.DISCOVERY_PORT); + sock.send(packet); + } catch (Exception e) { + Log.w(TAG, "Discovery probe send failed: " + e.getMessage()); + } + } + + private static boolean isDiscoverProbe(DatagramPacket packet) { + try { + String text = new String(packet.getData(), packet.getOffset(), packet.getLength(), + StandardCharsets.UTF_8); + JSONObject json = new JSONObject(text); + return CastConfig.DISCOVERY_MAGIC.equals(json.optString("magic")) + && json.optBoolean("discover", false); + } catch (Exception e) { + return false; + } + } + + private static void sendAnnounce(DatagramSocket sock, Context context, String deviceName, int port, + String transport, boolean listening, String pin, int placeholderId, int videoMask, int audioMask) + throws Exception { + byte[] wire = buildAnnounceWire(context, deviceName, port, transport, listening, pin, + placeholderId, videoMask, audioMask); + InetAddress broadcast = InetAddress.getByName("255.255.255.255"); + DatagramPacket packet = new DatagramPacket(wire, wire.length, broadcast, CastConfig.DISCOVERY_PORT); + sock.send(packet); + } + + private static void sendAnnounceUnicast(DatagramSocket sock, Context context, String deviceName, int port, + String transport, boolean listening, String pin, int placeholderId, int videoMask, int audioMask, + InetAddress target) { + try { + byte[] wire = buildAnnounceWire(context, deviceName, port, transport, listening, pin, + placeholderId, videoMask, audioMask); + DatagramPacket packet = new DatagramPacket(wire, wire.length, target, CastConfig.DISCOVERY_PORT); + sock.send(packet); + } catch (Exception e) { + Log.w(TAG, "Unicast announce failed: " + e.getMessage()); + } + } + + private static byte[] buildAnnounceWire(Context context, String deviceName, int port, String transport, + boolean listening, String pin, int placeholderId, int videoMask, int audioMask) throws Exception { + JSONObject json = new JSONObject(); + json.put("magic", CastConfig.DISCOVERY_MAGIC); + json.put("name", deviceName); + json.put("port", port); + json.put("transport", transport); + json.put("listening", listening); + json.put("device_uuid", DeviceInfo.getDeviceUuid(context)); + if (PinAuth.isProtected(pin)) { + json.put("pin_auth", PinAuth.hash(pin)); + } + byte[] jsonBytes = json.toString().getBytes(StandardCharsets.UTF_8); + CastProtoHeader hdr = CastProtoHeader.forDiscovery(placeholderId, videoMask, audioMask); + try { + return CastPacketFramer.frame(hdr, CastProtocol.MSG_HELLO, jsonBytes); + } catch (Exception e) { + return jsonBytes; + } + } + + private void handlePacket(DatagramPacket packet) { + try { + byte[] raw = packet.getData(); + int off = packet.getOffset(); + int len = packet.getLength(); + String text; + int videoCodecs = 0; + int audioCodecs = 0; + int placeholderId = 0; + long protoVersion = 0L; + int bodyOff = off; + int bodyLen = len; + if (len >= CastProtoHeader.HEADER_SIZE_V1 && readMagicLe(raw, off) == CastProtoHeader.MAGIC) { + CastProtoHeader hdr = CastProtoHeader.decode(raw, off, len); + if (hdr.verifyChecksum() && hdr.hsType == CastProtoHeader.HS_SDP) { + videoCodecs = hdr.videoCodecs; + audioCodecs = hdr.audioCodecs; + placeholderId = hdr.placeholderId; + protoVersion = hdr.protoVersion; + } + bodyOff = off + hdr.headerSize; + bodyLen = len - hdr.headerSize; + if (bodyLen > 5) { + byte type = raw[bodyOff]; + int plen = readIntBe(raw, bodyOff + 1); + if (plen >= 0 && bodyOff + 5 + plen <= off + len) { + text = new String(raw, bodyOff + 5, plen, StandardCharsets.UTF_8); + } else { + text = new String(raw, bodyOff, bodyLen, StandardCharsets.UTF_8); + } + } else { + text = new String(raw, bodyOff, bodyLen, StandardCharsets.UTF_8); + } + } else { + text = new String(raw, off, len, StandardCharsets.UTF_8); + } + JSONObject json = new JSONObject(text); + if (!CastConfig.DISCOVERY_MAGIC.equals(json.optString("magic"))) { + return; + } + String name = json.optString("name", "Unknown"); + int port = json.optInt("port", CastConfig.CAST_PORT); + String transport = json.optString("transport", CastConfig.DEFAULT_TRANSPORT); + if (!json.optBoolean("listening", true)) { + return; + } + String host = packet.getAddress().getHostAddress(); + String remoteUuid = json.optString("device_uuid", ""); + if (DiscoverySelfFilter.isSelf(appContext, host, remoteUuid)) { + String key = host + ":" + port; + if (devices.remove(key) != null) { + notifyListener(); + } + return; + } + String pinAuth = json.optString("pin_auth", ""); + String key = host + ":" + port; + DiscoveredDevice device = new DiscoveredDevice(name, host, port, transport, + System.currentTimeMillis(), videoCodecs, audioCodecs, placeholderId, protoVersion, pinAuth, + remoteUuid); + devices.put(key, device); + notifyListener(); + } catch (Exception ignored) { + } + } + + private static int readMagicLe(byte[] b, int off) { + return (b[off] & 0xff) | ((b[off + 1] & 0xff) << 8) + | ((b[off + 2] & 0xff) << 16) | ((b[off + 3] & 0xff) << 24); + } + + private static int readIntBe(byte[] b, int off) { + return ((b[off] & 0xff) << 24) | ((b[off + 1] & 0xff) << 16) + | ((b[off + 2] & 0xff) << 8) | (b[off + 3] & 0xff); + } + + private void purgeSelfFromDeviceMap() { + boolean changed = false; + for (String key : new ArrayList<>(devices.keySet())) { + DiscoveredDevice d = devices.get(key); + if (d != null && DiscoverySelfFilter.isSelf(appContext, d.host, null)) { + devices.remove(key); + changed = true; + } + } + if (changed) { + notifyListener(); + } + } + + private void notifyListener() { + if (listener == null) { + return; + } + long now = System.currentTimeMillis(); + List fresh = new ArrayList<>(); + for (DiscoveredDevice d : devices.values()) { + if (now - d.lastSeenMs < 10_000 + && !DiscoverySelfFilter.isSelf(appContext, d.host, null)) { + fresh.add(d); + } + } + mainHandler.post(() -> listener.onDevicesUpdated(fresh)); + } + + private void acquireMulticastLock() { + synchronized (lockGuard) { + if (multicastLock == null) { + WifiManager wifi = (WifiManager) appContext.getSystemService(Context.WIFI_SERVICE); + if (wifi == null) { + return; + } + multicastLock = wifi.createMulticastLock("androidcast-discovery"); + multicastLock.setReferenceCounted(false); + } + if (multicastHolds == 0) { + multicastLock.acquire(); + } + multicastHolds++; + } + } + + private void startNsdBrowse() { + if (nsdDiscovery == null) { + nsdDiscovery = new NsdCastDiscovery(appContext, this::upsertExternal); + } + nsdDiscovery.startDiscovering(); + } + + private void stopNsdBrowse() { + if (nsdDiscovery != null) { + nsdDiscovery.stopDiscovering(); + } + } + + private void startNsdRegister(String deviceName, int port, String transport, String pinAuth) { + if (nsdDiscovery == null) { + nsdDiscovery = new NsdCastDiscovery(appContext, this::upsertExternal); + } + nsdDiscovery.register(deviceName, port, transport, pinAuth); + } + + public void stopNsdRegister() { + if (nsdDiscovery != null) { + nsdDiscovery.unregister(); + } + } + + private void releaseMulticastLock() { + synchronized (lockGuard) { + if (multicastLock == null || multicastHolds <= 0) { + return; + } + multicastHolds--; + if (multicastHolds == 0) { + try { + if (multicastLock.isHeld()) { + multicastLock.release(); + } + } catch (RuntimeException e) { + Log.w(TAG, "MulticastLock release: " + e.getMessage()); + } + } + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/discovery/DiscoverySelfFilter.java b/app/src/main/java/com/foxx/androidcast/discovery/DiscoverySelfFilter.java new file mode 100644 index 0000000..13b1d9c --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/discovery/DiscoverySelfFilter.java @@ -0,0 +1,77 @@ +package com.foxx.androidcast.discovery; + +/********************************************************************* + * DiscoverySelfFilter.java + * Created at: Sun 17 May 2026 15:45:19 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * Contributors: + * - Anton Afanasyeu (2 commits, 73 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 cf0c0de407834543412ba5d8f3b89feb1f44a4f7a4258de315aed83a7a0436df +**********************************************************************/ +import android.content.Context; + +import com.foxx.androidcast.DeviceInfo; + +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Set; + +/** Drops LAN discovery entries that refer to this device. */ +final class DiscoverySelfFilter { + private DiscoverySelfFilter() {} + + static boolean isSelf(Context context, String host, String remoteDeviceUuid) { + if (context != null && remoteDeviceUuid != null && !remoteDeviceUuid.isEmpty()) { + if (remoteDeviceUuid.equals(DeviceInfo.getDeviceUuid(context.getApplicationContext()))) { + return true; + } + } + return isLocalHost(host); + } + + static boolean isLocalHost(String host) { + if (host == null || host.isEmpty()) { + return false; + } + if ("127.0.0.1".equals(host) || "::1".equals(host) || "0:0:0:0:0:0:0:1".equals(host)) { + return true; + } + for (String local : localIpv4Addresses()) { + if (local.equals(host)) { + return true; + } + } + return false; + } + + private static Set localIpv4Addresses() { + Set out = new HashSet<>(); + try { + Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); + if (ifaces == null) { + return out; + } + for (NetworkInterface ni : Collections.list(ifaces)) { + if (!ni.isUp() || ni.isLoopback()) { + continue; + } + for (InetAddress addr : Collections.list(ni.getInetAddresses())) { + if (addr instanceof Inet4Address && !addr.isLoopbackAddress()) { + String h = addr.getHostAddress(); + if (h != null) { + out.add(h); + } + } + } + } + } catch (Exception ignored) { + } + return out; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/discovery/NsdCastDiscovery.java b/app/src/main/java/com/foxx/androidcast/discovery/NsdCastDiscovery.java new file mode 100644 index 0000000..7617224 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/discovery/NsdCastDiscovery.java @@ -0,0 +1,207 @@ +package com.foxx.androidcast.discovery; + +/********************************************************************* + * NsdCastDiscovery.java + * Created at: Mon 18 May 2026 17:46:19 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class NsdCastDiscovery + * Contributors: + * - Anton Afanasyeu (2 commits, 203 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 6930ce92263586668ef5644052979b105a5707a40e17deccdb2c721ed1b7af51 +**********************************************************************/ +import android.content.Context; +import android.net.nsd.NsdManager; +import android.net.nsd.NsdServiceInfo; +import android.os.Build; +import android.util.Log; + +import com.foxx.androidcast.CastConfig; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Android NSD (mDNS) discovery/advertise alongside UDP broadcast. + * TXT: port, transport, pin_auth (optional). + */ +public final class NsdCastDiscovery { + private static final String TAG = "NsdCastDiscovery"; + + public interface Host { + void onNsdDeviceFound(DiscoveryManager.DiscoveredDevice device); + } + + private final Context appContext; + private final Host host; + private NsdManager nsdManager; + private NsdManager.DiscoveryListener discoveryListener; + private NsdManager.RegistrationListener registrationListener; + private final AtomicBoolean discovering = new AtomicBoolean(false); + + public NsdCastDiscovery(Context context, Host host) { + this.appContext = context.getApplicationContext(); + this.host = host; + } + + public void startDiscovering() { + if (!discovering.compareAndSet(false, true)) { + return; + } + nsdManager = (NsdManager) appContext.getSystemService(Context.NSD_SERVICE); + if (nsdManager == null) { + discovering.set(false); + return; + } + discoveryListener = new NsdManager.DiscoveryListener() { + @Override + public void onDiscoveryStarted(String serviceType) { + Log.d(TAG, "NSD discovery started"); + } + + @Override + public void onServiceFound(NsdServiceInfo service) { + if (service == null || service.getServiceType() == null) { + return; + } + if (!service.getServiceType().contains("_androidcast")) { + return; + } + nsdManager.resolveService(service, new NsdManager.ResolveListener() { + @Override + public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) { + Log.d(TAG, "NSD resolve failed: " + errorCode); + } + + @Override + public void onServiceResolved(NsdServiceInfo info) { + publishResolved(info); + } + }); + } + + @Override + public void onServiceLost(NsdServiceInfo service) {} + + @Override + public void onDiscoveryStopped(String serviceType) { + discovering.set(false); + } + + @Override + public void onStartDiscoveryFailed(String serviceType, int errorCode) { + Log.w(TAG, "NSD start failed: " + errorCode); + discovering.set(false); + } + + @Override + public void onStopDiscoveryFailed(String serviceType, int errorCode) { + discovering.set(false); + } + }; + try { + nsdManager.discoverServices(CastConfig.NSD_SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, + discoveryListener); + } catch (Exception e) { + Log.w(TAG, "NSD discover: " + e.getMessage()); + discovering.set(false); + } + } + + public void stopDiscovering() { + if (!discovering.get() || nsdManager == null || discoveryListener == null) { + discovering.set(false); + return; + } + try { + nsdManager.stopServiceDiscovery(discoveryListener); + } catch (Exception ignored) { + } + discoveryListener = null; + discovering.set(false); + } + + public void register(String serviceName, int port, String transport, String pinAuth) { + nsdManager = (NsdManager) appContext.getSystemService(Context.NSD_SERVICE); + if (nsdManager == null) { + return; + } + NsdServiceInfo info = new NsdServiceInfo(); + info.setServiceName(sanitizeServiceName(serviceName)); + info.setServiceType(CastConfig.NSD_SERVICE_TYPE); + info.setPort(port); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + info.setAttribute("transport", transport != null ? transport : CastConfig.DEFAULT_TRANSPORT); + if (pinAuth != null && !pinAuth.isEmpty()) { + info.setAttribute("pin_auth", pinAuth); + } + } + registrationListener = new NsdManager.RegistrationListener() { + @Override + public void onRegistrationFailed(NsdServiceInfo serviceInfo, int errorCode) { + Log.w(TAG, "NSD register failed: " + errorCode); + } + + @Override + public void onUnregistrationFailed(NsdServiceInfo serviceInfo, int errorCode) {} + + @Override + public void onServiceRegistered(NsdServiceInfo serviceInfo) { + Log.i(TAG, "NSD registered " + serviceInfo.getServiceName()); + } + + @Override + public void onServiceUnregistered(NsdServiceInfo serviceInfo) {} + }; + try { + nsdManager.registerService(info, NsdManager.PROTOCOL_DNS_SD, registrationListener); + } catch (Exception e) { + Log.w(TAG, "NSD register: " + e.getMessage()); + } + } + + public void unregister() { + if (nsdManager == null || registrationListener == null) { + return; + } + try { + nsdManager.unregisterService(registrationListener); + } catch (Exception ignored) { + } + registrationListener = null; + } + + private void publishResolved(NsdServiceInfo info) { + if (info == null || info.getHost() == null) { + return; + } + String hostAddress = info.getHost().getHostAddress(); + int port = info.getPort(); + if (port <= 0) { + port = CastConfig.CAST_PORT; + } + String transport = CastConfig.DEFAULT_TRANSPORT; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + byte[] t = info.getAttributes().get("transport"); + if (t != null) { + transport = new String(t).trim(); + } + } + String name = info.getServiceName() != null ? info.getServiceName().replace('_', ' ') : hostAddress; + DiscoveryManager.DiscoveredDevice device = new DiscoveryManager.DiscoveredDevice( + name, hostAddress, port, transport, System.currentTimeMillis()); + host.onNsdDeviceFound(device); + } + + private static String sanitizeServiceName(String name) { + String s = name != null ? name : "AndroidCast"; + s = s.replaceAll("[^a-zA-Z0-9-]", ""); + if (s.length() < 1) { + s = "AndroidCast"; + } + if (s.length() > 63) { + s = s.substring(0, 63); + } + return s; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/discovery/PinnedReceiversStore.java b/app/src/main/java/com/foxx/androidcast/discovery/PinnedReceiversStore.java new file mode 100644 index 0000000..08ad87f --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/discovery/PinnedReceiversStore.java @@ -0,0 +1,101 @@ +package com.foxx.androidcast.discovery; + +/********************************************************************* + * PinnedReceiversStore.java + * Created at: Mon 18 May 2026 17:46:19 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class PinnedReceiversStore + * Contributors: + * - Anton Afanasyeu (2 commits, 97 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 68ba4c5f3d15599a6be3b3119233919461009f1725133f13f15e63e7f3fd02d8 +**********************************************************************/ +import android.content.Context; +import android.content.SharedPreferences; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** Last successful cast targets shown at the top of the sender device list. */ +public final class PinnedReceiversStore { + private static final String PREFS = "androidcast_pinned_receivers"; + private static final String KEY_ENTRIES = "entries"; + private static final int MAX_PINNED = 5; + + private PinnedReceiversStore() {} + + public static void recordSuccess(Context context, DiscoveryManager.DiscoveredDevice device) { + if (context == null || device == null) { + return; + } + List list = load(context); + String key = device.host + ":" + device.port; + list.removeIf(d -> (d.host + ":" + d.port).equals(key)); + DiscoveryManager.DiscoveredDevice copy = new DiscoveryManager.DiscoveredDevice( + device.name, device.host, device.port, device.transport, System.currentTimeMillis(), + device.videoCodecs, device.audioCodecs, device.placeholderId, device.protoVersion, + device.pinAuth); + copy.pinnedRecent = true; + list.add(0, copy); + while (list.size() > MAX_PINNED) { + list.remove(list.size() - 1); + } + save(context, list); + } + + public static List load(Context context) { + List out = new ArrayList<>(); + SharedPreferences p = context.getApplicationContext().getSharedPreferences(PREFS, Context.MODE_PRIVATE); + String raw = p.getString(KEY_ENTRIES, "[]"); + try { + JSONArray arr = new JSONArray(raw); + for (int i = 0; i < arr.length(); i++) { + JSONObject o = arr.getJSONObject(i); + DiscoveryManager.DiscoveredDevice d = new DiscoveryManager.DiscoveredDevice( + o.optString("name", "?"), + o.optString("host", ""), + o.optInt("port", 0), + o.optString("transport", "udp"), + o.optLong("last_seen_ms", 0L), + o.optInt("video_codecs", 0), + o.optInt("audio_codecs", 0), + o.optInt("placeholder_id", 0), + o.optLong("proto_version", 0L), + o.optString("pin_auth", "")); + d.pinnedRecent = true; + if (!d.host.isEmpty() && d.port > 0) { + out.add(d); + } + } + } catch (Exception ignored) { + } + return out; + } + + private static void save(Context context, List list) { + JSONArray arr = new JSONArray(); + for (DiscoveryManager.DiscoveredDevice d : list) { + try { + JSONObject o = new JSONObject(); + o.put("name", d.name); + o.put("host", d.host); + o.put("port", d.port); + o.put("transport", d.transport); + o.put("last_seen_ms", d.lastSeenMs); + o.put("video_codecs", d.videoCodecs); + o.put("audio_codecs", d.audioCodecs); + o.put("placeholder_id", d.placeholderId); + o.put("proto_version", d.protoVersion); + o.put("pin_auth", d.pinAuth); + arr.put(o); + } catch (Exception ignored) { + } + } + context.getApplicationContext().getSharedPreferences(PREFS, Context.MODE_PRIVATE) + .edit().putString(KEY_ENTRIES, arr.toString()).apply(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/discovery/ReceiverCompatibility.java b/app/src/main/java/com/foxx/androidcast/discovery/ReceiverCompatibility.java new file mode 100644 index 0000000..2eaf79b --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/discovery/ReceiverCompatibility.java @@ -0,0 +1,56 @@ +package com.foxx.androidcast.discovery; + +/********************************************************************* + * ReceiverCompatibility.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class ReceiverCompatibility + * Contributors: + * - Anton Afanasyeu (2 commits, 52 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 c38fdecb8b4800e6d3ef26bf677413cf454d96b640d8783129a47b3301cb4fc9 +**********************************************************************/ +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.VersionInfo; +import com.foxx.androidcast.network.CastCodecFlags; + +/** Filters discovered receivers the sender can actually cast to. */ +public final class ReceiverCompatibility { + private ReceiverCompatibility() {} + + public static boolean isCompatible(DiscoveryManager.DiscoveredDevice device, CastSettings sender) { + if (device == null || sender == null) { + return false; + } + if (device.protoVersion != 0L && device.protoVersion != VersionInfo.PROTO_VERSION) { + return false; + } + if (device.transport == null || !device.transport.equalsIgnoreCase(sender.getTransport())) { + return false; + } + int senderMask = senderVideoMask(sender.getVideoCodec()); + if (device.videoCodecs != 0 && senderMask != 0 && (device.videoCodecs & senderMask) == 0) { + return false; + } + return true; + } + + private static int senderVideoMask(CastSettings.VideoCodec codec) { + if (codec == null || codec == CastSettings.VideoCodec.AUTO) { + return CastCodecFlags.localVideoMask(); + } + switch (codec) { + case H264: + return CastCodecFlags.VIDEO_H264; + case H265: + return CastCodecFlags.VIDEO_H265; + case LIBVPX_VP8: + return CastCodecFlags.VIDEO_VP8; + case LIBVPX_VP9: + return CastCodecFlags.VIDEO_VP9; + default: + return CastCodecFlags.localVideoMask(); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/display/ExternalDisplayCapturePolicy.java b/app/src/main/java/com/foxx/androidcast/display/ExternalDisplayCapturePolicy.java new file mode 100644 index 0000000..cbe5b27 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/display/ExternalDisplayCapturePolicy.java @@ -0,0 +1,43 @@ +package com.foxx.androidcast.display; + +/** + * Developer-only preference for which display MediaProjection should target once + * multi-display capture is implemented (roadmap D). + */ +public enum ExternalDisplayCapturePolicy { + /** Current production behavior: default display only. */ + DEFAULT_DISPLAY_ONLY, + /** + * When an external display is connected, prefer capturing it (not implemented — + * falls back to default until wired capture lands). + */ + PREFER_EXTERNAL_WHEN_PRESENT, + /** + * Explicit secondary-display capture (future; requires API 34+ rules review). + */ + EXTERNAL_DISPLAY_EXPERIMENTAL; + + public static ExternalDisplayCapturePolicy fromName(String name, ExternalDisplayCapturePolicy fallback) { + if (name == null || name.isEmpty()) { + return fallback; + } + try { + return valueOf(name); + } catch (IllegalArgumentException e) { + return fallback; + } + } + + /** Human-readable status for developer settings. */ + public String implementationNote() { + switch (this) { + case PREFER_EXTERNAL_WHEN_PRESENT: + return "Planned: auto-route capture to HDMI when present (not active)."; + case EXTERNAL_DISPLAY_EXPERIMENTAL: + return "Planned: explicit secondary-display VirtualDisplay (not active)."; + case DEFAULT_DISPLAY_ONLY: + default: + return "Active: captures the default display (standard cast)."; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/display/WiredDisplayMonitor.java b/app/src/main/java/com/foxx/androidcast/display/WiredDisplayMonitor.java new file mode 100644 index 0000000..06e3cb4 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/display/WiredDisplayMonitor.java @@ -0,0 +1,172 @@ +package com.foxx.androidcast.display; + +import android.content.Context; +import android.hardware.display.DisplayManager; +import android.os.Handler; +import android.os.Looper; +import android.util.DisplayMetrics; +import android.view.Display; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * Tracks wired / external displays (USB-C HDMI, presentation, etc.) for roadmap D. + * Does not perform capture — informs UI and future capture routing. + */ +public final class WiredDisplayMonitor implements DisplayManager.DisplayListener { + + public static final class ExternalDisplayInfo { + public final int displayId; + public final String name; + public final int widthPx; + public final int heightPx; + public final int flags; + + ExternalDisplayInfo(Display display) { + displayId = display.getDisplayId(); + name = display.getName() != null ? display.getName() : ("Display " + displayId); + DisplayMetrics m = new DisplayMetrics(); + display.getRealMetrics(m); + widthPx = m.widthPixels; + heightPx = m.heightPixels; + flags = display.getFlags(); + } + + public boolean likelyHdmiOrWired() { + return (flags & Display.FLAG_PRESENTATION) != 0 + || (flags & Display.FLAG_SECURE) != 0 + || displayId != Display.DEFAULT_DISPLAY; + } + } + + public interface Listener { + void onWiredDisplaysChanged(List externalDisplays); + } + + private static volatile WiredDisplayMonitor instance; + + private final DisplayManager displayManager; + private final Handler mainHandler; + private final CopyOnWriteArrayList listeners = new CopyOnWriteArrayList<>(); + private volatile List externalDisplays = Collections.emptyList(); + private boolean registered; + + public static WiredDisplayMonitor getInstance(Context context) { + if (instance == null) { + synchronized (WiredDisplayMonitor.class) { + if (instance == null) { + instance = new WiredDisplayMonitor(context.getApplicationContext()); + } + } + } + return instance; + } + + private WiredDisplayMonitor(Context context) { + displayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE); + mainHandler = new Handler(Looper.getMainLooper()); + refresh(); + } + + public void addListener(Listener listener) { + if (listener != null) { + listeners.add(listener); + listener.onWiredDisplaysChanged(externalDisplays); + } + } + + public void removeListener(Listener listener) { + listeners.remove(listener); + } + + public synchronized void ensureRegistered() { + if (registered || displayManager == null) { + return; + } + displayManager.registerDisplayListener(this, mainHandler); + registered = true; + refresh(); + } + + public synchronized void unregister() { + if (!registered || displayManager == null) { + return; + } + displayManager.unregisterDisplayListener(this); + registered = false; + } + + public List getExternalDisplays() { + return externalDisplays; + } + + public boolean hasExternalDisplay() { + return !externalDisplays.isEmpty(); + } + + public String getSummaryLine() { + if (externalDisplays.isEmpty()) { + return "No external display detected (USB-C HDMI will not work until OS sees a second screen)."; + } + StringBuilder sb = new StringBuilder(); + sb.append(externalDisplays.size()).append(" external display(s): "); + for (int i = 0; i < externalDisplays.size(); i++) { + if (i > 0) { + sb.append("; "); + } + ExternalDisplayInfo info = externalDisplays.get(i); + sb.append(info.name).append(" ").append(info.widthPx).append("×").append(info.heightPx); + } + return sb.toString(); + } + + @Override + public void onDisplayAdded(int displayId) { + if (displayId != Display.DEFAULT_DISPLAY) { + refresh(); + } + } + + @Override + public void onDisplayRemoved(int displayId) { + if (displayId != Display.DEFAULT_DISPLAY) { + refresh(); + } + } + + @Override + public void onDisplayChanged(int displayId) { + if (displayId != Display.DEFAULT_DISPLAY) { + refresh(); + } + } + + private void refresh() { + List next = scan(); + externalDisplays = next; + for (Listener l : listeners) { + l.onWiredDisplaysChanged(next); + } + } + + private List scan() { + if (displayManager == null) { + return Collections.emptyList(); + } + Display[] displays = displayManager.getDisplays(); + if (displays == null || displays.length == 0) { + return Collections.emptyList(); + } + List out = new ArrayList<>(); + for (Display d : displays) { + if (d == null || d.getDisplayId() == Display.DEFAULT_DISPLAY) { + continue; + } + out.add(new ExternalDisplayInfo(d)); + } + return Collections.unmodifiableList(out); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementCoordinator.java b/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementCoordinator.java new file mode 100644 index 0000000..6aec17c --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementCoordinator.java @@ -0,0 +1,181 @@ +package com.foxx.androidcast.entitlements; + +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; + +import com.foxx.androidcast.BuildConfig; + +import java.io.File; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicLong; + +/** + * Process-wide paid-feature bitmask: loads native lib on demand, reads local obfuscated file, refreshes from BE. + */ +public final class EntitlementCoordinator { + private static final String TAG = "EntitlementCoord"; + private static final long DEV_ACCOUNT_KEY = 0x0123456789ABCDEFL; + + private static volatile EntitlementCoordinator instance; + + private final Context appContext; + private final ExecutorService syncExecutor = Executors.newSingleThreadExecutor(r -> { + Thread t = new Thread(r, "entitlement-sync"); + t.setDaemon(true); + return t; + }); + private final Handler mainHandler = new Handler(Looper.getMainLooper()); + private final AtomicLong flags = new AtomicLong(0L); + + private volatile boolean nativeCapable; + + public static EntitlementCoordinator getInstance(Context context) { + if (instance == null) { + synchronized (EntitlementCoordinator.class) { + if (instance == null) { + instance = new EntitlementCoordinator(context.getApplicationContext()); + } + } + } + return instance; + } + + private EntitlementCoordinator(Context appContext) { + this.appContext = appContext; + } + + private volatile boolean bootstrapDone; + + /** Call once from {@link com.foxx.androidcast.AndroidCastApplication}. */ + public void bootstrap() { + if (bootstrapDone) { + return; + } + bootstrapDone = true; + reloadFromLocal(); + scheduleBackendSync(); + } + + public long getFlags() { + return flags.get(); + } + + public boolean hasFeature(long featureBit) { + return EntitlementFlags.hasFeature(flags.get(), featureBit); + } + + public boolean hasAnyPaidFeature() { + return EntitlementFlags.hasAnyPaidBit(flags.get()); + } + + public boolean isNativeLibraryAvailable() { + return nativeCapable; + } + + /** Re-read local file after manual refresh or sync completion. */ + public void reloadFromLocal() { + if (isDevUnlockAll()) { + flags.set(EntitlementFlags.DEV_ALL_PAYLOAD); + EntitlementNativeBridge.acquire(); + nativeCapable = EntitlementNativeBridge.isAvailable(); + if (nativeCapable) { + try { + writeDevBlobIfNeeded(); + } finally { + EntitlementNativeBridge.release(); + } + } else { + EntitlementNativeBridge.release(); + } + return; + } + + EntitlementNativeBridge.acquire(); + nativeCapable = EntitlementNativeBridge.isAvailable(); + if (!nativeCapable) { + EntitlementNativeBridge.release(); + flags.set(0L); + return; + } + + try { + long now = System.currentTimeMillis(); + if (EntitlementPolicy.isClockRollback(now, EntitlementStore.getLastVerifiedWallMs(appContext), + EntitlementPolicy.CLOCK_ROLLBACK_TOLERANCE_MS)) { + Log.w(TAG, "wall clock rollback detected — clearing entitlements"); + resetToDefaults(); + return; + } + + File file = EntitlementStore.entitlementFile(appContext); + if (!file.isFile()) { + flags.set(0L); + return; + } + if (EntitlementPolicy.isFileStale(file.lastModified(), now, EntitlementPolicy.FILE_TTL_MS)) { + Log.i(TAG, "local entitlement file expired"); + resetToDefaults(); + return; + } + + long key = EntitlementStore.getAccountKey(appContext); + if (key == 0L) { + flags.set(0L); + return; + } + + long[] out = new long[1]; + int rv = EntitlementNativeBridge.readFrom(file.getAbsolutePath(), key, out); + if (rv != 0) { + Log.w(TAG, "readFrom failed: " + rv); + flags.set(0L); + return; + } + flags.set(out[0]); + EntitlementStore.setLastVerifiedWallMs(appContext, now); + } finally { + EntitlementNativeBridge.release(); + } + } + + public void scheduleBackendSync() { + syncExecutor.execute(this::runBackendSync); + } + + private void runBackendSync() { + EntitlementSyncClient.SyncPayload payload = EntitlementSyncClient.fetch(appContext); + if (payload == null) { + return; + } + if (!EntitlementSyncClient.persistPayload(appContext, payload)) { + return; + } + mainHandler.post(this::reloadFromLocal); + } + + private void resetToDefaults() { + EntitlementStore.clearLocal(appContext); + flags.set(0L); + } + + private boolean isDevUnlockAll() { + return BuildConfig.DEBUG; + } + + /** Debug: materialize an all-features blob so Linux ↔ device file tests work without BE. */ + private void writeDevBlobIfNeeded() { + File file = EntitlementStore.entitlementFile(appContext); + if (file.isFile() && EntitlementStore.getAccountKey(appContext) == DEV_ACCOUNT_KEY) { + return; + } + EntitlementStore.setAccountKey(appContext, DEV_ACCOUNT_KEY); + int w = EntitlementNativeBridge.writeTo(file.getAbsolutePath(), + EntitlementFlags.DEV_ALL_PAYLOAD, DEV_ACCOUNT_KEY); + if (w != 0) { + Log.w(TAG, "dev writeTo failed: " + w); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementFlags.java b/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementFlags.java new file mode 100644 index 0000000..ebd341c --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementFlags.java @@ -0,0 +1,17 @@ +package com.foxx.androidcast.entitlements; + +/** Bitmask constants for paid / licensed app capabilities (40-bit payload). */ +public final class EntitlementFlags { + private EntitlementFlags() {} + + /** All encodable payload bits — dev builds unlock everything. */ + public static final long DEV_ALL_PAYLOAD = 0xFFFFFFFFFFL; + + public static boolean hasFeature(long flags, long featureBit) { + return featureBit != 0L && (flags & featureBit) == featureBit; + } + + public static boolean hasAnyPaidBit(long flags) { + return flags != 0L; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementNativeBridge.java b/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementNativeBridge.java new file mode 100644 index 0000000..fd78839 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementNativeBridge.java @@ -0,0 +1,105 @@ +package com.foxx.androidcast.entitlements; + +import android.util.Log; + +/** + * Loads {@code libandroidcast_entitlements.so} on demand. If load fails, callers must assume zero paid + * flags (unless dev unlock-all is enabled at the Java layer). + */ +public final class EntitlementNativeBridge { + private static final String TAG = "EntitlementNative"; + static final String LIB = "androidcast_entitlements"; + + private static final Object LOCK = new Object(); + private static int refCount = 0; + private static boolean loaded = false; + private static boolean loadFailed = false; + + private EntitlementNativeBridge() {} + + public static void acquire() { + synchronized (LOCK) { + if (loadFailed) { + return; + } + if (!loaded) { + try { + System.loadLibrary(LIB); + loaded = true; + } catch (UnsatisfiedLinkError e) { + loadFailed = true; + Log.w(TAG, "Native entitlements library unavailable: " + e.getMessage()); + return; + } + } + refCount++; + } + } + + public static void release() { + synchronized (LOCK) { + if (refCount <= 0) { + return; + } + refCount--; + if (refCount == 0) { + loaded = false; + } + } + } + + public static boolean isAvailable() { + synchronized (LOCK) { + return loaded && !loadFailed; + } + } + + public static boolean ensureLoaded() { + acquire(); + boolean ok = isAvailable(); + if (!ok) { + release(); + } + return ok; + } + + static void requireLoaded() { + if (!isAvailable()) { + throw new IllegalStateException("libandroidcast_entitlements is not loaded"); + } + } + + public static int readFrom(String absolutePath, long key, long[] outVal) { + requireLoaded(); + if (outVal == null || outVal.length < 1) { + return -1; + } + return nativeReadFrom(absolutePath, key, outVal); + } + + public static int writeTo(String absolutePath, long val, long key) { + requireLoaded(); + return nativeWriteTo(absolutePath, val, key); + } + + public static int decode(long encodedVal, long key, long[] outVal) { + requireLoaded(); + if (outVal == null || outVal.length < 1) { + return -1; + } + return nativeDecode(encodedVal, key, outVal); + } + + public static int encode(long val, long key, long[] outEncoded) { + requireLoaded(); + if (outEncoded == null || outEncoded.length < 1) { + return -1; + } + return nativeEncode(val, key, outEncoded); + } + + private static native int nativeReadFrom(String path, long key, long[] outVal); + private static native int nativeWriteTo(String path, long val, long key); + private static native int nativeDecode(long encodedVal, long key, long[] outVal); + private static native int nativeEncode(long val, long key, long[] outEncoded); +} diff --git a/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementPolicy.java b/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementPolicy.java new file mode 100644 index 0000000..1733399 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementPolicy.java @@ -0,0 +1,53 @@ +package com.foxx.androidcast.entitlements; + +/** Pure policy helpers (unit-tested without native I/O). */ +final class EntitlementPolicy { + /** Local entitlement blob older than this is discarded (offline abuse mitigation). */ + static final long FILE_TTL_MS = 3L * 24L * 60L * 60L * 1000L; + + /** Wall clock moved backwards beyond this vs last successful verify → treat as tamper. */ + static final long CLOCK_ROLLBACK_TOLERANCE_MS = 60_000L; + + private EntitlementPolicy() {} + + static boolean isFileStale(long fileLastModifiedMs, long nowMs, long ttlMs) { + if (fileLastModifiedMs <= 0L) { + return true; + } + long age = nowMs - fileLastModifiedMs; + return age < 0L || age > ttlMs; + } + + static boolean isClockRollback(long nowMs, long lastVerifiedWallMs, long toleranceMs) { + return lastVerifiedWallMs > 0L && nowMs + toleranceMs < lastVerifiedWallMs; + } + + static long parseKeyHex(String hex) { + if (hex == null) { + return 0L; + } + String trimmed = hex.trim(); + if (trimmed.isEmpty()) { + return 0L; + } + if (trimmed.startsWith("0x") || trimmed.startsWith("0X")) { + trimmed = trimmed.substring(2); + } + if (trimmed.matches("[0-9]+")) { + try { + return Long.parseLong(trimmed, 10); + } catch (NumberFormatException e) { + return 0L; + } + } + try { + return Long.parseUnsignedLong(trimmed, 16); + } catch (NumberFormatException e) { + return 0L; + } + } + + static String formatKeyHex(long key) { + return String.format("%016x", key); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementStore.java b/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementStore.java new file mode 100644 index 0000000..c29d2a0 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementStore.java @@ -0,0 +1,47 @@ +package com.foxx.androidcast.entitlements; + +import android.content.Context; + +import com.foxx.androidcast.AppPreferences; + +import java.io.File; + +/** Paths and persisted key / anti-tamper timestamps for the local entitlement blob. */ +final class EntitlementStore { + private static final String FILE_NAME = "account_flags.obf"; + + private EntitlementStore() {} + + static File entitlementFile(Context context) { + File dir = new File(context.getFilesDir(), "entitlements"); + if (!dir.exists() && !dir.mkdirs()) { + return new File(context.getFilesDir(), FILE_NAME); + } + return new File(dir, FILE_NAME); + } + + static long getAccountKey(Context context) { + return EntitlementPolicy.parseKeyHex(AppPreferences.getEntitlementAccountKey(context)); + } + + static void setAccountKey(Context context, long key) { + AppPreferences.setEntitlementAccountKey(context, EntitlementPolicy.formatKeyHex(key)); + } + + static long getLastVerifiedWallMs(Context context) { + return AppPreferences.getEntitlementLastVerifiedWallMs(context); + } + + static void setLastVerifiedWallMs(Context context, long wallMs) { + AppPreferences.setEntitlementLastVerifiedWallMs(context, wallMs); + } + + static void clearLocal(Context context) { + File f = entitlementFile(context); + if (f.exists() && !f.delete()) { + f.deleteOnExit(); + } + AppPreferences.setEntitlementAccountKey(context, ""); + AppPreferences.setEntitlementLastVerifiedWallMs(context, 0L); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementSyncClient.java b/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementSyncClient.java new file mode 100644 index 0000000..77a1963 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/entitlements/EntitlementSyncClient.java @@ -0,0 +1,151 @@ +package com.foxx.androidcast.entitlements; + +import android.content.Context; +import android.util.Log; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.network.BackendEndpoints; + +import org.json.JSONObject; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +/** + * Fetches per-account entitlement key + obfuscated blob from BE (RBAC-backed endpoint stub). + * Returns {@code null} when backend has no payload or network fails — local file remains authoritative. + */ +final class EntitlementSyncClient { + private static final String TAG = "EntitlementSync"; + + static final class SyncPayload { + final long accountKey; + final byte[] fileBytes; + final String etag; + + SyncPayload(long accountKey, byte[] fileBytes, String etag) { + this.accountKey = accountKey; + this.fileBytes = fileBytes; + this.etag = etag != null ? etag : ""; + } + } + + private EntitlementSyncClient() {} + + static SyncPayload fetch(Context context) { + String user = AppPreferences.getUsername(context); + if (user == null || user.trim().isEmpty()) { + return null; + } + HttpURLConnection conn = null; + try { + String q = "user=" + URLEncoder.encode(user.trim(), StandardCharsets.UTF_8.name()); + String pin = AppPreferences.getPin(context); + if (pin != null && !pin.isEmpty()) { + q += "&pin=" + URLEncoder.encode(pin, StandardCharsets.UTF_8.name()); + } + URL url = new URL(BackendEndpoints.ENTITLEMENTS_FETCH_URL + "?" + q); + conn = (HttpURLConnection) url.openConnection(); + conn.setConnectTimeout(12_000); + conn.setReadTimeout(20_000); + conn.setRequestMethod("GET"); + conn.setRequestProperty("Accept", "application/json"); + int code = conn.getResponseCode(); + if (code == HttpURLConnection.HTTP_NOT_FOUND) { + return null; + } + if (code != HttpURLConnection.HTTP_OK) { + Log.w(TAG, "fetch HTTP " + code); + return null; + } + String body = readUtf8(conn.getInputStream()); + JSONObject json = new JSONObject(body); + String keyHex = json.optString("key", ""); + long key = EntitlementPolicy.parseKeyHex(keyHex); + if (key == 0L) { + Log.w(TAG, "fetch missing key"); + return null; + } + String fileUrl = json.optString("file_url", ""); + String etag = json.optString("etag", ""); + byte[] bytes; + if (!fileUrl.isEmpty()) { + bytes = downloadBytes(fileUrl); + } else if (json.has("file_base64")) { + bytes = android.util.Base64.decode(json.getString("file_base64"), android.util.Base64.DEFAULT); + } else { + Log.w(TAG, "fetch missing file payload"); + return null; + } + if (bytes == null || bytes.length < 16) { + return null; + } + return new SyncPayload(key, bytes, etag); + } catch (Exception e) { + Log.w(TAG, "fetch failed: " + e.getMessage()); + return null; + } finally { + if (conn != null) { + conn.disconnect(); + } + } + } + + static boolean persistPayload(Context context, SyncPayload payload) { + if (payload == null || payload.fileBytes == null) { + return false; + } + File dest = EntitlementStore.entitlementFile(context); + File parent = dest.getParentFile(); + if (parent != null && !parent.exists() && !parent.mkdirs()) { + return false; + } + try (FileOutputStream fos = new FileOutputStream(dest, false)) { + fos.write(payload.fileBytes); + fos.flush(); + } catch (Exception e) { + Log.w(TAG, "persist failed: " + e.getMessage()); + return false; + } + EntitlementStore.setAccountKey(context, payload.accountKey); + return true; + } + + private static byte[] downloadBytes(String fileUrl) throws Exception { + HttpURLConnection c = (HttpURLConnection) new URL(fileUrl).openConnection(); + c.setConnectTimeout(12_000); + c.setReadTimeout(30_000); + try { + if (c.getResponseCode() != HttpURLConnection.HTTP_OK) { + return null; + } + return readBytes(c.getInputStream()); + } finally { + c.disconnect(); + } + } + + private static String readUtf8(InputStream in) throws Exception { + byte[] raw = readBytes(in); + return new String(raw, StandardCharsets.UTF_8); + } + + private static byte[] readBytes(InputStream in) throws Exception { + try (BufferedInputStream bin = new BufferedInputStream(in); + ByteArrayOutputStream bout = new ByteArrayOutputStream()) { + byte[] buf = new byte[4096]; + int n; + while ((n = bin.read(buf)) >= 0) { + bout.write(buf, 0, n); + } + return bout.toByteArray(); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/entitlements/PaidEntitlements.java b/app/src/main/java/com/foxx/androidcast/entitlements/PaidEntitlements.java new file mode 100644 index 0000000..eeb7420 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/entitlements/PaidEntitlements.java @@ -0,0 +1,33 @@ +package com.foxx.androidcast.entitlements; + +import android.content.Context; + +/** + * App-wide gate for paid capabilities decoded from the per-account obfuscated blob. + * Until feature-specific bits are defined, {@link #hasAnyPaidFeature} is the primary check. + */ +public final class PaidEntitlements { + private PaidEntitlements() {} + + public static long getFlags(Context context) { + return EntitlementCoordinator.getInstance(context).getFlags(); + } + + public static boolean hasAnyPaidFeature(Context context) { + return EntitlementCoordinator.getInstance(context).hasAnyPaidFeature(); + } + + public static boolean hasFeature(Context context, long featureBit) { + return EntitlementCoordinator.getInstance(context).hasFeature(featureBit); + } + + public static boolean isNativeGateAvailable(Context context) { + return EntitlementCoordinator.getInstance(context).isNativeLibraryAvailable(); + } + + public static void refresh(Context context) { + EntitlementCoordinator coord = EntitlementCoordinator.getInstance(context); + coord.reloadFromLocal(); + coord.scheduleBackendSync(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/live/LiveCastControlPlane.java b/app/src/main/java/com/foxx/androidcast/live/LiveCastControlPlane.java new file mode 100644 index 0000000..404651d --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/live/LiveCastControlPlane.java @@ -0,0 +1,183 @@ +package com.foxx.androidcast.live; + +import android.content.Context; +import android.util.Log; + +import com.foxx.androidcast.BuildConfig; +import com.foxx.androidcast.DeviceInfo; +import com.foxx.androidcast.crash.CrashSettingsStore; +import com.foxx.androidcast.network.BackendEndpoints; + +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +/** Keeps BE live cast session state updated (intent/live/closed + 60s keepalive). */ +public final class LiveCastControlPlane { + private static final String TAG = "LiveCastControl"; + private static final int HTTP_TIMEOUT_MS = 20_000; + private static final long HEARTBEAT_INTERVAL_SEC = 60L; + private static final AtomicReference SESSION_ID = new AtomicReference<>(""); + private static final ScheduledExecutorService HEARTBEAT = Executors.newSingleThreadScheduledExecutor(r -> { + Thread t = new Thread(r, "live-cast-heartbeat"); + t.setDaemon(true); + return t; + }); + + static { + HEARTBEAT.scheduleAtFixedRate(() -> { + String sid = SESSION_ID.get(); + if (sid == null || sid.isEmpty()) { + return; + } + try { + postHeartbeat(sid, "active", "", "", ""); + } catch (Exception e) { + Log.w(TAG, "heartbeat failed: " + e.getMessage()); + } + }, HEARTBEAT_INTERVAL_SEC, HEARTBEAT_INTERVAL_SEC, TimeUnit.SECONDS); + } + + private LiveCastControlPlane() {} + + public static void onCastStart(Context context, String platform, String codecVideo, String codecAudio, String bwMode) { + if (context == null) { + return; + } + try { + String sid = SESSION_ID.get(); + if (sid == null || sid.isEmpty()) { + sid = createIntent(context.getApplicationContext(), platform, codecVideo, codecAudio, bwMode); + if (sid != null && !sid.isEmpty()) { + SESSION_ID.set(sid); + } + } else { + postHeartbeat(sid, "active", codecVideo, codecAudio, bwMode); + } + } catch (Exception e) { + Log.w(TAG, "onCastStart failed: " + e.getMessage()); + } + } + + public static void onCastStop(String codecVideo, String codecAudio, String bwMode) { + String sid = SESSION_ID.getAndSet(""); + if (sid == null || sid.isEmpty()) { + return; + } + try { + postHeartbeat(sid, "ended", codecVideo, codecAudio, bwMode); + } catch (Exception e) { + Log.w(TAG, "onCastStop failed: " + e.getMessage()); + } + } + + private static String createIntent(Context app, String platform, String codecVideo, String codecAudio, String bwMode) + throws Exception { + JSONObject req = new JSONObject(); + req.put("action", "create_intent"); + req.put("platform", platform == null || platform.isEmpty() ? "android" : platform); + req.put("device_id", DeviceInfo.getDeviceUuid(app)); + req.put("max_duration_s", 300); + if (codecVideo != null && !codecVideo.isEmpty()) { + req.put("codec_video", codecVideo); + } + if (codecAudio != null && !codecAudio.isEmpty()) { + req.put("codec_audio", codecAudio); + } + if (bwMode != null && !bwMode.isEmpty()) { + req.put("bw_mode", bwMode); + } + JSONObject resp = postJson(resolveLiveCastUrl(app), req.toString()); + if (!resp.optBoolean("ok", false)) { + return ""; + } + JSONObject session = resp.optJSONObject("session"); + return session != null ? session.optString("session_id", "") : ""; + } + + private static void postHeartbeat(String sid, String status, String codecVideo, String codecAudio, String bwMode) + throws Exception { + JSONObject req = new JSONObject(); + req.put("action", "heartbeat"); + req.put("session_id", sid); + req.put("status", status); + if (codecVideo != null && !codecVideo.isEmpty()) { + req.put("codec_video", codecVideo); + } + if (codecAudio != null && !codecAudio.isEmpty()) { + req.put("codec_audio", codecAudio); + } + if (bwMode != null && !bwMode.isEmpty()) { + req.put("bw_mode", bwMode); + } + JSONObject resp = postJson(resolveLiveCastUrl(null), req.toString()); + if (!resp.optBoolean("ok", false)) { + throw new IllegalStateException("heartbeat rejected"); + } + } + + private static String resolveLiveCastUrl(Context context) { + String crashesUpload = context != null ? CrashSettingsStore.load(context).uploadUrl : ""; + if (crashesUpload != null && !crashesUpload.trim().isEmpty()) { + String base = BackendEndpoints.normalizeCrashesUrl(crashesUpload.trim()); + if (base.contains("/api/upload.php")) { + return base.replace("/api/upload.php", "/api/live_cast.php"); + } + if (base.endsWith("/")) { + return base + "api/live_cast.php"; + } + return base + "/api/live_cast.php"; + } + return BackendEndpoints.CRASHES_BASE + "/api/live_cast.php"; + } + + private static JSONObject postJson(String url, String body) throws Exception { + HttpURLConnection c = (HttpURLConnection) new URL(url).openConnection(); + c.setRequestMethod("POST"); + c.setConnectTimeout(HTTP_TIMEOUT_MS); + c.setReadTimeout(HTTP_TIMEOUT_MS); + c.setDoOutput(true); + c.setRequestProperty("Content-Type", "application/json; charset=utf-8"); + if (BuildConfig.GIT_COMMIT_SHORT != null) { + c.setRequestProperty("X-AndroidCast", BuildConfig.GIT_COMMIT_SHORT); + } + byte[] bytes = body.getBytes(StandardCharsets.UTF_8); + try (OutputStream os = c.getOutputStream()) { + os.write(bytes); + } + int code = c.getResponseCode(); + String text = readBody(c); + c.disconnect(); + if (code < 200 || code >= 300) { + throw new IllegalStateException("http_" + code + ":" + text); + } + return new JSONObject(text); + } + + private static String readBody(HttpURLConnection c) { + try (BufferedReader br = new BufferedReader( + new InputStreamReader(c.getInputStream(), StandardCharsets.UTF_8))) { + StringBuilder sb = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + sb.append(line); + if (sb.length() > 8192) { + break; + } + } + return sb.toString(); + } catch (Exception e) { + return ""; + } + } +} + diff --git a/app/src/main/java/com/foxx/androidcast/live/LiveCastPeerTracker.java b/app/src/main/java/com/foxx/androidcast/live/LiveCastPeerTracker.java new file mode 100644 index 0000000..f3b37d0 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/live/LiveCastPeerTracker.java @@ -0,0 +1,154 @@ +package com.foxx.androidcast.live; + +import android.content.Context; +import android.util.Log; + +import com.foxx.androidcast.crash.CrashSettingsStore; +import com.foxx.androidcast.network.BackendEndpoints; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.HashSet; +import java.util.Locale; +import java.util.Set; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +/** Polls BE for active live cast sessions to highlight casting peers in discovery UI. */ +public final class LiveCastPeerTracker { + private static final String TAG = "LiveCastPeerTracker"; + private static final long POLL_INTERVAL_SEC = 45L; + private static final int HTTP_TIMEOUT_MS = 15_000; + + public interface Listener { + void onLivePeersUpdated(Set liveDeviceIds, Set liveUsernames); + } + + private static final ScheduledExecutorService EXECUTOR = Executors.newSingleThreadScheduledExecutor(r -> { + Thread t = new Thread(r, "live-cast-peer-poll"); + t.setDaemon(true); + return t; + }); + private static final AtomicReference> POLL_TASK = new AtomicReference<>(); + private static final AtomicReference LISTENER = new AtomicReference<>(); + private static final AtomicReference API_URL = new AtomicReference<>(""); + + private LiveCastPeerTracker() {} + + public static void start(Context context, Listener listener) { + if (context == null || listener == null) { + return; + } + LISTENER.set(listener); + API_URL.set(resolveActiveUrl(context.getApplicationContext())); + ScheduledFuture prev = POLL_TASK.getAndSet( + EXECUTOR.scheduleAtFixedRate(LiveCastPeerTracker::pollOnce, 0L, POLL_INTERVAL_SEC, TimeUnit.SECONDS)); + if (prev != null) { + prev.cancel(false); + } + } + + public static void stop() { + ScheduledFuture prev = POLL_TASK.getAndSet(null); + if (prev != null) { + prev.cancel(false); + } + LISTENER.set(null); + } + + private static void pollOnce() { + Listener listener = LISTENER.get(); + String url = API_URL.get(); + if (listener == null || url == null || url.isEmpty()) { + return; + } + try { + Set deviceIds = new HashSet<>(); + Set usernames = new HashSet<>(); + JSONObject payload = getJson(url + "?action=active"); + if (payload != null && payload.optBoolean("ok", false)) { + JSONArray sessions = payload.optJSONArray("sessions"); + if (sessions != null) { + for (int i = 0; i < sessions.length(); i++) { + JSONObject row = sessions.optJSONObject(i); + if (row == null) { + continue; + } + String status = row.optString("status", ""); + if (!"live".equals(status) && !"intent".equals(status)) { + continue; + } + String deviceId = row.optString("device_id", ""); + if (!deviceId.isEmpty()) { + deviceIds.add(deviceId); + } + String username = row.optString("owner_username", ""); + if (!username.isEmpty()) { + usernames.add(username.toLowerCase(Locale.US)); + } + } + } + } + listener.onLivePeersUpdated(Collections.unmodifiableSet(deviceIds), + Collections.unmodifiableSet(usernames)); + } catch (Exception e) { + Log.w(TAG, "poll failed: " + e.getMessage()); + } + } + + private static String resolveActiveUrl(Context context) { + String upload = CrashSettingsStore.load(context).uploadUrl; + if (upload != null && !upload.trim().isEmpty()) { + String base = BackendEndpoints.normalizeCrashesUrl(upload.trim()); + if (base.contains("/api/upload.php")) { + return base.replace("/api/upload.php", "/api/live_cast.php"); + } + if (base.endsWith("/")) { + return base + "api/live_cast.php"; + } + return base + "/api/live_cast.php"; + } + return BackendEndpoints.CRASHES_BASE + "/api/live_cast.php"; + } + + private static JSONObject getJson(String url) throws Exception { + HttpURLConnection c = (HttpURLConnection) new URL(url).openConnection(); + c.setRequestMethod("GET"); + c.setConnectTimeout(HTTP_TIMEOUT_MS); + c.setReadTimeout(HTTP_TIMEOUT_MS); + int code = c.getResponseCode(); + String text = readBody(c); + c.disconnect(); + if (code < 200 || code >= 300) { + throw new IllegalStateException("http_" + code); + } + return new JSONObject(text); + } + + private static String readBody(HttpURLConnection c) { + try (BufferedReader br = new BufferedReader( + new InputStreamReader(c.getInputStream(), StandardCharsets.UTF_8))) { + StringBuilder sb = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + sb.append(line); + if (sb.length() > 16384) { + break; + } + } + return sb.toString(); + } catch (Exception e) { + return ""; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/AacAdtsHelper.java b/app/src/main/java/com/foxx/androidcast/media/AacAdtsHelper.java new file mode 100644 index 0000000..498c107 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/AacAdtsHelper.java @@ -0,0 +1,71 @@ +package com.foxx.androidcast.media; + +/********************************************************************* + * AacAdtsHelper.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class AacAdtsHelper + * Contributors: + * - Anton Afanasyeu (2 commits, 67 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 801727a4bf81e2b3538fcacffd5434d5e9f834052b29da4728a860caf98d44a9 +**********************************************************************/ +/** Prepends ADTS sync word so AAC decoders accept encoder access units. */ +public final class AacAdtsHelper { + private AacAdtsHelper() {} + + public static byte[] wrapIfNeeded(byte[] aacFrame, int sampleRate, int channelCount) { + if (aacFrame == null || aacFrame.length == 0) { + return aacFrame; + } + if (aacFrame.length >= 2 && (aacFrame[0] & 0xFF) == 0xFF && (aacFrame[1] & 0xF0) == 0xF0) { + return aacFrame; + } + int profile = 2; + int freqIdx = sampleRateIndex(sampleRate); + int chanCfg = Math.max(1, Math.min(7, channelCount)); + int frameLen = aacFrame.length + 7; + byte[] adts = new byte[frameLen]; + adts[0] = (byte) 0xFF; + adts[1] = (byte) 0xF1; + adts[2] = (byte) (((profile - 1) << 6) + (freqIdx << 2) + (chanCfg >> 2)); + adts[3] = (byte) (((chanCfg & 3) << 6) + (frameLen >> 11)); + adts[4] = (byte) ((frameLen & 0x7FF) >> 3); + adts[5] = (byte) (((frameLen & 7) << 5) + 0x1F); + adts[6] = (byte) 0xFC; + System.arraycopy(aacFrame, 0, adts, 7, aacFrame.length); + return adts; + } + + private static int sampleRateIndex(int sampleRate) { + switch (sampleRate) { + case 96000: + return 0; + case 88200: + return 1; + case 64000: + return 2; + case 48000: + return 3; + case 44100: + return 4; + case 32000: + return 5; + case 24000: + return 6; + case 22050: + return 7; + case 16000: + return 8; + case 12000: + return 9; + case 11025: + return 10; + case 8000: + return 11; + default: + return 4; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/AudioNegotiator.java b/app/src/main/java/com/foxx/androidcast/media/AudioNegotiator.java new file mode 100644 index 0000000..9171956 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/AudioNegotiator.java @@ -0,0 +1,85 @@ +package com.foxx.androidcast.media; + +import android.util.Log; + +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.media.codec.PassthroughCodecPolicy; +import com.foxx.androidcast.network.CastCodecFlags; + +import java.util.Locale; + +/** + * Picks an audio codec both sides support, honoring user preference when possible. + * AUTO uses {@link CodecPriorityCatalog#decideBestAudioCodec} (weights + codecs.json). + */ +public final class AudioNegotiator { + private static final String TAG = "AudioNegotiator"; + + private AudioNegotiator() {} + + /** Resolve preference for this session (explicit or AUTO). */ + public static CastSettings.AudioCodec negotiate(int senderMask, int receiverMask, + CastSettings.AudioCodec preference, CastSettings settings) { + return negotiate(senderMask, receiverMask, preference, settings, "negotiate"); + } + + public static CastSettings.AudioCodec negotiate(int senderMask, int receiverMask, + CastSettings.AudioCodec preference, CastSettings settings, String logRole) { + CastSettings scoreSettings = settings != null ? settings : new CastSettings(); + CastSettings.AudioCodec pref = preference != null ? preference : CastSettings.AudioCodec.AUTO; + + if (pref == CastSettings.AudioCodec.AUTO) { + CodecPriorityCatalog.AudioNegotiationDecision decision = + CodecPriorityCatalog.decideBestAudioCodec(senderMask, receiverMask, scoreSettings); + if (decision != null) { + CodecPriorityCatalog.logAudioNegotiationDecision(logRole, decision); + return decision.codec; + } + Log.w(TAG, logRole + " audio AUTO fallback AAC (no scored candidate)"); + return CastSettings.AudioCodec.AAC; + } + + CastSettings.AudioCodec effective = PassthroughCodecPolicy.forAudioNegotiation(pref); + if (effective == CastSettings.AudioCodec.AUTO) { + return negotiate(senderMask, receiverMask, CastSettings.AudioCodec.AUTO, scoreSettings, logRole); + } + if (!CastCodecFlags.maskSupports(senderMask, effective) + || !CastCodecFlags.maskSupports(receiverMask, effective)) { + Log.w(TAG, logRole + " audio explicit " + pref.name() + + " unavailable on link; falling back to AUTO"); + return negotiate(senderMask, receiverMask, CastSettings.AudioCodec.AUTO, scoreSettings, logRole); + } + int score = CodecPriorityCatalog.priorityScore(effective, scoreSettings); + Log.i(TAG, String.format(Locale.US, "%s audio explicit %s score=%d", + logRole, PassthroughCodecPolicy.displayAudioPreference(effective), score)); + return effective; + } + + public static CastSettings.AudioCodec resolveForSender(CastSettings settings, int peerAudioMask) { + if (settings == null) { + return CastSettings.AudioCodec.AAC; + } + CastSettings.AudioCodec resolved = negotiate( + CastCodecFlags.localAudioMask(), + peerAudioMask, + settings.getAudioCodec(), + settings, + "sender"); + settings.setResolvedAudioCodec(resolved); + return resolved; + } + + public static CastSettings.AudioCodec effective(CastSettings settings) { + if (settings == null) { + return CastSettings.AudioCodec.AAC; + } + CastSettings.AudioCodec resolved = settings.getResolvedAudioCodec(); + if (resolved != null) { + return resolved; + } + if (settings.getAudioCodec() == CastSettings.AudioCodec.AUTO) { + return CastSettings.AudioCodec.AAC; + } + return PassthroughCodecPolicy.forAudioNegotiation(settings.getAudioCodec()); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/CodecNegotiator.java b/app/src/main/java/com/foxx/androidcast/media/CodecNegotiator.java new file mode 100644 index 0000000..8cbbb22 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/CodecNegotiator.java @@ -0,0 +1,129 @@ +package com.foxx.androidcast.media; + +/********************************************************************* + * CodecNegotiator.java + * Created at: Fri 15 May 2026 20:37:44 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CodecNegotiator + * Contributors: + * - Anton Afanasyeu (7 commits, 125 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 0fb27c49fb9d42566c0f347b0bb0d5a3a7a118ba38cee8486e48a5c4262260e9 +**********************************************************************/ +import android.media.MediaFormat; +import android.util.Log; + +import com.foxx.androidcast.CastSettings; + +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +/** Picks a video MIME type both sides support, honoring user preference when possible. */ +public final class CodecNegotiator { + private static final String TAG = "CodecNegotiator"; + + private CodecNegotiator() {} + + public static String negotiate(List senderEncoders, List receiverDecoders, + CastSettings.VideoCodec preference) { + return negotiate(senderEncoders, receiverDecoders, preference, null, "negotiate"); + } + + public static String negotiate(List senderEncoders, List receiverDecoders, + CastSettings.VideoCodec preference, CastSettings negotiationSettings) { + return negotiate(senderEncoders, receiverDecoders, preference, negotiationSettings, "receiver"); + } + + public static String negotiate(List senderEncoders, List receiverDecoders, + CastSettings.VideoCodec preference, CastSettings negotiationSettings, String logRole) { + Set enc = new HashSet<>(senderEncoders); + Set dec = new HashSet<>(receiverDecoders); + CastSettings scoreSettings = negotiationSettings != null ? negotiationSettings : new CastSettings(); + + if (preference == CastSettings.VideoCodec.H264) { + String mime = pick(MediaFormat.MIMETYPE_VIDEO_AVC, enc, dec); + CodecPriorityCatalog.logExplicitNegotiation(logRole, mime, + CastSettings.VideoCodec.H264, scoreSettings); + return mime; + } + if (preference == CastSettings.VideoCodec.H265) { + String mime = pick(MediaFormat.MIMETYPE_VIDEO_HEVC, enc, dec); + CodecPriorityCatalog.logExplicitNegotiation(logRole, mime, + CastSettings.VideoCodec.H265, scoreSettings); + return mime; + } + if (preference == CastSettings.VideoCodec.LIBVPX_VP8) { + String mime = pick(MediaFormat.MIMETYPE_VIDEO_VP8, enc, dec); + CodecPriorityCatalog.logExplicitNegotiation(logRole, mime, + CastSettings.VideoCodec.LIBVPX_VP8, scoreSettings); + return mime; + } + if (preference == CastSettings.VideoCodec.LIBVPX_VP9) { + String mime = pick(MediaFormat.MIMETYPE_VIDEO_VP9, enc, dec); + CodecPriorityCatalog.logExplicitNegotiation(logRole, mime, + CastSettings.VideoCodec.LIBVPX_VP9, scoreSettings); + return mime; + } + + CodecPriorityCatalog.NegotiationDecision decision = CodecPriorityCatalog.decideBestVideoMime( + senderEncoders, receiverDecoders, scoreSettings); + if (decision != null) { + CodecPriorityCatalog.logNegotiationDecision(logRole, decision); + return decision.mime; + } + if (dec.contains(MediaFormat.MIMETYPE_VIDEO_AVC) && enc.contains(MediaFormat.MIMETYPE_VIDEO_AVC)) { + String mime = MediaFormat.MIMETYPE_VIDEO_AVC; + Log.w(TAG, logRole + " codec fallback H.264 (no scored candidate)"); + return mime; + } + throw new IllegalStateException("No common video codec (sender=" + enc + " receiver=" + dec + ")"); + } + + private static String pick(String mime, Set enc, Set dec) { + if (enc.contains(mime) && dec.contains(mime)) { + return mime; + } + throw new IllegalStateException("Preferred codec not available on both sides: " + mime); + } + + public static String displayName(String mime) { + if (mime == null) { + return "?"; + } + if (MediaFormat.MIMETYPE_VIDEO_AVC.equals(mime)) { + return "H.264"; + } + if (MediaFormat.MIMETYPE_VIDEO_HEVC.equals(mime)) { + return "H.265"; + } + if (MediaFormat.MIMETYPE_VIDEO_VP9.equals(mime)) { + return "VP9"; + } + if (MediaFormat.MIMETYPE_VIDEO_VP8.equals(mime)) { + return "VP8"; + } + int slash = mime.lastIndexOf('/'); + return slash >= 0 ? mime.substring(slash + 1).toUpperCase(Locale.US) : mime; + } + + public static boolean isH264(String mime) { + return MediaFormat.MIMETYPE_VIDEO_AVC.equals(mime); + } + + public static boolean isHevc(String mime) { + return MediaFormat.MIMETYPE_VIDEO_HEVC.equals(mime); + } + + public static boolean isVpx(String mime) { + return MediaFormat.MIMETYPE_VIDEO_VP8.equals(mime) + || MediaFormat.MIMETYPE_VIDEO_VP9.equals(mime); + } + + /** Score for diagnostics (lower = preferred). */ + public static int priorityScoreForNegotiatedMime(String mime, CastSettings settings) { + return CodecPriorityCatalog.combinedVideoMimeScore(mime, settings); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/CodecPriorityCatalog.java b/app/src/main/java/com/foxx/androidcast/media/CodecPriorityCatalog.java new file mode 100644 index 0000000..b0bda29 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/CodecPriorityCatalog.java @@ -0,0 +1,647 @@ +package com.foxx.androidcast.media; + +/********************************************************************* + * CodecPriorityCatalog.java + * Created at: Mon 18 May 2026 18:59:14 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CodecPriorityCatalog + * Contributors: + * - Anton Afanasyeu (3 commits, 542 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 b14ada272d847b895ab45abaf659441b25bdc4eb634821d4d37827cfa1bc1db4 +**********************************************************************/ +import android.content.Context; +import android.media.MediaFormat; +import android.util.Log; + +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.media.codec.jni.NativeCodecBridge; +import com.foxx.androidcast.network.CastCodecFlags; +import com.foxx.androidcast.sender.CodecCatalog; + +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Locale; + +import androidx.annotation.Nullable; + +/** + * Runtime codec priority: tier base (0 / 500 / 1000) + component hooks. + * Lower {@link #priorityScore} = higher preference in AUTO negotiation and settings ordering. + */ +public final class CodecPriorityCatalog { + private static final String TAG = "CodecPriority"; + private static final String ASSET = "codecs.json"; + + private static final String KEY_INTERNAL = "internal_codec_score"; + private static final String KEY_FEC = "no_inband_fec_score"; + private static final String KEY_PROTECTION = "no_inband_protection_score"; + private static final String KEY_OVERRIDE = "priority_override_score"; + private static final String KEY_BITRATE = "bitrate_score"; + + private static volatile JSONObject rootJson = new JSONObject(); + private static volatile Context appContext; + + private CodecPriorityCatalog() {} + + public static void init(Context context) { + appContext = context.getApplicationContext(); + rootJson = loadJson(appContext); + } + + /** Reload {@code assets/codecs.json} and refresh local codec capability cache. */ + public static String reload(Context context) { + Context app = context.getApplicationContext(); + appContext = app; + JSONObject loaded = loadJson(app); + rootJson = loaded; + CodecCatalog.invalidateCapabilities(); + int overrides = countJsonOverrides(loaded); + String summary = "codecs.json reloaded (" + overrides + " override field(s))"; + Log.i(TAG, summary); + return summary; + } + + public static int priorityScore(CodecPriorityId id, CodecTier tier, CastSettings settings) { + return breakdown(id, tier, settings).total; + } + + public static ScoreBreakdown breakdown(CodecPriorityId id, CodecTier tier, CastSettings settings) { + if (id == null || tier == null) { + return new ScoreBreakdown(Integer.MAX_VALUE, 0, 0, 0, 0, 0, 0); + } + int internal = component(id, KEY_INTERNAL, defaultInternal(id)); + int fec = component(id, KEY_FEC, defaultFec(id)); + int protection = component(id, KEY_PROTECTION, defaultProtection(id, settings)); + int override = component(id, KEY_OVERRIDE, 0); + int bitrate = component(id, KEY_BITRATE, defaultBitrate(id)); + int total = tier.baseScore + internal + fec + protection + override + bitrate; + return new ScoreBreakdown(total, tier.baseScore, internal, fec, protection, override, bitrate); + } + + public static int priorityScoreForVideoMime(String mime, CodecTier tier, CastSettings settings) { + CodecPriorityId id = CodecPriorityId.fromVideoMime(mime); + if (id == null) { + return CodecTier.PASSTHROUGH.baseScore + 100; + } + return priorityScore(id, tier, settings); + } + + public static int priorityScore(CastSettings.VideoCodec codec, CastSettings settings) { + CodecPriorityId id = CodecPriorityId.fromVideoPreference(codec); + if (id == null) { + return 0; + } + CodecTier tier = tierForVideoPreference(codec, id); + return priorityScore(id, tier, settings); + } + + public static int priorityScore(CastSettings.AudioCodec codec, CastSettings settings) { + CodecPriorityId id = CodecPriorityId.fromAudioPreference(codec); + if (id == null) { + return 0; + } + CodecTier tier = tierForAudioPreference(codec); + return priorityScore(id, tier, settings); + } + + /** Best MIME for AUTO: lowest score among codecs both sides can use. */ + @Nullable + public static String negotiateBestVideoMime(List senderEncoders, List receiverDecoders, + CastSettings settings) { + NegotiationDecision decision = decideBestVideoMime(senderEncoders, receiverDecoders, settings); + return decision != null ? decision.mime : null; + } + + /** AUTO negotiation with ranked candidates for logging and diagnostics. */ + @Nullable + public static NegotiationDecision decideBestVideoMime(List senderEncoders, + List receiverDecoders, CastSettings settings) { + List common = commonMimes(senderEncoders, receiverDecoders); + if (common.isEmpty()) { + return null; + } + List candidates = new ArrayList<>(); + for (String mime : common) { + candidates.add(buildCandidate(mime, settings)); + } + Collections.sort(candidates, Comparator.comparingInt(c -> c.combinedScore)); + NegotiationCandidate best = candidates.get(0); + return new NegotiationDecision(best, candidates); + } + + public static void logNegotiationDecision(String role, NegotiationDecision decision) { + if (decision == null) { + return; + } + Log.i(TAG, role + " codec AUTO: selected " + decision.logLine()); + for (NegotiationCandidate c : decision.candidates) { + boolean picked = c.mime != null && c.mime.equals(decision.mime); + Log.i(TAG, role + " codec candidate: " + c.logLine(picked)); + } + } + + public static void logExplicitNegotiation(String role, String mime, CastSettings.VideoCodec preference, + CastSettings settings) { + int score = combinedVideoMimeScore(mime, settings); + Log.i(TAG, role + " codec explicit " + preference.name() + ": " + + displayMime(mime) + " (" + mime + ") score=" + score + + " · " + formatVideoMimeBreakdown(mime, settings)); + } + + public static void logReceivedCodec(String role, String mime, CastSettings settings) { + int score = combinedVideoMimeScore(mime, settings); + Log.i(TAG, role + " codec selected by peer: " + + displayMime(mime) + " (" + mime + ") score=" + score + + " · " + formatVideoMimeBreakdown(mime, settings)); + } + + public static String formatVideoMimeBreakdown(String mime, CastSettings settings) { + CodecPriorityId id = CodecPriorityId.fromVideoMime(mime); + if (id == null) { + return mime + " unknown"; + } + CodecTier localDec = CodecCatalog.effectiveTierForVideoMime(mime, false); + ScoreBreakdown dec = breakdown(id, localDec, settings); + int peerEncScore = assumedRemoteEncoderScore(mime, settings); + return String.format(Locale.US, + "combined=%d dec=%d (tier %d +%d+%d+%d+%d+%d) peerEnc=%d", + Math.max(dec.total, peerEncScore), + dec.total, dec.tierBase, dec.internal, dec.fec, dec.protection, dec.override, dec.bitrate, + peerEncScore); + } + + private static NegotiationCandidate buildCandidate(String mime, CastSettings settings) { + int localDecoder = videoMimeScoreOnDevice(mime, false, settings); + int peerEncoder = assumedRemoteEncoderScore(mime, settings); + int combined = Math.max(localDecoder, peerEncoder); + return new NegotiationCandidate(mime, combined, localDecoder, peerEncoder, + formatVideoMimeBreakdown(mime, settings)); + } + + /** Conservative score when sender and receiver may use different tiers for the same MIME. */ + public static int combinedVideoMimeScore(String mime, CastSettings settings) { + int localEncoder = videoMimeScoreOnDevice(mime, true, settings); + int localDecoder = videoMimeScoreOnDevice(mime, false, settings); + int assumedPeerEncoder = assumedRemoteEncoderScore(mime, settings); + return Math.max(Math.max(localEncoder, localDecoder), assumedPeerEncoder); + } + + /** + * Estimates encoder-side score for the remote peer during handshake (only MIME caps known). + */ + public static int assumedRemoteEncoderScore(String mime, CastSettings remoteSettings) { + CodecPriorityId id = CodecPriorityId.fromVideoMime(mime); + if (id == null) { + return CodecTier.PASSTHROUGH.baseScore + 100; + } + CodecTier tier = assumedEncoderTier(id, remoteSettings); + return priorityScore(id, tier, remoteSettings); + } + + private static CodecTier assumedEncoderTier(CodecPriorityId id, CastSettings remote) { + CastSettings.VideoCodec pref = remote != null ? remote.getVideoCodec() : CastSettings.VideoCodec.AUTO; + if (pref == CastSettings.VideoCodec.PASSTHROUGH) { + return CodecTier.PASSTHROUGH; + } + if (pref == CastSettings.VideoCodec.LIBVPX_VP8 && id == CodecPriorityId.VP8) { + return CodecTier.SOFTWARE; + } + if (pref == CastSettings.VideoCodec.LIBVPX_VP9 && id == CodecPriorityId.VP9) { + return CodecTier.SOFTWARE; + } + if (id == CodecPriorityId.VP8 || id == CodecPriorityId.VP9) { + return CodecTier.HARDWARE; + } + return CodecTier.HARDWARE; + } + + public static int videoMimeScoreOnDevice(String mime, boolean encoder, CastSettings settings) { + CodecPriorityId id = CodecPriorityId.fromVideoMime(mime); + if (id == null) { + return CodecTier.PASSTHROUGH.baseScore + 100; + } + CodecTier tier = CodecCatalog.effectiveTierForVideoMime(mime, encoder); + return priorityScore(id, tier, settings); + } + + public static CodecTier tierForVideoPreference(CastSettings.VideoCodec preference, CodecPriorityId id) { + if (preference == CastSettings.VideoCodec.PASSTHROUGH) { + return CodecTier.PASSTHROUGH; + } + if (preference == CastSettings.VideoCodec.LIBVPX_VP8 + || preference == CastSettings.VideoCodec.LIBVPX_VP9) { + return CodecTier.SOFTWARE; + } + if (id == CodecPriorityId.VP8 || id == CodecPriorityId.VP9) { + return CodecTier.SOFTWARE; + } + return CodecTier.HARDWARE; + } + + public static CodecTier tierForAudioPreference(CastSettings.AudioCodec preference) { + if (preference == CastSettings.AudioCodec.SPEEX) { + return NativeCodecBridge.isSpeexAvailable() ? CodecTier.HARDWARE : CodecTier.PASSTHROUGH; + } + if (preference == CastSettings.AudioCodec.OPUS) { + return NativeCodecBridge.isOpusAvailable() ? CodecTier.HARDWARE : CodecTier.PASSTHROUGH; + } + if (preference == CastSettings.AudioCodec.PASSTHROUGH_DEBUG) { + return CodecTier.PASSTHROUGH; + } + return CodecTier.HARDWARE; + } + + /** AUTO: lowest score among audio codecs both peers support on this device. */ + @Nullable + public static AudioNegotiationDecision decideBestAudioCodec(int senderMask, int receiverMask, + CastSettings settings) { + int common = senderMask & receiverMask; + List candidates = new ArrayList<>(); + for (CastSettings.AudioCodec codec : manualAudioPreferences()) { + if (!CastCodecFlags.maskSupports(common, codec)) { + continue; + } + if (!CastCodecFlags.isLocallyAvailable(codec)) { + continue; + } + int score = audioCodecScoreOnDevice(codec, settings); + candidates.add(new AudioNegotiationCandidate(codec, score, + formatAudioBreakdown(codec, settings))); + } + if (candidates.isEmpty()) { + return null; + } + Collections.sort(candidates, Comparator.comparingInt(c -> c.score)); + return new AudioNegotiationDecision(candidates.get(0), candidates); + } + + public static int audioCodecScoreOnDevice(CastSettings.AudioCodec codec, CastSettings settings) { + CodecPriorityId id = CodecPriorityId.fromAudioPreference(codec); + if (id == null) { + return Integer.MAX_VALUE; + } + CodecTier tier = tierForAudioPreference(codec); + return priorityScore(id, tier, settings); + } + + public static void logAudioNegotiationDecision(String role, AudioNegotiationDecision decision) { + if (decision == null) { + return; + } + Log.i(TAG, role + " audio AUTO: selected " + decision.logLine()); + for (AudioNegotiationCandidate c : decision.candidates) { + boolean picked = c.codec == decision.codec; + Log.i(TAG, role + " audio candidate: " + c.logLine(picked)); + } + } + + public static String formatAudioBreakdown(CastSettings.AudioCodec codec, CastSettings settings) { + CodecPriorityId id = CodecPriorityId.fromAudioPreference(codec); + if (id == null) { + return codec.name(); + } + ScoreBreakdown b = breakdown(id, tierForAudioPreference(codec), settings); + return String.format(Locale.US, "%s score=%d tier=%d +%d+%d+%d+%d+%d", + codec.name(), b.total, b.tierBase, b.internal, b.fec, b.protection, b.override, b.bitrate); + } + + /** Manual settings order (after AUTO): Opus, AAC, Speex, PCM passthrough. */ + public static CastSettings.AudioCodec[] manualAudioPreferences() { + return new CastSettings.AudioCodec[] { + CastSettings.AudioCodec.OPUS, + CastSettings.AudioCodec.AAC, + CastSettings.AudioCodec.SPEEX, + CastSettings.AudioCodec.PASSTHROUGH_DEBUG, + }; + } + + public static final class AudioNegotiationCandidate { + public final CastSettings.AudioCodec codec; + public final int score; + public final String detail; + + AudioNegotiationCandidate(CastSettings.AudioCodec codec, int score, String detail) { + this.codec = codec; + this.score = score; + this.detail = detail; + } + + String logLine(boolean selected) { + return (selected ? "* " : " ") + codec.name() + " score=" + score + " · " + detail; + } + } + + public static final class AudioNegotiationDecision { + public final CastSettings.AudioCodec codec; + public final int score; + public final List candidates; + + AudioNegotiationDecision(AudioNegotiationCandidate selected, + List candidates) { + this.codec = selected.codec; + this.score = selected.score; + this.candidates = candidates; + } + + String logLine() { + return codec.name() + " score=" + score; + } + } + + public static List sortByPriority(List> items) { + List> copy = new ArrayList<>(items); + Collections.sort(copy, Comparator.comparingInt(a -> a.priorityScore)); + List out = new ArrayList<>(copy.size()); + for (ScoredItem item : copy) { + out.add(item.value); + } + return out; + } + + public static final class ScoredItem { + public final T value; + public final int priorityScore; + + public ScoredItem(T value, int priorityScore) { + this.value = value; + this.priorityScore = priorityScore; + } + } + + public static final class ScoreBreakdown { + public final int total; + public final int tierBase; + public final int internal; + public final int fec; + public final int protection; + public final int override; + public final int bitrate; + + ScoreBreakdown(int total, int tierBase, int internal, int fec, int protection, int override, + int bitrate) { + this.total = total; + this.tierBase = tierBase; + this.internal = internal; + this.fec = fec; + this.protection = protection; + this.override = override; + this.bitrate = bitrate; + } + } + + public static final class NegotiationCandidate { + public final String mime; + public final int combinedScore; + public final int localDecoderScore; + public final int peerEncoderScore; + public final String detail; + + NegotiationCandidate(String mime, int combinedScore, int localDecoderScore, int peerEncoderScore, + String detail) { + this.mime = mime; + this.combinedScore = combinedScore; + this.localDecoderScore = localDecoderScore; + this.peerEncoderScore = peerEncoderScore; + this.detail = detail; + } + + String logLine(boolean selected) { + return (selected ? "* " : " ") + + displayMime(mime) + " score=" + combinedScore + + " (dec=" + localDecoderScore + " peerEnc=" + peerEncoderScore + ") " + detail; + } + } + + public static final class NegotiationDecision { + public final String mime; + public final int score; + public final NegotiationCandidate selected; + public final List candidates; + + NegotiationDecision(NegotiationCandidate selected, List candidates) { + this.selected = selected; + this.candidates = candidates; + this.mime = selected.mime; + this.score = selected.combinedScore; + } + + String logLine() { + return displayMime(mime) + " (" + mime + ") score=" + score + " · " + selected.detail; + } + } + + private static String displayMime(String mime) { + if (mime == null) { + return "?"; + } + if (MediaFormat.MIMETYPE_VIDEO_AVC.equals(mime)) { + return "H.264"; + } + if (MediaFormat.MIMETYPE_VIDEO_HEVC.equals(mime)) { + return "H.265"; + } + if (MediaFormat.MIMETYPE_VIDEO_VP9.equals(mime)) { + return "VP9"; + } + if (MediaFormat.MIMETYPE_VIDEO_VP8.equals(mime)) { + return "VP8"; + } + int slash = mime.lastIndexOf('/'); + return slash >= 0 ? mime.substring(slash + 1).toUpperCase(Locale.US) : mime; + } + + private static List commonMimes(List enc, List dec) { + List out = new ArrayList<>(); + if (enc == null || dec == null) { + return out; + } + for (String mime : enc) { + if (mime != null && containsIgnoreCase(dec, mime)) { + out.add(mime); + } + } + return out; + } + + private static boolean containsIgnoreCase(List list, String mime) { + for (String s : list) { + if (s != null && s.equalsIgnoreCase(mime)) { + return true; + } + } + return false; + } + + private static int component(CodecPriorityId id, String key, int compileDefault) { + try { + JSONObject section = sectionFor(id); + if (section == null) { + return compileDefault; + } + JSONObject codec = section.optJSONObject(id.jsonKey); + if (codec != null && codec.has(key)) { + return codec.optInt(key, compileDefault); + } + } catch (Exception ignored) { + } + return compileDefault; + } + + private static JSONObject sectionFor(CodecPriorityId id) { + if (rootJson == null) { + return null; + } + switch (id) { + case H264: + case H265: + case VP8: + case VP9: + case PASSTHROUGH: + return rootJson.optJSONObject("video"); + case AAC: + case OPUS: + case SPEEX: + case PCM: + default: + return rootJson.optJSONObject("audio"); + } + } + + private static int defaultInternal(CodecPriorityId id) { + switch (id) { + case H264: + case VP9: + return 0; + case H265: + case OPUS: + return 1; + case VP8: + case AAC: + return 2; + case SPEEX: + return 5; + case PCM: + case PASSTHROUGH: + default: + return 10; + } + } + + private static int defaultFec(CodecPriorityId id) { + switch (id) { + case H264: + case OPUS: + return 0; + case H265: + case VP8: + case AAC: + return 1; + case VP9: + return 2; + case SPEEX: + return 5; + default: + return 1; + } + } + + private static int defaultProtection(CodecPriorityId id, CastSettings settings) { + switch (id) { + case VP8: + case VP9: + return vpxInbandProtectionScore(settings); + case H264: + case H265: + return 1; + case OPUS: + return 0; + case SPEEX: + return 5; + default: + return 1; + } + } + + /** 0 when libvpx in-band protection is available and enabled; 2 otherwise. */ + private static int vpxInbandProtectionScore(CastSettings settings) { + if (!NativeCodecBridge.isLibvpxAvailable()) { + return 2; + } + if (settings == null) { + return 0; + } + CastSettings.StreamProtection mode = settings.getStreamProtection(); + if (mode == null || mode == CastSettings.StreamProtection.AUTO + || mode == CastSettings.StreamProtection.NONE) { + return 2; + } + return 0; + } + + private static int defaultBitrate(CodecPriorityId id) { + switch (id) { + case H265: + case VP9: + case OPUS: + return 0; + case H264: + case AAC: + return 1; + case VP8: + return 2; + default: + return 10; + } + } + + private static int countJsonOverrides(JSONObject root) { + int n = 0; + n += countSectionOverrides(root.optJSONObject("video")); + n += countSectionOverrides(root.optJSONObject("audio")); + return n; + } + + private static int countSectionOverrides(JSONObject section) { + if (section == null) { + return 0; + } + int n = 0; + java.util.Iterator keys = section.keys(); + while (keys.hasNext()) { + JSONObject codec = section.optJSONObject(keys.next()); + if (codec == null) { + continue; + } + for (String k : new String[] {KEY_INTERNAL, KEY_FEC, KEY_PROTECTION, KEY_OVERRIDE, KEY_BITRATE}) { + if (codec.has(k)) { + n++; + } + } + } + return n; + } + + private static JSONObject loadJson(Context context) { + try (BufferedReader r = new BufferedReader(new InputStreamReader( + context.getAssets().open(ASSET), StandardCharsets.UTF_8))) { + StringBuilder sb = new StringBuilder(); + String line; + while ((line = r.readLine()) != null) { + sb.append(line); + } + return new JSONObject(sb.toString()); + } catch (Exception e) { + Log.w(TAG, "Using compile-time codec scores only (" + e.getMessage() + ")"); + return new JSONObject(); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/CodecPriorityId.java b/app/src/main/java/com/foxx/androidcast/media/CodecPriorityId.java new file mode 100644 index 0000000..c5cb092 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/CodecPriorityId.java @@ -0,0 +1,109 @@ +package com.foxx.androidcast.media; + +/********************************************************************* + * CodecPriorityId.java + * Created at: Mon 18 May 2026 18:59:14 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * enum CodecPriorityId + * Contributors: + * - Anton Afanasyeu (2 commits, 103 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 43f0c38b4db03f970badd018a05f0d173081f3f241f54644c2f6d3858dbc4b3d +**********************************************************************/ +import android.media.MediaFormat; + +import com.foxx.androidcast.CastSettings; + +/** Canonical codec id for scoring tables and {@code codecs.json} keys. */ +public enum CodecPriorityId { + H264("h264"), + H265("h265"), + VP8("vp8"), + VP9("vp9"), + PASSTHROUGH("passthrough"), + AAC("aac"), + OPUS("opus"), + SPEEX("speex"), + PCM("pcm"); + + public final String jsonKey; + + CodecPriorityId(String jsonKey) { + this.jsonKey = jsonKey; + } + + public static CodecPriorityId fromVideoMime(String mime) { + if (mime == null) { + return null; + } + if (MediaFormat.MIMETYPE_VIDEO_AVC.equalsIgnoreCase(mime)) { + return H264; + } + if (MediaFormat.MIMETYPE_VIDEO_HEVC.equalsIgnoreCase(mime)) { + return H265; + } + if (MediaFormat.MIMETYPE_VIDEO_VP8.equalsIgnoreCase(mime)) { + return VP8; + } + if (MediaFormat.MIMETYPE_VIDEO_VP9.equalsIgnoreCase(mime)) { + return VP9; + } + return null; + } + + public static CodecPriorityId fromVideoPreference(CastSettings.VideoCodec codec) { + if (codec == null) { + return null; + } + switch (codec) { + case H264: + return H264; + case H265: + return H265; + case LIBVPX_VP8: + return VP8; + case LIBVPX_VP9: + return VP9; + case PASSTHROUGH: + return PASSTHROUGH; + case AUTO: + default: + return null; + } + } + + public static CodecPriorityId fromAudioPreference(CastSettings.AudioCodec codec) { + if (codec == null) { + return null; + } + switch (codec) { + case AAC: + return AAC; + case OPUS: + return OPUS; + case SPEEX: + return SPEEX; + case PASSTHROUGH_DEBUG: + return PCM; + case AUTO: + default: + return null; + } + } + + public String toMime() { + switch (this) { + case H264: + return MediaFormat.MIMETYPE_VIDEO_AVC; + case H265: + return MediaFormat.MIMETYPE_VIDEO_HEVC; + case VP8: + return MediaFormat.MIMETYPE_VIDEO_VP8; + case VP9: + return MediaFormat.MIMETYPE_VIDEO_VP9; + default: + return null; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/CodecTier.java b/app/src/main/java/com/foxx/androidcast/media/CodecTier.java new file mode 100644 index 0000000..4335260 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/CodecTier.java @@ -0,0 +1,25 @@ +package com.foxx.androidcast.media; + +/********************************************************************* + * CodecTier.java + * Created at: Mon 18 May 2026 18:59:14 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * enum CodecTier + * Contributors: + * - Anton Afanasyeu (2 commits, 21 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 35b2a8f9796bb53fd83c2570b9ca3ad69ca7a883ac48612a87ab41de153e382b +**********************************************************************/ +/** Base tier added before per-codec component scores (lower total = higher priority). */ +public enum CodecTier { + HARDWARE(0), + SOFTWARE(500), + PASSTHROUGH(1000); + + public final int baseScore; + + CodecTier(int baseScore) { + this.baseScore = baseScore; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/EncodedStreamProbe.java b/app/src/main/java/com/foxx/androidcast/media/EncodedStreamProbe.java new file mode 100644 index 0000000..9383152 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/EncodedStreamProbe.java @@ -0,0 +1,43 @@ +package com.foxx.androidcast.media; + +/********************************************************************* + * EncodedStreamProbe.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class EncodedStreamProbe + * Contributors: + * - Anton Afanasyeu (2 commits, 39 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 4d03743f602aa3294bf05780ad25348f3037ffbbdb439eb265a6281f0b21a300 +**********************************************************************/ +import android.media.MediaFormat; + +/** Inspects encoded bitstream headers for diagnostics. */ +public final class EncodedStreamProbe { + private EncodedStreamProbe() {} + + public static String describeKeyframe(String mime, byte[] annexB) { + if (annexB == null || annexB.length < 5) { + return "empty"; + } + int offset = 0; + if (annexB[0] == 0 && annexB[1] == 0 && annexB[2] == 0 && annexB[3] == 1) { + offset = 4; + } else if (annexB[0] == 0 && annexB[1] == 0 && annexB[2] == 1) { + offset = 3; + } + if (offset >= annexB.length) { + return "no start code"; + } + if (MediaFormat.MIMETYPE_VIDEO_HEVC.equals(mime)) { + int nalType = (annexB[offset] >> 1) & 0x3F; + return "HEVC NAL type " + nalType + " (" + annexB.length + " B)"; + } + if (MediaFormat.MIMETYPE_VIDEO_AVC.equals(mime)) { + int nalType = annexB[offset] & 0x1F; + return "AVC NAL type " + nalType + " (" + annexB.length + " B)"; + } + return "encoded " + annexB.length + " B"; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/H264Bitstream.java b/app/src/main/java/com/foxx/androidcast/media/H264Bitstream.java new file mode 100644 index 0000000..c264ef8 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/H264Bitstream.java @@ -0,0 +1,70 @@ +package com.foxx.androidcast.media; + +/********************************************************************* + * H264Bitstream.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class H264Bitstream + * Contributors: + * - Anton Afanasyeu (3 commits, 66 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 b09701f961146fa6938b2e4b6c55942356bf385127ca222b5473f247e86e462d +**********************************************************************/ +import java.io.ByteArrayOutputStream; + +/** + * Converts H.264 / HEVC AVCC (length-prefixed) NAL units to Annex-B start codes for decoders. + * MediaCodec encoders on Android typically emit AVCC; many decoders expect Annex-B in input buffers. + */ +public final class H264Bitstream { + private static final byte[] START_CODE = {0, 0, 0, 1}; + + private H264Bitstream() {} + + public static byte[] toAnnexB(byte[] data) { + if (data == null || data.length < 4) { + return data; + } + if (startsWithAnnexB(data)) { + return data; + } + if (!looksLikeAvcc(data)) { + return data; + } + ByteArrayOutputStream out = new ByteArrayOutputStream(data.length + 16); + int offset = 0; + while (offset + 4 <= data.length) { + int length = readLength(data, offset); + if (length <= 0 || offset + 4 + length > data.length) { + break; + } + out.write(START_CODE, 0, START_CODE.length); + out.write(data, offset + 4, length); + offset += 4 + length; + } + if (out.size() == 0) { + return data; + } + return out.toByteArray(); + } + + private static boolean startsWithAnnexB(byte[] data) { + return data.length >= 4 + && data[0] == 0 + && data[1] == 0 + && (data[2] == 1 || (data[2] == 0 && data[3] == 1)); + } + + private static boolean looksLikeAvcc(byte[] data) { + int length = readLength(data, 0); + return length > 0 && length < data.length; + } + + private static int readLength(byte[] data, int offset) { + return ((data[offset] & 0xFF) << 24) + | ((data[offset + 1] & 0xFF) << 16) + | ((data[offset + 2] & 0xFF) << 8) + | (data[offset + 3] & 0xFF); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/H264SpsParser.java b/app/src/main/java/com/foxx/androidcast/media/H264SpsParser.java new file mode 100644 index 0000000..90fa15f --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/H264SpsParser.java @@ -0,0 +1,181 @@ +package com.foxx.androidcast.media; + +/********************************************************************* + * H264SpsParser.java + * Created at: Fri 15 May 2026 17:47:09 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class H264SpsParser + * Contributors: + * - Anton Afanasyeu (2 commits, 177 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 82619fa871bc520dcba789038ca5b368dc1fcfdd202f1ddd946a4f74ddc1c1dd +**********************************************************************/ +import android.util.Log; + +/** Extracts coded picture size from H.264 SPS (csd-0 / Annex-B). */ +public final class H264SpsParser { + private static final String TAG = "H264SpsParser"; + + private H264SpsParser() {} + + public static final class Dimensions { + public final int width; + public final int height; + + public Dimensions(int width, int height) { + this.width = width; + this.height = height; + } + } + + /** Returns null if SPS cannot be parsed. */ + public static Dimensions parseDimensions(byte[] csd0) { + if (csd0 == null || csd0.length < 8) { + return null; + } + byte[] annexB = H264Bitstream.toAnnexB(csd0); + int nalOffset = findNalOffset(annexB, 7); // SPS NAL type + if (nalOffset < 0) { + nalOffset = findNalOffset(annexB, 1); // fallback any SPS-like + } + if (nalOffset < 0) { + return null; + } + try { + BitReader br = new BitReader(annexB, nalOffset + 1); + int profile = br.readBits(8); + br.readBits(8); // constraint + reserved + br.readBits(8); // level + br.readUe(); // seq_parameter_set_id + if (profile == 100 || profile == 110 || profile == 122 || profile == 244 + || profile == 44 || profile == 83 || profile == 86 || profile == 118 + || profile == 128 || profile == 138) { + int chroma = br.readUe(); + if (chroma == 3) { + br.readUe(); // separate_colour_plane_flag offset + } + br.readUe(); // bit_depth_luma_minus8 + br.readUe(); // bit_depth_chroma_minus8 + br.readBits(1); // qpprime_y_zero_transform_bypass + int seqScaling = br.readBits(1); + if (seqScaling == 1) { + int count = (chroma != 3) ? 8 : 12; + int last = 8; + int next = 8; + for (int i = 0; i < count; i++) { + if (br.readBits(1) != 0) { + int delta = br.readSe(); + next = (last + delta + 256) % 256; + } + last = next; + } + } + } + br.readUe(); // log2_max_frame_num_minus4 + int picOrderCnt = br.readUe(); + if (picOrderCnt == 0) { + br.readUe(); + } else if (picOrderCnt == 1) { + br.readBits(1); + br.readSe(); + br.readSe(); + int cycles = br.readUe(); + for (int i = 0; i < cycles; i++) { + br.readSe(); + } + } + br.readUe(); // max_num_ref_frames + br.readBits(1); // gaps_in_frame_num_value_allowed_flag + int picWidthMbs = br.readUe() + 1; + int picHeightMbs = br.readUe() + 1; + int frameMbsOnly = br.readBits(1); + if (frameMbsOnly == 0) { + br.readBits(1); // mb_adaptive_frame_field_flag + } + br.readBits(1); // direct_8x8_inference_flag + int frameCrop = br.readBits(1); + int cropLeft = 0; + int cropRight = 0; + int cropTop = 0; + int cropBottom = 0; + if (frameCrop == 1) { + cropLeft = br.readUe(); + cropRight = br.readUe(); + cropTop = br.readUe(); + cropBottom = br.readUe(); + } + int width = picWidthMbs * 16 - (cropLeft + cropRight) * 2; + int height = (2 - frameMbsOnly) * picHeightMbs * 16 - (cropTop + cropBottom) * 2; + if (width > 0 && height > 0) { + return new Dimensions(width, height); + } + } catch (Exception e) { + Log.w(TAG, "SPS parse failed", e); + } + return null; + } + + private static int findNalOffset(byte[] data, int nalType) { + for (int i = 0; i + 4 < data.length; i++) { + if (data[i] == 0 && data[i + 1] == 0) { + int start = -1; + if (data[i + 2] == 1) { + start = i + 3; + } else if (data[i + 2] == 0 && data[i + 3] == 1) { + start = i + 4; + } + if (start > 0 && start < data.length && (data[start] & 0x1F) == nalType) { + return start; + } + } + } + return -1; + } + + private static final class BitReader { + private final byte[] data; + private int bitPos; + + BitReader(byte[] data, int byteOffset) { + this.data = data; + this.bitPos = byteOffset * 8; + } + + int readBits(int n) { + int val = 0; + for (int i = 0; i < n; i++) { + int byteIndex = bitPos / 8; + if (byteIndex >= data.length) { + throw new IndexOutOfBoundsException(); + } + int bitIndex = 7 - (bitPos % 8); + int bit = (data[byteIndex] >> bitIndex) & 1; + val = (val << 1) | bit; + bitPos++; + } + return val; + } + + int readUe() { + int zeros = 0; + while (readBits(1) == 0) { + zeros++; + if (zeros > 31) { + throw new IndexOutOfBoundsException(); + } + } + int val = 1; + for (int i = 0; i < zeros; i++) { + val = (val << 1) | readBits(1); + } + return val - 1; + } + + int readSe() { + int code = readUe(); + int sign = ((code & 1) << 1) - 1; + return ((code + 1) >> 1) * sign; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/PcmLevelAnalyzer.java b/app/src/main/java/com/foxx/androidcast/media/PcmLevelAnalyzer.java new file mode 100644 index 0000000..78b0d82 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/PcmLevelAnalyzer.java @@ -0,0 +1,78 @@ +package com.foxx.androidcast.media; + +/********************************************************************* + * PcmLevelAnalyzer.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class PcmLevelAnalyzer + * Contributors: + * - Anton Afanasyeu (2 commits, 74 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 ae36e5eb1e60c3d77e63238569736b4f33851352c18eb8e29dee2c9022f0a005 +**********************************************************************/ +/** Peak/RMS analysis for 16-bit little-endian PCM. */ +public final class PcmLevelAnalyzer { + /** ~-46 dBFS; below this counts as silence. */ + public static final float SILENT_PEAK_THRESHOLD = 0.005f; + + public static final class Levels { + public final float peak; + public final float rms; + public final boolean silent; + + Levels(float peak, float rms, boolean silent) { + this.peak = peak; + this.rms = rms; + this.silent = silent; + } + + public float peakDb() { + if (peak <= 1e-9f) { + return -96f; + } + return (float) (20.0 * Math.log10(peak)); + } + } + + private PcmLevelAnalyzer() {} + + public static Levels analyze(byte[] pcm, int length) { + if (pcm == null || length < 2) { + return new Levels(0f, 0f, true); + } + int samples = length / 2; + long sumSq = 0; + int peakAbs = 0; + for (int i = 0; i + 1 < length; i += 2) { + short s = (short) ((pcm[i] & 0xff) | (pcm[i + 1] << 8)); + int a = Math.abs(s); + if (a > peakAbs) { + peakAbs = a; + } + sumSq += (long) s * s; + } + float peak = peakAbs / 32768f; + float rms = samples > 0 + ? (float) Math.sqrt(sumSq / (double) samples) / 32768f + : 0f; + boolean silent = peak < SILENT_PEAK_THRESHOLD && rms < SILENT_PEAK_THRESHOLD * 0.7f; + return new Levels(peak, rms, silent); + } + + /** 0–100 visual level from RMS (scaled for speech/music). */ + public static int vuPercent(float rms) { + if (rms <= 0f) { + return 0; + } + float db = (float) (20.0 * Math.log10(rms + 1e-9)); + float norm = (db + 60f) / 60f; + if (norm < 0f) { + norm = 0f; + } + if (norm > 1f) { + norm = 1f; + } + return Math.round(norm * 100f); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/RgbToNv21.java b/app/src/main/java/com/foxx/androidcast/media/RgbToNv21.java new file mode 100644 index 0000000..cc5fb3d --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/RgbToNv21.java @@ -0,0 +1,63 @@ +package com.foxx.androidcast.media; + +/********************************************************************* + * RgbToNv21.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class RgbToNv21 + * Contributors: + * - Anton Afanasyeu (2 commits, 59 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 40a855caf25776c7d70981d056f0463ed62523d4d1fcb9427af1a1f566cd1da5 +**********************************************************************/ +import android.graphics.Bitmap; + +/** ARGB bitmap to NV21 for YUV420 encoder input. */ +public final class RgbToNv21 { + private RgbToNv21() {} + + public static byte[] fromBitmap(Bitmap bitmap) { + int width = bitmap.getWidth(); + int height = bitmap.getHeight(); + int[] argb = new int[width * height]; + bitmap.getPixels(argb, 0, width, 0, 0, width, height); + return fromArgb(argb, width, height); + } + + public static byte[] fromArgb(int[] argb, int width, int height) { + int frameSize = width * height; + int ySize = frameSize; + int uvSize = frameSize / 2; + byte[] nv21 = new byte[ySize + uvSize]; + int yIndex = 0; + int uvIndex = ySize; + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int color = argb[j * width + i]; + int r = (color >> 16) & 0xff; + int g = (color >> 8) & 0xff; + int b = color & 0xff; + int y = ((66 * r + 129 * g + 25 * b + 128) >> 8) + 16; + int u = ((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128; + int v = ((112 * r - 94 * g - 18 * b + 128) >> 8) + 128; + nv21[yIndex++] = (byte) clamp(y); + if ((j & 1) == 0 && (i & 1) == 0) { + nv21[uvIndex++] = (byte) clamp(v); + nv21[uvIndex++] = (byte) clamp(u); + } + } + } + return nv21; + } + + private static int clamp(int v) { + if (v < 0) { + return 0; + } + if (v > 255) { + return 255; + } + return v; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/RgbToYuv420.java b/app/src/main/java/com/foxx/androidcast/media/RgbToYuv420.java new file mode 100644 index 0000000..e671960 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/RgbToYuv420.java @@ -0,0 +1,163 @@ +package com.foxx.androidcast.media; + +/********************************************************************* + * RgbToYuv420.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class RgbToYuv420 + * Contributors: + * - Anton Afanasyeu (4 commits, 159 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 7050aefb284fec862ccdc6dbfc7f59720671fa25eeef2ccfc396e07ee2d9d68e +**********************************************************************/ +import android.graphics.Bitmap; +import android.media.Image; + +/** + * ARGB to YUV420 planar (I420) or semi-planar (NV12) for MediaCodec buffer input. + */ +public final class RgbToYuv420 { + public enum Layout { + I420, + NV12 + } + + private RgbToYuv420() {} + + public static byte[] fromBitmap(Bitmap bitmap, Layout layout) { + int width = bitmap.getWidth(); + int height = bitmap.getHeight(); + int[] argb = new int[width * height]; + bitmap.getPixels(argb, 0, width, 0, 0, width, height); + return fromArgb(argb, width, height, layout); + } + + public static byte[] fromArgb(int[] argb, int width, int height, Layout layout) { + if (layout == Layout.NV12) { + return toNv12(argb, width, height); + } + return toI420(argb, width, height); + } + + public static int bufferSize(int width, int height) { + return width * height + (width * height) / 2; + } + + /** Fills {@code scratch} with I420 from an RGBA {@link Image} (reuses scratch when large enough). */ + public static byte[] fromRgbaImage(Image image, byte[] scratch) { + if (image == null) { + return null; + } + int width = image.getWidth(); + int height = image.getHeight(); + int need = bufferSize(width, height); + byte[] out = scratch != null && scratch.length >= need ? scratch : new byte[need]; + Image.Plane[] planes = image.getPlanes(); + if (planes == null || planes.length == 0) { + return null; + } + Image.Plane plane = planes[0]; + java.nio.ByteBuffer buffer = plane.getBuffer(); + if (buffer == null) { + return null; + } + int rowStride = plane.getRowStride(); + int pixelStride = plane.getPixelStride(); + int[] argb = new int[width * height]; + int offset = 0; + for (int row = 0; row < height; row++) { + int rowStart = row * rowStride; + for (int col = 0; col < width; col++) { + int pixel = buffer.getInt(rowStart + col * pixelStride); + argb[offset++] = pixel; + } + } + byte[] i420 = toI420(argb, width, height); + if (out != i420) { + System.arraycopy(i420, 0, out, 0, i420.length); + } + return out; + } + + private static byte[] toI420(int[] argb, int width, int height) { + int frameSize = width * height; + int chromaW = (width + 1) / 2; + int chromaH = (height + 1) / 2; + int chromaLen = chromaW * chromaH; + byte[] out = new byte[frameSize + chromaLen * 2]; + int uOffset = frameSize; + int vOffset = frameSize + chromaLen; + + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int color = argb[j * width + i]; + int r = (color >> 16) & 0xff; + int g = (color >> 8) & 0xff; + int b = color & 0xff; + int y = yFromRgb(r, g, b); + out[j * width + i] = (byte) y; + if ((j & 1) == 0 && (i & 1) == 0) { + int u = uFromRgb(r, g, b); + int v = vFromRgb(r, g, b); + int cx = i >> 1; + int cy = j >> 1; + int cIndex = cy * chromaW + cx; + out[uOffset + cIndex] = (byte) u; + out[vOffset + cIndex] = (byte) v; + } + } + } + return out; + } + + private static byte[] toNv12(int[] argb, int width, int height) { + int frameSize = width * height; + int chromaW = (width + 1) / 2; + int chromaH = (height + 1) / 2; + byte[] out = new byte[frameSize + chromaW * chromaH * 2]; + int uvOffset = frameSize; + + for (int j = 0; j < height; j++) { + for (int i = 0; i < width; i++) { + int color = argb[j * width + i]; + int r = (color >> 16) & 0xff; + int g = (color >> 8) & 0xff; + int b = color & 0xff; + out[j * width + i] = (byte) yFromRgb(r, g, b); + if ((j & 1) == 0 && (i & 1) == 0) { + int u = uFromRgb(r, g, b); + int v = vFromRgb(r, g, b); + int cx = i >> 1; + int cy = j >> 1; + int uvIndex = uvOffset + (cy * chromaW + cx) * 2; + out[uvIndex] = (byte) u; + out[uvIndex + 1] = (byte) v; + } + } + } + return out; + } + + private static int yFromRgb(int r, int g, int b) { + return clamp(((66 * r + 129 * g + 25 * b + 128) >> 8) + 16); + } + + private static int uFromRgb(int r, int g, int b) { + return clamp(((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128); + } + + private static int vFromRgb(int r, int g, int b) { + return clamp(((112 * r - 94 * g - 18 * b + 128) >> 8) + 128); + } + + private static int clamp(int v) { + if (v < 0) { + return 0; + } + if (v > 255) { + return 255; + } + return v; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/StreamDimensionResolver.java b/app/src/main/java/com/foxx/androidcast/media/StreamDimensionResolver.java new file mode 100644 index 0000000..7e49dff --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/StreamDimensionResolver.java @@ -0,0 +1,53 @@ +package com.foxx.androidcast.media; + +/********************************************************************* + * StreamDimensionResolver.java + * Created at: Fri 15 May 2026 17:47:09 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class StreamDimensionResolver + * Contributors: + * - Anton Afanasyeu (2 commits, 49 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 1630558a8817b3155c394d96aa9064ef6cad027ab28ed1727ed18a7d6842dc6d +**********************************************************************/ +/** + * Resolves display dimensions using STREAM_CONFIG and SPS (csd-0). + * SPS confirms coded size; config reflects sender VirtualDisplay (preferred for rotation). + */ +public final class StreamDimensionResolver { + private StreamDimensionResolver() {} + + public static final class Size { + public final int width; + public final int height; + public final boolean fromSps; + + public Size(int width, int height, boolean fromSps) { + this.width = width; + this.height = height; + this.fromSps = fromSps; + } + } + + public static Size resolve(int configWidth, int configHeight, byte[] csd0) { + H264SpsParser.Dimensions sps = H264SpsParser.parseDimensions(csd0); + if (configWidth > 0 && configHeight > 0) { + if (sps != null && dimensionsSwapped(configWidth, configHeight, sps.width, sps.height)) { + // Encoder SPS matches rotated buffer — use SPS for display aspect + return new Size(sps.width, sps.height, true); + } + return new Size(configWidth, configHeight, false); + } + if (sps != null) { + return new Size(sps.width, sps.height, true); + } + return new Size(Math.max(configWidth, 2), Math.max(configHeight, 2), false); + } + + private static boolean dimensionsSwapped(int cw, int ch, int sw, int sh) { + boolean configLandscape = cw >= ch; + boolean spsLandscape = sw >= sh; + return configLandscape != spsLandscape && cw != sw && ch != sh; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/codec/AudioCodecBackend.java b/app/src/main/java/com/foxx/androidcast/media/codec/AudioCodecBackend.java new file mode 100644 index 0000000..6e5459d --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/codec/AudioCodecBackend.java @@ -0,0 +1,30 @@ +package com.foxx.androidcast.media.codec; + +/********************************************************************* + * AudioCodecBackend.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * enum AudioCodecBackend + * Contributors: + * - Anton Afanasyeu (2 commits, 23 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 8c4ce51346625ce93a91fa92bf55d5af6261fd1f054154c295f1e6be257cc18f +**********************************************************************/ +/** Implementation backing negotiated / configured audio. */ +public enum AudioCodecBackend { + MEDIA_CODEC_AAC("MediaCodec AAC-LC"), + SPEEX_NATIVE("Speex native"), + OPUS_NATIVE("Opus native"), + SPEEX_STUB("Speex (stub → AAC passthrough)"), + OPUS_STUB("Opus (stub → AAC passthrough)"), + PASSTHROUGH_DEBUG("Passthrough AAC (debug)"), + DISABLED("off"), + UNKNOWN("?"); + + public final String label; + + AudioCodecBackend(String label) { + this.label = label; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/codec/AudioCodecFactory.java b/app/src/main/java/com/foxx/androidcast/media/codec/AudioCodecFactory.java new file mode 100644 index 0000000..e72c0a1 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/codec/AudioCodecFactory.java @@ -0,0 +1,38 @@ +package com.foxx.androidcast.media.codec; + +/********************************************************************* + * AudioCodecFactory.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class AudioCodecFactory + * Contributors: + * - Anton Afanasyeu (2 commits, 25 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 e8b2c92d5f3a97150adcf9af3f44791d2ee6a0db31dd7b7d96cb970bedc5e9fd +**********************************************************************/ +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.media.AudioNegotiator; +import com.foxx.androidcast.sender.AudioEncoder; + +/** Creates audio encoder sinks. */ +public final class AudioCodecFactory { + private AudioCodecFactory() {} + + public static AudioEncoderSink createEncoder(CastSettings settings) { + CastSettings.AudioCodec preference = settings != null + ? AudioNegotiator.effective(settings) : CastSettings.AudioCodec.AAC; + return createEncoder(preference); + } + + public static AudioEncoderSink createEncoder(CastSettings.AudioCodec preference) { + CodecSessionRegistry.setAudioPreference(preference); + AudioCodecBackend backend = PassthroughCodecPolicy.audioBackendFor(preference, true); + if (backend == AudioCodecBackend.SPEEX_STUB + || backend == AudioCodecBackend.OPUS_STUB + || backend == AudioCodecBackend.PASSTHROUGH_DEBUG) { + return new PassthroughAudioEncoderSink(new AudioEncoder(), preference); + } + return new AudioEncoder(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/codec/AudioEncoderSink.java b/app/src/main/java/com/foxx/androidcast/media/codec/AudioEncoderSink.java new file mode 100644 index 0000000..7e2ca2c --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/codec/AudioEncoderSink.java @@ -0,0 +1,32 @@ +package com.foxx.androidcast.media.codec; + +/********************************************************************* + * AudioEncoderSink.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * interface AudioEncoderSink + * Contributors: + * - Anton Afanasyeu (2 commits, 28 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 2b9ef2dff0c165e31aff3b14ba6933df12b4cbfd5b29e81b76f13874c7cfa1ce +**********************************************************************/ +import java.io.IOException; + +/** Audio encoder pipeline (AAC via MediaCodec today; Speex/Opus later). */ +public interface AudioEncoderSink { + + interface Callback { + void onConfig(int sampleRate, int channels, byte[] csd0); + + void onEncodedFrame(long ptsUs, byte[] data); + } + + void prepare(Callback callback) throws IOException; + + void queuePcm(byte[] pcm, int length, long ptsUs); + + long getDroppedPcmFrames(); + + void stop(); +} diff --git a/app/src/main/java/com/foxx/androidcast/media/codec/CodecSessionRegistry.java b/app/src/main/java/com/foxx/androidcast/media/codec/CodecSessionRegistry.java new file mode 100644 index 0000000..2faef2e --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/codec/CodecSessionRegistry.java @@ -0,0 +1,80 @@ +package com.foxx.androidcast.media.codec; + +/********************************************************************* + * CodecSessionRegistry.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CodecSessionRegistry + * Contributors: + * - Anton Afanasyeu (2 commits, 76 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 b76039093ae82704f2530b0b5c5dcd745a7178425ff30cf5d27dd67612009c0c +**********************************************************************/ +import com.foxx.androidcast.CastSettings; + +/** Active codec backends for diagnostics overlay (receiver reads sender prefs + local decode). */ +public final class CodecSessionRegistry { + private static volatile CastSettings.VideoCodec videoPreference = CastSettings.VideoCodec.AUTO; + private static volatile CastSettings.AudioCodec audioPreference = CastSettings.AudioCodec.AUTO; + private static volatile VideoCodecBackend videoBackend = VideoCodecBackend.UNKNOWN; + private static volatile AudioCodecBackend audioBackend = AudioCodecBackend.UNKNOWN; + private static volatile String negotiatedVideoMime; + private static volatile String protectionSummary = "AUTO"; + + private CodecSessionRegistry() {} + + public static void setVideoPreference(CastSettings.VideoCodec pref) { + videoPreference = pref != null ? pref : CastSettings.VideoCodec.AUTO; + } + + public static void setAudioPreference(CastSettings.AudioCodec pref) { + audioPreference = pref != null ? pref : CastSettings.AudioCodec.AUTO; + } + + public static void setVideoBackend(VideoCodecBackend backend, String negotiatedMime) { + videoBackend = backend != null ? backend : VideoCodecBackend.UNKNOWN; + negotiatedVideoMime = negotiatedMime; + } + + public static void setAudioBackend(AudioCodecBackend backend) { + audioBackend = backend != null ? backend : AudioCodecBackend.UNKNOWN; + } + + public static void setProtectionSummary(String summary) { + protectionSummary = summary != null ? summary : "AUTO"; + } + + public static CastSettings.VideoCodec getVideoPreference() { + return videoPreference; + } + + public static CastSettings.AudioCodec getAudioPreference() { + return audioPreference; + } + + public static VideoCodecBackend getVideoBackend() { + return videoBackend; + } + + public static AudioCodecBackend getAudioBackend() { + return audioBackend; + } + + public static String getNegotiatedVideoMime() { + return negotiatedVideoMime; + } + + public static String getProtectionSummary() { + return protectionSummary; + } + + public static void clear() { + videoPreference = CastSettings.VideoCodec.AUTO; + audioPreference = CastSettings.AudioCodec.AUTO; + videoBackend = VideoCodecBackend.UNKNOWN; + audioBackend = AudioCodecBackend.UNKNOWN; + negotiatedVideoMime = null; + protectionSummary = "AUTO"; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/codec/LibvpxCapableVideoDecoder.java b/app/src/main/java/com/foxx/androidcast/media/codec/LibvpxCapableVideoDecoder.java new file mode 100644 index 0000000..7df62ea --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/codec/LibvpxCapableVideoDecoder.java @@ -0,0 +1,63 @@ +package com.foxx.androidcast.media.codec; + +/********************************************************************* + * LibvpxCapableVideoDecoder.java + * Created at: Mon 18 May 2026 17:05:47 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class LibvpxCapableVideoDecoder + * Contributors: + * - Anton Afanasyeu (2 commits, 59 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 26843b12f2436c44befd5fc8851b9ef41a507eb77e84434d07a51f1797cd717c +**********************************************************************/ +import android.util.Log; +import android.view.Surface; + +import com.foxx.androidcast.media.CodecNegotiator; +import com.foxx.androidcast.receiver.LibvpxVideoDecoder; +import com.foxx.androidcast.receiver.VideoDecoder; + +import java.io.IOException; + +/** + * Uses libvpx for VP8/VP9 when linked; otherwise or on failure falls back to {@link VideoDecoder}. + */ +public final class LibvpxCapableVideoDecoder implements VideoDecoderSink { + private static final String TAG = "LibvpxCapableVideoDecoder"; + + private final VideoDecoder hwDecoder = new VideoDecoder(); + private final LibvpxVideoDecoder libvpxDecoder = new LibvpxVideoDecoder(); + private VideoDecoderSink active; + + @Override + public void configure(String mime, int width, int height, byte[] csd0, byte[] csd1, Surface surface, + Listener listener) throws IOException { + if (CodecNegotiator.isVpx(mime)) { + try { + libvpxDecoder.configure(mime, width, height, csd0, csd1, surface, listener); + active = libvpxDecoder; + Log.i(TAG, "Using libvpx for " + mime); + return; + } catch (IOException e) { + Log.w(TAG, "libvpx decode unavailable, trying MediaCodec: " + e.getMessage()); + } + } + hwDecoder.configure(mime, width, height, csd0, csd1, surface, listener); + active = hwDecoder; + } + + @Override + public void queueFrame(long ptsUs, boolean keyFrame, byte[] data) { + if (active != null) { + active.queueFrame(ptsUs, keyFrame, data); + } + } + + @Override + public void release() { + hwDecoder.release(); + libvpxDecoder.release(); + active = null; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/codec/LibvpxVideoEncoderSink.java b/app/src/main/java/com/foxx/androidcast/media/codec/LibvpxVideoEncoderSink.java new file mode 100644 index 0000000..68ca7ea --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/codec/LibvpxVideoEncoderSink.java @@ -0,0 +1,248 @@ +package com.foxx.androidcast.media.codec; + +/********************************************************************* + * LibvpxVideoEncoderSink.java + * Created at: Mon 18 May 2026 14:25:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class LibvpxVideoEncoderSink + * Contributors: + * - Anton Afanasyeu (4 commits, 244 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 43faed143aa87bcb23e317cbe1118de3e2e598bfcf5ad1d16edd0c1265b43e98 +**********************************************************************/ +import android.graphics.Bitmap; +import android.graphics.PixelFormat; +import android.media.Image; +import android.media.ImageReader; +import android.media.MediaFormat; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; +import android.view.Surface; + +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.CastTuningEngine; +import com.foxx.androidcast.media.RgbToYuv420; +import com.foxx.androidcast.media.codec.jni.NativeCodecBridge; +import com.foxx.androidcast.media.codec.jni.VpxEncodedFrame; +import com.foxx.androidcast.sender.VideoEncoder; + +import java.io.IOException; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; + +/** + * Software VP8/VP9 via libvpx when {@link NativeCodecBridge#isLibvpxAvailable()}. + * Screen capture uses an {@link ImageReader} surface; calibration may use buffer or GLES paths. + */ +public final class LibvpxVideoEncoderSink implements VideoEncoderSink { + private static final String TAG = "LibvpxVideoEncoder"; + + private final CastSettings.VideoCodec preference; + private final VideoEncoder hwFallback = new VideoEncoder(); + + private Callback callback; + private final AtomicLong nativeHandle = new AtomicLong(); + private int width; + private int height; + private String mime; + private byte[] yuvScratch; + private boolean forceKeyframe; + + /** Active capture pipeline; {@link #releaseCapture()} swaps it out via {@code getAndSet(null)}. */ + private final AtomicReference capturePipeline = new AtomicReference<>(); + + public LibvpxVideoEncoderSink(CastSettings.VideoCodec preference) { + this.preference = preference; + } + + @Override + public Surface getInputSurface() { + CapturePipeline pipe = capturePipeline.get(); + if (nativeHandle.get() != 0L && pipe != null) { + return pipe.reader.getSurface(); + } + return hwFallback.getInputSurface(); + } + + @Override + public void requestKeyframe() { + if (nativeHandle.get() != 0L) { + NativeCodecBridge.vpxRequestKeyframe(nativeHandle.get()); + forceKeyframe = true; + } else { + hwFallback.requestKeyframe(); + } + } + + @Override + public Surface prepare(int width, int height, String mime, CastTuningEngine.EffectiveParams params, + Callback callback) throws IOException { + releaseCapture(); + releaseNativeEncoder(); + this.callback = callback; + this.width = width; + this.height = height; + this.mime = mime; + yuvScratch = new byte[RgbToYuv420.bufferSize(width, height)]; + + int bitrateKbps = Math.max(500, params.videoBitrate / 1000); + long handle = NativeCodecBridge.vpxEncoderCreate(mime, width, height, bitrateKbps); + if (handle == 0L) { + Log.w(TAG, "libvpx encoder init failed; using MediaCodec for surface capture"); + CodecSessionRegistry.setVideoBackend(VideoCodecBackend.MEDIA_CODEC_HW, mime); + return hwFallback.prepare(width, height, mime, params, callback); + } + nativeHandle.set(handle); + + CodecSessionRegistry.setVideoBackend(VideoCodecBackend.LIBVPX_NATIVE, mime); + CapturePipeline pipe = CapturePipeline.create(width, height, this::onImageAvailable); + capturePipeline.set(pipe); + callback.onConfig(width, height, null, null); + Log.i(TAG, "libvpx surface encoder " + width + "x" + height + " mime=" + mime); + return pipe.reader.getSurface(); + } + + @Override + public void prepareBufferInput(int width, int height, String mime, CastTuningEngine.EffectiveParams params, + Callback callback) throws IOException { + releaseCapture(); + releaseNativeEncoder(); + this.width = width; + this.height = height; + this.mime = mime; + this.callback = callback; + yuvScratch = new byte[RgbToYuv420.bufferSize(width, height)]; + int bitrateKbps = Math.max(500, params.videoBitrate / 1000); + long handle = NativeCodecBridge.vpxEncoderCreate(mime, width, height, bitrateKbps); + if (handle != 0L) { + nativeHandle.set(handle); + CodecSessionRegistry.setVideoBackend(VideoCodecBackend.LIBVPX_NATIVE, mime); + callback.onConfig(width, height, null, null); + return; + } + CodecSessionRegistry.setVideoBackend(VideoCodecBackend.MEDIA_CODEC_HW, mime); + hwFallback.prepareBufferInput(width, height, mime, params, callback); + } + + private void onImageAvailable(ImageReader reader) { + CapturePipeline pipe = capturePipeline.get(); + if (pipe == null || pipe.reader != reader || callback == null) { + return; + } + long handle = nativeHandle.get(); + if (handle == 0L) { + return; + } + try (Image image = reader.acquireLatestImage()) { + if (image == null) { + return; + } + if (image.getWidth() != width || image.getHeight() != height) { + return; + } + byte[] yuv = RgbToYuv420.fromRgbaImage(image, yuvScratch); + if (yuv == null) { + return; + } + if (capturePipeline.get() != pipe) { + return; + } + long ptsUs = image.getTimestamp() / 1000L; + emitEncodedFrame(handle, yuv, ptsUs); + } catch (Exception e) { + Log.w(TAG, "Capture frame skipped: " + e.getMessage()); + } + } + + private void emitEncodedFrame(long handle, byte[] yuv, long ptsUs) { + if (nativeHandle.get() != handle) { + return; + } + VpxEncodedFrame frame = NativeCodecBridge.vpxEncodeYuvFrame(handle, yuv, ptsUs, forceKeyframe); + forceKeyframe = false; + if (frame != null && frame.data != null && callback != null) { + callback.onEncodedFrame(ptsUs, frame.keyFrame, frame.data); + } + } + + @Override + public void queueBitmapFrame(Bitmap bitmap, long ptsUs) { + long handle = nativeHandle.get(); + if (handle == 0L) { + hwFallback.queueBitmapFrame(bitmap, ptsUs); + return; + } + byte[] yuv = RgbToYuv420.fromBitmap(bitmap, RgbToYuv420.Layout.I420); + emitEncodedFrame(handle, yuv, ptsUs); + } + + @Override + public void queueYuvFrame(byte[] yuv, long ptsUs) { + long handle = nativeHandle.get(); + if (handle == 0L) { + hwFallback.queueYuvFrame(yuv, ptsUs); + return; + } + emitEncodedFrame(handle, yuv, ptsUs); + } + + @Override + public void stop() { + releaseCapture(); + releaseNativeEncoder(); + hwFallback.stop(); + } + + private void releaseCapture() { + CapturePipeline old = capturePipeline.getAndSet(null); + if (old != null) { + old.release(); + } + } + + private void releaseNativeEncoder() { + long handle = nativeHandle.getAndSet(0L); + if (handle != 0L) { + NativeCodecBridge.vpxEncoderRelease(handle); + } + } + + private static final class CapturePipeline { + final ImageReader reader; + final HandlerThread thread; + + private CapturePipeline(ImageReader reader, HandlerThread thread) { + this.reader = reader; + this.thread = thread; + } + + static CapturePipeline create(int width, int height, ImageReader.OnImageAvailableListener listener) { + HandlerThread thread = new HandlerThread("libvpx-capture"); + thread.start(); + Handler handler = new Handler(thread.getLooper()); + ImageReader reader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 2); + reader.setOnImageAvailableListener(listener, handler); + return new CapturePipeline(reader, thread); + } + + void release() { + reader.setOnImageAvailableListener(null, null); + reader.close(); + thread.quitSafely(); + try { + thread.join(2000L); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + } + + static String mimeFor(CastSettings.VideoCodec preference) { + if (preference == CastSettings.VideoCodec.LIBVPX_VP9) { + return MediaFormat.MIMETYPE_VIDEO_VP9; + } + return MediaFormat.MIMETYPE_VIDEO_VP8; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/codec/PassthroughAudioEncoderSink.java b/app/src/main/java/com/foxx/androidcast/media/codec/PassthroughAudioEncoderSink.java new file mode 100644 index 0000000..0b874a8 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/codec/PassthroughAudioEncoderSink.java @@ -0,0 +1,54 @@ +package com.foxx.androidcast.media.codec; + +/********************************************************************* + * PassthroughAudioEncoderSink.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * Contributors: + * - Anton Afanasyeu (2 commits, 48 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 9e17f4283fe1f0aae032d7830fe767d8fc70deb184aa771aeb93d36fe3469a79 +**********************************************************************/ +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.sender.AudioEncoder; + +import java.io.IOException; + +/** Delegates to AAC MediaCodec while UI shows a future Speex/Opus choice. */ +final class PassthroughAudioEncoderSink implements AudioEncoderSink { + private final AudioEncoderSink delegate; + private final CastSettings.AudioCodec preference; + + PassthroughAudioEncoderSink(AudioEncoderSink delegate, CastSettings.AudioCodec preference) { + this.delegate = delegate; + this.preference = preference; + } + + @Override + public void prepare(Callback callback) throws IOException { + if (preference == CastSettings.AudioCodec.OPUS) { + CodecSessionRegistry.setAudioBackend(AudioCodecBackend.OPUS_STUB); + } else if (preference == CastSettings.AudioCodec.SPEEX) { + CodecSessionRegistry.setAudioBackend(AudioCodecBackend.SPEEX_STUB); + } else if (preference == CastSettings.AudioCodec.PASSTHROUGH_DEBUG) { + CodecSessionRegistry.setAudioBackend(AudioCodecBackend.PASSTHROUGH_DEBUG); + } + delegate.prepare(callback); + } + + @Override + public void queuePcm(byte[] pcm, int length, long ptsUs) { + delegate.queuePcm(pcm, length, ptsUs); + } + + @Override + public long getDroppedPcmFrames() { + return delegate.getDroppedPcmFrames(); + } + + @Override + public void stop() { + delegate.stop(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/codec/PassthroughCodecPolicy.java b/app/src/main/java/com/foxx/androidcast/media/codec/PassthroughCodecPolicy.java new file mode 100644 index 0000000..863d853 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/codec/PassthroughCodecPolicy.java @@ -0,0 +1,167 @@ +package com.foxx.androidcast.media.codec; + +/********************************************************************* + * PassthroughCodecPolicy.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class PassthroughCodecPolicy + * Contributors: + * - Anton Afanasyeu (4 commits, 154 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 fdcd87ff4674eca1c4857ae70bcccb26aead56fe3b1d9024f64b793588bbce16 +**********************************************************************/ +import android.media.MediaFormat; + +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.media.CodecNegotiator; +import com.foxx.androidcast.media.codec.jni.NativeCodecBridge; + +/** + * Maps UI / future software codec choices to wire negotiation and HW backends. + * Disabled libvpx / Speex / Opus entries use passthrough to system codecs until integrated. + */ +public final class PassthroughCodecPolicy { + private PassthroughCodecPolicy() {} + + public static CastSettings.VideoCodec forNegotiation(CastSettings.VideoCodec preference) { + if (preference == null) { + return CastSettings.VideoCodec.AUTO; + } + switch (preference) { + case LIBVPX_VP8: + case LIBVPX_VP9: + return preference; + case PASSTHROUGH: + return CastSettings.VideoCodec.AUTO; + default: + return preference; + } + } + + public static VideoCodecBackend videoBackendFor(CastSettings.VideoCodec preference) { + if (preference == CastSettings.VideoCodec.LIBVPX_VP8 + || preference == CastSettings.VideoCodec.LIBVPX_VP9) { + return NativeCodecBridge.isLibvpxAvailable() + ? VideoCodecBackend.LIBVPX_NATIVE : VideoCodecBackend.LIBVPX_STUB; + } + if (preference == CastSettings.VideoCodec.PASSTHROUGH) { + return VideoCodecBackend.PASSTHROUGH; + } + return VideoCodecBackend.MEDIA_CODEC_HW; + } + + public static CastSettings.AudioCodec forAudioNegotiation(CastSettings.AudioCodec preference) { + if (preference == null) { + return CastSettings.AudioCodec.AUTO; + } + switch (preference) { + case SPEEX: + case OPUS: + return preference; + case PASSTHROUGH_DEBUG: + return CastSettings.AudioCodec.AUTO; + default: + return preference; + } + } + + public static AudioCodecBackend audioBackendFor(CastSettings.AudioCodec preference, + boolean audioEnabled) { + if (!audioEnabled) { + return AudioCodecBackend.DISABLED; + } + if (preference == CastSettings.AudioCodec.SPEEX) { + return NativeCodecBridge.isSpeexAvailable() + ? AudioCodecBackend.SPEEX_NATIVE : AudioCodecBackend.SPEEX_STUB; + } + if (preference == CastSettings.AudioCodec.OPUS) { + return NativeCodecBridge.isOpusAvailable() + ? AudioCodecBackend.OPUS_NATIVE : AudioCodecBackend.OPUS_STUB; + } + if (preference == CastSettings.AudioCodec.PASSTHROUGH_DEBUG) { + return AudioCodecBackend.PASSTHROUGH_DEBUG; + } + return AudioCodecBackend.MEDIA_CODEC_AAC; + } + + public static String protectionDescription(CastSettings.StreamProtection mode, String transport, + CastSettings.AudioCodec audioPref) { + StringBuilder sb = new StringBuilder(); + if (mode != null) { + sb.append(mode.name()); + } else { + sb.append("AUTO"); + } + if (CastSettings.AudioCodec.OPUS == audioPref) { + sb.append(" · Opus in-band FEC (when Opus enabled)"); + } else if (CastSettings.AudioCodec.SPEEX == audioPref) { + sb.append(" · Speex FEC (when Speex enabled)"); + } + if (transport != null && transport.equalsIgnoreCase("udp")) { + if (mode == null || mode == CastSettings.StreamProtection.NONE + || mode == CastSettings.StreamProtection.AUTO) { + sb.append(" · UDP protection off (default)"); + } else { + sb.append(" · UDP per-shard FEC/NACK when negotiated"); + } + } + return sb.toString(); + } + + public static String wireMimeHint(CastSettings.VideoCodec preference) { + switch (preference) { + case LIBVPX_VP8: + return MediaFormat.MIMETYPE_VIDEO_VP8; + case LIBVPX_VP9: + return MediaFormat.MIMETYPE_VIDEO_VP9; + case H264: + return MediaFormat.MIMETYPE_VIDEO_AVC; + case H265: + return MediaFormat.MIMETYPE_VIDEO_HEVC; + case AUTO: + default: + return "negotiated"; + } + } + + public static String displayVideoPreference(CastSettings.VideoCodec codec) { + if (codec == null) { + return CodecNegotiator.displayName(null); + } + switch (codec) { + case LIBVPX_VP8: + return "libvpx (VP8)"; + case LIBVPX_VP9: + return "libvpx (VP9)"; + case H264: + return "H.264"; + case H265: + return "H.265"; + case PASSTHROUGH: + return "Passthrough"; + case AUTO: + default: + return "AUTO"; + } + } + + public static String displayAudioPreference(CastSettings.AudioCodec codec) { + if (codec == null) { + return "AUTO"; + } + switch (codec) { + case SPEEX: + return "Speex"; + case OPUS: + return "Opus"; + case AAC: + return "AAC"; + case PASSTHROUGH_DEBUG: + return "Passthrough (debug)"; + case AUTO: + default: + return "AUTO"; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/codec/PassthroughVideoEncoderSink.java b/app/src/main/java/com/foxx/androidcast/media/codec/PassthroughVideoEncoderSink.java new file mode 100644 index 0000000..370d7d1 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/codec/PassthroughVideoEncoderSink.java @@ -0,0 +1,75 @@ +package com.foxx.androidcast.media.codec; + +/********************************************************************* + * PassthroughVideoEncoderSink.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * Contributors: + * - Anton Afanasyeu (2 commits, 71 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 4767eda5f9d87dcc529c1e10b9d273213b8b2ea78069d643ce282df712bc9f9d +**********************************************************************/ +import android.graphics.Bitmap; +import android.view.Surface; + +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.CastTuningEngine; + +import java.io.IOException; + +/** + * Delegates to hardware {@link VideoEncoderSink} while preference is a future software codec. + */ +final class PassthroughVideoEncoderSink implements VideoEncoderSink { + private final VideoEncoderSink delegate; + private final CastSettings.VideoCodec preference; + + PassthroughVideoEncoderSink(VideoEncoderSink delegate, CastSettings.VideoCodec preference) { + this.delegate = delegate; + this.preference = preference; + } + + @Override + public Surface getInputSurface() { + return delegate.getInputSurface(); + } + + @Override + public void requestKeyframe() { + delegate.requestKeyframe(); + } + + @Override + public Surface prepare(int width, int height, String mime, CastTuningEngine.EffectiveParams params, + Callback callback) throws IOException { + CodecSessionRegistry.setVideoBackend(VideoCodecBackend.LIBVPX_STUB, mime); + return delegate.prepare(width, height, mime, params, callback); + } + + @Override + public void prepareBufferInput(int width, int height, String mime, CastTuningEngine.EffectiveParams params, + Callback callback) throws IOException { + CodecSessionRegistry.setVideoBackend(VideoCodecBackend.LIBVPX_STUB, mime); + delegate.prepareBufferInput(width, height, mime, params, callback); + } + + @Override + public void queueBitmapFrame(Bitmap bitmap, long ptsUs) { + delegate.queueBitmapFrame(bitmap, ptsUs); + } + + @Override + public void queueYuvFrame(byte[] yuv, long ptsUs) { + delegate.queueYuvFrame(yuv, ptsUs); + } + + @Override + public void stop() { + delegate.stop(); + } + + CastSettings.VideoCodec getPreference() { + return preference; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/codec/VideoCodecBackend.java b/app/src/main/java/com/foxx/androidcast/media/codec/VideoCodecBackend.java new file mode 100644 index 0000000..06a10bd --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/codec/VideoCodecBackend.java @@ -0,0 +1,27 @@ +package com.foxx.androidcast.media.codec; + +/********************************************************************* + * VideoCodecBackend.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * enum VideoCodecBackend + * Contributors: + * - Anton Afanasyeu (3 commits, 23 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 1046811d222a90a24b31cb5bfd956669b5ec2ea67fce49a6089864491e1d780e +**********************************************************************/ +/** Implementation backing a negotiated video MIME. */ +public enum VideoCodecBackend { + MEDIA_CODEC_HW("MediaCodec (HW)"), + LIBVPX_NATIVE("libvpx (software)"), + LIBVPX_STUB("libvpx (HW fallback until native encode wired)"), + PASSTHROUGH("Passthrough (stub)"), + UNKNOWN("?"); + + public final String label; + + VideoCodecBackend(String label) { + this.label = label; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/codec/VideoCodecFactory.java b/app/src/main/java/com/foxx/androidcast/media/codec/VideoCodecFactory.java new file mode 100644 index 0000000..0ca1df9 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/codec/VideoCodecFactory.java @@ -0,0 +1,38 @@ +package com.foxx.androidcast.media.codec; + +/********************************************************************* + * VideoCodecFactory.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class VideoCodecFactory + * Contributors: + * - Anton Afanasyeu (3 commits, 34 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 219cb0001dd6b968ca3039a8519888d4be431d9060e0843efed4b926b692f357 +**********************************************************************/ +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.media.codec.jni.NativeCodecBridge; +import com.foxx.androidcast.sender.VideoEncoder; + +/** Creates video encoder sinks; libvpx used when native library is linked. */ +public final class VideoCodecFactory { + private VideoCodecFactory() {} + + public static VideoEncoderSink createEncoder(CastSettings.VideoCodec preference) { + CodecSessionRegistry.setVideoPreference(preference); + if (preference == CastSettings.VideoCodec.LIBVPX_VP8 + || preference == CastSettings.VideoCodec.LIBVPX_VP9) { + if (NativeCodecBridge.isLibvpxAvailable()) { + return new LibvpxVideoEncoderSink(preference); + } + CodecSessionRegistry.setVideoBackend(VideoCodecBackend.MEDIA_CODEC_HW, null); + return new PassthroughVideoEncoderSink(new VideoEncoder(), preference); + } + VideoCodecBackend backend = PassthroughCodecPolicy.videoBackendFor(preference); + if (backend == VideoCodecBackend.PASSTHROUGH) { + return new PassthroughVideoEncoderSink(new VideoEncoder(), preference); + } + return new VideoEncoder(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/codec/VideoDecoderFactory.java b/app/src/main/java/com/foxx/androidcast/media/codec/VideoDecoderFactory.java new file mode 100644 index 0000000..a9b7074 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/codec/VideoDecoderFactory.java @@ -0,0 +1,27 @@ +package com.foxx.androidcast.media.codec; + +/********************************************************************* + * VideoDecoderFactory.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class VideoDecoderFactory + * Contributors: + * - Anton Afanasyeu (3 commits, 23 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 478c0cd5ddb8c25d46f2010ab216e758cd7d48c44a042dac38b76d9092cefb71 +**********************************************************************/ +import com.foxx.androidcast.media.codec.jni.NativeCodecBridge; +import com.foxx.androidcast.receiver.VideoDecoder; + +/** Creates video decoder sinks. */ +public final class VideoDecoderFactory { + private VideoDecoderFactory() {} + + public static VideoDecoderSink createDecoder() { + if (NativeCodecBridge.isLibvpxAvailable()) { + return new LibvpxCapableVideoDecoder(); + } + return new VideoDecoder(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/media/codec/VideoDecoderSink.java b/app/src/main/java/com/foxx/androidcast/media/codec/VideoDecoderSink.java new file mode 100644 index 0000000..bd205d8 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/codec/VideoDecoderSink.java @@ -0,0 +1,35 @@ +package com.foxx.androidcast.media.codec; + +/********************************************************************* + * VideoDecoderSink.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * interface VideoDecoderSink + * Contributors: + * - Anton Afanasyeu (2 commits, 31 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 82577d976f180dbe61110a21a61152a4481742085c5797e3c7e638e8fb0d3821 +**********************************************************************/ +import android.view.Surface; + +import java.io.IOException; + +/** Video decoder pipeline (MediaCodec today; libvpx fallback later). */ +public interface VideoDecoderSink { + + interface Listener { + void onFirstFrameRendered(); + + default void onFrameRendered() {} + + default void onOutputSizeChanged(int width, int height) {} + } + + void configure(String mime, int width, int height, byte[] csd0, byte[] csd1, Surface surface, + Listener listener) throws IOException; + + void queueFrame(long ptsUs, boolean keyFrame, byte[] data); + + void release(); +} diff --git a/app/src/main/java/com/foxx/androidcast/media/codec/VideoEncoderSink.java b/app/src/main/java/com/foxx/androidcast/media/codec/VideoEncoderSink.java new file mode 100644 index 0000000..166d6bf --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/codec/VideoEncoderSink.java @@ -0,0 +1,45 @@ +package com.foxx.androidcast.media.codec; + +/********************************************************************* + * VideoEncoderSink.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * interface VideoEncoderSink + * Contributors: + * - Anton Afanasyeu (2 commits, 41 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 5f4e7be7b85bbdf19150483998ca7dbe4faeede03678ffa3dcf112e0de885299 +**********************************************************************/ +import android.graphics.Bitmap; +import android.view.Surface; + +import com.foxx.androidcast.CastTuningEngine; + +import java.io.IOException; + +/** Video encoder pipeline (MediaCodec today; libvpx fallback later). */ +public interface VideoEncoderSink { + + interface Callback { + void onConfig(int width, int height, byte[] csd0, byte[] csd1); + + void onEncodedFrame(long ptsUs, boolean keyFrame, byte[] data); + } + + Surface getInputSurface(); + + void requestKeyframe(); + + Surface prepare(int width, int height, String mime, CastTuningEngine.EffectiveParams params, + Callback callback) throws IOException; + + void prepareBufferInput(int width, int height, String mime, CastTuningEngine.EffectiveParams params, + Callback callback) throws IOException; + + void queueBitmapFrame(Bitmap bitmap, long ptsUs); + + void queueYuvFrame(byte[] yuv, long ptsUs); + + void stop(); +} diff --git a/app/src/main/java/com/foxx/androidcast/media/codec/jni/NativeCodecBridge.java b/app/src/main/java/com/foxx/androidcast/media/codec/jni/NativeCodecBridge.java new file mode 100644 index 0000000..920b01c --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/codec/jni/NativeCodecBridge.java @@ -0,0 +1,128 @@ +package com.foxx.androidcast.media.codec.jni; + +/********************************************************************* + * NativeCodecBridge.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class NativeCodecBridge + * Contributors: + * - Anton Afanasyeu (4 commits, 124 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 bf3ba812b94838714e674811ced6549bad58071210e891174733e7b01ba499c3 +**********************************************************************/ +import android.util.Log; +import android.view.Surface; + +/** JNI probes for third-party codecs built from {@code ndk/} + {@code third-party/}. */ +public final class NativeCodecBridge { + private static final String TAG = "NativeCodecBridge"; + private static final String LIB = "androidcast_codecs"; + + private static boolean loaded; + private static boolean loadAttempted; + + private NativeCodecBridge() {} + + public static boolean ensureLoaded() { + if (loadAttempted) { + return loaded; + } + loadAttempted = true; + try { + System.loadLibrary(LIB); + loaded = true; + } catch (UnsatisfiedLinkError e) { + Log.w(TAG, "Native codec library not available: " + e.getMessage()); + loaded = false; + } + return loaded; + } + + public static boolean isLibvpxAvailable() { + return ensureLoaded() && nativeIsLibvpxAvailable(); + } + + public static boolean isOpusAvailable() { + return ensureLoaded() && nativeIsOpusAvailable(); + } + + public static boolean isSpeexAvailable() { + return ensureLoaded() && nativeIsSpeexAvailable(); + } + + public static long vpxEncoderCreate(String mime, int width, int height, int bitrateKbps) { + if (!isLibvpxAvailable()) { + return 0L; + } + return nativeVpxEncoderCreate(mime, width, height, bitrateKbps); + } + + public static byte[] vpxEncodeYuv(long handle, byte[] i420, long ptsUs, boolean forceKeyframe) { + VpxEncodedFrame frame = vpxEncodeYuvFrame(handle, i420, ptsUs, forceKeyframe); + return frame != null ? frame.data : null; + } + + public static VpxEncodedFrame vpxEncodeYuvFrame(long handle, byte[] i420, long ptsUs, + boolean forceKeyframe) { + if (handle == 0L || i420 == null) { + return null; + } + return nativeVpxEncodeYuvFrame(handle, i420, ptsUs, forceKeyframe); + } + + public static long vpxDecoderCreate(String mime) { + if (!isLibvpxAvailable()) { + return 0L; + } + return nativeVpxDecoderCreate(mime); + } + + public static boolean vpxDecodeFrame(long handle, byte[] data, long ptsUs, Surface surface) { + if (handle == 0L || data == null || surface == null) { + return false; + } + return nativeVpxDecodeFrame(handle, data, ptsUs, surface); + } + + public static void vpxDecoderRelease(long handle) { + if (handle != 0L) { + nativeVpxDecoderRelease(handle); + } + } + + public static void vpxEncoderRelease(long handle) { + if (handle != 0L) { + nativeVpxEncoderRelease(handle); + } + } + + public static void vpxRequestKeyframe(long handle) { + if (handle != 0L) { + nativeVpxRequestKeyframe(handle); + } + } + + private static native boolean nativeIsLibvpxAvailable(); + + private static native boolean nativeIsOpusAvailable(); + + private static native boolean nativeIsSpeexAvailable(); + + private static native long nativeVpxEncoderCreate(String mime, int width, int height, int bitrateKbps); + + private static native byte[] nativeVpxEncodeYuv(long handle, byte[] yuv, long ptsUs, boolean forceKeyframe); + + private static native VpxEncodedFrame nativeVpxEncodeYuvFrame(long handle, byte[] yuv, long ptsUs, + boolean forceKeyframe); + + private static native void nativeVpxEncoderRelease(long handle); + + private static native void nativeVpxRequestKeyframe(long handle); + + private static native long nativeVpxDecoderCreate(String mime); + + private static native boolean nativeVpxDecodeFrame(long handle, byte[] data, long ptsUs, Surface surface); + + private static native void nativeVpxDecoderRelease(long handle); +} diff --git a/app/src/main/java/com/foxx/androidcast/media/codec/jni/VpxEncodedFrame.java b/app/src/main/java/com/foxx/androidcast/media/codec/jni/VpxEncodedFrame.java new file mode 100644 index 0000000..5d6affc --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/media/codec/jni/VpxEncodedFrame.java @@ -0,0 +1,23 @@ +package com.foxx.androidcast.media.codec.jni; + +/********************************************************************* + * VpxEncodedFrame.java + * Created at: Mon 18 May 2026 17:05:47 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class VpxEncodedFrame + * Contributors: + * - Anton Afanasyeu (2 commits, 19 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 7a4350633371d1f6000bdb7f607ad80dda259816f960c7069230ac94ab37cf18 +**********************************************************************/ +/** One compressed VP8/VP9 frame from libvpx. */ +public final class VpxEncodedFrame { + public final byte[] data; + public final boolean keyFrame; + + public VpxEncodedFrame(byte[] data, boolean keyFrame) { + this.data = data; + this.keyFrame = keyFrame; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/BackendEndpoints.java b/app/src/main/java/com/foxx/androidcast/network/BackendEndpoints.java new file mode 100644 index 0000000..6b517e6 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/BackendEndpoints.java @@ -0,0 +1,57 @@ +package com.foxx.androidcast.network; + +/** Canonical production BE URLs on {@code apps.f0xx.org} (network self-test + defaults). */ +public final class BackendEndpoints { + public static final String APPS_HOST = "apps.f0xx.org"; + public static final String ISSUES_BASE = + "https://" + APPS_HOST + "/app/androidcast_project/issues"; + /** @deprecated use {@link #ISSUES_BASE}; nginx 301 redirects legacy path. */ + public static final String CRASHES_BASE = ISSUES_BASE; + public static final String GRAPHS_BASE = + "https://" + APPS_HOST + "/app/androidcast_project/graphs"; + public static final String HEARTBEAT_URL = CRASHES_BASE + "/api/heartbeat.php"; + public static final String UPLOAD_URL = CRASHES_BASE + "/api/upload.php"; + public static final String GRAPH_UPLOAD_URL = GRAPHS_BASE + "/api/graph_upload.php"; + public static final String ENTITLEMENTS_BASE = + "https://" + APPS_HOST + "/app/androidcast_project/entitlements"; + /** GET — returns JSON {@code {key, file_url|file_base64, etag}} for RBAC-authenticated user. */ + public static final String ENTITLEMENTS_FETCH_URL = ENTITLEMENTS_BASE + "/api/fetch.php"; + + private BackendEndpoints() {} + + /** Maps legacy {@code f0xx.org}/{@code foxx.org} crash paths to {@link #APPS_HOST}. */ + public static String normalizeCrashesUrl(String url) { + if (url == null) { + return ""; + } + String trimmed = url.trim(); + if (trimmed.isEmpty()) { + return trimmed; + } + if (trimmed.contains("://f0xx.org/app/androidcast_project/crashes") + || trimmed.contains("://foxx.org/app/androidcast_project/crashes") + || trimmed.contains("://f0xx.org/app/androidcast_project/issues") + || trimmed.contains("://foxx.org/app/androidcast_project/issues")) { + return trimmed.replace("://f0xx.org/", "://" + APPS_HOST + "/") + .replace("://foxx.org/", "://" + APPS_HOST + "/") + .replace("/crashes/", "/issues/"); + } + if (trimmed.contains("/crashes/")) { + return trimmed.replace("/crashes/", "/issues/"); + } + return trimmed; + } + + /** Maps a crashes upload URL to the graphs session ingest endpoint. */ + public static String graphUploadUrlFromCrashesUrl(String crashesUrl) { + if (crashesUrl == null || crashesUrl.isEmpty()) { + return GRAPH_UPLOAD_URL; + } + String trimmed = normalizeCrashesUrl(crashesUrl.trim()); + if (trimmed.contains("/issues/")) { + return trimmed.replace("/issues/", "/graphs/") + .replace("/api/upload.php", "/api/graph_upload.php"); + } + return GRAPH_UPLOAD_URL; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/BackendNtpSync.java b/app/src/main/java/com/foxx/androidcast/network/BackendNtpSync.java new file mode 100644 index 0000000..e92a8a7 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/BackendNtpSync.java @@ -0,0 +1,151 @@ +package com.foxx.androidcast.network; + +import com.foxx.androidcast.AppPreferences; + +import org.json.JSONObject; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.TimeZone; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Backend heartbeat NTP correction (developer setting). + * When |skew| exceeds {@link #SYNC_THRESHOLD_MS}, stores offset for app-local "corrected" time. + * Does not change the system clock. + */ +public final class BackendNtpSync { + /** ±3 minutes — sync when skew exceeds this. */ + public static final long SYNC_THRESHOLD_MS = 3L * 60L * 1000L; + + private static final Pattern TZ_OFFSET = Pattern.compile("([+-])(\\d{2})(\\d{2})"); + + private BackendNtpSync() {} + + public enum Action { + DISABLED, + WITHIN_THRESHOLD, + SYNCED, + FAILED + } + + public static final class Result { + public final Action action; + public final long skewMs; + public final long appliedOffsetMs; + public final String serverWallBeTz; + public final String localWallBeTz; + public final String detail; + + Result(Action action, long skewMs, long appliedOffsetMs, + String serverWallBeTz, String localWallBeTz, String detail) { + this.action = action; + this.skewMs = skewMs; + this.appliedOffsetMs = appliedOffsetMs; + this.serverWallBeTz = serverWallBeTz; + this.localWallBeTz = localWallBeTz; + this.detail = detail; + } + } + + /** Corrected wall time for diagnostics when sync is active. */ + public static long correctedNowMs(android.content.Context context) { + if (!AppPreferences.isDevBackendNtpSyncEnabled(context)) { + return System.currentTimeMillis(); + } + return System.currentTimeMillis() + AppPreferences.getDevBackendNtpOffsetMs(context); + } + + /** + * @param requestStartMs wall clock when POST started + * @param requestEndMs wall clock when response body was read + * @param clientEpochSec epoch seconds sent in heartbeat.date + */ + public static Result evaluateResponse( + android.content.Context context, + long requestStartMs, + long requestEndMs, + long clientEpochSec, + String responseBody) { + if (!AppPreferences.isDevBackendNtpSyncEnabled(context)) { + return new Result(Action.DISABLED, 0L, 0L, "", "", "dev setting off"); + } + try { + JSONObject root = new JSONObject(responseBody != null ? responseBody : "{}"); + JSONObject hb = root.optJSONObject("heartbeat"); + if (hb == null) { + return fail("missing heartbeat object"); + } + long serverEpochSec = hb.optLong("server_date", 0L); + String serverTz = hb.optString("server_tz", ""); + if (serverEpochSec <= 0L) { + return fail("missing server_date"); + } + TimeZone beTz = parseBeTimeZone(serverTz); + long skewMs = computeSkewMs(requestStartMs, requestEndMs, serverEpochSec); + long serverMs = serverEpochSec * 1000L; + long localMidMs = requestStartMs + Math.max(0L, requestEndMs - requestStartMs) / 2L; + + long correctionFromBe = hb.has("correction_seconds") + ? hb.optLong("correction_seconds", 0L) * 1000L + : (serverEpochSec - clientEpochSec) * 1000L; + + String serverWall = formatWallClock(serverMs, beTz); + String localWallInBeTz = formatWallClock(localMidMs, beTz); + String summary = String.format(Locale.US, + "skew=%d ms (BE correction=%d ms) · BE %s · local→BE %s", + skewMs, correctionFromBe, serverWall, localWallInBeTz); + + if (Math.abs(skewMs) > SYNC_THRESHOLD_MS) { + AppPreferences.setDevBackendNtpOffsetMs(context, skewMs); + AppPreferences.setDevBackendNtpLastSyncMs(context, System.currentTimeMillis()); + AppPreferences.setDevBackendNtpLastSkewMs(context, skewMs); + return new Result(Action.SYNCED, skewMs, skewMs, + serverWall, localWallInBeTz, summary + " · offset stored"); + } + AppPreferences.setDevBackendNtpLastSkewMs(context, skewMs); + return new Result(Action.WITHIN_THRESHOLD, skewMs, + AppPreferences.getDevBackendNtpOffsetMs(context), + serverWall, localWallInBeTz, summary + " · within ±3 min"); + } catch (Exception e) { + return fail(e.getClass().getSimpleName() + ": " + e.getMessage()); + } + } + + private static Result fail(String detail) { + return new Result(Action.FAILED, 0L, 0L, "", "", detail); + } + + static long computeSkewMs(long requestStartMs, long requestEndMs, long serverEpochSec) { + long serverMs = serverEpochSec * 1000L; + long localMidMs = requestStartMs + Math.max(0L, requestEndMs - requestStartMs) / 2L; + return serverMs - localMidMs; + } + + static boolean shouldSync(long skewMs) { + return Math.abs(skewMs) > SYNC_THRESHOLD_MS; + } + + static TimeZone parseBeTimeZone(String serverTz) { + if (serverTz == null || serverTz.isEmpty()) { + return TimeZone.getDefault(); + } + Matcher m = TZ_OFFSET.matcher(serverTz.trim()); + if (!m.matches()) { + return TimeZone.getDefault(); + } + String sign = m.group(1); + int hours = Integer.parseInt(m.group(2)); + int mins = Integer.parseInt(m.group(3)); + String id = String.format(Locale.US, "GMT%s%02d:%02d", sign, hours, mins); + return TimeZone.getTimeZone(id); + } + + private static String formatWallClock(long epochMs, TimeZone tz) { + SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z", Locale.US); + fmt.setTimeZone(tz); + return fmt.format(new Date(epochMs)); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/CastCodecFlags.java b/app/src/main/java/com/foxx/androidcast/network/CastCodecFlags.java new file mode 100644 index 0000000..8922abd --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/CastCodecFlags.java @@ -0,0 +1,114 @@ +package com.foxx.androidcast.network; + +/********************************************************************* + * CastCodecFlags.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastCodecFlags + * Contributors: + * - Anton Afanasyeu (2 commits, 60 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 e22ed8faf888b972a834720927d568b6d8469b5bd59a809ccce6b5a80a29cc94 +**********************************************************************/ +import android.media.MediaFormat; + +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.sender.CodecCatalog; + +import java.util.List; + +/** Video/audio codec bitmasks in {@link CastProtoHeader}. */ +public final class CastCodecFlags { + public static final int VIDEO_UNKNOWN = 0; + public static final int VIDEO_H264 = 1; + public static final int VIDEO_H265 = 2; + public static final int VIDEO_VP8 = 4; + public static final int VIDEO_VP9 = 8; + + public static final int AUDIO_UNKNOWN = 0; + public static final int AUDIO_PCM = 1; + public static final int AUDIO_AAC = 2; + public static final int AUDIO_OPUS = 4; + public static final int AUDIO_SPEEX = 8; + + private CastCodecFlags() {} + + public static int videoMaskFromMimes(List mimes) { + int mask = 0; + if (mimes == null) { + return mask; + } + for (String mime : mimes) { + if (MediaFormat.MIMETYPE_VIDEO_AVC.equalsIgnoreCase(mime)) { + mask |= VIDEO_H264; + } else if (MediaFormat.MIMETYPE_VIDEO_HEVC.equalsIgnoreCase(mime)) { + mask |= VIDEO_H265; + } else if (MediaFormat.MIMETYPE_VIDEO_VP8.equalsIgnoreCase(mime)) { + mask |= VIDEO_VP8; + } else if (MediaFormat.MIMETYPE_VIDEO_VP9.equalsIgnoreCase(mime)) { + mask |= VIDEO_VP9; + } + } + return mask; + } + + public static int localVideoMask() { + return videoMaskFromMimes(CodecCatalog.localEncoderMimes()); + } + + public static int localDecoderVideoMask() { + return videoMaskFromMimes(CodecCatalog.localDecoderMimes()); + } + + public static int localAudioMask() { + // Advertise Opus/Speex for stub negotiation even when native probes are false. + return AUDIO_AAC | AUDIO_PCM | AUDIO_OPUS | AUDIO_SPEEX; + } + + public static int localDecoderAudioMask() { + return localAudioMask(); + } + + public static int flagForAudioPreference(CastSettings.AudioCodec codec) { + if (codec == null) { + return AUDIO_UNKNOWN; + } + switch (codec) { + case OPUS: + return AUDIO_OPUS; + case SPEEX: + return AUDIO_SPEEX; + case PASSTHROUGH_DEBUG: + return AUDIO_PCM; + case AAC: + return AUDIO_AAC; + case AUTO: + default: + return AUDIO_UNKNOWN; + } + } + + public static boolean maskSupports(int mask, CastSettings.AudioCodec codec) { + int flag = flagForAudioPreference(codec); + return flag != AUDIO_UNKNOWN && (mask & flag) != 0; + } + + /** Whether this device can encode/decode the preference (native probes for Opus/Speex). */ + public static boolean isLocallyAvailable(CastSettings.AudioCodec codec) { + if (codec == null) { + return false; + } + switch (codec) { + case OPUS: + case SPEEX: + return true; + case AAC: + case PASSTHROUGH_DEBUG: + return true; + case AUTO: + default: + return false; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/CastFramingContext.java b/app/src/main/java/com/foxx/androidcast/network/CastFramingContext.java new file mode 100644 index 0000000..eaf1bce --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/CastFramingContext.java @@ -0,0 +1,37 @@ +package com.foxx.androidcast.network; + +/********************************************************************* + * CastFramingContext.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastFramingContext + * Contributors: + * - Anton Afanasyeu (2 commits, 33 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 6bab8dd7f00e2dcac4cbfff7a71264458219c95581ba70f163604f61f332ec92 +**********************************************************************/ +/** Per-session values written into {@link CastProtoHeader}. */ +public final class CastFramingContext { + public final int sessionId; + public final int placeholderId; + public final int videoCodecs; + public final int audioCodecs; + + public CastFramingContext(int sessionId, int placeholderId, int videoCodecs, int audioCodecs) { + this.sessionId = sessionId; + this.placeholderId = placeholderId; + this.videoCodecs = videoCodecs; + this.audioCodecs = audioCodecs; + } + + public CastProtoHeader newHeader(byte hsType) { + CastProtoHeader h = new CastProtoHeader(); + h.hsType = hsType; + h.sessionId = sessionId; + h.placeholderId = placeholderId; + h.videoCodecs = videoCodecs; + h.audioCodecs = audioCodecs; + return h; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/CastPacketFramer.java b/app/src/main/java/com/foxx/androidcast/network/CastPacketFramer.java new file mode 100644 index 0000000..53b6668 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/CastPacketFramer.java @@ -0,0 +1,123 @@ +package com.foxx.androidcast.network; + +/********************************************************************* + * CastPacketFramer.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastPacketFramer + * Contributors: + * - Anton Afanasyeu (3 commits, 119 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 806b98464c799cdf9ccae53bcd08907959948949247045c8c6e8d6247d5e8ff0 +**********************************************************************/ +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.EOFException; +import java.io.IOException; +import java.io.InputStream; + +/** Wraps {@link CastProtoHeader} + {@link CastProtocol} message body. */ +public final class CastPacketFramer { + private CastPacketFramer() {} + + public static byte[] frame(CastProtoHeader header, byte type, byte[] payload) throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + CastProtocol.writeMessage(dos, type, payload); + byte[] inner = bos.toByteArray(); + header.recomputeChecksum(); + byte[] hdr = header.encode(); + byte[] out = new byte[hdr.length + inner.length]; + System.arraycopy(hdr, 0, out, 0, hdr.length); + System.arraycopy(inner, 0, out, hdr.length, inner.length); + return out; + } + + public static CastProtoHeader readHeader(byte[] wire) throws IOException { + if (wire == null || wire.length < CastProtoHeader.HEADER_SIZE_V1) { + throw new IOException("Frame too short"); + } + CastProtoHeader hdr = CastProtoHeader.decode(wire, 0, wire.length); + if (!hdr.verifyChecksum()) { + throw new IOException("Header checksum mismatch"); + } + return hdr; + } + + public static CastProtocol.Message unframe(byte[] wire) throws IOException { + if (wire == null || wire.length < CastProtoHeader.HEADER_SIZE_V1 + 5) { + throw new IOException("Frame too short"); + } + CastProtoHeader hdr = readHeader(wire); + int innerOff = hdr.headerSize; + if (wire.length < innerOff + 5) { + throw new IOException("Missing message body"); + } + DataInputStream dis = new DataInputStream( + new java.io.ByteArrayInputStream(wire, innerOff, wire.length - innerOff)); + return CastProtocol.readMessage(dis); + } + + /** + * Reads one framed message from a TCP stream (blocking). + * Returns null if stream ends before a full frame. + */ + public static CastProtocol.Message readFramedMessage(InputStream in) throws IOException { + byte[] magicBuf = readFully(in, 4); + if (magicBuf == null) { + return null; + } + int magic = (magicBuf[0] & 0xff) | ((magicBuf[1] & 0xff) << 8) + | ((magicBuf[2] & 0xff) << 16) | ((magicBuf[3] & 0xff) << 24); + if (magic != CastProtoHeader.MAGIC) { + throw new IOException("Bad magic on wire: 0x" + Integer.toHexString(magic)); + } + byte[] restHdr = readFully(in, CastProtoHeader.HEADER_SIZE_V1 - 4); + if (restHdr == null) { + return null; + } + byte[] headerBytes = new byte[CastProtoHeader.HEADER_SIZE_V1]; + System.arraycopy(magicBuf, 0, headerBytes, 0, 4); + System.arraycopy(restHdr, 0, headerBytes, 4, restHdr.length); + CastProtoHeader hdr = CastProtoHeader.decode(headerBytes, 0, headerBytes.length); + if (!hdr.verifyChecksum()) { + throw new IOException("Header checksum mismatch"); + } + byte type = (byte) in.read(); + if (type < 0) { + return null; + } + byte[] lenBuf = readFully(in, 4); + if (lenBuf == null) { + return null; + } + int len = ((lenBuf[0] & 0xff) << 24) | ((lenBuf[1] & 0xff) << 16) + | ((lenBuf[2] & 0xff) << 8) | (lenBuf[3] & 0xff); + if (len < 0 || len > 4 * 1024 * 1024) { + throw new IOException("Invalid payload length: " + len); + } + byte[] payload = len == 0 ? new byte[0] : readFully(in, len); + if (payload == null && len > 0) { + return null; + } + return new CastProtocol.Message(type, payload); + } + + private static byte[] readFully(InputStream in, int n) throws IOException { + byte[] buf = new byte[n]; + int off = 0; + while (off < n) { + int r = in.read(buf, off, n - off); + if (r < 0) { + if (off == 0) { + return null; + } + throw new EOFException("Short read"); + } + off += r; + } + return buf; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/CastProtoHeader.java b/app/src/main/java/com/foxx/androidcast/network/CastProtoHeader.java new file mode 100644 index 0000000..414dc82 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/CastProtoHeader.java @@ -0,0 +1,142 @@ +package com.foxx.androidcast.network; + +/********************************************************************* + * CastProtoHeader.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastProtoHeader + * Contributors: + * - Anton Afanasyeu (2 commits, 138 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 afb671c1209f1fb7414fca91bf9b5c1ccbe2cac079a4b1725ffc8daf9f96df61 +**********************************************************************/ +import com.foxx.androidcast.VersionInfo; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.zip.CRC32; + +/** + * Fixed binary header prefixed to every cast/discovery packet (little-endian). + * v1 size = 48 bytes. + */ +public final class CastProtoHeader { + public static final int MAGIC = 0xDEADBABE; + public static final int HEADER_SIZE_V1 = 48; + + public static final byte HS_DEFAULT = 0; + public static final byte HS_SDP = 1; + + public int magic = MAGIC; + public long protoVersion = VersionInfo.PROTO_VERSION; + public int headerSize = HEADER_SIZE_V1; + public int flags; + public int reserved; + public byte hsType = HS_DEFAULT; + public int videoCodecs; + public int audioCodecs; + public int placeholderId; + public int sessionId; + public int checksum; + + public static CastProtoHeader forCast(int sessionId, int placeholderId, int videoCodecs, int audioCodecs) { + CastProtoHeader h = new CastProtoHeader(); + h.hsType = HS_DEFAULT; + h.sessionId = sessionId; + h.placeholderId = placeholderId; + h.videoCodecs = videoCodecs; + h.audioCodecs = audioCodecs; + h.recomputeChecksum(); + return h; + } + + public static CastProtoHeader forDiscovery(int placeholderId, int videoCodecs, int audioCodecs) { + CastProtoHeader h = new CastProtoHeader(); + h.hsType = HS_SDP; + h.sessionId = 0; + h.placeholderId = placeholderId; + h.videoCodecs = videoCodecs; + h.audioCodecs = audioCodecs; + h.recomputeChecksum(); + return h; + } + + public void recomputeChecksum() { + checksum = 0; + checksum = (int) crc32(encode()); + } + + public boolean verifyChecksum() { + int saved = checksum; + checksum = 0; + int expected = (int) crc32(encode()); + checksum = saved; + return saved == expected; + } + + public byte[] encode() { + ByteBuffer buf = ByteBuffer.allocate(HEADER_SIZE_V1).order(ByteOrder.LITTLE_ENDIAN); + buf.putInt(magic); + buf.putLong(protoVersion); + buf.putInt(headerSize); + buf.putInt(flags); + buf.putInt(reserved); + buf.put(hsType); + buf.put((byte) 0); + buf.put((byte) 0); + buf.put((byte) 0); + buf.putInt(videoCodecs); + buf.putInt(audioCodecs); + buf.putInt(placeholderId); + buf.putInt(sessionId); + buf.putInt(0); + byte[] out = buf.array(); + checksum = (int) crc32(out); + ByteBuffer.wrap(out).order(ByteOrder.LITTLE_ENDIAN).putInt(44, checksum); + return out; + } + + public static CastProtoHeader decode(byte[] bytes, int offset, int length) throws java.io.IOException { + if (length < HEADER_SIZE_V1) { + throw new java.io.IOException("Header too short: " + length); + } + ByteBuffer buf = ByteBuffer.wrap(bytes, offset, length).order(ByteOrder.LITTLE_ENDIAN); + CastProtoHeader h = new CastProtoHeader(); + h.magic = buf.getInt(); + if (h.magic != MAGIC) { + throw new java.io.IOException("Bad magic: 0x" + Integer.toHexString(h.magic)); + } + h.protoVersion = buf.getLong(); + h.headerSize = buf.getInt(); + h.flags = buf.getInt(); + h.reserved = buf.getInt(); + h.hsType = buf.get(); + buf.get(); + buf.get(); + buf.get(); + h.videoCodecs = buf.getInt(); + h.audioCodecs = buf.getInt(); + h.placeholderId = buf.getInt(); + h.sessionId = buf.getInt(); + h.checksum = buf.getInt(); + if (h.headerSize < HEADER_SIZE_V1) { + h.headerSize = HEADER_SIZE_V1; + } + return h; + } + + private static long crc32(byte[] data) { + CRC32 crc = new CRC32(); + int checksumOffset = 44; + crc.update(data, 0, checksumOffset); + crc.update((byte) 0); + crc.update((byte) 0); + crc.update((byte) 0); + crc.update((byte) 0); + if (data.length > checksumOffset + 4) { + crc.update(data, checksumOffset + 4, data.length - checksumOffset - 4); + } + return crc.getValue(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/CastProtocol.java b/app/src/main/java/com/foxx/androidcast/network/CastProtocol.java new file mode 100644 index 0000000..4410058 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/CastProtocol.java @@ -0,0 +1,551 @@ +package com.foxx.androidcast.network; + +/********************************************************************* + * CastProtocol.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastProtocol + * Contributors: + * - Anton Afanasyeu (10 commits, 528 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 656a5843695c1e1219882549e895e14ba560d5f6b366de72827577752b833dc2 +**********************************************************************/ +import com.foxx.androidcast.CastConfig; +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.network.control.NetworkControlAdvice; +import com.foxx.androidcast.network.control.NetworkStatsSnapshot; +import com.foxx.androidcast.network.diag.CastDiagPing; + +import android.media.MediaFormat; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** Length-prefixed binary protocol (TCP) and payload format (shared with UDP). */ +public final class CastProtocol { + public static final byte MSG_HELLO = 1; + public static final byte MSG_AUTH = 2; + public static final byte MSG_AUTH_OK = 3; + public static final byte MSG_AUTH_FAIL = 4; + public static final byte MSG_STREAM_CONFIG = 5; + public static final byte MSG_VIDEO_FRAME = 6; + public static final byte MSG_GOODBYE = 7; + public static final byte MSG_AUDIO_CONFIG = 8; + public static final byte MSG_AUDIO_FRAME = 9; + public static final byte MSG_CAST_SETTINGS = 10; + public static final byte MSG_NETWORK_STATS = 11; + public static final byte MSG_NETWORK_CONTROL = 12; + public static final byte MSG_AUDIO_CONSENT = 13; + public static final byte MSG_CODEC_CAPS = 14; + public static final byte MSG_CODEC_SELECTED = 15; + /** UDP NACK: payload is big-endian {@code messageId} (4 bytes). */ + public static final byte MSG_NACK = 16; + /** Receiver capability/settings (same payload as {@link #MSG_CAST_SETTINGS}). */ + public static final byte MSG_RECEIVER_CAST_SETTINGS = 17; + /** + * Diagnostic ping-pong (developer). Payload: {@link com.foxx.androidcast.network.diag.CastDiagPing}. + * Peers on older builds ignore unknown types. + */ + public static final byte MSG_DIAG_PING = 18; + /** UDP outer wrapper: payload is {@link CastPacketFramer} wire bytes. */ + public static final byte MSG_WIRE_PACKET = 127; + + private CastProtocol() {} + + public static void writeMessage(DataOutputStream out, byte type, byte[] payload) throws IOException { + out.writeByte(type); + int len = payload == null ? 0 : payload.length; + out.writeInt(len); + if (len > 0) { + out.write(payload); + } + out.flush(); + } + + public static Message readMessage(DataInputStream in) throws IOException { + byte type = in.readByte(); + int len = in.readInt(); + if (len < 0 || len > 4 * 1024 * 1024) { + throw new IOException("Invalid payload length: " + len); + } + byte[] payload = len == 0 ? new byte[0] : new byte[len]; + if (len > 0) { + in.readFully(payload); + } + return new Message(type, payload); + } + + public static byte[] helloPayload(String deviceName) { + return deviceName.getBytes(StandardCharsets.UTF_8); + } + + public static byte[] authPayload(String pin) { + return sha256(pin).getBytes(StandardCharsets.UTF_8); + } + + public static byte[] castSettingsPayload(CastSettings settings) throws IOException { + java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + dos.writeInt(CastSettings.SETTINGS_VERSION); + dos.writeUTF(settings.getTransport()); + dos.writeInt(settings.getQuality().ordinal()); + dos.writeInt(settings.getResolution().ordinal()); + dos.writeByte(settings.isAudioEnabled() ? 1 : 0); + dos.writeInt(settings.getVideoCodec().ordinal()); + dos.writeInt(settings.getAdjustmentPreset().ordinal()); + dos.writeInt(settings.getBitrateMode().ordinal()); + dos.writeInt(settings.getNetworkAdoption().ordinal()); + dos.writeInt(settings.getCaptureMode().ordinal()); + dos.writeInt(settings.getStreamProtection().ordinal()); + dos.writeInt(settings.getReceiverDisplayResolution().ordinal()); + dos.writeInt(settings.getAudioCodec().ordinal()); + dos.flush(); + return bos.toByteArray(); + } + + public static CastSettings parseCastSettings(byte[] payload) throws IOException { + DataInputStream dis = new DataInputStream(new java.io.ByteArrayInputStream(payload)); + CastSettings settings = new CastSettings(); + dis.mark(64); + int first = dis.readInt(); + if (first == CastSettings.SETTINGS_VERSION) { + settings.setTransport(dis.readUTF()); + settings.setQuality(readEnum(CastSettings.Quality.values(), dis.readInt(), CastSettings.Quality.MEDIUM)); + settings.setResolution(readEnum(CastSettings.Resolution.values(), dis.readInt(), + CastSettings.Resolution.HD_720P)); + settings.setAudioEnabled(dis.readByte() != 0); + if (dis.available() > 0) { + settings.setVideoCodec(readEnum(CastSettings.VideoCodec.values(), dis.readInt(), + CastSettings.VideoCodec.AUTO)); + } + if (dis.available() > 0) { + settings.setAdjustmentPreset(readEnum(CastSettings.AdjustmentPreset.values(), dis.readInt(), + CastSettings.AdjustmentPreset.AUTO)); + } + if (dis.available() > 0) { + settings.setBitrateMode(readEnum(CastSettings.BitrateMode.values(), dis.readInt(), + CastSettings.BitrateMode.AUTO)); + } + if (dis.available() > 0) { + settings.setNetworkAdoption(readEnum(CastSettings.NetworkAdoption.values(), dis.readInt(), + CastSettings.NetworkAdoption.AUTO)); + } + if (dis.available() > 0) { + settings.setCaptureMode(readEnum(CastSettings.CaptureMode.values(), dis.readInt(), + CastSettings.CaptureMode.FULL_SCREEN)); + } + if (dis.available() > 0) { + settings.setStreamProtection(readEnum(CastSettings.StreamProtection.values(), dis.readInt(), + CastSettings.StreamProtection.NONE)); + } + if (dis.available() > 0) { + settings.setReceiverDisplayResolution( + readEnum(CastSettings.ReceiverDisplayResolution.values(), dis.readInt(), + CastSettings.ReceiverDisplayResolution.AUTO_FIT)); + } + if (dis.available() > 0) { + settings.setAudioCodec(readEnum(CastSettings.AudioCodec.values(), dis.readInt(), + CastSettings.AudioCodec.AUTO)); + } + } else { + dis.reset(); + settings.setTransport(dis.readUTF()); + settings.setQuality(readEnum(CastSettings.Quality.values(), dis.readInt(), CastSettings.Quality.MEDIUM)); + settings.setResolution(readEnum(CastSettings.Resolution.values(), dis.readInt(), + CastSettings.Resolution.HD_720P)); + settings.setAudioEnabled(dis.readByte() != 0); + } + return settings; + } + + private static > T readEnum(T[] values, int ordinal, T fallback) { + if (ordinal >= 0 && ordinal < values.length) { + return values[ordinal]; + } + return fallback; + } + + public static byte[] codecCapsPayload(java.util.List mimeTypes) throws IOException { + java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + dos.writeInt(mimeTypes != null ? mimeTypes.size() : 0); + if (mimeTypes != null) { + for (String mime : mimeTypes) { + dos.writeUTF(mime); + } + } + dos.flush(); + return bos.toByteArray(); + } + + public static java.util.List parseCodecCaps(byte[] payload) throws IOException { + DataInputStream dis = new DataInputStream(new java.io.ByteArrayInputStream(payload)); + int n = dis.readInt(); + java.util.List list = new java.util.ArrayList<>(Math.max(0, n)); + for (int i = 0; i < n; i++) { + list.add(dis.readUTF()); + } + return list; + } + + public static byte[] codecSelectedPayload(String mime) throws IOException { + java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + dos.writeUTF(mime != null ? mime : MediaFormat.MIMETYPE_VIDEO_AVC); + dos.flush(); + return bos.toByteArray(); + } + + public static String parseCodecSelected(byte[] payload) throws IOException { + DataInputStream dis = new DataInputStream(new java.io.ByteArrayInputStream(payload)); + return dis.readUTF(); + } + + public static byte[] streamConfigPayload(int width, int height, byte[] csd0, byte[] csd1) throws IOException { + java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + dos.writeInt(width); + dos.writeInt(height); + writeBytes(dos, csd0); + writeBytes(dos, csd1); + dos.flush(); + return bos.toByteArray(); + } + + public static byte[] audioConfigPayload(int sampleRate, int channels, byte[] csd0) throws IOException { + java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + dos.writeInt(sampleRate); + dos.writeInt(channels); + writeBytes(dos, csd0); + dos.flush(); + return bos.toByteArray(); + } + + public static byte[] videoFramePayload(long ptsUs, boolean keyFrame, byte[] data) throws IOException { + java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + dos.writeLong(ptsUs); + dos.writeByte(keyFrame ? 1 : 0); + writeBytes(dos, data); + dos.flush(); + return bos.toByteArray(); + } + + public static byte[] audioFramePayload(long ptsUs, byte[] data) throws IOException { + java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + dos.writeLong(ptsUs); + writeBytes(dos, data); + dos.flush(); + return bos.toByteArray(); + } + + public static StreamConfig parseStreamConfig(byte[] payload) throws IOException { + DataInputStream dis = new DataInputStream(new java.io.ByteArrayInputStream(payload)); + int width = dis.readInt(); + int height = dis.readInt(); + byte[] csd0 = readBytes(dis); + byte[] csd1 = readBytes(dis); + return new StreamConfig(width, height, csd0, csd1); + } + + public static AudioConfig parseAudioConfig(byte[] payload) throws IOException { + DataInputStream dis = new DataInputStream(new java.io.ByteArrayInputStream(payload)); + int sampleRate = dis.readInt(); + int channels = dis.readInt(); + byte[] csd0 = readBytes(dis); + return new AudioConfig(sampleRate, channels, csd0); + } + + public static VideoFrame parseVideoFrame(byte[] payload) throws IOException { + DataInputStream dis = new DataInputStream(new java.io.ByteArrayInputStream(payload)); + long ptsUs = dis.readLong(); + boolean keyFrame = dis.readByte() != 0; + byte[] data = readBytes(dis); + return new VideoFrame(ptsUs, keyFrame, data); + } + + public static AudioFrame parseAudioFrame(byte[] payload) throws IOException { + DataInputStream dis = new DataInputStream(new java.io.ByteArrayInputStream(payload)); + long ptsUs = dis.readLong(); + byte[] data = readBytes(dis); + return new AudioFrame(ptsUs, data); + } + + public static String payloadAsUtf8(byte[] payload) { + return new String(payload, StandardCharsets.UTF_8); + } + + public static boolean pinMatches(byte[] authHashUtf8, String pin) { + String expected = sha256(pin); + String received = new String(authHashUtf8, StandardCharsets.UTF_8); + return expected.equals(received); + } + + public static boolean transportMatches(CastSettings local, CastSettings remote) { + return local.getTransport().equals(remote.getTransport()); + } + + private static final byte NETWORK_STATS_VERSION = 5; + + public static byte[] networkStatsPayload(NetworkStatsSnapshot s) throws IOException { + java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + dos.writeLong(s.sequence); + dos.writeLong(s.timestampMs); + dos.writeInt(s.rttMs); + dos.writeFloat(s.lossRatio); + dos.writeInt(s.sendBitrateKbps); + dos.writeInt(s.recvBitrateKbps); + dos.writeInt(s.congestionLevel); + dos.writeInt(s.jitterMs); + dos.writeByte(NETWORK_STATS_VERSION); + dos.writeFloat(s.encodeFps); + dos.writeInt(s.encodeQueueDepth); + dos.writeInt(s.droppedPFrames); + dos.writeByte(s.audioActive ? 1 : 0); + dos.writeLong(s.audioFramesSent); + dos.writeInt(s.suggestedBitrateKbps); + dos.writeInt(s.targetBitrateKbps); + if (NETWORK_STATS_VERSION >= 3) { + dos.writeByte(Math.max(0, Math.min(100, s.audioCaptureVuPercent))); + dos.writeLong(s.audioCaptureSilentBlocks); + dos.writeLong(s.audioCaptureAudibleBlocks); + dos.writeFloat(s.audioCapturePeakDb); + dos.writeFloat(s.audioCaptureRmsDb); + } + if (NETWORK_STATS_VERSION >= 4) { + dos.writeLong(s.udpDatagramsRx); + dos.writeLong(s.udpDatagramsTx); + dos.writeLong(s.udpDatagramsInvalid); + dos.writeLong(s.udpFragmentsRx); + dos.writeLong(s.udpFragmentsDuplicate); + dos.writeLong(s.udpReassemblyOk); + dos.writeLong(s.udpReassemblyLost); + dos.writeLong(s.udpWireDropped); + dos.writeLong(s.udpMalformed); + dos.writeInt(s.droppedAudioFrames); + dos.writeLong(s.recvVideoPackets); + dos.writeLong(s.recvAudioPackets); + dos.writeLong(s.recvVideoSkippedKey); + dos.writeLong(s.recvVideoDecodeErrors); + dos.writeLong(s.recvAudioDecodeErrors); + dos.writeLong(s.recvAudioQueueDrops); + dos.writeLong(s.recvDamagedVideoFrames); + dos.writeUTF(s.protectionMode != null ? s.protectionMode : "NONE"); + dos.writeLong(s.fecStubPackets); + dos.writeLong(s.nackStubRequests); + } + if (NETWORK_STATS_VERSION >= 5) { + dos.writeLong(s.fecPacketsDecoded); + dos.writeLong(s.fecDecodeFailures); + } + dos.flush(); + return bos.toByteArray(); + } + + public static NetworkStatsSnapshot parseNetworkStats(byte[] payload) throws IOException { + DataInputStream dis = new DataInputStream(new java.io.ByteArrayInputStream(payload)); + NetworkStatsSnapshot s = new NetworkStatsSnapshot(); + s.sequence = dis.readLong(); + s.timestampMs = dis.readLong(); + s.rttMs = dis.readInt(); + s.lossRatio = dis.readFloat(); + s.sendBitrateKbps = dis.readInt(); + s.recvBitrateKbps = dis.readInt(); + s.congestionLevel = dis.readInt(); + s.jitterMs = dis.readInt(); + if (dis.available() > 0) { + byte ver = dis.readByte(); + if (ver >= 2) { + s.encodeFps = dis.readFloat(); + s.encodeQueueDepth = dis.readInt(); + s.droppedPFrames = dis.readInt(); + s.audioActive = dis.readByte() != 0; + s.audioFramesSent = dis.readLong(); + s.suggestedBitrateKbps = dis.readInt(); + s.targetBitrateKbps = dis.readInt(); + if (ver >= 3 && dis.available() > 0) { + s.audioCaptureVuPercent = dis.readByte() & 0xff; + s.audioCaptureSilentBlocks = dis.readLong(); + s.audioCaptureAudibleBlocks = dis.readLong(); + s.audioCapturePeakDb = dis.readFloat(); + s.audioCaptureRmsDb = dis.readFloat(); + } + if (ver >= 4 && dis.available() > 0) { + s.udpDatagramsRx = dis.readLong(); + s.udpDatagramsTx = dis.readLong(); + s.udpDatagramsInvalid = dis.readLong(); + s.udpFragmentsRx = dis.readLong(); + s.udpFragmentsDuplicate = dis.readLong(); + s.udpReassemblyOk = dis.readLong(); + s.udpReassemblyLost = dis.readLong(); + s.udpWireDropped = dis.readLong(); + s.udpMalformed = dis.readLong(); + s.droppedAudioFrames = dis.readInt(); + s.recvVideoPackets = dis.readLong(); + s.recvAudioPackets = dis.readLong(); + s.recvVideoSkippedKey = dis.readLong(); + s.recvVideoDecodeErrors = dis.readLong(); + s.recvAudioDecodeErrors = dis.readLong(); + s.recvAudioQueueDrops = dis.readLong(); + s.recvDamagedVideoFrames = dis.readLong(); + s.protectionMode = dis.readUTF(); + s.fecStubPackets = dis.readLong(); + s.nackStubRequests = dis.readLong(); + } + if (ver >= 5 && dis.available() > 0) { + s.fecPacketsDecoded = dis.readLong(); + s.fecDecodeFailures = dis.readLong(); + } + } + } + return s; + } + + public static byte[] networkControlPayload(NetworkControlAdvice advice) throws IOException { + java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + dos.writeInt(advice.suggestedBitrateKbps); + dos.writeUTF(advice.suggestedTransport != null ? advice.suggestedTransport : CastConfig.DEFAULT_TRANSPORT); + dos.writeByte(advice.switchTransport ? 1 : 0); + dos.writeInt(advice.congestionLevel); + dos.flush(); + return bos.toByteArray(); + } + + public static NetworkControl parseNetworkControl(byte[] payload) throws IOException { + DataInputStream dis = new DataInputStream(new java.io.ByteArrayInputStream(payload)); + NetworkControl c = new NetworkControl(); + c.suggestedBitrateKbps = dis.readInt(); + c.suggestedTransport = dis.readUTF(); + c.switchTransport = dis.readByte() != 0; + c.congestionLevel = dis.readInt(); + return c; + } + + public static byte[] diagPingPayload(CastDiagPing.Packet packet) throws IOException { + return CastDiagPing.encode(packet); + } + + public static CastDiagPing.Packet parseDiagPing(byte[] payload) throws IOException { + return CastDiagPing.decode(payload); + } + + public static byte[] audioConsentPayload(boolean accept) { + return new byte[]{(byte) (accept ? 1 : 0)}; + } + + public static boolean parseAudioConsent(byte[] payload) { + return payload != null && payload.length > 0 && payload[0] != 0; + } + + private static void writeBytes(DataOutputStream dos, byte[] data) throws IOException { + if (data == null) { + dos.writeInt(0); + return; + } + dos.writeInt(data.length); + if (data.length > 0) { + dos.write(data); + } + } + + private static byte[] readBytes(DataInputStream dis) throws IOException { + int len = dis.readInt(); + if (len == 0) { + return new byte[0]; + } + if (len < 0 || len > 2 * 1024 * 1024) { + throw new IOException("Invalid blob length: " + len); + } + byte[] buf = new byte[len]; + dis.readFully(buf); + return buf; + } + + private static String sha256(String input) { + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] hash = md.digest(input.getBytes(StandardCharsets.UTF_8)); + StringBuilder sb = new StringBuilder(); + for (byte b : hash) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } catch (NoSuchAlgorithmException e) { + throw new IllegalStateException(e); + } + } + + public static final class Message { + public final byte type; + public final byte[] payload; + + public Message(byte type, byte[] payload) { + this.type = type; + this.payload = payload; + } + } + + public static final class StreamConfig { + public final int width; + public final int height; + public final byte[] csd0; + public final byte[] csd1; + + public StreamConfig(int width, int height, byte[] csd0, byte[] csd1) { + this.width = width; + this.height = height; + this.csd0 = csd0; + this.csd1 = csd1; + } + } + + public static final class AudioConfig { + public final int sampleRate; + public final int channels; + public final byte[] csd0; + + public AudioConfig(int sampleRate, int channels, byte[] csd0) { + this.sampleRate = sampleRate; + this.channels = channels; + this.csd0 = csd0; + } + } + + public static final class VideoFrame { + public final long ptsUs; + public final boolean keyFrame; + public final byte[] data; + + public VideoFrame(long ptsUs, boolean keyFrame, byte[] data) { + this.ptsUs = ptsUs; + this.keyFrame = keyFrame; + this.data = data; + } + } + + public static final class AudioFrame { + public final long ptsUs; + public final byte[] data; + + public AudioFrame(long ptsUs, byte[] data) { + this.ptsUs = ptsUs; + this.data = data; + } + } + + public static final class NetworkControl { + public int suggestedBitrateKbps; + public String suggestedTransport; + public boolean switchTransport; + public int congestionLevel; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/CastSession.java b/app/src/main/java/com/foxx/androidcast/network/CastSession.java new file mode 100644 index 0000000..ecb77f9 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/CastSession.java @@ -0,0 +1,211 @@ +package com.foxx.androidcast.network; + +/********************************************************************* + * CastSession.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastSession + * Contributors: + * - Anton Afanasyeu (9 commits, 207 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 dbf1f38a83f982eeae65310c6c91e22b86fcee043fdee0b33260a400e8331025 +**********************************************************************/ +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.media.CodecNegotiator; +import com.foxx.androidcast.media.CodecPriorityCatalog; +import com.foxx.androidcast.media.codec.PassthroughCodecPolicy; +import com.foxx.androidcast.sender.CodecCatalog; +import com.foxx.androidcast.stats.SessionStatsContext; + +import java.io.IOException; +import java.util.List; + +/** Auth handshake and message I/O over a {@link CastTransport}. */ +public class CastSession { + public static final class HandshakeResult { + public final String senderName; + /** Sender cast settings from handshake. */ + public final CastSettings settings; + /** Receiver advertisement ({@code AUTO} = auto-detected FEC capability). */ + public final CastSettings receiverAdvertisement; + public final String negotiatedVideoMime; + + public HandshakeResult(String senderName, CastSettings settings, + CastSettings receiverAdvertisement, String negotiatedVideoMime) { + this.senderName = senderName; + this.settings = settings; + this.receiverAdvertisement = receiverAdvertisement; + this.negotiatedVideoMime = negotiatedVideoMime; + } + } + + private final CastTransport transport; + + public CastSession(CastTransport transport) { + this.transport = transport; + } + + public CastTransport getTransport() { + return transport; + } + + public void listen(int port) throws IOException { + transport.listen(port); + } + + public void prepareListen(int port) throws IOException { + transport.prepareListen(port); + } + + public void acceptClient() throws IOException { + transport.acceptClient(); + } + + public void connect(String host, int port) throws IOException { + transport.connect(host, port); + } + + public HandshakeResult clientHandshake(String deviceName, String pin, CastSettings settings) throws IOException { + byte[] hello = CastProtocol.helloPayload(deviceName); + transport.send(CastProtocol.MSG_HELLO, hello); + recordOutbound(CastProtocol.MSG_HELLO, hello); + byte[] auth = CastProtocol.authPayload(pin); + transport.send(CastProtocol.MSG_AUTH, auth); + recordOutbound(CastProtocol.MSG_AUTH, auth); + CastProtocol.Message reply = receive(10_000); + if (reply == null || reply.type != CastProtocol.MSG_AUTH_OK) { + throw new IOException("Authentication failed"); + } + byte[] castSettings = CastProtocol.castSettingsPayload(settings); + transport.send(CastProtocol.MSG_CAST_SETTINGS, castSettings); + recordOutbound(CastProtocol.MSG_CAST_SETTINGS, castSettings); + byte[] codecCaps = CastProtocol.codecCapsPayload(CodecCatalog.localEncoderMimes()); + transport.send(CastProtocol.MSG_CODEC_CAPS, codecCaps); + recordOutbound(CastProtocol.MSG_CODEC_CAPS, codecCaps); + + String negotiated = null; + CastSettings receiverAdvertisement = null; + long deadline = System.currentTimeMillis() + 15_000; + while (System.currentTimeMillis() < deadline) { + CastProtocol.Message msg = receive(2_000); + if (msg == null) { + continue; + } + if (msg.type == CastProtocol.MSG_RECEIVER_CAST_SETTINGS) { + receiverAdvertisement = CastProtocol.parseCastSettings(msg.payload); + } else if (msg.type == CastProtocol.MSG_CODEC_SELECTED) { + negotiated = CastProtocol.parseCodecSelected(msg.payload); + break; + } + } + if (negotiated == null) { + throw new IOException("Codec negotiation timeout"); + } + settings.setNegotiatedVideoMime(negotiated); + CodecPriorityCatalog.logReceivedCodec("sender", negotiated, settings); + return new HandshakeResult(deviceName, settings, receiverAdvertisement, negotiated); + } + + public HandshakeResult serverHandshake(String expectedPin, CastSettings localSettings) throws IOException { + String senderName = "Sender"; + boolean authed = false; + CastSettings remote = null; + List senderCaps = null; + long deadline = System.currentTimeMillis() + 30_000; + while (System.currentTimeMillis() < deadline) { + CastProtocol.Message msg = receive(2_000); + if (msg == null) { + continue; + } + switch (msg.type) { + case CastProtocol.MSG_HELLO: + senderName = CastProtocol.payloadAsUtf8(msg.payload); + break; + case CastProtocol.MSG_AUTH: + if (CastProtocol.pinMatches(msg.payload, expectedPin)) { + authed = true; + transport.send(CastProtocol.MSG_AUTH_OK, new byte[0]); + recordOutbound(CastProtocol.MSG_AUTH_OK, new byte[0]); + } else { + transport.send(CastProtocol.MSG_AUTH_FAIL, new byte[0]); + recordOutbound(CastProtocol.MSG_AUTH_FAIL, new byte[0]); + throw new IOException("Bad PIN"); + } + break; + case CastProtocol.MSG_CAST_SETTINGS: + remote = CastProtocol.parseCastSettings(msg.payload); + if (!CastProtocol.transportMatches(localSettings, remote)) { + throw new IOException("Transport mismatch: receiver=" + + localSettings.getTransport() + " sender=" + remote.getTransport()); + } + break; + case CastProtocol.MSG_CODEC_CAPS: + senderCaps = CastProtocol.parseCodecCaps(msg.payload); + break; + default: + break; + } + if (authed && remote != null && senderCaps != null) { + CastSettings receiverAdvert = new CastSettings(); + receiverAdvert.copyFrom(localSettings); + receiverAdvert.setStreamProtection( + com.foxx.androidcast.network.transport.StreamProtectionCapability + .handshakeAdvertisement()); + byte[] recvSettings = CastProtocol.castSettingsPayload(receiverAdvert); + transport.send(CastProtocol.MSG_RECEIVER_CAST_SETTINGS, recvSettings); + recordOutbound(CastProtocol.MSG_RECEIVER_CAST_SETTINGS, recvSettings); + List receiverCaps = CodecCatalog.localDecoderMimes(); + byte[] recvCaps = CastProtocol.codecCapsPayload(receiverCaps); + transport.send(CastProtocol.MSG_CODEC_CAPS, recvCaps); + recordOutbound(CastProtocol.MSG_CODEC_CAPS, recvCaps); + String mime = CodecNegotiator.negotiate(senderCaps, receiverCaps, + PassthroughCodecPolicy.forNegotiation(remote.getVideoCodec()), remote, "receiver"); + byte[] selected = CastProtocol.codecSelectedPayload(mime); + transport.send(CastProtocol.MSG_CODEC_SELECTED, selected); + recordOutbound(CastProtocol.MSG_CODEC_SELECTED, selected); + remote.setNegotiatedVideoMime(mime); + return new HandshakeResult(senderName, remote, receiverAdvert, mime); + } + } + throw new IOException("Handshake timeout"); + } + + public void send(byte type, byte[] payload) throws IOException { + transport.send(type, payload); + } + + private static void recordOutbound(byte type, byte[] payload) { + int size = payload != null ? payload.length : 0; + SessionStatsContext.recordOutboundMessage(type, false, size); + } + + private static void recordInbound(CastProtocol.Message msg) { + if (msg == null) { + return; + } + boolean keyFrame = false; + if (msg.type == CastProtocol.MSG_VIDEO_FRAME) { + try { + keyFrame = CastProtocol.parseVideoFrame(msg.payload).keyFrame; + } catch (IOException ignored) { + } + } + int size = msg.payload != null ? msg.payload.length : 0; + SessionStatsContext.recordInboundMessage(msg.type, keyFrame, size); + } + + public CastProtocol.Message receive(int timeoutMs) throws IOException { + CastProtocol.Message msg = transport.receive(timeoutMs); + recordInbound(msg); + return msg; + } + + public void releaseConnection() { + transport.releaseConnection(); + } + + public void close() { + transport.close(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/CastSessionGate.java b/app/src/main/java/com/foxx/androidcast/network/CastSessionGate.java new file mode 100644 index 0000000..a097052 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/CastSessionGate.java @@ -0,0 +1,48 @@ +package com.foxx.androidcast.network; + +/********************************************************************* + * CastSessionGate.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastSessionGate + * Contributors: + * - Anton Afanasyeu (2 commits, 44 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 bffde4e7930b8ad589c9e66476fddf21a5235667811c9379979fba5bac48db5e +**********************************************************************/ +/** + * Binds to the first non-zero session id on a connection and drops stale packets from other casts. + */ +public final class CastSessionGate { + private static final int UNBOUND = Integer.MIN_VALUE; + + private int boundSessionId = UNBOUND; + + public boolean accept(CastProtoHeader header) { + if (header == null) { + return true; + } + int sid = header.sessionId; + if (sid == 0) { + return true; + } + if (boundSessionId == UNBOUND) { + boundSessionId = sid; + return true; + } + return boundSessionId == sid; + } + + public void reset() { + boundSessionId = UNBOUND; + } + + public boolean isBound() { + return boundSessionId != UNBOUND; + } + + public int getBoundSessionId() { + return boundSessionId == UNBOUND ? 0 : boundSessionId; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/CastTransport.java b/app/src/main/java/com/foxx/androidcast/network/CastTransport.java new file mode 100644 index 0000000..4461113 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/CastTransport.java @@ -0,0 +1,59 @@ +package com.foxx.androidcast.network; + +/********************************************************************* + * CastTransport.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * interface CastTransport + * Contributors: + * - Anton Afanasyeu (5 commits, 55 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 cacc0f092505305b2c75a7a0479a1c837a39a05de5ace51d17267d54116262be +**********************************************************************/ +import com.foxx.androidcast.network.transport.TransportLossStats; + +import java.io.Closeable; +import java.io.IOException; + +/** Pluggable stream transport (TCP or UDP). */ +public interface CastTransport extends Closeable { + /** Optional proto header context; ignored when null. */ + default void setFramingContext(CastFramingContext context) {} + + /** Drops inbound wire packets whose session id does not match the active cast. */ + default void setInboundSessionGate(CastSessionGate gate) {} + /** Server: bind and wait for first peer datagram / connection. */ + void listen(int port) throws IOException; + + /** Server: bind listen socket only (port open for inbound TCP). */ + default void prepareListen(int port) throws IOException { + listen(port); + } + + /** Server: block until a client connects (TCP) or no-op (UDP). */ + default void acceptClient() throws IOException {} + + /** Client: connect to host:port. */ + void connect(String host, int port) throws IOException; + + void send(byte type, byte[] payload) throws IOException; + + /** Blocks until a message arrives or timeout. Returns null on timeout. */ + CastProtocol.Message receive(int timeoutMs) throws IOException; + + String getModeLabel(); + + /** Loss/damage counters when supported (UDP); empty stats otherwise. */ + default TransportLossStats getLossStats() { + return new TransportLossStats(); + } + + /** Server: drop the active client socket but keep the listen socket bound. */ + default void releaseConnection() { + close(); + } + + @Override + void close(); +} diff --git a/app/src/main/java/com/foxx/androidcast/network/CastTransportFactory.java b/app/src/main/java/com/foxx/androidcast/network/CastTransportFactory.java new file mode 100644 index 0000000..a04324a --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/CastTransportFactory.java @@ -0,0 +1,98 @@ +package com.foxx.androidcast.network; + +/********************************************************************* + * CastTransportFactory.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastTransportFactory + * Contributors: + * - Anton Afanasyeu (6 commits, 90 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 87367475c8479ef541f606f782c652a202bedddca55a3275516a147205542471 +**********************************************************************/ +import android.content.Context; + +import com.foxx.androidcast.CastConfig; +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.network.quic.QuicCronetCastTransport; +import com.foxx.androidcast.network.usb.UsbTetherTransportFactory; +import com.foxx.androidcast.network.webrtc.WebRtcTransportFactory; + +import java.io.IOException; + +public final class CastTransportFactory { + private static Context appContext; + + private CastTransportFactory() {} + + public static void init(Context context) { + appContext = context.getApplicationContext(); + } + + public static CastTransport create(CastSettings settings) throws IOException { + String mode = settings.getTransport(); + if (CastConfig.TRANSPORT_QUIC.equals(mode)) { + if (appContext == null) { + throw new IOException("CastTransportFactory.init(context) required for QUIC"); + } + QuicCronetCastTransport quic = new QuicCronetCastTransport(appContext); + applyUdpProtectionDeferred(quic.getUdpTransport()); + return quic; + } + if (WebRtcTransportFactory.isTransportId(mode)) { + return WebRtcTransportFactory.create(); + } + if (UsbTetherTransportFactory.isTransportId(mode)) { + return UsbTetherTransportFactory.create(); + } + if (CastConfig.TRANSPORT_UDP.equals(mode)) { + UdpCastTransport udp = new UdpCastTransport(); + applyUdpProtectionDeferred(udp); + return udp; + } + return new TcpCastTransport(); + } + + private static void applyUdpProtection(UdpCastTransport udp, CastSettings settings) { + if (udp == null) { + return; + } + udp.setProtectionEngine(com.foxx.androidcast.network.transport.StreamProtectionEngine.noop()); + if (settings == null || !CastConfig.TRANSPORT_UDP.equals(settings.getTransport())) { + return; + } + udp.applyStreamProtection(settings); + } + + /** UDP transports start with protection off until {@link #applyNegotiatedUdpProtection}. */ + public static void applyUdpProtectionDeferred(UdpCastTransport udp) { + if (udp != null) { + udp.setProtectionEngine(com.foxx.androidcast.network.transport.StreamProtectionEngine.noop()); + } + } + + /** + * Apply protection after handshake using negotiated local/remote preferences. + * + * @param localIsReceiver true when {@code local} is the receiver's capability from settings. + * @return negotiation details (prompts, agreed mode) for UI/logging. + */ + public static com.foxx.androidcast.network.transport.StreamProtectionNegotiation applyNegotiatedUdpProtection( + UdpCastTransport udp, CastSettings local, CastSettings remote, boolean localIsReceiver) { + if (udp == null || local == null) { + return com.foxx.androidcast.network.transport.StreamProtectionNegotiation.none(); + } + com.foxx.androidcast.network.transport.StreamProtectionNegotiation negotiated = + com.foxx.androidcast.network.transport.StreamProtectionNegotiator.negotiate( + local.getStreamProtection(), + remote != null ? remote.getStreamProtection() : null, + localIsReceiver); + CastSettings effective = new CastSettings(); + effective.copyFrom(local); + effective.setStreamProtection(negotiated.agreed); + udp.setProtectionEngine(com.foxx.androidcast.network.transport.StreamProtectionFactory.create( + negotiated.agreed, udp.getLossStats(), negotiated.nackEnabled)); + return negotiated; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/TcpCastTransport.java b/app/src/main/java/com/foxx/androidcast/network/TcpCastTransport.java new file mode 100644 index 0000000..a4c56b4 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/TcpCastTransport.java @@ -0,0 +1,292 @@ +package com.foxx.androidcast.network; + +/********************************************************************* + * TcpCastTransport.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class TcpCastTransport + * Contributors: + * - Anton Afanasyeu (7 commits, 288 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 770c47dffaaba48aaf909248ab441601a93ae94870e55d577486fd388cd07966 +**********************************************************************/ +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketTimeoutException; + +/** Reliable message transport over TCP (serialized send/receive). */ +public class TcpCastTransport implements CastTransport { + private static final int CONNECT_TIMEOUT_MS = 10_000; + private static final int LEGACY_HEADER_BYTES = 5; + + private final Object sendLock = new Object(); + private CastFramingContext framingContext; + private CastSessionGate inboundSessionGate; + private final Object receiveLock = new Object(); + + private ServerSocket serverSocket; + private Socket socket; + private BufferedInputStream bufferedIn; + private DataInputStream in; + private DataOutputStream out; + + /** True once {@link #listen} has bound the server socket (port is accepting connections). */ + public boolean isListening() { + return serverSocket != null && !serverSocket.isClosed(); + } + + @Override + public void prepareListen(int port) throws IOException { + ensureServerSocket(port); + } + + @Override + public void acceptClient() throws IOException { + acceptClientConnection(); + } + + @Override + public void listen(int port) throws IOException { + prepareListen(port); + acceptClient(); + } + + private void ensureServerSocket(int port) throws IOException { + if (serverSocket != null && !serverSocket.isClosed()) { + return; + } + serverSocket = new ServerSocket(); + serverSocket.setReuseAddress(true); + serverSocket.bind(new InetSocketAddress(InetAddress.getByName("0.0.0.0"), port)); + } + + private void acceptClientConnection() throws IOException { + releaseConnection(); + socket = serverSocket.accept(); + socket.setTcpNoDelay(true); + openStreams(); + } + + @Override + public void connect(String host, int port) throws IOException { + InetAddress address = InetAddress.getByName(host); + socket = new Socket(); + socket.setTcpNoDelay(true); + socket.connect(new InetSocketAddress(address, port), CONNECT_TIMEOUT_MS); + openStreams(); + } + + private void openStreams() throws IOException { + bufferedIn = new BufferedInputStream(socket.getInputStream(), 256 * 1024); + in = new DataInputStream(bufferedIn); + out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream())); + } + + @Override + public void setFramingContext(CastFramingContext context) { + this.framingContext = context; + } + + @Override + public void setInboundSessionGate(CastSessionGate gate) { + this.inboundSessionGate = gate; + } + + @Override + public void send(byte type, byte[] payload) throws IOException { + synchronized (sendLock) { + if (socket == null || socket.isClosed() || out == null) { + throw new IOException("Socket closed"); + } + if (framingContext != null) { + CastProtoHeader hdr = framingContext.newHeader(CastProtoHeader.HS_DEFAULT); + byte[] wire = CastPacketFramer.frame(hdr, type, payload); + out.write(wire); + out.flush(); + } else { + CastProtocol.writeMessage(out, type, payload); + } + } + } + + /** + * Waits up to {@code timeoutMs} for data, then reads one full message without a socket read timeout. + * Avoids partial reads that desync the stream (root cause of "Invalid payload length" garbage). + */ + @Override + public CastProtocol.Message receive(int timeoutMs) throws IOException { + synchronized (receiveLock) { + if (socket == null || socket.isClosed() || in == null) { + return null; + } + if (timeoutMs > 0 && !waitForHeader(timeoutMs)) { + return null; + } + try { + socket.setSoTimeout(0); + if (framingContext != null) { + return readFramedMessage(); + } + return CastProtocol.readMessage(in); + } catch (SocketTimeoutException e) { + return null; + } catch (java.io.EOFException e) { + return null; + } catch (java.net.SocketException e) { + if ("Connection reset".equals(e.getMessage()) || "Socket closed".equals(e.getMessage())) { + return null; + } + throw e; + } + } + } + + private CastProtocol.Message readFramedMessage() throws IOException { + if (inboundSessionGate == null) { + return CastPacketFramer.readFramedMessage(bufferedIn); + } + byte[] magicBuf = readFully(bufferedIn, 4); + if (magicBuf == null) { + return null; + } + int magic = (magicBuf[0] & 0xff) | ((magicBuf[1] & 0xff) << 8) + | ((magicBuf[2] & 0xff) << 16) | ((magicBuf[3] & 0xff) << 24); + if (magic != CastProtoHeader.MAGIC) { + throw new IOException("Bad magic on wire: 0x" + Integer.toHexString(magic)); + } + byte[] restHdr = readFully(bufferedIn, CastProtoHeader.HEADER_SIZE_V1 - 4); + if (restHdr == null) { + return null; + } + byte[] headerBytes = new byte[CastProtoHeader.HEADER_SIZE_V1]; + System.arraycopy(magicBuf, 0, headerBytes, 0, 4); + System.arraycopy(restHdr, 0, headerBytes, 4, restHdr.length); + CastProtoHeader hdr = CastProtoHeader.decode(headerBytes, 0, headerBytes.length); + if (!hdr.verifyChecksum()) { + throw new IOException("Header checksum mismatch"); + } + if (!inboundSessionGate.accept(hdr)) { + skipMessageBody(in); + return null; + } + byte type = (byte) in.read(); + if (type < 0) { + return null; + } + byte[] lenBuf = readFully(bufferedIn, 4); + if (lenBuf == null) { + return null; + } + int len = ((lenBuf[0] & 0xff) << 24) | ((lenBuf[1] & 0xff) << 16) + | ((lenBuf[2] & 0xff) << 8) | (lenBuf[3] & 0xff); + if (len < 0 || len > 4 * 1024 * 1024) { + throw new IOException("Invalid payload length: " + len); + } + byte[] payload = len == 0 ? new byte[0] : readFully(bufferedIn, len); + if (payload == null && len > 0) { + return null; + } + return new CastProtocol.Message(type, payload); + } + + private static void skipMessageBody(DataInputStream in) throws IOException { + byte type = (byte) in.read(); + if (type < 0) { + return; + } + byte[] lenBuf = readFully(in, 4); + if (lenBuf == null) { + return; + } + int len = ((lenBuf[0] & 0xff) << 24) | ((lenBuf[1] & 0xff) << 16) + | ((lenBuf[2] & 0xff) << 8) | (lenBuf[3] & 0xff); + if (len > 0 && len <= 4 * 1024 * 1024) { + in.skipBytes(len); + } + } + + private static byte[] readFully(InputStream in, int n) throws IOException { + byte[] buf = new byte[n]; + int off = 0; + while (off < n) { + int r = in.read(buf, off, n - off); + if (r < 0) { + if (off == 0) { + return null; + } + throw new java.io.EOFException("Short read"); + } + off += r; + } + return buf; + } + + private boolean waitForHeader(int timeoutMs) throws IOException { + int need = framingContext != null ? CastProtoHeader.HEADER_SIZE_V1 : LEGACY_HEADER_BYTES; + long deadline = System.currentTimeMillis() + timeoutMs; + while (System.currentTimeMillis() < deadline) { + if (bufferedIn.available() >= need) { + return true; + } + try { + Thread.sleep(10); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return false; + } + } + return bufferedIn.available() >= need; + } + + @Override + public String getModeLabel() { + return "TCP"; + } + + @Override + public void releaseConnection() { + synchronized (sendLock) { + synchronized (receiveLock) { + closeClientOnly(); + } + } + } + + @Override + public void close() { + synchronized (sendLock) { + synchronized (receiveLock) { + closeClientOnly(); + if (serverSocket != null) { + try { + serverSocket.close(); + } catch (Exception ignored) { + } + serverSocket = null; + } + } + } + } + + private void closeClientOnly() { + try { + if (socket != null) { + socket.close(); + } + } catch (Exception ignored) { + } + socket = null; + bufferedIn = null; + in = null; + out = null; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/UdpCastTransport.java b/app/src/main/java/com/foxx/androidcast/network/UdpCastTransport.java new file mode 100644 index 0000000..941f802 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/UdpCastTransport.java @@ -0,0 +1,607 @@ +package com.foxx.androidcast.network; + +/********************************************************************* + * UdpCastTransport.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class UdpCastTransport + * Contributors: + * - Anton Afanasyeu (9 commits, 603 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 4a5d534472ed2b021d783c8cf74246142994197c4c9c81c829154584fb6e6d9c +**********************************************************************/ +import android.util.Log; + +import com.foxx.androidcast.CastConfig; +import com.foxx.androidcast.network.transport.CombinedProtectionEngine; +import com.foxx.androidcast.network.transport.FecProtectionEngine; +import com.foxx.androidcast.network.transport.NackProtectionEngine; +import com.foxx.androidcast.network.transport.RetransmitCache; +import com.foxx.androidcast.network.transport.StreamProtectionEngine; +import com.foxx.androidcast.network.transport.StreamProtectionCompat; +import com.foxx.androidcast.network.transport.StreamProtectionMode; +import com.foxx.androidcast.network.transport.StreamProtectionScopes; +import com.foxx.androidcast.network.transport.TransportLossStats; +import com.foxx.androidcast.network.transport.TransportStatsProvider; +import com.foxx.androidcast.network.transport.fec.FecEncodedGroup; +import com.foxx.androidcast.network.transport.fec.FecShardWire; +import com.foxx.androidcast.stats.SessionStatsContext; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.SocketException; +import java.net.SocketTimeoutException; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** Best-effort message transport over UDP with fragmentation. */ +public class UdpCastTransport implements CastTransport, TransportStatsProvider { + private static final String TAG = "UdpCastTransport"; + private static final byte[] MAGIC = {'A', 'C', 'U', 'D'}; + /** magic(4) + type(1) + msgId(4) + fragIdx(2) + fragCnt(2) + totalLen(4) */ + private static final int HEADER = 17; + private static final int MAX_RELIABLE_BYTES = 8 * 1024; + + private DatagramSocket socket; + private InetSocketAddress peer; + private int nextMessageId = 1; + private volatile boolean listening; + + private final Map pending = new ConcurrentHashMap<>(); + private final TransportLossStats lossStats = new TransportLossStats(); + private StreamProtectionEngine protectionEngine = StreamProtectionEngine.noop(); + private FecProtectionEngine fecEngine; + private NackProtectionEngine nackEngine; + private final RetransmitCache retransmitCache = new RetransmitCache(); + private CastFramingContext framingContext; + private CastSessionGate inboundSessionGate; + private static final long REASSEMBLY_TIMEOUT_MIN_MS = 3_000; + private static final long REASSEMBLY_TIMEOUT_MAX_MS = 20_000; + /** Large VP9 keyframes need many UDP fragments per FEC shard; allow extra time to collect shards. */ + private static final long FEC_GROUP_TIMEOUT_MS = 12_000; + private static final int REASSEMBLY_LOG_EVERY = 16; + private int reassemblyExpireLogCount; + + public boolean isListening() { + return listening && socket != null && !socket.isClosed(); + } + + @Override + public void prepareListen(int port) throws IOException { + if (isListening()) { + return; + } + openSocket(); + socket.bind(new InetSocketAddress(InetAddress.getByName("0.0.0.0"), port)); + socket.setSoTimeout(500); + listening = true; + } + + @Override + public void listen(int port) throws IOException { + prepareListen(port); + } + + @Override + public void connect(String host, int port) throws IOException { + openSocket(); + peer = new InetSocketAddress(host, port); + socket.setSoTimeout(500); + listening = false; + } + + private void openSocket() throws SocketException { + if (socket != null && !socket.isClosed()) { + return; + } + socket = new DatagramSocket(null); + socket.setReuseAddress(true); + socket.setReceiveBufferSize(2 * 1024 * 1024); + socket.setSendBufferSize(2 * 1024 * 1024); + } + + @Override + public void setFramingContext(CastFramingContext context) { + this.framingContext = context; + } + + @Override + public void setInboundSessionGate(CastSessionGate gate) { + this.inboundSessionGate = gate; + } + + public void applyStreamProtection(com.foxx.androidcast.CastSettings settings) { + StreamProtectionEngine engine = com.foxx.androidcast.network.transport.StreamProtectionFactory + .create(settings != null ? settings.getStreamProtection() : null, lossStats); + setProtectionEngine(engine); + } + + /** Select stream protection engine (FEC / NACK). */ + public void setProtectionEngine(StreamProtectionEngine engine) { + protectionEngine = engine != null ? engine : StreamProtectionEngine.noop(); + fecEngine = FecProtectionEngine.extract(protectionEngine); + nackEngine = extractNackEngine(protectionEngine); + if (nackEngine != null) { + nackEngine.setNackSender(messageId -> sendRaw(CastProtocol.MSG_NACK, + NackProtectionEngine.nackPayload(messageId))); + } + synchronized (lossStats) { + lossStats.protectionMode = protectionEngine.mode(); + } + } + + private static NackProtectionEngine extractNackEngine(StreamProtectionEngine engine) { + if (engine instanceof NackProtectionEngine) { + return (NackProtectionEngine) engine; + } + if (engine instanceof CombinedProtectionEngine) { + return ((CombinedProtectionEngine) engine).nack(); + } + return null; + } + + @Override + public TransportLossStats getLossStats() { + synchronized (lossStats) { + lossStats.publishLegacyCounters(); + return lossStats.copy(); + } + } + + /** Send a low-level UDP control datagram (not FEC-wrapped). */ + public void sendRaw(byte type, byte[] payload) throws IOException { + if (peer == null) { + throw new IOException("UDP peer not set"); + } + byte[] body = payload == null ? new byte[0] : payload; + sendOnce(type, body, false); + } + + void retransmitCached(byte wireType, byte[] body, int messageId) { + try { + sendOnceWithId(wireType, body, false, messageId); + } catch (IOException ignored) { + } + } + + private void handleIncomingNack(int messageId) { + protectionEngine.onNack(messageId); + RetransmitCache.CachedMessage entry = retransmitCache.get(messageId); + if (entry == null) { + synchronized (lossStats) { + lossStats.nackCacheMisses++; + } + if ((++reassemblyExpireLogCount % REASSEMBLY_LOG_EVERY) == 1) { + Log.w(TAG, "NACK cache miss id=" + messageId); + } + return; + } + synchronized (lossStats) { + lossStats.nackRetransmits++; + } + retransmitCached(entry.wireType, entry.body, messageId); + } + + @Override + public void send(byte type, byte[] payload) throws IOException { + if (peer == null) { + throw new IOException("UDP peer not set"); + } + byte[] body; + byte wireType = type; + if (framingContext != null) { + CastProtoHeader hdr = framingContext.newHeader(CastProtoHeader.HS_DEFAULT); + body = CastPacketFramer.frame(hdr, type, payload); + wireType = CastProtocol.MSG_WIRE_PACKET; + } else { + body = payload == null ? new byte[0] : payload; + } + if (fecEngine != null && StreamProtectionScopes.protectsUdpPayload(type)) { + sendFecShardGroup(wireType, body); + return; + } + body = protectionEngine.onOutboundPayload(type, body); + if (body.length <= MAX_RELIABLE_BYTES) { + sendOnce(wireType, body, true); + sendOnce(wireType, body, true); + } else { + sendOnce(wireType, body, true); + } + } + + private void sendFecShardGroup(byte wireType, byte[] payload) throws IOException { + FecEncodedGroup group = fecEngine.encodeGroup(payload); + int baseId = nextMessageId; + nextMessageId += group.totalShards(); + boolean cache = nackEngine != null; + for (int i = 0; i < group.totalShards(); i++) { + byte[] shardWire = fecEngine.encodeShardWire(group, baseId, i); + sendOnceWithId(wireType, shardWire, cache, baseId + i); + if (i + 1 < group.totalShards() && shardWire.length > 8_000) { + paceBetweenLargeShards(); + } + } + } + + private static void paceBetweenLargeShards() { + try { + Thread.sleep(2); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + private void sendOnce(byte type, byte[] body, boolean cacheForNack) throws IOException { + sendOnceWithId(type, body, cacheForNack, nextMessageId++); + } + + private void sendOnceWithId(byte type, byte[] body, boolean cacheForNack, int messageId) + throws IOException { + if (cacheForNack) { + retransmitCache.put(messageId, type, body); + } + int chunkSize = CastConfig.UDP_CHUNK_SIZE - HEADER; + int fragments = Math.max(1, (body.length + chunkSize - 1) / chunkSize); + boolean paceFragments = fragments > 24; + for (int i = 0; i < fragments; i++) { + int offset = i * chunkSize; + int len = Math.min(chunkSize, body.length - offset); + byte[] packet = buildPacket(type, messageId, i, fragments, body, offset, len, body.length); + DatagramPacket dp = new DatagramPacket(packet, packet.length, peer); + socket.send(dp); + SessionStatsContext.onDatagramSent(packet.length); + synchronized (lossStats) { + lossStats.datagramsSent++; + } + if (paceFragments && i + 1 < fragments && (i & 7) == 7) { + paceBetweenLargeShards(); + } + } + } + + @Override + public CastProtocol.Message receive(int timeoutMs) throws IOException { + if (socket == null || socket.isClosed()) { + return null; + } + long deadline = System.currentTimeMillis() + timeoutMs; + while (System.currentTimeMillis() < deadline) { + expireStaleReassembly(); + expireStaleFecGroups(); + int remaining = (int) Math.max(1, deadline - System.currentTimeMillis()); + socket.setSoTimeout(remaining); + try { + byte[] buf = new byte[CastConfig.UDP_CHUNK_SIZE + 64]; + DatagramPacket dp = new DatagramPacket(buf, buf.length); + socket.receive(dp); + SessionStatsContext.onDatagramReceived(dp.getLength()); + synchronized (lossStats) { + lossStats.datagramsReceived++; + } + if (peer == null) { + peer = new InetSocketAddress(dp.getAddress(), dp.getPort()); + } + CastProtocol.Message msg = parsePacket(dp.getData(), dp.getLength()); + if (msg != null) { + return msg; + } + } catch (SocketTimeoutException ignored) { + } + } + return null; + } + + private void expireStaleFecGroups() { + if (fecEngine == null || nackEngine == null) { + if (fecEngine != null) { + fecEngine.expireStaleGroups(FEC_GROUP_TIMEOUT_MS, null); + } + return; + } + fecEngine.expireStaleGroups(FEC_GROUP_TIMEOUT_MS, nackEngine::requestNack); + } + + private void expireStaleReassembly() { + long now = System.currentTimeMillis(); + for (Map.Entry e : pending.entrySet()) { + Reassembly r = e.getValue(); + if (r != null && now > r.deadlineMs) { + pending.remove(e.getKey()); + synchronized (lossStats) { + lossStats.reassemblyIncomplete++; + } + maybeLogReassemblyExpired(e.getKey(), r); + int messageId = e.getKey(); + if (nackEngine != null) { + nackEngine.requestNack(messageId); + } else if ((++reassemblyExpireLogCount % REASSEMBLY_LOG_EVERY) == 2) { + Log.w(TAG, "Reassembly expired without NACK id=" + messageId); + } + } + } + } + + private void maybeLogReassemblyExpired(int messageId, Reassembly r) { + if ((++reassemblyExpireLogCount % REASSEMBLY_LOG_EVERY) != 1) { + return; + } + Log.w(TAG, "UDP reassembly timeout id=" + messageId + " frags=" + r.received + "/" + + r.fragCount + " bytes=" + r.totalLen); + } + + private static long reassemblyDeadlineMs(int fragCount, int totalLen) { + if (fragCount <= 1) { + return System.currentTimeMillis() + REASSEMBLY_TIMEOUT_MIN_MS; + } + int chunkSize = Math.max(1, CastConfig.UDP_CHUNK_SIZE - HEADER); + int expectedFrags = Math.max(fragCount, (totalLen + chunkSize - 1) / chunkSize); + long budget = REASSEMBLY_TIMEOUT_MIN_MS + expectedFrags * 200L + (totalLen / 2048); + if (fragCount > 1) { + budget = Math.max(8_000L, budget); + } + budget = Math.min(REASSEMBLY_TIMEOUT_MAX_MS, budget); + return System.currentTimeMillis() + budget; + } + + private CastProtocol.Message parsePacket(byte[] data, int length) throws IOException { + if (length < HEADER) { + synchronized (lossStats) { + lossStats.datagramsInvalid++; + } + return null; + } + for (int i = 0; i < 4; i++) { + if (data[i] != MAGIC[i]) { + synchronized (lossStats) { + lossStats.datagramsInvalid++; + } + return null; + } + } + synchronized (lossStats) { + lossStats.fragmentsReceived++; + } + byte type = data[4]; + int messageId = readInt(data, 5); + int fragIndex = readShort(data, 9); + int fragCount = readShort(data, 11); + if (type == CastProtocol.MSG_NACK && fragCount <= 1) { + if (nackEngine == null) { + return null; + } + int payloadLenNack = length - HEADER; + byte[] nackBody = payloadLenNack > 0 ? new byte[payloadLenNack] : new byte[0]; + if (payloadLenNack > 0) { + System.arraycopy(data, HEADER, nackBody, 0, payloadLenNack); + } + int nackId = NackProtectionEngine.parseNackPayload(nackBody); + if (nackId >= 0) { + handleIncomingNack(nackId); + } + return null; + } + int totalLen = readInt(data, 13); + int payloadLen = length - HEADER; + byte[] chunk = new byte[payloadLen]; + System.arraycopy(data, HEADER, chunk, 0, payloadLen); + + CastProtocol.Message raw; + if (fragCount <= 1) { + byte[] body; + if (totalLen != payloadLen && totalLen > 0 && totalLen <= payloadLen) { + body = new byte[totalLen]; + System.arraycopy(chunk, 0, body, 0, totalLen); + } else { + body = chunk; + } + body = decodeInboundBody(type, body, messageId); + if (body == null) { + return null; + } + raw = new CastProtocol.Message(type, body); + return unwrapWire(raw); + } + + Reassembly existing = pending.get(messageId); + if (existing != null && (existing.fragCount != fragCount || existing.totalLen != totalLen)) { + pending.remove(messageId); + synchronized (lossStats) { + lossStats.reassemblySuperseded++; + } + existing = null; + } + Reassembly r = existing; + if (r == null) { + r = new Reassembly(fragCount, totalLen); + pending.put(messageId, r); + } + if (!r.put(fragIndex, chunk, payloadLen)) { + synchronized (lossStats) { + lossStats.fragmentsDuplicate++; + } + return null; + } + if (!r.complete()) { + return null; + } + pending.remove(messageId); + synchronized (lossStats) { + lossStats.reassemblyCompleted++; + } + byte[] assembled = r.assemble(); + assembled = decodeInboundBody(type, assembled, messageId); + if (assembled == null) { + return null; + } + return unwrapWire(new CastProtocol.Message(type, assembled)); + } + + private byte[] decodeInboundBody(byte type, byte[] body, int messageId) { + StreamProtectionMode active = protectionEngine.mode(); + if (StreamProtectionCompat.shouldIgnoreInbound(body, active)) { + synchronized (lossStats) { + lossStats.unsupportedProtectionDropped++; + } + return null; + } + if (fecEngine != null && FecShardWire.isShardPacket(body)) { + FecProtectionEngine.ShardDecodeResult shard = fecEngine.onInboundShard(type, body); + if (shard.status == FecProtectionEngine.ShardDecodeResult.Status.PENDING) { + return null; + } + if (shard.status == FecProtectionEngine.ShardDecodeResult.Status.FAILED) { + if (nackEngine != null) { + nackEngine.requestNack(messageId); + } + return null; + } + return shard.payload; + } + byte[] decoded = protectionEngine.onInboundPayload(type, body); + if (decoded != null + && StreamProtectionCompat.shouldIgnoreInbound(decoded, active)) { + synchronized (lossStats) { + lossStats.unsupportedProtectionDropped++; + } + return null; + } + if (decoded == null && nackEngine != null && active != StreamProtectionMode.NONE) { + nackEngine.requestNack(messageId); + } + return decoded; + } + + private CastProtocol.Message unwrapWire(CastProtocol.Message raw) throws IOException { + if (raw.type == CastProtocol.MSG_WIRE_PACKET) { + if (inboundSessionGate != null) { + CastProtoHeader hdr = CastPacketFramer.readHeader(raw.payload); + if (!inboundSessionGate.accept(hdr)) { + synchronized (lossStats) { + lossStats.wirePacketsDropped++; + } + return null; + } + } + try { + return CastPacketFramer.unframe(raw.payload); + } catch (IOException e) { + synchronized (lossStats) { + lossStats.malformedPackets++; + } + throw e; + } + } + return raw; + } + + private static byte[] buildPacket( + byte type, int messageId, int fragIndex, int fragCount, + byte[] body, int offset, int len, int totalLen) { + byte[] packet = new byte[HEADER + len]; + System.arraycopy(MAGIC, 0, packet, 0, 4); + packet[4] = type; + writeInt(packet, 5, messageId); + writeShort(packet, 9, fragIndex); + writeShort(packet, 11, fragCount); + writeInt(packet, 13, totalLen); + System.arraycopy(body, offset, packet, HEADER, len); + return packet; + } + + private static int readInt(byte[] b, int off) { + return ((b[off] & 0xFF) << 24) | ((b[off + 1] & 0xFF) << 16) + | ((b[off + 2] & 0xFF) << 8) | (b[off + 3] & 0xFF); + } + + private static int readShort(byte[] b, int off) { + return ((b[off] & 0xFF) << 8) | (b[off + 1] & 0xFF); + } + + private static void writeInt(byte[] b, int off, int v) { + b[off] = (byte) (v >> 24); + b[off + 1] = (byte) (v >> 16); + b[off + 2] = (byte) (v >> 8); + b[off + 3] = (byte) v; + } + + private static void writeShort(byte[] b, int off, int v) { + b[off] = (byte) (v >> 8); + b[off + 1] = (byte) v; + } + + @Override + public String getModeLabel() { + return "UDP"; + } + + @Override + public void releaseConnection() { + peer = null; + pending.clear(); + } + + @Override + public void close() { + listening = false; + if (socket != null) { + socket.close(); + socket = null; + } + pending.clear(); + peer = null; + } + + private static final class Reassembly { + final int fragCount; + final int totalLen; + final long startedMs; + final long deadlineMs; + final byte[][] parts; + final int[] sizes; + int received; + + Reassembly(int fragCount, int totalLen) { + this.fragCount = fragCount; + this.totalLen = totalLen; + this.startedMs = System.currentTimeMillis(); + this.deadlineMs = reassemblyDeadlineMs(fragCount, totalLen); + this.parts = new byte[fragCount][]; + this.sizes = new int[fragCount]; + } + + boolean put(int index, byte[] data, int len) { + if (index < 0 || index >= fragCount || parts[index] != null) { + return false; + } + byte[] copy = new byte[len]; + System.arraycopy(data, 0, copy, 0, len); + parts[index] = copy; + sizes[index] = len; + received++; + return true; + } + + boolean complete() { + return received == fragCount; + } + + byte[] assemble() { + ByteArrayOutputStream bos = new ByteArrayOutputStream(totalLen); + for (int i = 0; i < fragCount; i++) { + bos.write(parts[i], 0, sizes[i]); + } + byte[] out = bos.toByteArray(); + if (out.length > totalLen) { + byte[] trimmed = new byte[totalLen]; + System.arraycopy(out, 0, trimmed, 0, totalLen); + return trimmed; + } + return out; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/control/NetworkControlAdvice.java b/app/src/main/java/com/foxx/androidcast/network/control/NetworkControlAdvice.java new file mode 100644 index 0000000..df3d3e3 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/control/NetworkControlAdvice.java @@ -0,0 +1,28 @@ +package com.foxx.androidcast.network.control; + +/********************************************************************* + * NetworkControlAdvice.java + * Created at: Fri 15 May 2026 17:47:09 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class NetworkControlAdvice + * Contributors: + * - Anton Afanasyeu (3 commits, 24 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 1be9e2b0c4a12def59e9e8587cdd184f1c62490ebaacff224a30e5266f295c4d +**********************************************************************/ +import com.foxx.androidcast.CastConfig; + +/** Actionable guidance produced by the network control plane (may be no-op). */ +public class NetworkControlAdvice { + public boolean sendStats; + public boolean sendControl; + public int suggestedBitrateKbps; + public String suggestedTransport = CastConfig.DEFAULT_TRANSPORT; + public boolean switchTransport; + public int congestionLevel; + + public static NetworkControlAdvice none() { + return new NetworkControlAdvice(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/control/NetworkControlPlane.java b/app/src/main/java/com/foxx/androidcast/network/control/NetworkControlPlane.java new file mode 100644 index 0000000..faa078c --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/control/NetworkControlPlane.java @@ -0,0 +1,33 @@ +package com.foxx.androidcast.network.control; + +/********************************************************************* + * NetworkControlPlane.java + * Created at: Fri 15 May 2026 17:47:09 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * interface NetworkControlPlane + * Contributors: + * - Anton Afanasyeu (2 commits, 29 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 5d0720517170cb275496c433afa459fa0fb4648eeaa0effa35ba1b0d8a149388 +**********************************************************************/ +/** + * Pluggable network intelligence: bandwidth estimation, congestion, transport switching. + * Replace {@link PassThroughNetworkControlPlane} with a real implementation when ready. + */ +public interface NetworkControlPlane { + /** Called periodically from the cast loop (sender or receiver). */ + NetworkControlAdvice tick(long nowMs); + + /** Peer stats received over the wire. */ + void onPeerStats(NetworkStatsSnapshot stats); + + /** Local stats to publish to the peer. */ + NetworkStatsSnapshot buildLocalStats(long nowMs); + + /** Apply control message received from peer (bitrate/transport hints). */ + void onPeerControl(int suggestedBitrateKbps, String suggestedTransport, boolean switchTransport, int congestionLevel); + + /** Local advice to send after {@link #tick(long)}. */ + NetworkControlAdvice getOutboundAdvice(); +} diff --git a/app/src/main/java/com/foxx/androidcast/network/control/NetworkFeedbackManager.java b/app/src/main/java/com/foxx/androidcast/network/control/NetworkFeedbackManager.java new file mode 100644 index 0000000..386c0fc --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/control/NetworkFeedbackManager.java @@ -0,0 +1,135 @@ +package com.foxx.androidcast.network.control; + +/********************************************************************* + * NetworkFeedbackManager.java + * Created at: Fri 15 May 2026 17:47:09 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class NetworkFeedbackManager + * Contributors: + * - Anton Afanasyeu (2 commits, 98 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 03dc7300be054e07eef44367194228e77c7c25dab3efe96b9e835df5b14ab902 +**********************************************************************/ +import android.util.Log; + +import com.foxx.androidcast.network.CastProtocol; +import com.foxx.androidcast.network.CastSession; +import com.foxx.androidcast.network.diag.DiagPingSession; + +import java.io.IOException; + +/** Bridges {@link NetworkControlPlane} to {@link CastSession} send/receive. */ +public class NetworkFeedbackManager { + private static final String TAG = "NetworkFeedback"; + + private final NetworkControlPlane plane; + private final CastSession session; + private final boolean isSender; + private DiagPingSession diagPing; + + public NetworkFeedbackManager(CastSession session, boolean isSender, NetworkControlPlane plane) { + this.session = session; + this.isSender = isSender; + this.plane = plane != null ? plane : new PassThroughNetworkControlPlane(); + } + + public NetworkFeedbackManager(CastSession session, boolean isSender) { + this(session, isSender, new PassThroughNetworkControlPlane()); + } + + public NetworkControlPlane getPlane() { + return plane; + } + + public void configureDiagPing(boolean enabled, byte responseMode, DiagPingSession.SampleListener listener) { + if (!enabled) { + if (diagPing != null) { + diagPing.setEnabled(false); + } + return; + } + diagPing = new DiagPingSession(session, responseMode, listener); + diagPing.setEnabled(true); + } + + public DiagPingSession getDiagPingSession() { + return diagPing; + } + + /** Call on each stream loop iteration (~500ms). */ + public void tick() { + long now = System.currentTimeMillis(); + if (diagPing != null) { + diagPing.tick(now); + } + NetworkControlAdvice advice = plane.tick(now); + if (advice.sendStats) { + sendStats(plane.buildLocalStats(now)); + } + if (advice.sendControl) { + sendControl(advice); + } + } + + public boolean handleMessage(CastProtocol.Message msg) { + if (diagPing != null && diagPing.handleMessage(msg)) { + applyDiagPingRtt(); + return true; + } + try { + switch (msg.type) { + case CastProtocol.MSG_NETWORK_STATS: + plane.onPeerStats(CastProtocol.parseNetworkStats(msg.payload)); + return true; + case CastProtocol.MSG_NETWORK_CONTROL: + CastProtocol.NetworkControl ctrl = CastProtocol.parseNetworkControl(msg.payload); + plane.onPeerControl(ctrl.suggestedBitrateKbps, ctrl.suggestedTransport, + ctrl.switchTransport, ctrl.congestionLevel); + applyAdvice(plane.getOutboundAdvice()); + return true; + default: + return false; + } + } catch (IOException e) { + Log.w(TAG, "Network message parse failed", e); + return false; + } + } + + private void applyDiagPingRtt() { + if (diagPing == null || !(plane instanceof PassThroughNetworkControlPlane)) { + return; + } + PassThroughNetworkControlPlane pass = (PassThroughNetworkControlPlane) plane; + int rtt = diagPing.metrics().preferredRttMs(pass.getDiagPingRttMs()); + pass.setDiagPingRttMs(rtt); + } + + private void sendStats(NetworkStatsSnapshot stats) { + try { + session.send(CastProtocol.MSG_NETWORK_STATS, CastProtocol.networkStatsPayload(stats)); + } catch (IOException e) { + Log.w(TAG, "Send stats failed", e); + } + } + + private void sendControl(NetworkControlAdvice advice) { + try { + session.send(CastProtocol.MSG_NETWORK_CONTROL, + CastProtocol.networkControlPayload(advice)); + } catch (IOException e) { + Log.w(TAG, "Send control failed", e); + } + } + + /** Hook for sender to apply bitrate/transport hints (stub-friendly). */ + public void applyAdvice(NetworkControlAdvice advice) { + if (advice.suggestedBitrateKbps > 0 && isSender) { + Log.d(TAG, "Bitrate hint (not applied yet): " + advice.suggestedBitrateKbps); + } + if (advice.switchTransport) { + Log.d(TAG, "Transport switch hint (not applied yet): " + advice.suggestedTransport); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/control/NetworkStatsSnapshot.java b/app/src/main/java/com/foxx/androidcast/network/control/NetworkStatsSnapshot.java new file mode 100644 index 0000000..8bf5a23 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/control/NetworkStatsSnapshot.java @@ -0,0 +1,111 @@ +package com.foxx.androidcast.network.control; + +/********************************************************************* + * NetworkStatsSnapshot.java + * Created at: Fri 15 May 2026 17:47:09 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class NetworkStatsSnapshot + * Contributors: + * - Anton Afanasyeu (5 commits, 107 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 f63d6815d874e115f739dd6c42a23c64df6615f4ea267ef5e132af59a78e2a45 +**********************************************************************/ +/** Point-in-time network metrics exchanged between sender and receiver. */ +public class NetworkStatsSnapshot { + public long sequence; + public long timestampMs; + public int rttMs; + public float lossRatio; + public int sendBitrateKbps; + public int recvBitrateKbps; + public int congestionLevel; + public int jitterMs; + + /** v2 extension: sender encode FPS (receiver: decode/render FPS). */ + public float encodeFps; + public int encodeQueueDepth; + public int droppedPFrames; + public boolean audioActive; + public long audioFramesSent; + public int suggestedBitrateKbps; + public int targetBitrateKbps; + + /** v3: sender pre-encode PCM levels (receiver: post-decode levels in overlay only). */ + public int audioCaptureVuPercent; + public long audioCaptureSilentBlocks; + public long audioCaptureAudibleBlocks; + public float audioCapturePeakDb; + public float audioCaptureRmsDb; + + /** v4: UDP + app-layer loss (see {@link com.foxx.androidcast.network.transport.TransportLossStats}). */ + public long udpDatagramsRx; + public long udpDatagramsTx; + public long udpDatagramsInvalid; + public long udpFragmentsRx; + public long udpFragmentsDuplicate; + public long udpReassemblyOk; + public long udpReassemblyLost; + public long udpWireDropped; + public long udpMalformed; + public int droppedAudioFrames; + public long recvVideoPackets; + public long recvAudioPackets; + public long recvVideoSkippedKey; + public long recvVideoDecodeErrors; + public long recvAudioDecodeErrors; + public long recvAudioQueueDrops; + public long recvDamagedVideoFrames; + public String protectionMode = "NONE"; + public long fecStubPackets; + public long fecPacketsDecoded; + public long fecDecodeFailures; + public long nackStubRequests; + + public NetworkStatsSnapshot copy() { + NetworkStatsSnapshot c = new NetworkStatsSnapshot(); + c.sequence = sequence; + c.timestampMs = timestampMs; + c.rttMs = rttMs; + c.lossRatio = lossRatio; + c.sendBitrateKbps = sendBitrateKbps; + c.recvBitrateKbps = recvBitrateKbps; + c.congestionLevel = congestionLevel; + c.jitterMs = jitterMs; + c.encodeFps = encodeFps; + c.encodeQueueDepth = encodeQueueDepth; + c.droppedPFrames = droppedPFrames; + c.audioActive = audioActive; + c.audioFramesSent = audioFramesSent; + c.suggestedBitrateKbps = suggestedBitrateKbps; + c.targetBitrateKbps = targetBitrateKbps; + c.audioCaptureVuPercent = audioCaptureVuPercent; + c.audioCaptureSilentBlocks = audioCaptureSilentBlocks; + c.audioCaptureAudibleBlocks = audioCaptureAudibleBlocks; + c.audioCapturePeakDb = audioCapturePeakDb; + c.audioCaptureRmsDb = audioCaptureRmsDb; + c.udpDatagramsRx = udpDatagramsRx; + c.udpDatagramsTx = udpDatagramsTx; + c.udpDatagramsInvalid = udpDatagramsInvalid; + c.udpFragmentsRx = udpFragmentsRx; + c.udpFragmentsDuplicate = udpFragmentsDuplicate; + c.udpReassemblyOk = udpReassemblyOk; + c.udpReassemblyLost = udpReassemblyLost; + c.udpWireDropped = udpWireDropped; + c.udpMalformed = udpMalformed; + c.droppedAudioFrames = droppedAudioFrames; + c.recvVideoPackets = recvVideoPackets; + c.recvAudioPackets = recvAudioPackets; + c.recvVideoSkippedKey = recvVideoSkippedKey; + c.recvVideoDecodeErrors = recvVideoDecodeErrors; + c.recvAudioDecodeErrors = recvAudioDecodeErrors; + c.recvAudioQueueDrops = recvAudioQueueDrops; + c.recvDamagedVideoFrames = recvDamagedVideoFrames; + c.protectionMode = protectionMode; + c.fecStubPackets = fecStubPackets; + c.fecPacketsDecoded = fecPacketsDecoded; + c.fecDecodeFailures = fecDecodeFailures; + c.nackStubRequests = nackStubRequests; + return c; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/control/PassThroughNetworkControlPlane.java b/app/src/main/java/com/foxx/androidcast/network/control/PassThroughNetworkControlPlane.java new file mode 100644 index 0000000..e1fe875 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/control/PassThroughNetworkControlPlane.java @@ -0,0 +1,162 @@ +package com.foxx.androidcast.network.control; + +/********************************************************************* + * PassThroughNetworkControlPlane.java + * Created at: Fri 15 May 2026 17:47:09 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class PassThroughNetworkControlPlane + * Contributors: + * - Anton Afanasyeu (7 commits, 143 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 55fde627b9a8bb3fc5c27b4e3d5f7c79760d4037f477d4a578f3699b6349fb6e +**********************************************************************/ +import com.foxx.androidcast.CastConfig; + +/** + * Default no-op controller: emits heartbeat stats, ignores congestion, never switches transport. + * Swap this class for smart logic without changing protocol or session code. + */ +public class PassThroughNetworkControlPlane implements NetworkControlPlane { + private static final long STATS_INTERVAL_MS = 2_000; + + private long sequence; + private long lastStatsMs; + private NetworkStatsSnapshot lastPeer; + private final NetworkControlAdvice outbound = NetworkControlAdvice.none(); + private long statsWindowBytes; + private long statsWindowStartMs; + private long sendWindowBytes; + private long sendWindowStartMs; + private StatsEnricher statsEnricher; + private volatile int diagPingRttMs; + + /** Optional hook to attach encode/decode metrics before stats are sent. */ + public interface StatsEnricher { + void enrich(NetworkStatsSnapshot snapshot, long nowMs); + } + + public void setStatsEnricher(StatsEnricher enricher) { + this.statsEnricher = enricher; + } + + public void setDiagPingRttMs(int rttMs) { + if (rttMs > 0 && rttMs < 30_000) { + diagPingRttMs = rttMs; + } + } + + public int getDiagPingRttMs() { + return diagPingRttMs; + } + + @Override + public NetworkControlAdvice tick(long nowMs) { + outbound.sendStats = nowMs - lastStatsMs >= STATS_INTERVAL_MS; + outbound.sendControl = false; + outbound.suggestedBitrateKbps = 0; + outbound.suggestedTransport = CastConfig.DEFAULT_TRANSPORT; + outbound.switchTransport = false; + outbound.congestionLevel = 0; + if (outbound.sendStats) { + lastStatsMs = nowMs; + } + return outbound; + } + + public NetworkStatsSnapshot getLastPeerStats() { + return lastPeer != null ? lastPeer.copy() : null; + } + + @Override + public void onPeerStats(NetworkStatsSnapshot stats) { + lastPeer = stats != null ? stats.copy() : null; + if (lastPeer != null && lastPeer.timestampMs > 0) { + long rtt = System.currentTimeMillis() - lastPeer.timestampMs; + if (rtt > 0 && rtt < 10_000) { + lastPeer.rttMs = (int) rtt; + } + } + } + + /** Record inbound (receiver) or outbound (sender) payload bytes for bitrate stats. */ + public void recordBytes(int bytes) { + long now = System.currentTimeMillis(); + if (statsWindowStartMs == 0) { + statsWindowStartMs = now; + } + statsWindowBytes += bytes; + } + + public void recordSendBytes(int bytes) { + long now = System.currentTimeMillis(); + if (sendWindowStartMs == 0) { + sendWindowStartMs = now; + } + sendWindowBytes += bytes; + } + + @Override + public NetworkStatsSnapshot buildLocalStats(long nowMs) { + NetworkStatsSnapshot s = new NetworkStatsSnapshot(); + s.sequence = ++sequence; + s.timestampMs = nowMs; + if (diagPingRttMs > 0) { + s.rttMs = diagPingRttMs; + } else { + s.rttMs = lastPeer != null ? lastPeer.rttMs : 0; + } + s.lossRatio = 0f; + s.sendBitrateKbps = estimateSendKbps(nowMs); + s.recvBitrateKbps = estimateRecvKbps(nowMs); + s.congestionLevel = 0; + s.jitterMs = 0; + if (statsEnricher != null) { + statsEnricher.enrich(s, nowMs); + } + return s; + } + + private int estimateSendKbps(long nowMs) { + if (sendWindowStartMs == 0 || sendWindowBytes == 0) { + return 0; + } + long elapsed = nowMs - sendWindowStartMs; + if (elapsed < 200) { + return 0; + } + int kbps = (int) (sendWindowBytes * 8L / elapsed); + if (elapsed > 4000) { + sendWindowStartMs = nowMs; + sendWindowBytes = 0; + } + return kbps; + } + + private int estimateRecvKbps(long nowMs) { + if (statsWindowStartMs == 0 || statsWindowBytes == 0) { + return 0; + } + long elapsed = nowMs - statsWindowStartMs; + if (elapsed < 200) { + return 0; + } + int kbps = (int) (statsWindowBytes * 8L / elapsed); + if (elapsed > 4000) { + statsWindowStartMs = nowMs; + statsWindowBytes = 0; + } + return kbps; + } + + @Override + public void onPeerControl(int suggestedBitrateKbps, String suggestedTransport, + boolean switchTransport, int congestionLevel) { + // Pass-through: no local adjustments yet. + } + + @Override + public NetworkControlAdvice getOutboundAdvice() { + return outbound; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/diag/CastDiagPing.java b/app/src/main/java/com/foxx/androidcast/network/diag/CastDiagPing.java new file mode 100644 index 0000000..221c11b --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/diag/CastDiagPing.java @@ -0,0 +1,104 @@ +package com.foxx.androidcast.network.diag; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Diagnostic cast ping-pong wire format (optional; {@link com.foxx.androidcast.network.CastProtocol#MSG_DIAG_PING}). + *

+ * v1 layout (big-endian): + * magic(4) version(1) flags(1) direction(1) reserved(1) + * timestamp_ms(8) seq(8) payload_size(4) [payload] + * When {@link #FLAG_PONG} and direction {@link #DIR_REPLY_WITH}: reply_for_seq(8) reply_for_timestamp_ms(8) + */ +public final class CastDiagPing { + public static final int MAGIC = 0x50494E47; // "PING" + public static final byte VERSION = 1; + + /** Set on pong packets. */ + public static final byte FLAG_PONG = 0x01; + + /** Echo probe fields unchanged (dummy pong). */ + public static final byte DIR_MIRROR_AS_IS = 0; + /** Pong uses local wall-clock timestamp; same seq as probe. */ + public static final byte DIR_MIRROR_SMART = 1; + /** Pong includes reply-for fields plus local timestamp and seq. */ + public static final byte DIR_REPLY_WITH = 2; + + private CastDiagPing() {} + + public static final class Packet { + public int magic; + public byte version; + public byte flags; + public byte direction; + public long timestampMs; + public long seq; + public byte[] payload = new byte[0]; + /** Valid when {@link #FLAG_PONG} and {@link #DIR_REPLY_WITH}. */ + public long replyForSeq; + public long replyForTimestampMs; + + public boolean isPong() { + return (flags & FLAG_PONG) != 0; + } + + public boolean isValidMagic() { + return magic == MAGIC && version == VERSION; + } + } + + public static byte[] encode(Packet p) throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(32); + DataOutputStream out = new DataOutputStream(bos); + out.writeInt(p.magic != 0 ? p.magic : MAGIC); + out.writeByte(VERSION); + out.writeByte(p.flags); + out.writeByte(p.direction); + out.writeByte(0); + out.writeLong(p.timestampMs); + out.writeLong(p.seq); + byte[] body = p.payload != null ? p.payload : new byte[0]; + out.writeInt(body.length); + if (body.length > 0) { + out.write(body); + } + if (p.isPong() && p.direction == DIR_REPLY_WITH) { + out.writeLong(p.replyForSeq); + out.writeLong(p.replyForTimestampMs); + } + out.flush(); + return bos.toByteArray(); + } + + public static Packet decode(byte[] raw) throws IOException { + if (raw == null || raw.length < 28) { + throw new IOException("Diag ping too short"); + } + DataInputStream in = new DataInputStream(new ByteArrayInputStream(raw)); + Packet p = new Packet(); + p.magic = in.readInt(); + p.version = in.readByte(); + p.flags = in.readByte(); + p.direction = in.readByte(); + in.readByte(); // reserved + p.timestampMs = in.readLong(); + p.seq = in.readLong(); + int payloadSize = in.readInt(); + if (payloadSize < 0 || payloadSize > 64 * 1024) { + throw new IOException("Invalid diag ping payload size: " + payloadSize); + } + if (payloadSize > 0) { + p.payload = new byte[payloadSize]; + in.readFully(p.payload); + } + if (p.isPong() && p.direction == DIR_REPLY_WITH && in.available() >= 16) { + p.replyForSeq = in.readLong(); + p.replyForTimestampMs = in.readLong(); + } + return p; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/diag/DiagPingMetrics.java b/app/src/main/java/com/foxx/androidcast/network/diag/DiagPingMetrics.java new file mode 100644 index 0000000..93f9ad2 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/diag/DiagPingMetrics.java @@ -0,0 +1,86 @@ +package com.foxx.androidcast.network.diag; + +/** + * Rolling diagnostic ping RTT samples for overlays and bandwidth hints. + */ +public final class DiagPingMetrics { + private static final int WINDOW = 16; + + private final long[] rttMs = new long[WINDOW]; + private final long[] seq = new long[WINDOW]; + private int count; + private int index; + private long probesSent; + private long pongsRx; + private long lastRttMs; + private long lastSeq; + + public synchronized void recordProbeSent(long seqNum) { + probesSent++; + lastSeq = seqNum; + } + + public synchronized void recordPong(long rtt, long pongSeq) { + if (rtt <= 0 || rtt > 30_000) { + return; + } + pongsRx++; + lastRttMs = rtt; + lastSeq = pongSeq; + rttMs[index] = rtt; + seq[index] = pongSeq; + index = (index + 1) % WINDOW; + if (count < WINDOW) { + count++; + } + } + + public synchronized Snapshot snapshot() { + Snapshot s = new Snapshot(); + s.enabled = true; + s.probesSent = probesSent; + s.pongsRx = pongsRx; + s.lastRttMs = (int) lastRttMs; + s.lastSeq = lastSeq; + if (count == 0) { + return s; + } + long sum = 0; + for (int i = 0; i < count; i++) { + sum += rttMs[i]; + } + s.avgRttMs = (int) (sum / count); + return s; + } + + public synchronized int preferredRttMs(int fallbackRtt) { + Snapshot s = snapshot(); + if (s.avgRttMs > 0) { + return s.avgRttMs; + } + if (s.lastRttMs > 0) { + return s.lastRttMs; + } + return fallbackRtt; + } + + public synchronized void reset() { + count = 0; + index = 0; + probesSent = 0; + pongsRx = 0; + lastRttMs = 0; + lastSeq = 0; + } + + public static final class Snapshot { + public boolean enabled; + public long probesSent; + public long pongsRx; + public int lastRttMs; + public int avgRttMs; + public long lastSeq; + + public static final Snapshot EMPTY = new Snapshot(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/diag/DiagPingSession.java b/app/src/main/java/com/foxx/androidcast/network/diag/DiagPingSession.java new file mode 100644 index 0000000..edbaf69 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/diag/DiagPingSession.java @@ -0,0 +1,158 @@ +package com.foxx.androidcast.network.diag; + +import android.util.Log; + +import com.foxx.androidcast.network.CastProtocol; +import com.foxx.androidcast.network.CastSession; + +import java.io.IOException; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Optional ~1 Hz diagnostic ping-pong during an active cast (developer setting). + * Unknown {@link CastProtocol#MSG_DIAG_PING} on old peers is ignored by their handlers. + */ +public final class DiagPingSession { + private static final String TAG = "DiagPing"; + private static final long PROBE_INTERVAL_MS = 1_000L; + + public interface SampleListener { + void onDiagPingSample(DiagPingMetrics.Snapshot snapshot); + } + + private final CastSession session; + private final byte localResponseMode; + private final DiagPingMetrics metrics = new DiagPingMetrics(); + private final ConcurrentHashMap pendingProbeSentMs = new ConcurrentHashMap<>(); + private final SampleListener listener; + + private volatile boolean enabled; + private long nextSeq; + private long lastProbeMs; + + public DiagPingSession(CastSession session, byte localResponseMode, SampleListener listener) { + this.session = session; + this.localResponseMode = localResponseMode; + this.listener = listener; + } + + public void setEnabled(boolean on) { + enabled = on; + if (!on) { + reset(); + } + } + + public boolean isEnabled() { + return enabled; + } + + public DiagPingMetrics metrics() { + return metrics; + } + + public void reset() { + nextSeq = 0; + lastProbeMs = 0; + pendingProbeSentMs.clear(); + metrics.reset(); + } + + public void tick(long nowMs) { + if (!enabled) { + return; + } + if (lastProbeMs == 0 || nowMs - lastProbeMs >= PROBE_INTERVAL_MS) { + sendProbe(nowMs); + lastProbeMs = nowMs; + } + } + + /** @return true if consumed (including invalid magic). */ + public boolean handleMessage(CastProtocol.Message msg) { + if (msg.type != CastProtocol.MSG_DIAG_PING) { + return false; + } + try { + CastDiagPing.Packet p = CastProtocol.parseDiagPing(msg.payload); + if (!p.isValidMagic()) { + Log.w(TAG, "Ignoring diag ping with bad magic/version"); + return true; + } + if (p.isPong()) { + onPong(p); + } else { + onProbe(p); + } + return true; + } catch (IOException e) { + Log.w(TAG, "Diag ping parse failed", e); + return true; + } + } + + private void onProbe(CastDiagPing.Packet probe) throws IOException { + CastDiagPing.Packet pong = new CastDiagPing.Packet(); + pong.flags = CastDiagPing.FLAG_PONG; + pong.direction = probe.direction; + pong.payload = probe.payload != null ? probe.payload : new byte[0]; + switch (probe.direction) { + case CastDiagPing.DIR_MIRROR_AS_IS: + pong.timestampMs = probe.timestampMs; + pong.seq = probe.seq; + break; + case CastDiagPing.DIR_MIRROR_SMART: + pong.timestampMs = System.currentTimeMillis(); + pong.seq = probe.seq; + break; + case CastDiagPing.DIR_REPLY_WITH: + pong.timestampMs = System.currentTimeMillis(); + pong.seq = nextSeq++; + pong.replyForSeq = probe.seq; + pong.replyForTimestampMs = probe.timestampMs; + break; + default: + pong.direction = CastDiagPing.DIR_MIRROR_SMART; + pong.timestampMs = System.currentTimeMillis(); + pong.seq = probe.seq; + break; + } + session.send(CastProtocol.MSG_DIAG_PING, CastProtocol.diagPingPayload(pong)); + } + + private void onPong(CastDiagPing.Packet pong) { + long now = System.currentTimeMillis(); + long rtt; + if (pong.direction == CastDiagPing.DIR_REPLY_WITH) { + Long sentAt = pendingProbeSentMs.remove(pong.replyForSeq); + rtt = sentAt != null ? now - sentAt : now - pong.replyForTimestampMs; + } else { + Long sentAt = pendingProbeSentMs.remove(pong.seq); + rtt = sentAt != null ? now - sentAt : now - pong.timestampMs; + } + metrics.recordPong(rtt, pong.seq); + notifyListener(); + } + + private void sendProbe(long nowMs) { + try { + long seq = nextSeq++; + pendingProbeSentMs.put(seq, nowMs); + metrics.recordProbeSent(seq); + CastDiagPing.Packet probe = new CastDiagPing.Packet(); + probe.timestampMs = nowMs; + probe.seq = seq; + probe.direction = localResponseMode; + probe.payload = new byte[0]; + session.send(CastProtocol.MSG_DIAG_PING, CastProtocol.diagPingPayload(probe)); + } catch (IOException e) { + Log.w(TAG, "Send diag probe failed", e); + } + } + + private void notifyListener() { + if (listener != null) { + listener.onDiagPingSample(metrics.snapshot()); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/quic/CronetEngineProvider.java b/app/src/main/java/com/foxx/androidcast/network/quic/CronetEngineProvider.java new file mode 100644 index 0000000..b70c171 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/quic/CronetEngineProvider.java @@ -0,0 +1,61 @@ +package com.foxx.androidcast.network.quic; + +/********************************************************************* + * CronetEngineProvider.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CronetEngineProvider + * Contributors: + * - Anton Afanasyeu (2 commits, 57 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 39f9f6c05214d52370267e6cabb02a4b4f64e43894dffaa507ab818017e3e8b6 +**********************************************************************/ +import android.content.Context; + +import com.google.android.gms.net.CronetProviderInstaller; +import com.google.android.gms.tasks.Tasks; + +import org.chromium.net.CronetEngine; +import org.chromium.net.ExperimentalCronetEngine; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +/** Shared Cronet engine with QUIC / HTTP3 enabled for experimental cast transport. */ +public final class CronetEngineProvider { + private static final AtomicReference ENGINE = new AtomicReference<>(); + + private CronetEngineProvider() {} + + public static CronetEngine getEngine(Context context) throws Exception { + CronetEngine existing = ENGINE.get(); + if (existing != null) { + return existing; + } + synchronized (CronetEngineProvider.class) { + existing = ENGINE.get(); + if (existing != null) { + return existing; + } + Context app = context.getApplicationContext(); + Tasks.await(CronetProviderInstaller.installProvider(app), 30, TimeUnit.SECONDS); + ExperimentalCronetEngine.Builder builder = + new ExperimentalCronetEngine.Builder(app) + .enableQuic(true) + .enableHttp2(true) + .setStoragePath(app.getCacheDir().getAbsolutePath()) + .enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISK, 256 * 1024); + CronetEngine built = builder.build(); + ENGINE.set(built); + return built; + } + } + + public static void shutdown() { + CronetEngine e = ENGINE.getAndSet(null); + if (e != null) { + e.shutdown(); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/quic/QuicCronetCastTransport.java b/app/src/main/java/com/foxx/androidcast/network/quic/QuicCronetCastTransport.java new file mode 100644 index 0000000..85a6b42 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/quic/QuicCronetCastTransport.java @@ -0,0 +1,154 @@ +package com.foxx.androidcast.network.quic; + +/********************************************************************* + * QuicCronetCastTransport.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class QuicCronetCastTransport + * Contributors: + * - Anton Afanasyeu (3 commits, 150 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 388e37e6d9c73a9e2647d5e792807d03ba046dd4b5f542d2a3bc67fb82c5c5ea +**********************************************************************/ +import android.content.Context; +import android.util.Log; + +import com.foxx.androidcast.CastConfig; +import com.foxx.androidcast.network.CastFramingContext; +import com.foxx.androidcast.network.CastProtocol; +import com.foxx.androidcast.network.CastTransport; +import com.foxx.androidcast.network.TcpCastTransport; +import com.foxx.androidcast.network.UdpCastTransport; + +import org.chromium.net.CronetEngine; + +import java.io.IOException; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Experimental QUIC cast transport (Cronet stack). + *

+ * Cronet on Android is a QUIC/HTTP3 client only. This transport uses: + *

    + *
  • {@link CronetEngine} with QUIC enabled (shared via {@link CronetEngineProvider})
  • + *
  • Framed cast messages on {@link CastConfig#QUIC_PORT} over UDP (same as legacy ACUD framing)
  • + *
  • TCP fallback on the same port if UDP bind fails
  • + *
+ * A future revision can move the data plane to Cronet {@code BidirectionalStream} once an HTTP/3 + * terminator is available on the receiver. + */ +public final class QuicCronetCastTransport implements CastTransport { + private static final String TAG = "QuicCronetTransport"; + + private final Context appContext; + private final UdpCastTransport udp = new UdpCastTransport(); + private final TcpCastTransport tcpFallback = new TcpCastTransport(); + private final AtomicBoolean usingTcp = new AtomicBoolean(false); + private CronetEngine engine; + + public QuicCronetCastTransport(Context context) { + this.appContext = context.getApplicationContext(); + } + + /** Underlying UDP data plane (ACUD framing, FEC/NACK). */ + public UdpCastTransport getUdpTransport() { + return udp; + } + + private CastTransport active() { + return usingTcp.get() ? tcpFallback : udp; + } + + @Override + public void setFramingContext(CastFramingContext context) { + udp.setFramingContext(context); + tcpFallback.setFramingContext(context); + } + + @Override + public void setInboundSessionGate(com.foxx.androidcast.network.CastSessionGate gate) { + udp.setInboundSessionGate(gate); + tcpFallback.setInboundSessionGate(gate); + } + + private void ensureCronet() { + if (engine != null) { + return; + } + try { + engine = CronetEngineProvider.getEngine(appContext); + Log.i(TAG, "Cronet engine ready (QUIC/HTTP3 enabled for experimental transport)"); + } catch (Exception e) { + Log.w(TAG, "Cronet engine unavailable: " + e.getMessage()); + } + } + + @Override + public void prepareListen(int port) throws IOException { + ensureCronet(); + int quicPort = port > 0 ? port : CastConfig.QUIC_PORT; + try { + udp.prepareListen(quicPort); + usingTcp.set(false); + Log.i(TAG, "QUIC listen UDP :" + quicPort); + } catch (IOException e) { + Log.w(TAG, "QUIC UDP listen failed, TCP fallback :" + quicPort, e); + tcpFallback.prepareListen(quicPort); + usingTcp.set(true); + } + } + + @Override + public void acceptClient() throws IOException { + active().acceptClient(); + } + + @Override + public void listen(int port) throws IOException { + prepareListen(port); + acceptClient(); + } + + @Override + public void connect(String host, int port) throws IOException { + ensureCronet(); + int quicPort = port > 0 ? port : CastConfig.QUIC_PORT; + try { + udp.connect(host, quicPort); + usingTcp.set(false); + Log.i(TAG, "QUIC connect UDP " + host + ":" + quicPort); + } catch (IOException e) { + Log.w(TAG, "QUIC UDP connect failed, TCP fallback", e); + tcpFallback.connect(host, quicPort); + usingTcp.set(true); + } + } + + @Override + public void send(byte type, byte[] payload) throws IOException { + active().send(type, payload); + } + + @Override + public CastProtocol.Message receive(int timeoutMs) throws IOException { + return active().receive(timeoutMs); + } + + @Override + public String getModeLabel() { + String base = usingTcp.get() ? "QUIC(exp/TCP)" : "QUIC(exp/UDP)"; + return engine != null ? base + "+Cronet" : base; + } + + @Override + public void releaseConnection() { + active().releaseConnection(); + } + + @Override + public void close() { + udp.close(); + tcpFallback.close(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/selftest/NetworkSelfTestBridge.java b/app/src/main/java/com/foxx/androidcast/network/selftest/NetworkSelfTestBridge.java new file mode 100644 index 0000000..7017235 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/selftest/NetworkSelfTestBridge.java @@ -0,0 +1,26 @@ +package com.foxx.androidcast.network.selftest; + +import android.content.Context; +import android.content.Intent; + +/** Helper to signal network self-test service from cast services. */ +public final class NetworkSelfTestBridge { + private NetworkSelfTestBridge() {} + + public static void startCapture(Context context) { + send(context, NetworkSelfTestService.ACTION_START_CAPTURE); + } + + public static void stopCapture(Context context) { + send(context, NetworkSelfTestService.ACTION_STOP_CAPTURE); + } + + private static void send(Context context, String action) { + if (context == null) { + return; + } + Intent i = new Intent(context, NetworkSelfTestService.class); + i.setAction(action); + context.startService(i); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/selftest/NetworkSelfTestService.java b/app/src/main/java/com/foxx/androidcast/network/selftest/NetworkSelfTestService.java new file mode 100644 index 0000000..670735a --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/selftest/NetworkSelfTestService.java @@ -0,0 +1,365 @@ +package com.foxx.androidcast.network.selftest; + +import android.app.Service; +import android.content.Intent; +import android.net.ConnectivityManager; +import android.net.Network; +import android.net.NetworkCapabilities; +import android.net.NetworkRequest; +import android.os.Build; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IBinder; +import android.os.RemoteCallbackList; +import android.os.RemoteException; + +import com.foxx.androidcast.BuildConfig; +import com.foxx.androidcast.INetworkChangeListener; +import com.foxx.androidcast.INetworkSelfTestService; +import com.foxx.androidcast.NetworkConditions; +import com.foxx.androidcast.dev.DevNetworkSelfTestProbe; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.File; +import java.io.FileOutputStream; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +/** Standalone network self-test service with AIDL cache and change subscriptions. */ +public final class NetworkSelfTestService extends Service { + public static final String ACTION_START_CAPTURE = "com.foxx.androidcast.NET_SELFTEST_START_CAPTURE"; + public static final String ACTION_STOP_CAPTURE = "com.foxx.androidcast.NET_SELFTEST_STOP_CAPTURE"; + public static final String ACTION_FORCE_REFRESH = "com.foxx.androidcast.NET_SELFTEST_FORCE_REFRESH"; + + private final RemoteCallbackList listeners = new RemoteCallbackList<>(); + private final AtomicBoolean refreshing = new AtomicBoolean(false); + private final Object lock = new Object(); + + private HandlerThread workerThread; + private Handler worker; + private ConnectivityManager connectivityManager; + private ConnectivityManager.NetworkCallback networkCallback; + private NetworkConditions cached; + private int periodicIntervalMinutes; + + private boolean captureActive; + private long captureSessionStartedUtcSec; + private JSONArray captureEvents = new JSONArray(); + + private final Runnable periodicTask = new Runnable() { + @Override + public void run() { + requestRefreshInternal(false, "periodic"); + if (worker != null) { + worker.postDelayed(this, periodicIntervalMinutes * 60_000L); + } + } + }; + + private final INetworkSelfTestService.Stub binder = new INetworkSelfTestService.Stub() { + @Override + public NetworkConditions getCachedConditions() { + synchronized (lock) { + if (cached == null) { + return null; + } + return new NetworkConditions(cached.collectedAtMs, cached.fingerprint, cached.reportText, + refreshing.get()); + } + } + + @Override + public void requestRefresh() { + requestRefreshInternal(true, "client_request"); + } + + @Override + public boolean isRefreshing() { + return refreshing.get(); + } + + @Override + public void addListener(INetworkChangeListener listener) { + if (listener != null) { + listeners.register(listener); + } + } + + @Override + public void removeListener(INetworkChangeListener listener) { + if (listener != null) { + listeners.unregister(listener); + } + } + + @Override + public void startCapture() { + setCaptureActive(true); + } + + @Override + public void stopCapture() { + setCaptureActive(false); + } + + @Override + public void setPeriodicIntervalMinutes(int minutes) { + if (minutes != 1 && minutes != 5 && minutes != 15) { + return; + } + periodicIntervalMinutes = minutes; + restartPeriodicTask(); + } + + @Override + public int getPeriodicIntervalMinutes() { + return periodicIntervalMinutes; + } + }; + + @Override + public void onCreate() { + super.onCreate(); + periodicIntervalMinutes = BuildConfig.DEBUG ? 1 : 5; + workerThread = new HandlerThread("NetSelfTestWorker"); + workerThread.start(); + worker = new Handler(workerThread.getLooper()); + connectivityManager = getSystemService(ConnectivityManager.class); + registerNetworkCallback(); + worker.post(periodicTask); + requestRefreshInternal(true, "service_start"); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (intent != null) { + String action = intent.getAction(); + if (ACTION_START_CAPTURE.equals(action)) { + setCaptureActive(true); + return START_STICKY; + } else if (ACTION_STOP_CAPTURE.equals(action)) { + setCaptureActive(false); + return START_STICKY; + } else if (ACTION_FORCE_REFRESH.equals(action)) { + requestRefreshInternal(true, "intent_force"); + return START_STICKY; + } + } + return START_STICKY; + } + + @Override + public IBinder onBind(Intent intent) { + return binder; + } + + @Override + public void onDestroy() { + if (worker != null) { + worker.removeCallbacksAndMessages(null); + } + unregisterNetworkCallback(); + listeners.kill(); + if (workerThread != null) { + workerThread.quitSafely(); + } + super.onDestroy(); + } + + private void requestRefreshInternal(boolean forceNotifyIfChanged, String reason) { + if (worker == null || !refreshing.compareAndSet(false, true)) { + return; + } + worker.post(() -> { + try { + long now = System.currentTimeMillis(); + String report = DevNetworkSelfTestProbe.run(getApplicationContext(), new AtomicBoolean(false)); + String fingerprint = sha256(report); + NetworkConditions next = new NetworkConditions(now, fingerprint, report, false); + NetworkConditions prev; + synchronized (lock) { + prev = cached; + cached = next; + } + boolean changed = prev == null || !fingerprint.equals(prev.fingerprint); + if (captureActive && changed) { + appendCaptureEvent(reason, next); + } + if (changed || forceNotifyIfChanged) { + notifyListeners(next, changed); + } + } finally { + refreshing.set(false); + } + }); + } + + private void notifyListeners(NetworkConditions current, boolean changed) { + // Requirement: no push notifications when conditions have not changed. + if (!changed) { + return; + } + int n = listeners.beginBroadcast(); + try { + for (int i = 0; i < n; i++) { + INetworkChangeListener cb = listeners.getBroadcastItem(i); + if (cb == null) { + continue; + } + try { + cb.onNetworkConditionChange(current); + } catch (RemoteException ignored) { + } + } + } finally { + listeners.finishBroadcast(); + } + } + + private void registerNetworkCallback() { + if (connectivityManager == null || networkCallback != null) { + return; + } + networkCallback = new ConnectivityManager.NetworkCallback() { + @Override + public void onAvailable(Network network) { + onNetworkChange(); + } + + @Override + public void onLost(Network network) { + onNetworkChange(); + } + + @Override + public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { + onNetworkChange(); + } + }; + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + connectivityManager.registerDefaultNetworkCallback(networkCallback); + } else { + NetworkRequest req = new NetworkRequest.Builder().build(); + connectivityManager.registerNetworkCallback(req, networkCallback); + } + } catch (Exception ignored) { + } + } + + private void unregisterNetworkCallback() { + if (connectivityManager == null || networkCallback == null) { + return; + } + try { + connectivityManager.unregisterNetworkCallback(networkCallback); + } catch (Exception ignored) { + } + networkCallback = null; + } + + private void onNetworkChange() { + if (!captureActive) { + return; + } + requestRefreshInternal(true, "network_changed"); + } + + private void restartPeriodicTask() { + if (worker == null) { + return; + } + worker.removeCallbacks(periodicTask); + worker.post(periodicTask); + } + + private void setCaptureActive(boolean active) { + synchronized (lock) { + if (captureActive == active) { + return; + } + captureActive = active; + if (active) { + captureSessionStartedUtcSec = System.currentTimeMillis() / 1000L; + captureEvents = new JSONArray(); + rotateCaptureFiles(); + requestRefreshInternal(true, "capture_start"); + } else { + flushCaptureJournal(); + } + } + } + + private void appendCaptureEvent(String reason, NetworkConditions conditions) { + synchronized (lock) { + if (!captureActive) { + return; + } + try { + JSONObject event = new JSONObject(); + event.put("ts_ms", System.currentTimeMillis()); + event.put("reason", reason); + event.put("collected_at_ms", conditions.collectedAtMs); + event.put("fingerprint", conditions.fingerprint); + event.put("report", conditions.reportText); + captureEvents.put(event); + } catch (Exception ignored) { + } + flushCaptureJournal(); + } + } + + private void flushCaptureJournal() { + synchronized (lock) { + if (captureSessionStartedUtcSec <= 0) { + return; + } + File out = new File(getFilesDir(), "net_conn_" + captureSessionStartedUtcSec + ".json"); + try { + JSONObject root = new JSONObject(); + root.put("session_start_utc", captureSessionStartedUtcSec); + root.put("capture_active", captureActive); + root.put("events", captureEvents); + try (FileOutputStream fos = new FileOutputStream(out, false)) { + fos.write(root.toString(2).getBytes(StandardCharsets.UTF_8)); + } + } catch (Exception ignored) { + } + } + } + + private void rotateCaptureFiles() { + File dir = getFilesDir(); + File[] files = dir.listFiles((d, name) -> name.startsWith("net_conn_") && name.endsWith(".json")); + if (files == null || files.length <= 20) { + return; + } + List all = new ArrayList<>(Arrays.asList(files)); + all.sort(Comparator.comparingLong(File::lastModified).reversed()); + for (int i = 20; i < all.size(); i++) { + //noinspection ResultOfMethodCallIgnored + all.get(i).delete(); + } + } + + private static String sha256(String text) { + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] digest = md.digest((text != null ? text : "").getBytes(StandardCharsets.UTF_8)); + StringBuilder sb = new StringBuilder(digest.length * 2); + for (byte b : digest) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } catch (Exception e) { + return Long.toHexString(System.currentTimeMillis()); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/CombinedProtectionEngine.java b/app/src/main/java/com/foxx/androidcast/network/transport/CombinedProtectionEngine.java new file mode 100644 index 0000000..d213e66 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/CombinedProtectionEngine.java @@ -0,0 +1,57 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * CombinedProtectionEngine.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CombinedProtectionEngine + * Contributors: + * - Anton Afanasyeu (3 commits, 53 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 8d2e19bd4e7b93efa54061257dd4a0c09d3ec026e67d46344cd5267ac8d34217 +**********************************************************************/ +/** FEC 3/4 (default) plus NACK retransmission. */ +public final class CombinedProtectionEngine implements StreamProtectionEngine { + private final FecProtectionEngine fec; + private final NackProtectionEngine nack; + + public CombinedProtectionEngine(FecProtectionEngine fec, NackProtectionEngine nack) { + this.fec = fec; + this.nack = nack; + } + + public NackProtectionEngine nack() { + return nack; + } + + public FecProtectionEngine fec() { + return fec; + } + + @Override + public StreamProtectionMode mode() { + return fec.mode() == StreamProtectionMode.FEC_REED_SOLOMON + ? StreamProtectionMode.FEC_REED_SOLOMON + : StreamProtectionMode.FEC_3_4; + } + + @Override + public byte[] onOutboundPayload(byte type, byte[] payload) { + return fec.onOutboundPayload(type, payload); + } + + @Override + public byte[] onInboundPayload(byte type, byte[] payload) { + return fec.onInboundPayload(type, payload); + } + + @Override + public void onNack(int messageId) { + nack.onNack(messageId); + } + + public NackProtectionEngine getNack() { + return nack; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/FecProtectionEngine.java b/app/src/main/java/com/foxx/androidcast/network/transport/FecProtectionEngine.java new file mode 100644 index 0000000..dd90ca7 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/FecProtectionEngine.java @@ -0,0 +1,281 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * FecProtectionEngine.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class FecProtectionEngine + * Contributors: + * - Anton Afanasyeu (4 commits, 277 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 8440267db9d075ca98198af006689f0eb1aa6e5babddb197e421b39db055909e +**********************************************************************/ +import com.foxx.androidcast.network.CastProtoHeader; +import com.foxx.androidcast.network.CastProtocol; +import com.foxx.androidcast.network.transport.fec.FecEncodedGroup; +import com.foxx.androidcast.network.transport.fec.FecShardReassembly; +import com.foxx.androidcast.network.transport.fec.FecShardWire; +import com.foxx.androidcast.network.transport.fec.ProtectionEnvelope; +import com.foxx.androidcast.network.transport.fec.ReedSolomonFec; + +import android.util.Log; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +/** Reed-Solomon FEC: one shard per UDP message; v1 monolithic decode still accepted inbound. */ +public final class FecProtectionEngine implements StreamProtectionEngine { + private static final String TAG = "FecProtection"; + private static final AtomicInteger NEXT_GROUP_ID = new AtomicInteger(1); + private static final int LOG_EVERY_N = 32; + private int inboundShardRejectLogCount; + private int inboundDecodeFailLogCount; + + private final byte mode; + private final int dataShards; + private final int parityShards; + private final TransportLossStats stats; + private final StreamProtectionMode protectionMode; + private final Map inboundGroups = new ConcurrentHashMap<>(); + + public FecProtectionEngine(byte envelopeMode, int dataShards, int parityShards, + TransportLossStats stats) { + this.mode = envelopeMode; + this.dataShards = dataShards; + this.parityShards = parityShards; + this.stats = stats; + this.protectionMode = envelopeMode == ProtectionEnvelope.MODE_REED_SOLOMON + ? StreamProtectionMode.FEC_REED_SOLOMON + : StreamProtectionMode.FEC_3_4; + } + + public static FecProtectionEngine extract(StreamProtectionEngine engine) { + if (engine instanceof FecProtectionEngine) { + return (FecProtectionEngine) engine; + } + if (engine instanceof CombinedProtectionEngine) { + return ((CombinedProtectionEngine) engine).fec(); + } + return null; + } + + @Override + public StreamProtectionMode mode() { + return protectionMode; + } + + /** Pick shard counts so each ACUD logical message stays small on lossy Wi‑Fi. */ + static int[] shardPlanForPayload(int payloadLength, int defaultData, int defaultParity) { + if (payloadLength > 64_000) { + return new int[] {16, 8}; + } + if (payloadLength > 16_000) { + return new int[] {8, 4}; + } + return new int[] {defaultData, defaultParity}; + } + + public FecEncodedGroup encodeGroup(byte[] payload) throws IOException { + if (payload == null || payload.length == 0) { + throw new IOException("empty payload"); + } + int[] plan = shardPlanForPayload(payload.length, dataShards, parityShards); + int k = plan[0]; + int m = plan[1]; + ReedSolomonFec fec = new ReedSolomonFec(k, m); + byte[][] shards = fec.encode(payload); + int groupId = NEXT_GROUP_ID.getAndIncrement(); + if (stats != null) { + synchronized (stats) { + stats.fecPacketsEncoded += shards.length; + } + } + return new FecEncodedGroup(mode, groupId, payload.length, k, m, shards); + } + + public byte[] encodeShardWire(FecEncodedGroup group, int baseMessageId, int shardIndex) + throws IOException { + return FecShardWire.encodeShard( + group.mode, + group.groupId, + baseMessageId, + shardIndex, + group.totalShards(), + group.originalLen, + group.dataShards, + group.parityShards, + group.shards[shardIndex]); + } + + public static final class ShardDecodeResult { + public enum Status { PENDING, OK, FAILED } + + public final Status status; + public final byte[] payload; + + ShardDecodeResult(Status status, byte[] payload) { + this.status = status; + this.payload = payload; + } + } + + public ShardDecodeResult onInboundShard(byte type, byte[] payload) { + if (!StreamProtectionScopes.protectsUdpPayload(type)) { + return new ShardDecodeResult(ShardDecodeResult.Status.OK, payload); + } + if (type == CastProtocol.MSG_WIRE_PACKET && looksLikeWireHeader(payload)) { + return new ShardDecodeResult(ShardDecodeResult.Status.OK, payload); + } + FecShardWire.Parsed shard = FecShardWire.tryParse(payload); + if (shard == null) { + byte[] legacy = onInboundPayload(type, payload); + if (legacy == null) { + return new ShardDecodeResult(ShardDecodeResult.Status.FAILED, null); + } + return new ShardDecodeResult(ShardDecodeResult.Status.OK, legacy); + } + FecShardReassembly assembly = inboundGroups.get(shard.groupId); + if (assembly == null) { + FecShardReassembly created = new FecShardReassembly(shard); + FecShardReassembly prev = inboundGroups.putIfAbsent(shard.groupId, created); + assembly = prev != null ? prev : created; + } + if (!assembly.addShard(shard)) { + maybeLogShardReject(shard, assembly); + byte[] retry = assembly.tryDecode(); + if (retry != null) { + inboundGroups.remove(shard.groupId); + if (stats != null) { + synchronized (stats) { + stats.fecPacketsDecoded++; + } + } + return new ShardDecodeResult(ShardDecodeResult.Status.OK, retry); + } + return new ShardDecodeResult(ShardDecodeResult.Status.PENDING, null); + } + byte[] decoded = assembly.tryDecode(); + if (decoded == null) { + if (assembly.receivedCount() >= assembly.getTotalShards()) { + if (stats != null) { + synchronized (stats) { + stats.fecDecodeFailures++; + } + } + maybeLogDecodeFail(shard.groupId, assembly.receivedCount(), assembly.getTotalShards()); + inboundGroups.remove(shard.groupId); + return new ShardDecodeResult(ShardDecodeResult.Status.FAILED, null); + } + return new ShardDecodeResult(ShardDecodeResult.Status.PENDING, null); + } + inboundGroups.remove(shard.groupId); + if (stats != null) { + synchronized (stats) { + stats.fecPacketsDecoded++; + } + } + return new ShardDecodeResult(ShardDecodeResult.Status.OK, decoded); + } + + public void expireStaleGroups(long maxAgeMs, ShardNackRequester nack) { + long now = System.currentTimeMillis(); + Iterator> it = inboundGroups.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry e = it.next(); + FecShardReassembly asm = e.getValue(); + if (now - asm.getStartedMs() <= maxAgeMs) { + continue; + } + it.remove(); + if (nack != null) { + for (int i = 0; i < asm.getTotalShards(); i++) { + if (!asm.hasShard(i)) { + nack.requestNack(asm.nackMessageIdForIndex(i)); + } + } + } + if (stats != null) { + synchronized (stats) { + stats.fecDecodeFailures++; + } + } + } + } + + public interface ShardNackRequester { + void requestNack(int messageId); + } + + @Override + public byte[] onOutboundPayload(byte type, byte[] payload) { + return payload; + } + + @Override + public byte[] onInboundPayload(byte type, byte[] payload) { + if (!StreamProtectionScopes.protectsUdpPayload(type)) { + return payload; + } + if (type == CastProtocol.MSG_WIRE_PACKET && looksLikeWireHeader(payload)) { + return payload; + } + if (FecShardWire.isShardPacket(payload)) { + ShardDecodeResult shard = onInboundShard(type, payload); + if (shard.status == ShardDecodeResult.Status.OK) { + return shard.payload; + } + return null; + } + if (!ProtectionEnvelope.isProtected(payload)) { + return payload; + } + ProtectionEnvelope.Decoded decoded = ProtectionEnvelope.tryDecode(payload); + if (decoded == null) { + return payload; + } + if (!decoded.complete) { + if (stats != null) { + synchronized (stats) { + stats.fecDecodeFailures++; + } + } + return null; + } + if (stats != null) { + synchronized (stats) { + stats.fecPacketsDecoded++; + } + } + return decoded.payload; + } + + private void maybeLogShardReject(FecShardWire.Parsed shard, FecShardReassembly assembly) { + if ((++inboundShardRejectLogCount % LOG_EVERY_N) != 1) { + return; + } + Log.w(TAG, "FEC shard reject gid=" + shard.groupId + " idx=" + shard.shardIndex + + " shardLen=" + shard.shardData.length + " recv=" + assembly.receivedCount() + + "/" + assembly.getTotalShards()); + } + + private void maybeLogDecodeFail(int groupId, int received, int total) { + if ((++inboundDecodeFailLogCount % LOG_EVERY_N) != 1) { + return; + } + Log.w(TAG, "FEC RS decode failed gid=" + groupId + " shards=" + received + "/" + total); + } + + private static boolean looksLikeWireHeader(byte[] payload) { + if (payload == null || payload.length < 4) { + return false; + } + int magic = ByteBuffer.wrap(payload, 0, 4).order(ByteOrder.LITTLE_ENDIAN).getInt(); + return magic == CastProtoHeader.MAGIC; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/NackProtectionEngine.java b/app/src/main/java/com/foxx/androidcast/network/transport/NackProtectionEngine.java new file mode 100644 index 0000000..9c33788 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/NackProtectionEngine.java @@ -0,0 +1,109 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * NackProtectionEngine.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class NackProtectionEngine + * Contributors: + * - Anton Afanasyeu (3 commits, 105 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 2143666c7b09b385a3f29fa6e162b0e1bdbc4014c53ca141e84d780ea63fa03a +**********************************************************************/ +import com.foxx.androidcast.network.CastProtocol; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +/** NACK requests + retransmit cache (sender stores, receiver requests). */ +public final class NackProtectionEngine implements StreamProtectionEngine { + private final TransportLossStats stats; + private final RetransmitCache cache; + private final NackRateLimiter rateLimiter = new NackRateLimiter(); + private NackSender nackSender; + + public interface NackSender { + void sendNack(int messageId) throws IOException; + } + + public NackProtectionEngine(TransportLossStats stats, RetransmitCache cache) { + this.stats = stats; + this.cache = cache != null ? cache : new RetransmitCache(); + } + + public void setNackSender(NackSender sender) { + this.nackSender = sender; + } + + public RetransmitCache getCache() { + return cache; + } + + @Override + public StreamProtectionMode mode() { + return StreamProtectionMode.NACK; + } + + @Override + public byte[] onOutboundPayload(byte type, byte[] payload) { + return payload; + } + + @Override + public byte[] onInboundPayload(byte type, byte[] payload) { + return payload; + } + + @Override + public void onNack(int messageId) { + if (stats != null) { + synchronized (stats) { + stats.nackRequestsReceived++; + } + } + } + + public void requestNack(int messageId) { + if (!rateLimiter.allow(messageId)) { + return; + } + if (stats != null) { + synchronized (stats) { + stats.nackRequestsSent++; + } + } + if (nackSender != null) { + try { + nackSender.sendNack(messageId); + } catch (IOException ignored) { + } + } + } + + public static byte[] nackPayload(int messageId) throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(8); + DataOutputStream dos = new DataOutputStream(bos); + dos.writeInt(messageId); + return bos.toByteArray(); + } + + public static int parseNackPayload(byte[] payload) { + if (payload == null || payload.length < 4) { + return -1; + } + return ((payload[0] & 0xFF) << 24) | ((payload[1] & 0xFF) << 16) + | ((payload[2] & 0xFF) << 8) | (payload[3] & 0xFF); + } + + private RetransmitHandler retransmitHandler; + + public void setRetransmitHandler(RetransmitHandler handler) { + this.retransmitHandler = handler; + } + + public interface RetransmitHandler { + void retransmit(byte wireType, byte[] body); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/NackRateLimiter.java b/app/src/main/java/com/foxx/androidcast/network/transport/NackRateLimiter.java new file mode 100644 index 0000000..8c540b2 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/NackRateLimiter.java @@ -0,0 +1,57 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * NackRateLimiter.java + * Created at: Mon 18 May 2026 14:25:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class NackRateLimiter + * Contributors: + * - Anton Afanasyeu (2 commits, 53 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 fb01ac8cf405797ee3f320822e701f6c0b401a7f75c221b92eb132cd4aaa9b3e +**********************************************************************/ +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** Limits outbound NACK storms per message id. */ +public final class NackRateLimiter { + private static final long MIN_INTERVAL_MS = 40L; + private static final int MAX_NACKS_PER_MESSAGE = 6; + private static final long ENTRY_TTL_MS = 30_000L; + + private final Map entries = new ConcurrentHashMap<>(); + + public boolean allow(int messageId) { + long now = System.currentTimeMillis(); + pruneExpired(now); + Entry e = entries.computeIfAbsent(messageId, id -> new Entry()); + synchronized (e) { + if (e.count >= MAX_NACKS_PER_MESSAGE) { + return false; + } + if (now - e.lastRequestMs < MIN_INTERVAL_MS) { + return false; + } + e.lastRequestMs = now; + e.count++; + return true; + } + } + + public void pruneExpired(long nowMs) { + Iterator> it = entries.entrySet().iterator(); + while (it.hasNext()) { + Entry e = it.next().getValue(); + if (nowMs - e.lastRequestMs > ENTRY_TTL_MS) { + it.remove(); + } + } + } + + private static final class Entry { + long lastRequestMs; + int count; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/ProtectionNegotiationPrompts.java b/app/src/main/java/com/foxx/androidcast/network/transport/ProtectionNegotiationPrompts.java new file mode 100644 index 0000000..277d65a --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/ProtectionNegotiationPrompts.java @@ -0,0 +1,67 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * ProtectionNegotiationPrompts.java + * Created at: Tue 19 May 2026 12:23:39 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class ProtectionNegotiationPrompts + * Contributors: + * - Anton Afanasyeu (2 commits, 63 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 26526ff9e1f666fd34f2592b5d7379e1e731ce89b10b587b3c2fc362248ef211 +**********************************************************************/ +import android.content.Context; + +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.R; + +/** Formats {@link StreamProtectionNegotiation.Prompt} for logs and on-screen status. */ +public final class ProtectionNegotiationPrompts { + private ProtectionNegotiationPrompts() {} + + public static String format(Context context, StreamProtectionNegotiation.Prompt prompt, + boolean localIsReceiver) { + if (context == null || prompt == null) { + return ""; + } + String local = label(context, prompt.localPreference); + String remote = label(context, prompt.remotePreference); + String role = context.getString(prompt.target == StreamProtectionNegotiation.Prompt.Target.SENDER + ? R.string.protection_negotiation_role_sender + : R.string.protection_negotiation_role_receiver); + return context.getString(prompt.messageResId, local, remote, role); + } + + public static String summarize(Context context, StreamProtectionNegotiation negotiation) { + if (context == null || negotiation == null) { + return ""; + } + String mode = label(context, negotiation.agreed); + String nack = negotiation.nackEnabled + ? context.getString(R.string.protection_negotiation_nack_on) + : context.getString(R.string.protection_negotiation_nack_off); + return context.getString(R.string.protection_negotiation_agreed, mode, nack); + } + + public static String label(Context context, CastSettings.StreamProtection mode) { + if (context == null || mode == null) { + return "?"; + } + switch (mode) { + case FEC_3_4: + return context.getString(R.string.protection_fec_34); + case FEC_REED_SOLOMON: + return context.getString(R.string.protection_fec_rs); + case NACK: + return context.getString(R.string.protection_nack); + case FEC_NACK: + return context.getString(R.string.protection_fec_nack); + case AUTO: + return context.getString(R.string.option_auto); + case NONE: + default: + return context.getString(R.string.protection_none); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/RetransmitCache.java b/app/src/main/java/com/foxx/androidcast/network/transport/RetransmitCache.java new file mode 100644 index 0000000..3b82351 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/RetransmitCache.java @@ -0,0 +1,64 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * RetransmitCache.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class RetransmitCache + * Contributors: + * - Anton Afanasyeu (3 commits, 60 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 410e0a7afeb307c0221d8866c4cda59e112d4db6ef2771e89028cf686e5976be +**********************************************************************/ +import java.util.LinkedHashMap; +import java.util.Map; + +/** Ring buffer of recent UDP logical messages for NACK retransmission. */ +public final class RetransmitCache { + /** VP9+FEC uses 7 message ids per frame; must cover several seconds of in-flight shards. */ + private static final int DEFAULT_CAPACITY = 4096; + + private final int capacity; + private final LinkedHashMap map; + + public RetransmitCache() { + this(DEFAULT_CAPACITY); + } + + public RetransmitCache(int capacity) { + this.capacity = Math.max(8, capacity); + this.map = new LinkedHashMap(capacity + 1, 0.75f, true) { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > RetransmitCache.this.capacity; + } + }; + } + + public void put(int messageId, byte wireType, byte[] body) { + if (body == null) { + return; + } + synchronized (map) { + map.put(messageId, new CachedMessage(wireType, body.clone())); + } + } + + public CachedMessage get(int messageId) { + synchronized (map) { + CachedMessage e = map.get(messageId); + return e != null ? new CachedMessage(e.wireType, e.body.clone()) : null; + } + } + + public static final class CachedMessage { + public final byte wireType; + public final byte[] body; + + CachedMessage(byte wireType, byte[] body) { + this.wireType = wireType; + this.body = body; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionCapability.java b/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionCapability.java new file mode 100644 index 0000000..a8d94dc --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionCapability.java @@ -0,0 +1,69 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * StreamProtectionCapability.java + * Created at: Tue 19 May 2026 12:23:39 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class StreamProtectionCapability + * Contributors: + * - Anton Afanasyeu (2 commits, 53 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 2964f9d7b3c1de2f07bba4f8974f0694e8e70ca5c826053a8b45113007fb0655 +**********************************************************************/ +import com.foxx.androidcast.CastSettings; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; + +/** Runtime FEC/NACK implementations on this device (not a user setting). */ +public final class StreamProtectionCapability { + private StreamProtectionCapability() {} + + /** Wire value: receiver supports negotiation from {@link #receiverImplementations()}. */ + public static CastSettings.StreamProtection handshakeAdvertisement() { + return CastSettings.StreamProtection.AUTO; + } + + public static boolean isAutoAdvertisement(CastSettings.StreamProtection mode) { + return mode == null || mode == CastSettings.StreamProtection.AUTO; + } + + /** Modes this build can encode/decode over UDP. */ + public static EnumSet receiverImplementations() { + return EnumSet.of( + CastSettings.StreamProtection.FEC_3_4, + CastSettings.StreamProtection.FEC_REED_SOLOMON, + CastSettings.StreamProtection.NACK, + CastSettings.StreamProtection.FEC_NACK, + CastSettings.StreamProtection.NONE); + } + + public static boolean supports(CastSettings.StreamProtection mode) { + CastSettings.StreamProtection n = StreamProtectionNegotiator.normalize(mode); + return receiverImplementations().contains(n); + } + + public static EnumSet resolveRemoteCapability( + CastSettings.StreamProtection remote) { + if (isAutoAdvertisement(remote)) { + return receiverImplementations(); + } + CastSettings.StreamProtection n = StreamProtectionNegotiator.normalize(remote); + if (supports(n)) { + return EnumSet.of(n); + } + return EnumSet.of(CastSettings.StreamProtection.NONE); + } + + /** Modes this device advertises on the wire (handshake uses AUTO → full set). */ + public static List advertisedProtectionInOrder() { + List out = new ArrayList<>(); + out.add("AUTO (handshake)"); + for (CastSettings.StreamProtection mode : receiverImplementations()) { + out.add(mode.name()); + } + return out; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionCompat.java b/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionCompat.java new file mode 100644 index 0000000..7c577d3 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionCompat.java @@ -0,0 +1,37 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * StreamProtectionCompat.java + * Created at: Mon 18 May 2026 14:25:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class StreamProtectionCompat + * Contributors: + * - Anton Afanasyeu (2 commits, 33 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 49de97502e18546009f074f42933ba0dadb2b8a6d574e5cd73902e69085a68bd +**********************************************************************/ +import com.foxx.androidcast.network.transport.fec.FecShardWire; +import com.foxx.androidcast.network.transport.fec.ProtectionEnvelope; + +/** + * Backward-compatible handling of optional UDP stream protection (FEC/NACK). + * Peers that did not negotiate protection must ignore protected payloads without + * disconnecting or feeding decoders. + */ +public final class StreamProtectionCompat { + private StreamProtectionCompat() {} + + /** True when the payload uses FEC wrapping this peer is not applying. */ + public static boolean isForeignProtectionPayload(byte[] body) { + if (body == null || body.length < 4) { + return false; + } + return FecShardWire.isShardPacket(body) || ProtectionEnvelope.isProtected(body); + } + + /** Drop foreign protection silently (no NACK) when {@code activeMode} is {@link StreamProtectionMode#NONE}. */ + public static boolean shouldIgnoreInbound(byte[] body, StreamProtectionMode activeMode) { + return activeMode == StreamProtectionMode.NONE && isForeignProtectionPayload(body); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionEngine.java b/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionEngine.java new file mode 100644 index 0000000..16fbd1c --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionEngine.java @@ -0,0 +1,50 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * StreamProtectionEngine.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * interface StreamProtectionEngine + * Contributors: + * - Anton Afanasyeu (3 commits, 46 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 e5fb2347ba725ee16f5078394e2cbed9ac6c73b7f3328a04306d82f1af496e14 +**********************************************************************/ +/** + * FEC / NACK over UDP logical payloads (before ACUD fragmentation). + */ +public interface StreamProtectionEngine { + StreamProtectionMode mode(); + + /** Called before UDP payload is fragmented (outbound). */ + byte[] onOutboundPayload(byte type, byte[] payload); + + /** + * Called when a reassembled UDP message is ready (inbound). + * Return {@code null} to signal decode failure (may trigger NACK). + */ + byte[] onInboundPayload(byte type, byte[] payload); + + /** Sender handles NACK for a lost {@code messageId}. */ + default void onNack(int messageId) {} + + static StreamProtectionEngine noop() { + return new StreamProtectionEngine() { + @Override + public StreamProtectionMode mode() { + return StreamProtectionMode.NONE; + } + + @Override + public byte[] onOutboundPayload(byte type, byte[] payload) { + return payload; + } + + @Override + public byte[] onInboundPayload(byte type, byte[] payload) { + return payload; + } + }; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionFactory.java b/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionFactory.java new file mode 100644 index 0000000..0de83ce --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionFactory.java @@ -0,0 +1,76 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * StreamProtectionFactory.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class StreamProtectionFactory + * Contributors: + * - Anton Afanasyeu (3 commits, 72 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 d95251aee912c4c9073550c2ffd1db792d73e960ef11cee2143f509e716a8b44 +**********************************************************************/ +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.network.UdpCastTransport; +import com.foxx.androidcast.network.transport.fec.ProtectionEnvelope; + +/** Builds {@link StreamProtectionEngine} from {@link CastSettings.StreamProtection}. */ +public final class StreamProtectionFactory { + private static final int FEC34_DATA = 4; + private static final int FEC34_PARITY = 3; + private static final int RS_DATA = 8; + private static final int RS_PARITY = 4; + + private StreamProtectionFactory() {} + + public static StreamProtectionEngine create(CastSettings.StreamProtection setting, + TransportLossStats stats) { + return create(setting, stats, wantsBundledNack(setting)); + } + + public static StreamProtectionEngine create(CastSettings.StreamProtection setting, + TransportLossStats stats, boolean nackEnabled) { + CastSettings.StreamProtection mode = StreamProtectionNegotiator.normalize(setting); + RetransmitCache cache = new RetransmitCache(); + switch (mode) { + case NONE: + return StreamProtectionEngine.noop(); + case FEC_3_4: + return wrapFec(new FecProtectionEngine(ProtectionEnvelope.MODE_FEC_34, + FEC34_DATA, FEC34_PARITY, stats), stats, cache, nackEnabled); + case FEC_REED_SOLOMON: + return wrapFec(new FecProtectionEngine(ProtectionEnvelope.MODE_REED_SOLOMON, + RS_DATA, RS_PARITY, stats), stats, cache, nackEnabled); + case NACK: + return new NackProtectionEngine(stats, cache); + case FEC_NACK: + default: + FecProtectionEngine fec = new FecProtectionEngine(ProtectionEnvelope.MODE_FEC_NACK, + FEC34_DATA, FEC34_PARITY, stats); + NackProtectionEngine nack = new NackProtectionEngine(stats, cache); + return new CombinedProtectionEngine(fec, nack); + } + } + + private static StreamProtectionEngine wrapFec(FecProtectionEngine fec, + TransportLossStats stats, RetransmitCache cache, boolean nackEnabled) { + if (!nackEnabled) { + return fec; + } + return new CombinedProtectionEngine(fec, new NackProtectionEngine(stats, cache)); + } + + private static boolean wantsBundledNack(CastSettings.StreamProtection mode) { + return mode == CastSettings.StreamProtection.FEC_3_4 + || mode == CastSettings.StreamProtection.FEC_NACK + || mode == CastSettings.StreamProtection.FEC_REED_SOLOMON; + } + + public static void wireUdp(UdpCastTransport udp, StreamProtectionEngine engine) { + if (udp == null || engine == null) { + return; + } + udp.setProtectionEngine(engine); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionMode.java b/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionMode.java new file mode 100644 index 0000000..d9ba603 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionMode.java @@ -0,0 +1,49 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * StreamProtectionMode.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * enum StreamProtectionMode + * Contributors: + * - Anton Afanasyeu (4 commits, 45 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 70fb0edd14bcdef8391f5739ab0f54beba0cee3a5e9dc90e7e8e1c0347134b6c +**********************************************************************/ +/** Active UDP stream protection mode. */ +public enum StreamProtectionMode { + NONE, + FEC_3_4, + FEC_REED_SOLOMON, + NACK, + FEC_NACK; + + public boolean isActive() { + return this != NONE; + } + + public boolean usesFec() { + return this == FEC_3_4 || this == FEC_REED_SOLOMON || this == FEC_NACK; + } + + public boolean usesNack() { + return this == NACK || this == FEC_NACK; + } + + public String wireLabel() { + switch (this) { + case FEC_3_4: + return "FEC 3/4"; + case FEC_REED_SOLOMON: + return "FEC Reed-Solomon"; + case NACK: + return "NACK"; + case FEC_NACK: + return "FEC 3/4 + NACK"; + case NONE: + default: + return "NONE"; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionNegotiation.java b/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionNegotiation.java new file mode 100644 index 0000000..982c1a8 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionNegotiation.java @@ -0,0 +1,56 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * StreamProtectionNegotiation.java + * Created at: Tue 19 May 2026 12:23:39 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class StreamProtectionNegotiation + * Contributors: + * - Anton Afanasyeu (2 commits, 52 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 a4955f74abcb34c96613501e0f6eb25d3889e73816c7a324f7edd39be2253d99 +**********************************************************************/ +import com.foxx.androidcast.CastSettings; + +/** Outcome of matching local/remote {@link CastSettings.StreamProtection} preferences. */ +public final class StreamProtectionNegotiation { + public final CastSettings.StreamProtection agreed; + public final boolean nackEnabled; + public final Prompt prompt; + + public StreamProtectionNegotiation(CastSettings.StreamProtection agreed, boolean nackEnabled, + Prompt prompt) { + this.agreed = agreed != null ? agreed : CastSettings.StreamProtection.NONE; + this.nackEnabled = nackEnabled; + this.prompt = prompt; + } + + public static StreamProtectionNegotiation none() { + return new StreamProtectionNegotiation(CastSettings.StreamProtection.NONE, false, null); + } + + public static final class Prompt { + public enum Target { + /** Ask the casting phone to change stream protection in settings. */ + SENDER, + /** Ask the receiver device to change stream protection in settings. */ + RECEIVER + } + + public final Target target; + /** String resource id for a short user-visible hint. */ + public final int messageResId; + public final CastSettings.StreamProtection localPreference; + public final CastSettings.StreamProtection remotePreference; + + public Prompt(Target target, int messageResId, + CastSettings.StreamProtection localPreference, + CastSettings.StreamProtection remotePreference) { + this.target = target; + this.messageResId = messageResId; + this.localPreference = localPreference; + this.remotePreference = remotePreference; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionNegotiator.java b/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionNegotiator.java new file mode 100644 index 0000000..25abc08 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionNegotiator.java @@ -0,0 +1,253 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * StreamProtectionNegotiator.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class StreamProtectionNegotiator + * Contributors: + * - Anton Afanasyeu (4 commits, 249 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 591201c333c776d898de736e339b1b74d3cbdba88e0230611e3aaf2f128ce08a +**********************************************************************/ +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.R; + +import java.util.EnumSet; + +/** Picks agreed stream protection from receiver capability vs sender preference. */ +public final class StreamProtectionNegotiator { + private StreamProtectionNegotiator() {} + + /** @deprecated Use {@link #negotiate(CastSettings.StreamProtection, CastSettings.StreamProtection, boolean)}. */ + @Deprecated + public static CastSettings.StreamProtection resolve(CastSettings.StreamProtection local, + CastSettings.StreamProtection remote) { + return negotiate(local, remote, false).agreed; + } + + /** + * @param local sender preference when {@code localIsReceiver} is false; ignored on receiver + * (capability is auto-detected) + * @param remote sender preference when {@code localIsReceiver}; receiver wire adv. when sender + */ + public static StreamProtectionNegotiation negotiate(CastSettings.StreamProtection local, + CastSettings.StreamProtection remote, boolean localIsReceiver) { + EnumSet receiverCaps; + CastSettings.StreamProtection senderPref; + if (localIsReceiver) { + receiverCaps = StreamProtectionCapability.receiverImplementations(); + senderPref = remote; + } else { + senderPref = local; + receiverCaps = StreamProtectionCapability.resolveRemoteCapability(remote); + } + return negotiateWithReceiverCaps(receiverCaps, senderPref, local, remote, localIsReceiver); + } + + private static StreamProtectionNegotiation negotiateWithReceiverCaps( + EnumSet receiverCaps, + CastSettings.StreamProtection senderPref, + CastSettings.StreamProtection localRaw, + CastSettings.StreamProtection remoteRaw, + boolean localIsReceiver) { + CastSettings.StreamProtection sender = normalize(senderPref); + CastSettings.StreamProtection receiverLabel = localIsReceiver + ? StreamProtectionCapability.handshakeAdvertisement() + : pickRepresentativeCap(receiverCaps); + + if (sender == CastSettings.StreamProtection.NONE) { + if (receiverCaps.stream().anyMatch(StreamProtectionNegotiator::isFec)) { + StreamProtectionNegotiation.Prompt.Target target = localIsReceiver + ? StreamProtectionNegotiation.Prompt.Target.SENDER + : StreamProtectionNegotiation.Prompt.Target.RECEIVER; + return new StreamProtectionNegotiation( + CastSettings.StreamProtection.NONE, + false, + new StreamProtectionNegotiation.Prompt( + target, + R.string.protection_negotiation_use_none, + receiverLabel, + senderPref)); + } + return StreamProtectionNegotiation.none(); + } + + if (receiverCaps.contains(sender)) { + return agreeExact(sender, receiverLabel, senderPref); + } + + if (isFec34(sender) && normalize(remoteRaw) == CastSettings.StreamProtection.FEC_NACK) { + return fec34WithoutNack(receiverLabel, senderPref, localIsReceiver); + } + + if (isNackOnly(sender) && receiverCaps.stream().anyMatch(StreamProtectionNegotiator::isFec)) { + CastSettings.StreamProtection fec = receiverCaps.contains(CastSettings.StreamProtection.FEC_NACK) + ? CastSettings.StreamProtection.FEC_NACK + : receiverCaps.contains(CastSettings.StreamProtection.FEC_3_4) + ? CastSettings.StreamProtection.FEC_3_4 + : CastSettings.StreamProtection.FEC_REED_SOLOMON; + return agreeFecWithNack(fec, receiverLabel, senderPref, localIsReceiver); + } + + if (isFec(sender)) { + if (isFec34(sender) && receiverCaps.contains(CastSettings.StreamProtection.FEC_REED_SOLOMON)) { + return negotiateFecFamilyMismatch( + CastSettings.StreamProtection.FEC_REED_SOLOMON, + CastSettings.StreamProtection.FEC_3_4, + receiverLabel, + senderPref, + localIsReceiver); + } + if (sender == CastSettings.StreamProtection.FEC_REED_SOLOMON + && receiverCaps.contains(CastSettings.StreamProtection.FEC_3_4)) { + return negotiateFecFamilyMismatch( + CastSettings.StreamProtection.FEC_REED_SOLOMON, + CastSettings.StreamProtection.FEC_3_4, + receiverLabel, + senderPref, + localIsReceiver); + } + StreamProtectionNegotiation.Prompt.Target target = localIsReceiver + ? StreamProtectionNegotiation.Prompt.Target.SENDER + : StreamProtectionNegotiation.Prompt.Target.RECEIVER; + return new StreamProtectionNegotiation( + CastSettings.StreamProtection.NONE, + false, + new StreamProtectionNegotiation.Prompt( + target, + R.string.protection_negotiation_use_none, + receiverLabel, + senderPref)); + } + + StreamProtectionNegotiation.Prompt.Target target = localIsReceiver + ? StreamProtectionNegotiation.Prompt.Target.SENDER + : StreamProtectionNegotiation.Prompt.Target.RECEIVER; + return new StreamProtectionNegotiation( + CastSettings.StreamProtection.NONE, + false, + new StreamProtectionNegotiation.Prompt( + target, + R.string.protection_negotiation_mismatch, + receiverLabel, + senderPref)); + } + + private static CastSettings.StreamProtection pickRepresentativeCap( + EnumSet caps) { + if (caps.contains(CastSettings.StreamProtection.FEC_REED_SOLOMON)) { + return CastSettings.StreamProtection.FEC_REED_SOLOMON; + } + if (caps.contains(CastSettings.StreamProtection.FEC_3_4)) { + return CastSettings.StreamProtection.FEC_3_4; + } + if (caps.contains(CastSettings.StreamProtection.FEC_NACK)) { + return CastSettings.StreamProtection.FEC_NACK; + } + if (caps.contains(CastSettings.StreamProtection.NACK)) { + return CastSettings.StreamProtection.NACK; + } + return CastSettings.StreamProtection.NONE; + } + + private static StreamProtectionNegotiation negotiateFecFamilyMismatch( + CastSettings.StreamProtection agreed, + CastSettings.StreamProtection other, + CastSettings.StreamProtection receiverLabel, + CastSettings.StreamProtection senderPref, + boolean localIsReceiver) { + StreamProtectionNegotiation.Prompt.Target target = localIsReceiver + ? StreamProtectionNegotiation.Prompt.Target.SENDER + : StreamProtectionNegotiation.Prompt.Target.RECEIVER; + boolean nack = wantsNack(other); + if (isFecNack(other)) { + nack = false; + } + return new StreamProtectionNegotiation( + agreed, + nack, + new StreamProtectionNegotiation.Prompt( + target, + R.string.protection_negotiation_fec_family_rs, + receiverLabel, + senderPref)); + } + + private static StreamProtectionNegotiation fec34WithoutNack( + CastSettings.StreamProtection receiverLabel, + CastSettings.StreamProtection senderPref, + boolean localIsReceiver) { + StreamProtectionNegotiation.Prompt.Target target = localIsReceiver + ? StreamProtectionNegotiation.Prompt.Target.SENDER + : StreamProtectionNegotiation.Prompt.Target.RECEIVER; + return new StreamProtectionNegotiation( + CastSettings.StreamProtection.FEC_3_4, + false, + new StreamProtectionNegotiation.Prompt( + target, + R.string.protection_negotiation_fec34_no_nack, + receiverLabel, + senderPref)); + } + + private static StreamProtectionNegotiation agreeFecWithNack( + CastSettings.StreamProtection fecMode, + CastSettings.StreamProtection receiverLabel, + CastSettings.StreamProtection senderPref, + boolean localIsReceiver) { + StreamProtectionNegotiation.Prompt.Target target = localIsReceiver + ? StreamProtectionNegotiation.Prompt.Target.SENDER + : StreamProtectionNegotiation.Prompt.Target.RECEIVER; + return new StreamProtectionNegotiation( + fecMode, + true, + new StreamProtectionNegotiation.Prompt( + target, + R.string.protection_negotiation_nack_to_fec, + receiverLabel, + senderPref)); + } + + private static StreamProtectionNegotiation agreeExact( + CastSettings.StreamProtection mode, + CastSettings.StreamProtection receiverLabel, + CastSettings.StreamProtection senderPref) { + boolean nack = wantsNack(mode); + if (mode == CastSettings.StreamProtection.FEC_3_4) { + nack = true; + } + return new StreamProtectionNegotiation(mode, nack, null); + } + + public static CastSettings.StreamProtection normalize(CastSettings.StreamProtection mode) { + if (mode == null || mode == CastSettings.StreamProtection.AUTO) { + return CastSettings.StreamProtection.NONE; + } + return mode; + } + + private static boolean wantsNack(CastSettings.StreamProtection mode) { + return mode == CastSettings.StreamProtection.NACK + || mode == CastSettings.StreamProtection.FEC_NACK; + } + + private static boolean isNackOnly(CastSettings.StreamProtection mode) { + return mode == CastSettings.StreamProtection.NACK; + } + + private static boolean isFec(CastSettings.StreamProtection mode) { + return mode == CastSettings.StreamProtection.FEC_3_4 + || mode == CastSettings.StreamProtection.FEC_REED_SOLOMON + || mode == CastSettings.StreamProtection.FEC_NACK; + } + + private static boolean isFec34(CastSettings.StreamProtection mode) { + return mode == CastSettings.StreamProtection.FEC_3_4; + } + + private static boolean isFecNack(CastSettings.StreamProtection mode) { + return mode == CastSettings.StreamProtection.FEC_NACK; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionScopes.java b/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionScopes.java new file mode 100644 index 0000000..f2f1794 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/StreamProtectionScopes.java @@ -0,0 +1,27 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * StreamProtectionScopes.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class StreamProtectionScopes + * Contributors: + * - Anton Afanasyeu (2 commits, 23 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 99d185ecec47f81b9958f1dcf7e4e8244355c57189d3d51f36628354bef0f41a +**********************************************************************/ +import com.foxx.androidcast.network.CastProtocol; + +/** Which UDP cast message types use FEC/NACK payload wrapping. */ +public final class StreamProtectionScopes { + private StreamProtectionScopes() {} + + /** Handshake and control messages stay raw; only media/stats use protection. */ + public static boolean protectsUdpPayload(byte messageType) { + return messageType == CastProtocol.MSG_VIDEO_FRAME + || messageType == CastProtocol.MSG_AUDIO_FRAME + || messageType == CastProtocol.MSG_WIRE_PACKET + || messageType == CastProtocol.MSG_NETWORK_STATS; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/TransportLossStats.java b/app/src/main/java/com/foxx/androidcast/network/transport/TransportLossStats.java new file mode 100644 index 0000000..12054ab --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/TransportLossStats.java @@ -0,0 +1,141 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * TransportLossStats.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class TransportLossStats + * Contributors: + * - Anton Afanasyeu (4 commits, 137 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 2d267619fa0169158e84e64613d7b891e0ca3e9fcdbb19c6cf747411a1a8ccf9 +**********************************************************************/ +/** + * Per-transport loss / damage counters (UDP datagrams, reassembly, app-layer drops). + * Thread-safe increments; copy for stats exchange. + */ +public final class TransportLossStats { + public long datagramsSent; + public long datagramsReceived; + public long datagramsInvalid; + public long fragmentsReceived; + public long fragmentsDuplicate; + public long reassemblyCompleted; + public long reassemblyIncomplete; + public long reassemblySuperseded; + public long wirePacketsDropped; + public long malformedPackets; + + public int sendDroppedVideoP; + public int sendDroppedAudio; + public int sendQueueDepth; + + public long recvVideoPackets; + public long recvAudioPackets; + public long recvVideoSkippedAwaitingKey; + public long recvVideoDecodeErrors; + public long recvAudioDecodeErrors; + public long recvAudioQueueDrops; + public long recvDamagedVideoFrames; + + public StreamProtectionMode protectionMode = StreamProtectionMode.NONE; + public long fecPacketsEncoded; + public long fecPacketsDecoded; + public long fecDecodeFailures; + public long nackRequestsSent; + public long nackRequestsReceived; + public long nackRetransmits; + public long nackCacheMisses; + /** Inbound FEC/protection payloads dropped (peer sent protection we did not negotiate). */ + public long unsupportedProtectionDropped; + /** Legacy wire stats (mirrors real counters). */ + public long fecPacketsStub; + public long nackRequestsStub; + public long nackRetransmitsStub; + + public synchronized void addFrom(TransportLossStats other) { + if (other == null) { + return; + } + datagramsSent += other.datagramsSent; + datagramsReceived += other.datagramsReceived; + datagramsInvalid += other.datagramsInvalid; + fragmentsReceived += other.fragmentsReceived; + fragmentsDuplicate += other.fragmentsDuplicate; + reassemblyCompleted += other.reassemblyCompleted; + reassemblyIncomplete += other.reassemblyIncomplete; + reassemblySuperseded += other.reassemblySuperseded; + wirePacketsDropped += other.wirePacketsDropped; + malformedPackets += other.malformedPackets; + sendDroppedVideoP += other.sendDroppedVideoP; + sendDroppedAudio += other.sendDroppedAudio; + recvVideoPackets += other.recvVideoPackets; + recvAudioPackets += other.recvAudioPackets; + recvVideoSkippedAwaitingKey += other.recvVideoSkippedAwaitingKey; + recvVideoDecodeErrors += other.recvVideoDecodeErrors; + recvAudioDecodeErrors += other.recvAudioDecodeErrors; + recvAudioQueueDrops += other.recvAudioQueueDrops; + recvDamagedVideoFrames += other.recvDamagedVideoFrames; + fecPacketsEncoded += other.fecPacketsEncoded; + fecPacketsDecoded += other.fecPacketsDecoded; + fecDecodeFailures += other.fecDecodeFailures; + nackRequestsSent += other.nackRequestsSent; + nackRequestsReceived += other.nackRequestsReceived; + nackRetransmits += other.nackRetransmits; + nackCacheMisses += other.nackCacheMisses; + unsupportedProtectionDropped += other.unsupportedProtectionDropped; + fecPacketsStub += other.fecPacketsStub; + nackRequestsStub += other.nackRequestsStub; + nackRetransmitsStub += other.nackRetransmitsStub; + } + + public synchronized TransportLossStats copy() { + TransportLossStats c = new TransportLossStats(); + c.datagramsSent = datagramsSent; + c.datagramsReceived = datagramsReceived; + c.datagramsInvalid = datagramsInvalid; + c.fragmentsReceived = fragmentsReceived; + c.fragmentsDuplicate = fragmentsDuplicate; + c.reassemblyCompleted = reassemblyCompleted; + c.reassemblyIncomplete = reassemblyIncomplete; + c.reassemblySuperseded = reassemblySuperseded; + c.wirePacketsDropped = wirePacketsDropped; + c.malformedPackets = malformedPackets; + c.sendDroppedVideoP = sendDroppedVideoP; + c.sendDroppedAudio = sendDroppedAudio; + c.sendQueueDepth = sendQueueDepth; + c.recvVideoPackets = recvVideoPackets; + c.recvAudioPackets = recvAudioPackets; + c.recvVideoSkippedAwaitingKey = recvVideoSkippedAwaitingKey; + c.recvVideoDecodeErrors = recvVideoDecodeErrors; + c.recvAudioDecodeErrors = recvAudioDecodeErrors; + c.recvAudioQueueDrops = recvAudioQueueDrops; + c.recvDamagedVideoFrames = recvDamagedVideoFrames; + c.protectionMode = protectionMode; + c.fecPacketsEncoded = fecPacketsEncoded; + c.fecPacketsDecoded = fecPacketsDecoded; + c.fecDecodeFailures = fecDecodeFailures; + c.nackRequestsSent = nackRequestsSent; + c.nackRequestsReceived = nackRequestsReceived; + c.nackRetransmits = nackRetransmits; + c.nackCacheMisses = nackCacheMisses; + c.unsupportedProtectionDropped = unsupportedProtectionDropped; + c.fecPacketsStub = fecPacketsStub; + c.nackRequestsStub = nackRequestsStub; + c.nackRetransmitsStub = nackRetransmitsStub; + return c; + } + + /** Sync legacy fields for network stats wire format. */ + public synchronized void publishLegacyCounters() { + fecPacketsStub = fecPacketsEncoded; + nackRequestsStub = nackRequestsSent + nackRequestsReceived; + nackRetransmitsStub = nackRetransmits; + } + + /** Estimated UDP loss: incomplete reassembly + invalid, not double-counting fragments. */ + public synchronized long estimatedUdpLossEvents() { + return reassemblyIncomplete + reassemblySuperseded + datagramsInvalid + malformedPackets; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/TransportLossStatsBridge.java b/app/src/main/java/com/foxx/androidcast/network/transport/TransportLossStatsBridge.java new file mode 100644 index 0000000..9613964 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/TransportLossStatsBridge.java @@ -0,0 +1,56 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * TransportLossStatsBridge.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class TransportLossStatsBridge + * Contributors: + * - Anton Afanasyeu (4 commits, 52 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 a0e2d68b2e6d01631f986b6e85a57a9f134d7a8dd2cc12c3fd6dd25eb99d1189 +**********************************************************************/ +import com.foxx.androidcast.network.control.NetworkStatsSnapshot; + +/** Copies {@link TransportLossStats} into {@link NetworkStatsSnapshot} for overlay / heartbeat. */ +public final class TransportLossStatsBridge { + private TransportLossStatsBridge() {} + + public static void applyTo(NetworkStatsSnapshot s, TransportLossStats loss) { + if (s == null || loss == null) { + return; + } + synchronized (loss) { + loss.publishLegacyCounters(); + s.udpDatagramsRx = loss.datagramsReceived; + s.udpDatagramsTx = loss.datagramsSent; + s.udpDatagramsInvalid = loss.datagramsInvalid; + s.udpFragmentsRx = loss.fragmentsReceived; + s.udpFragmentsDuplicate = loss.fragmentsDuplicate; + s.udpReassemblyOk = loss.reassemblyCompleted; + s.udpReassemblyLost = loss.reassemblyIncomplete + loss.reassemblySuperseded; + s.udpWireDropped = loss.wirePacketsDropped; + s.udpMalformed = loss.malformedPackets; + s.droppedPFrames = Math.max(s.droppedPFrames, loss.sendDroppedVideoP); + s.droppedAudioFrames = loss.sendDroppedAudio; + s.encodeQueueDepth = Math.max(s.encodeQueueDepth, loss.sendQueueDepth); + s.recvVideoPackets = loss.recvVideoPackets; + s.recvAudioPackets = loss.recvAudioPackets; + s.recvVideoSkippedKey = loss.recvVideoSkippedAwaitingKey; + s.recvVideoDecodeErrors = loss.recvVideoDecodeErrors; + s.recvAudioDecodeErrors = loss.recvAudioDecodeErrors; + s.recvAudioQueueDrops = loss.recvAudioQueueDrops; + s.recvDamagedVideoFrames = loss.recvDamagedVideoFrames; + s.protectionMode = loss.protectionMode.name(); + s.fecStubPackets = loss.fecPacketsEncoded; + s.fecPacketsDecoded = loss.fecPacketsDecoded; + s.fecDecodeFailures = loss.fecDecodeFailures; + s.nackStubRequests = loss.nackRequestsSent + loss.nackRequestsReceived; + long lossEvents = loss.estimatedUdpLossEvents(); + if (loss.datagramsReceived > 0 && lossEvents > 0) { + s.lossRatio = Math.min(1f, lossEvents / (float) loss.datagramsReceived); + } + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/TransportStatsProvider.java b/app/src/main/java/com/foxx/androidcast/network/transport/TransportStatsProvider.java new file mode 100644 index 0000000..6220b03 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/TransportStatsProvider.java @@ -0,0 +1,17 @@ +package com.foxx.androidcast.network.transport; + +/********************************************************************* + * TransportStatsProvider.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * interface TransportStatsProvider + * Contributors: + * - Anton Afanasyeu (2 commits, 13 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 a27f1eb0684304471faf475f8d4dee87b30edb9fbe878cf3731e70676cf738c6 +**********************************************************************/ +/** Transports that expose {@link TransportLossStats}. */ +public interface TransportStatsProvider { + TransportLossStats getLossStats(); +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/fec/FecEncodedGroup.java b/app/src/main/java/com/foxx/androidcast/network/transport/fec/FecEncodedGroup.java new file mode 100644 index 0000000..b5fa4ad --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/fec/FecEncodedGroup.java @@ -0,0 +1,36 @@ +package com.foxx.androidcast.network.transport.fec; + +/********************************************************************* + * FecEncodedGroup.java + * Created at: Mon 18 May 2026 14:25:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class FecEncodedGroup + * Contributors: + * - Anton Afanasyeu (2 commits, 32 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 cf8e39fe78582c20657f87f2b0121418e45485753750396bd752ca29a4b93a64 +**********************************************************************/ +/** Reed–Solomon shards ready for per-datagram transmission. */ +public final class FecEncodedGroup { + public final byte mode; + public final int groupId; + public final int originalLen; + public final int dataShards; + public final int parityShards; + public final byte[][] shards; + + public FecEncodedGroup(byte mode, int groupId, int originalLen, int dataShards, int parityShards, + byte[][] shards) { + this.mode = mode; + this.groupId = groupId; + this.originalLen = originalLen; + this.dataShards = dataShards; + this.parityShards = parityShards; + this.shards = shards; + } + + public int totalShards() { + return shards.length; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/fec/FecShardReassembly.java b/app/src/main/java/com/foxx/androidcast/network/transport/fec/FecShardReassembly.java new file mode 100644 index 0000000..d73363c --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/fec/FecShardReassembly.java @@ -0,0 +1,97 @@ +package com.foxx.androidcast.network.transport.fec; + +/********************************************************************* + * FecShardReassembly.java + * Created at: Mon 18 May 2026 14:25:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class FecShardReassembly + * Contributors: + * - Anton Afanasyeu (2 commits, 93 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 029547f18662efca05cb784e7216010b48c90198fc5770d1e6952f5734b39331 +**********************************************************************/ +import java.util.Arrays; + +/** Collects per-datagram FEC shards until Reed–Solomon decode succeeds. */ +public final class FecShardReassembly { + private final int groupId; + private final byte mode; + private final int originalLen; + private final int dataShards; + private final int parityShards; + private final int totalShards; + private final int shardSize; + private final int baseMessageId; + private final long startedMs; + private final byte[][] shards; + private int received; + + public FecShardReassembly(FecShardWire.Parsed first) { + groupId = first.groupId; + mode = first.mode; + originalLen = first.originalLen; + dataShards = first.dataShards; + parityShards = first.parityShards; + totalShards = first.totalShards; + shardSize = first.shardData.length; + baseMessageId = first.baseMessageId; + startedMs = System.currentTimeMillis(); + shards = new byte[totalShards][]; + } + + public int getGroupId() { + return groupId; + } + + public long getStartedMs() { + return startedMs; + } + + public int getBaseMessageId() { + return baseMessageId; + } + + public int getTotalShards() { + return totalShards; + } + + /** @return true if this shard was new */ + public boolean addShard(FecShardWire.Parsed shard) { + if (shard.groupId != groupId || shard.originalLen != originalLen + || shard.dataShards != dataShards || shard.parityShards != parityShards + || shard.baseMessageId != baseMessageId) { + return false; + } + if (shard.shardData.length != shardSize) { + return false; + } + int idx = shard.shardIndex; + if (idx < 0 || idx >= totalShards || shards[idx] != null) { + return false; + } + shards[idx] = Arrays.copyOf(shard.shardData, shard.shardData.length); + received++; + return true; + } + + public int receivedCount() { + return received; + } + + public boolean hasShard(int index) { + return index >= 0 && index < totalShards && shards[index] != null; + } + + public int nackMessageIdForIndex(int shardIndex) { + return baseMessageId + shardIndex; + } + + public byte[] tryDecode() { + if (received < dataShards) { + return null; + } + ReedSolomonFec fec = new ReedSolomonFec(dataShards, parityShards); + return fec.decode(shards, originalLen); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/fec/FecShardWire.java b/app/src/main/java/com/foxx/androidcast/network/transport/fec/FecShardWire.java new file mode 100644 index 0000000..1bb82ea --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/fec/FecShardWire.java @@ -0,0 +1,146 @@ +package com.foxx.androidcast.network.transport.fec; + +/********************************************************************* + * FecShardWire.java + * Created at: Mon 18 May 2026 14:25:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class FecShardWire + * Contributors: + * - Anton Afanasyeu (3 commits, 142 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 e43675e8fa136c178c00c95e7ad0a569400a6582342223eef64e369e1aa4b719 +**********************************************************************/ +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; + +/** + * Per-datagram FEC shard. Each shard is its own ACUD logical message so loss of one + * fragment does not invalidate the whole Reed–Solomon block. + * + *

v2 used a single-byte shard length (max 255), which breaks VP9 keyframes. v3 uses uint16. + */ +public final class FecShardWire { + private static final byte[] MAGIC = {'A', 'C', 'P', 'F'}; + /** Legacy on-wire format; shard length field is 1 byte (max 255). */ + public static final byte VERSION_SHARD_V2 = 2; + /** Current format; shard length field is uint16. */ + public static final byte VERSION_SHARD = 3; + private static final int HEADER_AFTER_MAGIC_V2 = 19; + private static final int HEADER_AFTER_MAGIC_V3 = 20; + + private FecShardWire() {} + + public static byte[] encodeShard( + byte mode, + int groupId, + int baseMessageId, + int shardIndex, + int totalShards, + int originalLen, + int dataShards, + int parityShards, + byte[] shardData) throws IOException { + if (shardData == null) { + throw new IOException("shardData required"); + } + if (shardData.length > 0xFFFF) { + throw new IOException("shard too large: " + shardData.length); + } + ByteArrayOutputStream bos = new ByteArrayOutputStream(32 + shardData.length); + DataOutputStream dos = new DataOutputStream(bos); + dos.write(MAGIC); + dos.writeByte(VERSION_SHARD); + dos.writeByte(mode); + dos.writeInt(groupId); + dos.writeInt(baseMessageId); + dos.writeByte(shardIndex); + dos.writeByte(totalShards); + dos.writeInt(originalLen); + dos.writeByte(dataShards); + dos.writeByte(parityShards); + dos.writeShort(shardData.length); + dos.write(shardData); + return bos.toByteArray(); + } + + public static boolean isShardPacket(byte[] wire) { + return tryParse(wire) != null; + } + + public static Parsed tryParse(byte[] wire) { + if (wire == null || wire.length < MAGIC.length + HEADER_AFTER_MAGIC_V2) { + return null; + } + for (int i = 0; i < MAGIC.length; i++) { + if (wire[i] != MAGIC[i]) { + return null; + } + } + try { + DataInputStream dis = new DataInputStream(new ByteArrayInputStream(wire, MAGIC.length, + wire.length - MAGIC.length)); + byte ver = dis.readByte(); + if (ver != VERSION_SHARD_V2 && ver != VERSION_SHARD) { + return null; + } + byte mode = dis.readByte(); + int groupId = dis.readInt(); + int baseMessageId = dis.readInt(); + int shardIndex = dis.readUnsignedByte(); + int totalShards = dis.readUnsignedByte(); + int originalLen = dis.readInt(); + int dataShards = dis.readUnsignedByte(); + int parityShards = dis.readUnsignedByte(); + int shardSize = ver == VERSION_SHARD ? dis.readUnsignedShort() : dis.readUnsignedByte(); + if (dataShards < 1 || parityShards < 1 || totalShards != dataShards + parityShards) { + return null; + } + if (shardIndex >= totalShards || originalLen < 1 || shardSize < 1) { + return null; + } + int headerAfterMagic = ver == VERSION_SHARD ? HEADER_AFTER_MAGIC_V3 : HEADER_AFTER_MAGIC_V2; + if (wire.length < MAGIC.length + headerAfterMagic + shardSize) { + return null; + } + byte[] shardData = new byte[shardSize]; + dis.readFully(shardData); + return new Parsed(mode, groupId, baseMessageId, shardIndex, totalShards, originalLen, + dataShards, parityShards, shardData); + } catch (IOException e) { + return null; + } + } + + public static final class Parsed { + public final byte mode; + public final int groupId; + public final int baseMessageId; + public final int shardIndex; + public final int totalShards; + public final int originalLen; + public final int dataShards; + public final int parityShards; + public final byte[] shardData; + + Parsed(byte mode, int groupId, int baseMessageId, int shardIndex, int totalShards, + int originalLen, int dataShards, int parityShards, byte[] shardData) { + this.mode = mode; + this.groupId = groupId; + this.baseMessageId = baseMessageId; + this.shardIndex = shardIndex; + this.totalShards = totalShards; + this.originalLen = originalLen; + this.dataShards = dataShards; + this.parityShards = parityShards; + this.shardData = shardData; + } + + public int messageIdForShard() { + return baseMessageId + shardIndex; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/fec/GaloisField.java b/app/src/main/java/com/foxx/androidcast/network/transport/fec/GaloisField.java new file mode 100644 index 0000000..b835eac --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/fec/GaloisField.java @@ -0,0 +1,74 @@ +package com.foxx.androidcast.network.transport.fec; + +/********************************************************************* + * GaloisField.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * Contributors: + * - Anton Afanasyeu (2 commits, 70 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 03db14e672d69bcc8be9a67a3dfdd09799b4f96c95c09c856bedba70e51de212 +**********************************************************************/ +/** GF(2^8) arithmetic for Reed-Solomon. */ +final class GaloisField { + private static final int[] EXP = new int[512]; + private static final int[] LOG = new int[256]; + + static { + int x = 1; + for (int i = 0; i < 255; i++) { + EXP[i] = x; + LOG[x] = i; + x <<= 1; + if ((x & 0x100) != 0) { + x ^= 0x11D; + } + } + for (int i = 255; i < 512; i++) { + EXP[i] = EXP[i - 255]; + } + } + + private GaloisField() {} + + static int add(int a, int b) { + return a ^ b; + } + + static int mul(int a, int b) { + if (a == 0 || b == 0) { + return 0; + } + return EXP[LOG[a] + LOG[b]]; + } + + static int div(int a, int b) { + if (b == 0) { + throw new ArithmeticException("divide by zero"); + } + if (a == 0) { + return 0; + } + return EXP[(LOG[a] - LOG[b] + 255) % 255]; + } + + static int pow(int a, int power) { + if (power == 0) { + return 1; + } + if (a == 0) { + return 0; + } + return EXP[(LOG[a] * power) % 255]; + } + + static void mulAddInto(byte[] dst, byte[] src, int coeff) { + if (coeff == 0) { + return; + } + for (int i = 0; i < dst.length && i < src.length; i++) { + dst[i] ^= mul(src[i] & 0xFF, coeff); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/fec/ProtectionEnvelope.java b/app/src/main/java/com/foxx/androidcast/network/transport/fec/ProtectionEnvelope.java new file mode 100644 index 0000000..264d9c7 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/fec/ProtectionEnvelope.java @@ -0,0 +1,162 @@ +package com.foxx.androidcast.network.transport.fec; + +/********************************************************************* + * ProtectionEnvelope.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class ProtectionEnvelope + * Contributors: + * - Anton Afanasyeu (2 commits, 158 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 c6a05fbd2c4892e6995b46682b4aecf857deb9db651efada97c9cd86445ce2ee +**********************************************************************/ +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +/** Serialized FEC-protected UDP message body (before ACUD fragmentation). */ +public final class ProtectionEnvelope { + private static final byte[] MAGIC = {'A', 'C', 'P', 'F'}; + public static final byte VERSION = 1; + private static final int HEADER_BYTES = 9; + private static final int MAX_ORIGINAL_LENGTH = 16 * 1024 * 1024; + + public static final byte MODE_FEC_34 = 1; + public static final byte MODE_REED_SOLOMON = 2; + public static final byte MODE_FEC_NACK = 3; + + private ProtectionEnvelope() {} + + public static byte[] encode(byte mode, int dataShards, int parityShards, byte[] payload) throws IOException { + ReedSolomonFec fec = new ReedSolomonFec(dataShards, parityShards); + byte[][] shards = fec.encode(payload); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + dos.write(MAGIC); + dos.writeByte(VERSION); + dos.writeByte(mode); + dos.writeInt(payload.length); + dos.writeByte(dataShards); + dos.writeByte(parityShards); + dos.writeByte(shards[0].length); + for (byte[] shard : shards) { + dos.write(shard); + } + return bos.toByteArray(); + } + + public static Decoded tryDecode(byte[] wire) { + if (wire == null || wire.length < MAGIC.length + 10) { + return null; + } + for (int i = 0; i < MAGIC.length; i++) { + if (wire[i] != MAGIC[i]) { + return null; + } + } + try { + DataInputStream dis = new DataInputStream(new ByteArrayInputStream(wire, MAGIC.length, + wire.length - MAGIC.length)); + byte ver = dis.readByte(); + if (ver != VERSION) { + return null; + } + byte mode = dis.readByte(); + int originalLen = dis.readInt(); + int dataShards = dis.readUnsignedByte(); + int parityShards = dis.readUnsignedByte(); + int shardSize = dis.readUnsignedByte(); + if (!isValidHeader(dataShards, parityShards, shardSize, originalLen)) { + return null; + } + int total = dataShards + parityShards; + int expectedLen = MAGIC.length + HEADER_BYTES + total * shardSize; + if (wire.length < expectedLen) { + return null; + } + byte[][] shards = new byte[total][shardSize]; + for (int i = 0; i < total; i++) { + dis.readFully(shards[i]); + } + ReedSolomonFec fec = new ReedSolomonFec(dataShards, parityShards); + byte[] payload = fec.decode(shards, originalLen); + if (payload == null) { + return Decoded.incomplete(mode, dataShards, parityShards); + } + return Decoded.ok(mode, payload); + } catch (IOException | RuntimeException e) { + return null; + } + } + + public static boolean isProtected(byte[] wire) { + if (wire == null || wire.length < MAGIC.length + HEADER_BYTES + 1) { + return false; + } + for (int i = 0; i < MAGIC.length; i++) { + if (wire[i] != MAGIC[i]) { + return false; + } + } + try { + DataInputStream dis = new DataInputStream(new ByteArrayInputStream(wire, MAGIC.length, + wire.length - MAGIC.length)); + if (dis.readByte() != VERSION) { + return false; + } + dis.readByte(); + int originalLen = dis.readInt(); + int dataShards = dis.readUnsignedByte(); + int parityShards = dis.readUnsignedByte(); + int shardSize = dis.readUnsignedByte(); + if (!isValidHeader(dataShards, parityShards, shardSize, originalLen)) { + return false; + } + return wire.length >= MAGIC.length + HEADER_BYTES + (dataShards + parityShards) * shardSize; + } catch (IOException e) { + return false; + } + } + + private static boolean isValidHeader(int dataShards, int parityShards, int shardSize, int originalLen) { + if (dataShards < 1 || parityShards < 1 || dataShards + parityShards > 255) { + return false; + } + if (shardSize < 1) { + return false; + } + if (originalLen < 1 || originalLen > MAX_ORIGINAL_LENGTH) { + return false; + } + long maxRecoverable = (long) dataShards * shardSize; + return originalLen <= maxRecoverable; + } + + public static final class Decoded { + public final boolean complete; + public final byte mode; + public final byte[] payload; + public final int dataShards; + public final int parityShards; + + private Decoded(boolean complete, byte mode, byte[] payload, int dataShards, int parityShards) { + this.complete = complete; + this.mode = mode; + this.payload = payload; + this.dataShards = dataShards; + this.parityShards = parityShards; + } + + static Decoded ok(byte mode, byte[] payload) { + return new Decoded(true, mode, payload, 0, 0); + } + + static Decoded incomplete(byte mode, int dataShards, int parityShards) { + return new Decoded(false, mode, null, dataShards, parityShards); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/transport/fec/ReedSolomonFec.java b/app/src/main/java/com/foxx/androidcast/network/transport/fec/ReedSolomonFec.java new file mode 100644 index 0000000..b5f272d --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/transport/fec/ReedSolomonFec.java @@ -0,0 +1,186 @@ +package com.foxx.androidcast.network.transport.fec; + +/********************************************************************* + * ReedSolomonFec.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class ReedSolomonFec + * Contributors: + * - Anton Afanasyeu (2 commits, 182 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 f6b72854c1477ec632367c3c6a88aa6592c7a1ff1fc3255c6ebb62c861a06031 +**********************************************************************/ +import java.util.Arrays; + +/** + * Reed-Solomon erasure code over GF(256). Requires any {@code dataShards} of + * {@code dataShards + parityShards} shards to recover the payload. + */ +public final class ReedSolomonFec { + private final int dataShards; + private final int parityShards; + private final int totalShards; + private final int[] encodeMatrix; + + public ReedSolomonFec(int dataShards, int parityShards) { + if (dataShards < 1 || parityShards < 1 || dataShards + parityShards > 255) { + throw new IllegalArgumentException("Invalid shard counts"); + } + this.dataShards = dataShards; + this.parityShards = parityShards; + this.totalShards = dataShards + parityShards; + this.encodeMatrix = buildEncodeMatrix(dataShards, parityShards); + } + + public int dataShards() { + return dataShards; + } + + public int parityShards() { + return parityShards; + } + + public int totalShards() { + return totalShards; + } + + public static int shardSizeFor(int payloadLength, int dataShards) { + return Math.max(1, (payloadLength + dataShards - 1) / dataShards); + } + + public byte[][] encode(byte[] payload) { + int shardSize = shardSizeFor(payload.length, dataShards); + byte[][] shards = new byte[totalShards][shardSize]; + for (int i = 0; i < dataShards; i++) { + int off = i * shardSize; + int len = Math.min(shardSize, Math.max(0, payload.length - off)); + if (len > 0) { + System.arraycopy(payload, off, shards[i], 0, len); + } + } + for (int p = 0; p < parityShards; p++) { + for (int d = 0; d < dataShards; d++) { + int coeff = encodeMatrix[p * dataShards + d] & 0xFF; + GaloisField.mulAddInto(shards[dataShards + p], shards[d], coeff); + } + } + return shards; + } + + public byte[] decode(byte[][] shards, int originalLength) { + if (shards == null || shards.length != totalShards) { + return null; + } + int shardSize = 0; + for (byte[] s : shards) { + if (s != null && s.length > shardSize) { + shardSize = s.length; + } + } + if (shardSize == 0) { + return null; + } + int[] idx = new int[dataShards]; + int found = 0; + for (int i = 0; i < totalShards && found < dataShards; i++) { + if (shards[i] != null) { + idx[found++] = i; + } + } + if (found < dataShards) { + return null; + } + int[][] matrix = new int[dataShards][dataShards]; + for (int row = 0; row < dataShards; row++) { + int shardIndex = idx[row]; + if (shardIndex < dataShards) { + matrix[row][shardIndex] = 1; + } else { + int p = shardIndex - dataShards; + for (int col = 0; col < dataShards; col++) { + matrix[row][col] = encodeMatrix[p * dataShards + col] & 0xFF; + } + } + } + int[][] inv = invertMatrix(matrix); + if (inv == null) { + return null; + } + byte[][] data = new byte[dataShards][shardSize]; + for (int row = 0; row < dataShards; row++) { + Arrays.fill(data[row], (byte) 0); + for (int col = 0; col < dataShards; col++) { + int coeff = inv[row][col] & 0xFF; + if (coeff != 0) { + GaloisField.mulAddInto(data[row], shards[idx[col]], coeff); + } + } + } + byte[] out = new byte[originalLength]; + int shardSizeOut = shardSizeFor(originalLength, dataShards); + for (int i = 0; i < dataShards; i++) { + int off = i * shardSizeOut; + int len = Math.min(shardSizeOut, originalLength - off); + if (len > 0) { + len = Math.min(len, data[i].length); + System.arraycopy(data[i], 0, out, off, len); + } + } + return out; + } + + private static int[] buildEncodeMatrix(int k, int m) { + int[] matrix = new int[m * k]; + for (int row = 0; row < m; row++) { + for (int col = 0; col < k; col++) { + matrix[row * k + col] = GaloisField.pow((row + 1) & 0xFF, col); + } + } + return matrix; + } + + private static int[][] invertMatrix(int[][] matrix) { + int n = matrix.length; + int[][] aug = new int[n][2 * n]; + for (int i = 0; i < n; i++) { + System.arraycopy(matrix[i], 0, aug[i], 0, n); + aug[i][n + i] = 1; + } + for (int col = 0; col < n; col++) { + int pivot = -1; + for (int row = col; row < n; row++) { + if (aug[row][col] != 0) { + pivot = row; + break; + } + } + if (pivot < 0) { + return null; + } + if (pivot != col) { + int[] tmp = aug[pivot]; + aug[pivot] = aug[col]; + aug[col] = tmp; + } + int inv = GaloisField.div(1, aug[col][col]); + for (int j = 0; j < 2 * n; j++) { + aug[col][j] = GaloisField.mul(aug[col][j], inv); + } + for (int row = 0; row < n; row++) { + if (row == col || aug[row][col] == 0) { + continue; + } + int factor = aug[row][col]; + for (int j = 0; j < 2 * n; j++) { + aug[row][j] = GaloisField.add(aug[row][j], GaloisField.mul(factor, aug[col][j])); + } + } + } + int[][] out = new int[n][n]; + for (int i = 0; i < n; i++) { + System.arraycopy(aug[i], n, out[i], 0, n); + } + return out; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/usb/UsbTetherCastTransport.java b/app/src/main/java/com/foxx/androidcast/network/usb/UsbTetherCastTransport.java new file mode 100644 index 0000000..0999f81 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/usb/UsbTetherCastTransport.java @@ -0,0 +1,58 @@ +package com.foxx.androidcast.network.usb; + +import com.foxx.androidcast.network.CastProtocol; +import com.foxx.androidcast.network.CastTransport; + +import java.io.IOException; + +/** + * Future cast transport over USB tethering or ADB reverse port forward (roadmap E). + * Same {@link CastProtocol} framing as TCP/UDP once a byte stream is available. + */ +public interface UsbTetherCastTransport extends CastTransport { + + /** Returns true when {@link android.hardware.usb.UsbManager} reports tether active, etc. */ + boolean isUsbLinkAvailable(); + + static UsbTetherCastTransport createStub() { + return new UsbTetherCastTransportStub(); + } + + final class UsbTetherCastTransportStub implements UsbTetherCastTransport { + @Override + public boolean isUsbLinkAvailable() { + return false; + } + + @Override + public void listen(int port) throws IOException { + throw new UnsupportedOperationException( + "USB-tether cast is not implemented yet. Enable in developer settings only for " + + "future testing; use UDP/TCP over Wi-Fi for alpha."); + } + + @Override + public void connect(String host, int port) throws IOException { + throw new UnsupportedOperationException( + "USB-tether cast is not implemented yet (roadmap E)."); + } + + @Override + public void send(byte type, byte[] payload) throws IOException { + throw new UnsupportedOperationException("USB-tether cast is not implemented yet"); + } + + @Override + public CastProtocol.Message receive(int timeoutMs) throws IOException { + throw new UnsupportedOperationException("USB-tether cast is not implemented yet"); + } + + @Override + public String getModeLabel() { + return "USB tether (stub)"; + } + + @Override + public void close() {} + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/usb/UsbTetherTransportFactory.java b/app/src/main/java/com/foxx/androidcast/network/usb/UsbTetherTransportFactory.java new file mode 100644 index 0000000..54d8529 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/usb/UsbTetherTransportFactory.java @@ -0,0 +1,15 @@ +package com.foxx.androidcast.network.usb; + +import com.foxx.androidcast.CastConfig; + +public final class UsbTetherTransportFactory { + private UsbTetherTransportFactory() {} + + public static boolean isTransportId(String transport) { + return CastConfig.TRANSPORT_USB_TETHER.equals(transport); + } + + public static UsbTetherCastTransport create() { + return UsbTetherCastTransport.createStub(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/webrtc/WebRtcCastTransport.java b/app/src/main/java/com/foxx/androidcast/network/webrtc/WebRtcCastTransport.java new file mode 100644 index 0000000..c0c2f9f --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/webrtc/WebRtcCastTransport.java @@ -0,0 +1,73 @@ +package com.foxx.androidcast.network.webrtc; + +/********************************************************************* + * WebRtcCastTransport.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * interface WebRtcCastTransport + * Contributors: + * - Anton Afanasyeu (2 commits, 69 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 af151a4dd6ea8e576648e3c4861d851eb9e85c04bdb3bdee18e1344af52beede +**********************************************************************/ +import com.foxx.androidcast.network.CastProtocol; +import com.foxx.androidcast.network.CastTransport; + +import java.io.IOException; + +/** + * Future WebRTC transport (libwebrtc or pion-backed). Not wired yet — use {@link #createStub()}. + */ +public interface WebRtcCastTransport extends CastTransport { + + /** Signaling / ICE configuration for upcoming integration. */ + interface SignalingConfig { + String getSignalingUrl(); + + String[] getIceServers(); + } + + /** Attach when integrating real PeerConnection / DataChannel. */ + void attachPeer(WebRtcPeerAdapter peer); + + /** + * Placeholder until libwebrtc or pion transport is connected. + */ + static WebRtcCastTransport createStub() { + return new WebRtcCastTransportStub(); + } + + final class WebRtcCastTransportStub implements WebRtcCastTransport { + @Override + public void attachPeer(WebRtcPeerAdapter peer) {} + + @Override + public void listen(int port) throws IOException { + throw new UnsupportedOperationException("WebRTC transport is not implemented yet"); + } + + @Override + public void connect(String host, int port) throws IOException { + throw new UnsupportedOperationException("WebRTC transport is not implemented yet"); + } + + @Override + public void send(byte type, byte[] payload) throws IOException { + throw new UnsupportedOperationException("WebRTC transport is not implemented yet"); + } + + @Override + public CastProtocol.Message receive(int timeoutMs) throws IOException { + throw new UnsupportedOperationException("WebRTC transport is not implemented yet"); + } + + @Override + public String getModeLabel() { + return "WebRTC (stub)"; + } + + @Override + public void close() {} + } +} diff --git a/app/src/main/java/com/foxx/androidcast/network/webrtc/WebRtcPeerAdapter.java b/app/src/main/java/com/foxx/androidcast/network/webrtc/WebRtcPeerAdapter.java new file mode 100644 index 0000000..55157f6 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/webrtc/WebRtcPeerAdapter.java @@ -0,0 +1,48 @@ +package com.foxx.androidcast.network.webrtc; + +/********************************************************************* + * WebRtcPeerAdapter.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * interface WebRtcPeerAdapter + * Contributors: + * - Anton Afanasyeu (2 commits, 44 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 fffc6dd70bc526851d144abc9716bbd2a69849e8d788f6bced7573febcf027c4 +**********************************************************************/ +/** + * Abstraction over future {@code org.webrtc.PeerConnection} or pion peer APIs. + * Implementations will map cast frames to SCTP DataChannel or encoded tracks. + */ +public interface WebRtcPeerAdapter { + + interface Observer { + void onIceCandidate(String sdpMid, int sdpMLineIndex, String candidate); + + void onConnectionStateChanged(WebRtcConnectionState state); + + void onDataChannelMessage(byte[] payload); + + void onEncodedVideoFrame(long ptsUs, boolean keyFrame, byte[] data); + } + + enum WebRtcConnectionState { + NEW, CONNECTING, CONNECTED, DISCONNECTED, FAILED, CLOSED + } + + void setObserver(Observer observer); + + void createOffer(); + + void createAnswer(String remoteDescription); + + void setRemoteDescription(String sdp, boolean isOffer); + + void addIceCandidate(String sdpMid, int sdpMLineIndex, String candidate); + + /** Send opaque cast protocol bytes on a labeled DataChannel. */ + void sendDataChannel(byte[] payload); + + void close(); +} diff --git a/app/src/main/java/com/foxx/androidcast/network/webrtc/WebRtcTransportFactory.java b/app/src/main/java/com/foxx/androidcast/network/webrtc/WebRtcTransportFactory.java new file mode 100644 index 0000000..8740098 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/network/webrtc/WebRtcTransportFactory.java @@ -0,0 +1,30 @@ +package com.foxx.androidcast.network.webrtc; + +/********************************************************************* + * WebRtcTransportFactory.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class WebRtcTransportFactory + * Contributors: + * - Anton Afanasyeu (2 commits, 26 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 e493627f2d6a5ebbf641fa5fd3a96d4c4c098dd08a8305a76f132cc2c90f45b4 +**********************************************************************/ +import com.foxx.androidcast.CastConfig; +import com.foxx.androidcast.network.CastTransport; + +/** + * Factory for WebRTC-backed cast transport (stub today; swap implementation for libwebrtc / pion). + */ +public final class WebRtcTransportFactory { + private WebRtcTransportFactory() {} + + public static boolean isTransportId(String transport) { + return CastConfig.TRANSPORT_WEBRTC.equals(transport); + } + + public static CastTransport create() { + return WebRtcCastTransport.createStub(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ota/OtaApkInstaller.java b/app/src/main/java/com/foxx/androidcast/ota/OtaApkInstaller.java new file mode 100644 index 0000000..6a28c68 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ota/OtaApkInstaller.java @@ -0,0 +1,147 @@ +package com.foxx.androidcast.ota; + +/********************************************************************* + * OtaApkInstaller.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class OtaApkInstaller + * Contributors: + * - Anton Afanasyeu (2 commits, 143 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 ea6b467b9b8c4ee24c26d349772228aef7595f259e996a280813a56f7cbf1166 +**********************************************************************/ +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.util.Log; + +import androidx.core.content.FileProvider; + +import java.io.BufferedInputStream; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.security.MessageDigest; + +/** Downloads an APK and launches the package installer. */ +public final class OtaApkInstaller { + private static final String TAG = "OtaApkInstaller"; + private static final int CONNECT_TIMEOUT_MS = 15_000; + private static final int READ_TIMEOUT_MS = 300_000; + + public interface ProgressListener { + void onProgress(long downloadedBytes, long totalBytes); + } + + private OtaApkInstaller() {} + + /** Resolves a verified APK: HTTP bundle when present, else legacy per-artifact download. */ + public static File downloadApk(Context context, OtaManifest manifest, ProgressListener listener) + throws Exception { + if (manifest == null) { + throw new IllegalArgumentException("Missing manifest"); + } + if (manifest.hasHttpBundle()) { + return OtaBundleInstaller.downloadApkFromBundle(context, manifest, listener); + } + return downloadApkLegacy(context, manifest, listener); + } + + static File downloadApkLegacy(Context context, OtaManifest manifest, ProgressListener listener) + throws Exception { + if (manifest.apkUrl.isEmpty()) { + throw new IllegalArgumentException("Missing apkUrl"); + } + File dir = new File(context.getCacheDir(), "ota"); + if (!dir.exists() && !dir.mkdirs()) { + throw new IllegalStateException("Cannot create OTA cache dir"); + } + File out = new File(dir, "update-" + manifest.effectiveVersionCode() + ".apk"); + if (out.exists() && !out.delete()) { + throw new IllegalStateException("Cannot replace cached APK"); + } + String scheme = OtaJsonFetch.schemeOf(manifest.apkUrl); + if ("mqtt".equals(scheme) || "mqtts".equals(scheme)) { + byte[] payload = OtaJsonFetch.getBytes(manifest.apkUrl, 512 * 1024 * 1024); + long total = payload.length; + try (InputStream in = new BufferedInputStream(new ByteArrayInputStream(payload)); + FileOutputStream fos = new FileOutputStream(out)) { + byte[] buf = new byte[32 * 1024]; + long downloaded = 0; + int n; + while ((n = in.read(buf)) != -1) { + fos.write(buf, 0, n); + downloaded += n; + if (listener != null) { + listener.onProgress(downloaded, total); + } + } + } + } else { + HttpURLConnection conn = (HttpURLConnection) new URL(manifest.apkUrl).openConnection(); + conn.setConnectTimeout(CONNECT_TIMEOUT_MS); + conn.setReadTimeout(READ_TIMEOUT_MS); + conn.setInstanceFollowRedirects(true); + int code = conn.getResponseCode(); + if (code < 200 || code >= 300) { + conn.disconnect(); + throw new IllegalStateException("Download HTTP " + code); + } + long total = conn.getContentLengthLong(); + try (InputStream in = new BufferedInputStream(conn.getInputStream()); + FileOutputStream fos = new FileOutputStream(out)) { + byte[] buf = new byte[32 * 1024]; + long downloaded = 0; + int n; + while ((n = in.read(buf)) != -1) { + fos.write(buf, 0, n); + downloaded += n; + if (listener != null) { + listener.onProgress(downloaded, total); + } + } + } finally { + conn.disconnect(); + } + } + if (!manifest.sha256Hex.isEmpty()) { + String actual = sha256Hex(out); + if (!manifest.sha256Hex.equalsIgnoreCase(actual)) { + out.delete(); + throw new IllegalStateException("APK checksum mismatch"); + } + } + Log.i(TAG, "Downloaded OTA APK " + out.length() + " bytes -> " + out.getName()); + return out; + } + + public static void launchInstall(Context context, File apkFile) { + Uri uri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", apkFile); + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setDataAndType(uri, "application/vnd.android.package-archive"); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } + + static String sha256Hex(File file) throws Exception { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + try (BufferedInputStream in = new BufferedInputStream(new java.io.FileInputStream(file))) { + byte[] buf = new byte[8192]; + int n; + while ((n = in.read(buf)) != -1) { + md.update(buf, 0, n); + } + } + byte[] digest = md.digest(); + StringBuilder sb = new StringBuilder(digest.length * 2); + for (byte b : digest) { + sb.append(String.format("%02x", b & 0xff)); + } + return sb.toString(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ota/OtaBundleInstaller.java b/app/src/main/java/com/foxx/androidcast/ota/OtaBundleInstaller.java new file mode 100644 index 0000000..afb198b --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ota/OtaBundleInstaller.java @@ -0,0 +1,188 @@ +package com.foxx.androidcast.ota; + +/********************************************************************* + * OtaBundleInstaller.java + * Created at: Wed 20 May 2026 15:17:13 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class OtaBundleInstaller + * Contributors: + * - Anton Afanasyeu (1 commits, 181 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 050709074c45c65d229157f78c7b52d9d6be9fbfb9af82d4a862d986aa3760c5 +**********************************************************************/ +import android.content.Context; +import android.util.Log; + +import com.foxx.androidcast.util.IoUtils; + +import org.json.JSONObject; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +/** + * Downloads an optional {@code .otabundle.zip} (STORE entries: manifest.json, sign.json, + * package.apk) and returns a verified local APK file. + */ +public final class OtaBundleInstaller { + private static final String TAG = "OtaBundleInstaller"; + static final String ENTRY_MANIFEST = "manifest.json"; + static final String ENTRY_SIGN = "sign.json"; + static final String ENTRY_PACKAGE = "package.apk"; + + private static final int CONNECT_TIMEOUT_MS = 15_000; + private static final int READ_TIMEOUT_MS = 300_000; + private static final int MAX_BUNDLE_BYTES = 512 * 1024 * 1024; + + private OtaBundleInstaller() {} + + public static File downloadApkFromBundle(Context context, OtaManifest manifest, + OtaApkInstaller.ProgressListener listener) throws Exception { + if (manifest == null || !manifest.hasHttpBundle()) { + throw new IllegalArgumentException("Missing HTTP bundleUrl"); + } + File cacheRoot = new File(context.getCacheDir(), "ota"); + if (!cacheRoot.exists() && !cacheRoot.mkdirs()) { + throw new IllegalStateException("Cannot create OTA cache dir"); + } + int version = manifest.effectiveVersionCode(); + File bundleZip = new File(cacheRoot, "bundle-" + version + ".otabundle.zip"); + File extractDir = new File(cacheRoot, "bundle-" + version); + deleteRecursive(extractDir); + if (bundleZip.exists() && !bundleZip.delete()) { + throw new IllegalStateException("Cannot replace cached bundle"); + } + downloadBundleZip(manifest, bundleZip, listener); + if (!manifest.bundleSha256Hex.isEmpty()) { + String actual = OtaApkInstaller.sha256Hex(bundleZip); + if (!manifest.bundleSha256Hex.equalsIgnoreCase(actual)) { + bundleZip.delete(); + throw new IllegalStateException("Bundle checksum mismatch"); + } + } + if (!extractDir.mkdirs()) { + throw new IllegalStateException("Cannot create bundle extract dir"); + } + unzipBundle(bundleZip, extractDir); + File apk = new File(extractDir, ENTRY_PACKAGE); + if (!apk.isFile()) { + throw new IllegalStateException("Bundle missing " + ENTRY_PACKAGE); + } + String expectedSha = manifest.sha256Hex; + if (expectedSha.isEmpty()) { + File signFile = new File(extractDir, ENTRY_SIGN); + if (signFile.isFile()) { + try (FileInputStream fis = new FileInputStream(signFile)) { + byte[] buf = IoUtils.readAllBytes(fis); + OtaSignBundle sign = OtaSignBundle.fromJson( + new JSONObject(new String(buf, StandardCharsets.UTF_8))); + expectedSha = sign.sha256Hex; + } + } + } + if (!expectedSha.isEmpty()) { + String actualApk = OtaApkInstaller.sha256Hex(apk); + if (!expectedSha.equalsIgnoreCase(actualApk)) { + deleteRecursive(extractDir); + throw new IllegalStateException("APK checksum mismatch (bundle)"); + } + } + Log.i(TAG, "Extracted bundle APK " + apk.length() + " bytes"); + return apk; + } + + private static void downloadBundleZip(OtaManifest manifest, File out, + OtaApkInstaller.ProgressListener listener) throws Exception { + HttpURLConnection conn = (HttpURLConnection) new URL(manifest.bundleUrl).openConnection(); + conn.setConnectTimeout(CONNECT_TIMEOUT_MS); + conn.setReadTimeout(READ_TIMEOUT_MS); + conn.setInstanceFollowRedirects(true); + int code = conn.getResponseCode(); + if (code < 200 || code >= 300) { + conn.disconnect(); + throw new IllegalStateException("Bundle download HTTP " + code); + } + long total = manifest.bundleSizeBytes > 0L + ? manifest.bundleSizeBytes + : conn.getContentLengthLong(); + if (total > MAX_BUNDLE_BYTES) { + conn.disconnect(); + throw new IllegalStateException("Bundle too large"); + } + try (InputStream in = new BufferedInputStream(conn.getInputStream()); + FileOutputStream fos = new FileOutputStream(out)) { + byte[] buf = new byte[32 * 1024]; + long downloaded = 0; + int n; + while ((n = in.read(buf)) != -1) { + downloaded += n; + if (downloaded > MAX_BUNDLE_BYTES) { + throw new IllegalStateException("Bundle exceeds size limit"); + } + fos.write(buf, 0, n); + if (listener != null) { + listener.onProgress(downloaded, total > 0 ? total : downloaded); + } + } + } finally { + conn.disconnect(); + } + Log.i(TAG, "Downloaded bundle " + out.length() + " bytes"); + } + + static void unzipBundle(File zipFile, File destDir) throws Exception { + try (ZipInputStream zis = new ZipInputStream(new BufferedInputStream( + new FileInputStream(zipFile)))) { + ZipEntry entry; + byte[] buf = new byte[8192]; + while ((entry = zis.getNextEntry()) != null) { + if (entry.isDirectory()) { + continue; + } + String name = entry.getName(); + int slash = name.lastIndexOf('/'); + if (slash >= 0) { + name = name.substring(slash + 1); + } + if (!ENTRY_MANIFEST.equals(name) && !ENTRY_SIGN.equals(name) + && !ENTRY_PACKAGE.equals(name)) { + continue; + } + File out = new File(destDir, name); + try (BufferedOutputStream bos = new BufferedOutputStream( + new FileOutputStream(out))) { + int n; + while ((n = zis.read(buf)) != -1) { + bos.write(buf, 0, n); + } + } + zis.closeEntry(); + } + } + } + + static void deleteRecursive(File file) { + if (file == null || !file.exists()) { + return; + } + if (file.isDirectory()) { + File[] children = file.listFiles(); + if (children != null) { + for (File child : children) { + deleteRecursive(child); + } + } + } + file.delete(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ota/OtaChannelPointer.java b/app/src/main/java/com/foxx/androidcast/ota/OtaChannelPointer.java new file mode 100644 index 0000000..186cfd6 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ota/OtaChannelPointer.java @@ -0,0 +1,34 @@ +package com.foxx.androidcast.ota; + +/********************************************************************* + * OtaChannelPointer.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class OtaChannelPointer + * Contributors: + * - Anton Afanasyeu (2 commits, 30 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 e09bb60ad6b267beca91b6e3bf5f9acc792aedd8cc94fcd85d7137baabbe432b +**********************************************************************/ +import org.json.JSONObject; + +/** Default-channel entry ({@code v0/ota/channel/stable.json}). */ +public final class OtaChannelPointer { + public final String manifestUrl; + + public OtaChannelPointer(String manifestUrl) { + this.manifestUrl = manifestUrl != null ? manifestUrl.trim() : ""; + } + + public boolean isValid() { + return !manifestUrl.isEmpty(); + } + + public static OtaChannelPointer fromJson(JSONObject root) { + if (root == null) { + return new OtaChannelPointer(""); + } + return new OtaChannelPointer(root.optString("manifestUrl", "")); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ota/OtaJsonFetch.java b/app/src/main/java/com/foxx/androidcast/ota/OtaJsonFetch.java new file mode 100644 index 0000000..50d5a62 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ota/OtaJsonFetch.java @@ -0,0 +1,126 @@ +package com.foxx.androidcast.ota; + +/********************************************************************* + * OtaJsonFetch.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * Contributors: + * - Anton Afanasyeu (2 commits, 122 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 fc9897e4627ffc8405f8deeeefbc17d085cb1b960695ca41929b8c073c36a9fb +**********************************************************************/ +import org.json.JSONObject; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URI; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Locale; + +/** Small HTTP JSON helper for OTA endpoints. */ +final class OtaJsonFetch { + private static final int CONNECT_TIMEOUT_MS = 12_000; + private static final int READ_TIMEOUT_MS = 20_000; + + private OtaJsonFetch() {} + + static JSONObject getJson(String url, int maxBytes) throws Exception { + byte[] body = getBytes(url, maxBytes); + return new JSONObject(new String(body, StandardCharsets.UTF_8)); + } + + static byte[] getBytes(String url, int maxBytes) throws Exception { + String scheme = schemeOf(url); + if ("mqtt".equals(scheme) || "mqtts".equals(scheme)) { + byte[] body = OtaMqttFetch.getPayload(url, READ_TIMEOUT_MS); + if (body.length > maxBytes) { + throw new IllegalStateException("Response too large"); + } + return body; + } + if (!isHttpUrl(url)) { + throw new IllegalStateException("Unsupported OTA scheme: " + scheme); + } + HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); + conn.setConnectTimeout(CONNECT_TIMEOUT_MS); + conn.setReadTimeout(READ_TIMEOUT_MS); + conn.setInstanceFollowRedirects(true); + conn.setRequestProperty("Accept", "application/json"); + int code = conn.getResponseCode(); + InputStream in = code >= 200 && code < 300 ? conn.getInputStream() : conn.getErrorStream(); + if (in == null) { + conn.disconnect(); + throw new IllegalStateException("HTTP " + code); + } + byte[] body = readLimited(in, maxBytes); + conn.disconnect(); + if (code < 200 || code >= 300) { + throw new IllegalStateException("HTTP " + code); + } + return body; + } + + static long getContentLength(String url) { + String scheme = schemeOf(url); + if ("mqtt".equals(scheme) || "mqtts".equals(scheme)) { + return 0L; + } + if (!isHttpUrl(url)) { + return 0L; + } + HttpURLConnection conn = null; + try { + conn = (HttpURLConnection) new URL(url).openConnection(); + conn.setConnectTimeout(CONNECT_TIMEOUT_MS); + conn.setReadTimeout(READ_TIMEOUT_MS); + conn.setInstanceFollowRedirects(true); + conn.setRequestMethod("HEAD"); + long len = conn.getContentLengthLong(); + if (len > 0L) { + return len; + } + } catch (Exception ignored) { + } finally { + if (conn != null) { + conn.disconnect(); + } + } + return 0L; + } + + static String schemeOf(String url) { + try { + URI uri = URI.create(url); + String scheme = uri.getScheme(); + return scheme == null ? "" : scheme.toLowerCase(Locale.US); + } catch (Exception ignored) { + return ""; + } + } + + static boolean isHttpUrl(String url) { + String scheme = schemeOf(url); + return "http".equals(scheme) || "https".equals(scheme); + } + + private static byte[] readLimited(InputStream in, int maxBytes) throws Exception { + try (BufferedInputStream bin = new BufferedInputStream(in); + ByteArrayOutputStream out = new ByteArrayOutputStream()) { + byte[] buf = new byte[4096]; + int total = 0; + int n; + while ((n = bin.read(buf)) != -1) { + total += n; + if (total > maxBytes) { + throw new IllegalStateException("Response too large"); + } + out.write(buf, 0, n); + } + return out.toByteArray(); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ota/OtaManifest.java b/app/src/main/java/com/foxx/androidcast/ota/OtaManifest.java new file mode 100644 index 0000000..c5e4843 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ota/OtaManifest.java @@ -0,0 +1,183 @@ +package com.foxx.androidcast.ota; + +/********************************************************************* + * OtaManifest.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class OtaManifest + * Contributors: + * - Anton Afanasyeu (2 commits, 179 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 9d252cd4e87fbbb7368a325b3c8a19734691281b4638e6d3b71c23214c096463 +**********************************************************************/ +import android.text.TextUtils; + +import org.json.JSONException; +import org.json.JSONObject; + +/** Per-build OTA descriptor ({@code *_manifest.json}). */ +public final class OtaManifest { + private static final int UNSET = -1; + + public final int major; + public final int minor; + public final int build; + /** Legacy field; ignored when {@link #hasVersionTriple()} is true. */ + public final int versionCode; + public final String versionName; + public final String apkUrl; + public final String signUrl; + /** SHA-256 of {@code package.apk} inside the bundle or standalone {@code .otapkg}. */ + public final String sha256Hex; + public final long packageSizeBytes; + public final boolean mandatory; + public final String releaseNotes; + /** Optional HTTP(S) zip bundle ({@code manifest.json}, {@code sign.json}, {@code package.apk}). */ + public final String bundleUrl; + public final String bundleSha256Hex; + public final long bundleSizeBytes; + + public OtaManifest(int major, int minor, int build, int versionCode, String versionName, + String apkUrl, String signUrl, String sha256Hex, long packageSizeBytes, + boolean mandatory, String releaseNotes) { + this(major, minor, build, versionCode, versionName, apkUrl, signUrl, sha256Hex, + packageSizeBytes, mandatory, releaseNotes, "", "", 0L); + } + + public OtaManifest(int major, int minor, int build, int versionCode, String versionName, + String apkUrl, String signUrl, String sha256Hex, long packageSizeBytes, + boolean mandatory, String releaseNotes, String bundleUrl, String bundleSha256Hex, + long bundleSizeBytes) { + this.major = major; + this.minor = minor; + this.build = build; + this.versionCode = versionCode; + this.versionName = versionName != null ? versionName : ""; + this.apkUrl = apkUrl != null ? apkUrl : ""; + this.signUrl = signUrl != null ? signUrl : ""; + this.sha256Hex = sha256Hex != null ? sha256Hex.toLowerCase() : ""; + this.packageSizeBytes = Math.max(0L, packageSizeBytes); + this.mandatory = mandatory; + this.releaseNotes = releaseNotes != null ? releaseNotes : ""; + this.bundleUrl = bundleUrl != null ? bundleUrl : ""; + this.bundleSha256Hex = bundleSha256Hex != null ? bundleSha256Hex.toLowerCase() : ""; + this.bundleSizeBytes = Math.max(0L, bundleSizeBytes); + } + + public boolean hasVersionTriple() { + return major >= 0 && minor >= 0 && build >= 0; + } + + public int effectiveVersionCode() { + if (hasVersionTriple()) { + return OtaVersion.pack(major, minor, build); + } + return versionCode; + } + + public String displayVersion() { + if (!versionName.isEmpty()) { + return versionName; + } + if (hasVersionTriple()) { + return new OtaVersion(major, minor, build).displayName(); + } + return String.valueOf(versionCode); + } + + /** HTTP(S) bundle download is preferred over separate artifact fetches. */ + public boolean hasHttpBundle() { + return !bundleUrl.isEmpty() && OtaJsonFetch.isHttpUrl(bundleUrl); + } + + /** Size shown in the update dialog (bundle zip when applicable). */ + public long downloadSizeBytes() { + if (hasHttpBundle() && bundleSizeBytes > 0L) { + return bundleSizeBytes; + } + return packageSizeBytes; + } + + public boolean isValid() { + return effectiveVersionCode() > 0 + && (!apkUrl.isEmpty() || hasHttpBundle()); + } + + public static OtaManifest fromJson(JSONObject root) { + if (root == null) { + return null; + } + return new OtaManifest( + root.has("major") ? root.optInt("major", UNSET) : UNSET, + root.has("minor") ? root.optInt("minor", UNSET) : UNSET, + root.has("build") ? root.optInt("build", UNSET) : UNSET, + root.optInt("versionCode", 0), + root.optString("versionName", ""), + root.optString("apkUrl", ""), + root.optString("signUrl", ""), + root.optString("sha256", ""), + root.optLong("sizeBytes", 0L), + root.optBoolean("mandatory", false), + root.optString("releaseNotes", ""), + root.optString("bundleUrl", ""), + root.optString("bundleSha256", ""), + root.optLong("bundleSizeBytes", 0L)); + } + + public static OtaManifest fromJsonString(String json) { + if (TextUtils.isEmpty(json)) { + return null; + } + try { + return fromJson(new JSONObject(json)); + } catch (JSONException e) { + return null; + } + } + + public JSONObject toJson() throws JSONException { + JSONObject o = new JSONObject(); + if (hasVersionTriple()) { + o.put("major", major); + o.put("minor", minor); + o.put("build", build); + } + if (versionCode != 0) { + o.put("versionCode", versionCode); + } + if (!versionName.isEmpty()) { + o.put("versionName", versionName); + } + o.put("apkUrl", apkUrl); + if (!signUrl.isEmpty()) { + o.put("signUrl", signUrl); + } + if (!sha256Hex.isEmpty()) { + o.put("sha256", sha256Hex); + } + if (packageSizeBytes > 0) { + o.put("sizeBytes", packageSizeBytes); + } + if (!bundleUrl.isEmpty()) { + o.put("bundleUrl", bundleUrl); + } + if (!bundleSha256Hex.isEmpty()) { + o.put("bundleSha256", bundleSha256Hex); + } + if (bundleSizeBytes > 0) { + o.put("bundleSizeBytes", bundleSizeBytes); + } + o.put("mandatory", mandatory); + o.put("releaseNotes", releaseNotes); + return o; + } + + public String toJsonString() { + try { + return toJson().toString(); + } catch (JSONException e) { + return "{}"; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ota/OtaMqttFetch.java b/app/src/main/java/com/foxx/androidcast/ota/OtaMqttFetch.java new file mode 100644 index 0000000..617cc3d --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ota/OtaMqttFetch.java @@ -0,0 +1,124 @@ +package com.foxx.androidcast.ota; + +/********************************************************************* + * OtaMqttFetch.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * Contributors: + * - Anton Afanasyeu (2 commits, 120 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 83b61695b2344fb831a826cb0ef9687578aab90231f5c08416d1806462b09ec6 +**********************************************************************/ +import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; +import org.eclipse.paho.client.mqttv3.MqttCallback; +import org.eclipse.paho.client.mqttv3.MqttClient; +import org.eclipse.paho.client.mqttv3.MqttConnectOptions; +import org.eclipse.paho.client.mqttv3.MqttException; +import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; + +import java.net.URI; +import java.util.Locale; +import java.util.UUID; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +/** Fetches retained payloads from MQTT topics addressed by mqtt:// or mqtts:// URLs. */ +final class OtaMqttFetch { + private static final int DEFAULT_MQTT_PORT = 1883; + private static final int DEFAULT_MQTTS_PORT = 8883; + + private OtaMqttFetch() {} + + static byte[] getPayload(String mqttUrl, int timeoutMs) throws Exception { + URI uri = URI.create(mqttUrl); + String scheme = uri.getScheme() == null ? "" : uri.getScheme().toLowerCase(Locale.US); + boolean tls; + if ("mqtt".equals(scheme)) { + tls = false; + } else if ("mqtts".equals(scheme)) { + tls = true; + } else { + throw new IllegalStateException("Unsupported MQTT scheme: " + scheme); + } + String host = uri.getHost(); + if (host == null || host.isEmpty()) { + throw new IllegalStateException("MQTT URL missing host"); + } + int port = uri.getPort(); + if (port <= 0) { + port = tls ? DEFAULT_MQTTS_PORT : DEFAULT_MQTT_PORT; + } + String topic = uri.getPath(); + if (topic == null || topic.isEmpty() || "/".equals(topic)) { + throw new IllegalStateException("MQTT URL missing topic path"); + } + if (topic.startsWith("/")) { + topic = topic.substring(1); + } + String brokerUri = (tls ? "ssl" : "tcp") + "://" + host + ":" + port; + + AtomicReference payload = new AtomicReference<>(); + AtomicReference error = new AtomicReference<>(); + CountDownLatch latch = new CountDownLatch(1); + + String clientId = "androidcast-ota-" + UUID.randomUUID().toString().replace("-", ""); + MqttClient client = new MqttClient(brokerUri, clientId, new MemoryPersistence()); + try { + MqttConnectOptions opts = new MqttConnectOptions(); + opts.setAutomaticReconnect(false); + opts.setCleanSession(true); + opts.setConnectionTimeout(Math.max(3, timeoutMs / 1000)); + opts.setKeepAliveInterval(20); + client.setCallback(new MqttCallback() { + @Override + public void connectionLost(Throwable cause) { + error.compareAndSet(null, cause); + latch.countDown(); + } + + @Override + public void messageArrived(String topic, MqttMessage message) { + payload.compareAndSet(null, message.getPayload()); + latch.countDown(); + } + + @Override + public void deliveryComplete(IMqttDeliveryToken token) { + // not used for OTA fetch + } + }); + client.connect(opts); + client.subscribe(topic, 0); + boolean got = latch.await(Math.max(1, timeoutMs), TimeUnit.MILLISECONDS); + client.unsubscribe(topic); + if (!got) { + throw new IllegalStateException("MQTT timeout waiting for topic: " + topic); + } + if (error.get() != null) { + Throwable t = error.get(); + throw new IllegalStateException(t.getMessage() != null ? t.getMessage() : "MQTT error", t); + } + byte[] body = payload.get(); + if (body == null || body.length == 0) { + throw new IllegalStateException("MQTT topic has empty payload: " + topic); + } + return body; + } catch (MqttException e) { + throw new IllegalStateException(e.getMessage() != null ? e.getMessage() : "MQTT error", e); + } finally { + try { + if (client.isConnected()) { + client.disconnect(); + } + } catch (Exception ignored) { + } + try { + client.close(); + } catch (Exception ignored) { + } + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ota/OtaRuntimeSettings.java b/app/src/main/java/com/foxx/androidcast/ota/OtaRuntimeSettings.java new file mode 100644 index 0000000..d4278f7 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ota/OtaRuntimeSettings.java @@ -0,0 +1,31 @@ +package com.foxx.androidcast.ota; + +/********************************************************************* + * OtaRuntimeSettings.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class OtaRuntimeSettings + * Contributors: + * - Anton Afanasyeu (2 commits, 27 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 46adf91da6c2173e02da82fed4e9702001ab6eb3319eb7612808087bc9879097 +**********************************************************************/ +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** Runtime OTA configuration loaded from files/private preferences. */ +public final class OtaRuntimeSettings { + public static final long DEFAULT_CHECK_INTERVAL_MS = 60_000L; + + public final List sourceUrls; + public final long checkIntervalMs; + public final boolean trusted; + + OtaRuntimeSettings(List sourceUrls, long checkIntervalMs, boolean trusted) { + this.sourceUrls = Collections.unmodifiableList(new ArrayList<>(sourceUrls)); + this.checkIntervalMs = Math.max(10_000L, checkIntervalMs); + this.trusted = trusted; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ota/OtaSettingsStore.java b/app/src/main/java/com/foxx/androidcast/ota/OtaSettingsStore.java new file mode 100644 index 0000000..fbd0151 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ota/OtaSettingsStore.java @@ -0,0 +1,200 @@ +package com.foxx.androidcast.ota; + +/********************************************************************* + * OtaSettingsStore.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * Contributors: + * - Anton Afanasyeu (2 commits, 195 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 ad00d10986e51e0c3056c351cfba2c39da457a45562cabf09387f6910676dc2e +**********************************************************************/ +import android.content.Context; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.BuildConfig; +import com.foxx.androidcast.crash.CrashSettings; +import com.foxx.androidcast.util.IoUtils; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; + +/** Reads app-private settings.json and composes effective OTA runtime settings. */ +final class OtaSettingsStore { + private static final String SETTINGS_FILE = "settings.json"; + + private OtaSettingsStore() {} + + static OtaRuntimeSettings load(Context context) { + ensureSettingsFile(context); + JSONObject root = readSettingsJson(context); + JSONObject ota = root.optJSONObject("ota"); + + LinkedHashMap dedup = new LinkedHashMap<>(); + addSource(dedup, AppPreferences.getOtaChannelUrl(context)); + if (BuildConfig.OTA_CHANNEL_URL_DEFAULT != null) { + addSource(dedup, BuildConfig.OTA_CHANNEL_URL_DEFAULT); + } + if (BuildConfig.OTA_MANIFEST_URL_DEFAULT != null) { + addSource(dedup, BuildConfig.OTA_MANIFEST_URL_DEFAULT); + } + if (ota != null) { + addSource(dedup, ota.optString("base_url", "")); + JSONArray arr = ota.optJSONArray("base_urls"); + if (arr != null) { + for (int i = 0; i < arr.length(); i++) { + addSource(dedup, arr.optString(i, "")); + } + } + } + + List urls = new ArrayList<>(dedup.keySet()); + long interval = OtaRuntimeSettings.DEFAULT_CHECK_INTERVAL_MS; + if (ota != null) { + interval = parseDurationMs(ota.optString("check_interval", "1m"), interval); + } + boolean trusted = ota != null && parseBoolean(ota.optString("trusted", "false")); + return new OtaRuntimeSettings(urls, interval, trusted); + } + + private static void addSource(LinkedHashMap dedup, String raw) { + if (raw == null) { + return; + } + String value = raw.trim(); + if (value.isEmpty()) { + return; + } + if (value.endsWith(",")) { + value = value.substring(0, value.length() - 1).trim(); + } + if (value.contains(",")) { + String[] split = value.split(","); + for (String s : split) { + addSource(dedup, s); + } + return; + } + dedup.put(value, Boolean.TRUE); + } + + private static JSONObject readSettingsJson(Context context) { + File f = new File(context.getFilesDir(), SETTINGS_FILE); + try (FileInputStream fis = new FileInputStream(f)) { + byte[] data = IoUtils.readAllBytes(fis); + String text = new String(data, StandardCharsets.UTF_8); + return new JSONObject(text); + } catch (Exception ignored) { + return new JSONObject(); + } + } + + private static void ensureSettingsFile(Context context) { + File f = new File(context.getFilesDir(), SETTINGS_FILE); + if (f.exists()) { + return; + } + JSONObject ota = new JSONObject(); + try { + ota.put("base_url", defaultBaseUrl(context)); + ota.put("trusted", "false"); + ota.put("check_interval", "1m"); + JSONObject crash = new JSONObject(); + crash.put("enabled", "true"); + crash.put("upload_url", CrashSettings.DEFAULT_UPLOAD_URL); + crash.put("prune_after_upload", "true"); + crash.put("upload_interval", "5m"); + crash.put("max_pending", 32); + JSONObject root = new JSONObject(); + root.put("ota", ota); + root.put("crash", crash); + try (FileOutputStream fos = new FileOutputStream(f)) { + fos.write(root.toString(2).getBytes(StandardCharsets.UTF_8)); + } + } catch (Exception ignored) { + } + } + + private static String defaultBaseUrl(Context context) { + String pref = AppPreferences.getOtaChannelUrl(context); + if (!pref.isEmpty()) { + return pref; + } + if (BuildConfig.OTA_CHANNEL_URL_DEFAULT != null && !BuildConfig.OTA_CHANNEL_URL_DEFAULT.trim().isEmpty()) { + return BuildConfig.OTA_CHANNEL_URL_DEFAULT.trim(); + } + if (BuildConfig.OTA_MANIFEST_URL_DEFAULT != null) { + return BuildConfig.OTA_MANIFEST_URL_DEFAULT.trim(); + } + return "https://foxx.org/v0/ota/channel/stable.json"; + } + + static long parseDurationMs(String raw, long fallback) { + if (raw == null) { + return fallback; + } + String text = raw.trim().toLowerCase(Locale.US); + if (text.isEmpty()) { + return fallback; + } + try { + long total = 0L; + int i = 0; + while (i < text.length()) { + while (i < text.length() && Character.isWhitespace(text.charAt(i))) { + i++; + } + int start = i; + while (i < text.length() + && (Character.isDigit(text.charAt(i)) || text.charAt(i) == '.')) { + i++; + } + if (start == i) { + return fallback; + } + double value = Double.parseDouble(text.substring(start, i)); + int unitStart = i; + while (i < text.length() && Character.isLetter(text.charAt(i))) { + i++; + } + String unit = text.substring(unitStart, i); + long mult; + if ("ms".equals(unit)) { + mult = 1L; + } else if ("s".equals(unit)) { + mult = 1_000L; + } else if ("m".equals(unit)) { + mult = 60_000L; + } else if ("h".equals(unit)) { + mult = 3_600_000L; + } else if ("d".equals(unit)) { + mult = 86_400_000L; + } else { + return fallback; + } + total += Math.round(value * mult); + } + return total > 0L ? total : fallback; + } catch (Exception e) { + return fallback; + } + } + + private static boolean parseBoolean(String raw) { + if (raw == null) { + return false; + } + String v = raw.trim().toLowerCase(Locale.US); + return "true".equals(v) || "1".equals(v) || "yes".equals(v) || "on".equals(v); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ota/OtaSignBundle.java b/app/src/main/java/com/foxx/androidcast/ota/OtaSignBundle.java new file mode 100644 index 0000000..4a50dd2 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ota/OtaSignBundle.java @@ -0,0 +1,30 @@ +package com.foxx.androidcast.ota; + +/********************************************************************* + * OtaSignBundle.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class OtaSignBundle + * Contributors: + * - Anton Afanasyeu (2 commits, 26 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 eadf7b0d0c4a5c80e8faaa3519e4e7bc2885e931727eb66d362efb6a9fcbe3ae +**********************************************************************/ +import org.json.JSONObject; + +/** Checksums and digests for one OTA build ({@code *_sign.json}). */ +public final class OtaSignBundle { + public final String sha256Hex; + + public OtaSignBundle(String sha256Hex) { + this.sha256Hex = sha256Hex != null ? sha256Hex.toLowerCase() : ""; + } + + public static OtaSignBundle fromJson(JSONObject root) { + if (root == null) { + return new OtaSignBundle(""); + } + return new OtaSignBundle(root.optString("sha256", "")); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ota/OtaUpdateChecker.java b/app/src/main/java/com/foxx/androidcast/ota/OtaUpdateChecker.java new file mode 100644 index 0000000..a6a9c7f --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ota/OtaUpdateChecker.java @@ -0,0 +1,174 @@ +package com.foxx.androidcast.ota; + +/********************************************************************* + * OtaUpdateChecker.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class OtaUpdateChecker + * Contributors: + * - Anton Afanasyeu (2 commits, 170 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 35c0b4dd9db5095245a025fe2ea4971146d322b7ad41e6101b54afe7b4b7246c +**********************************************************************/ +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; + +import org.json.JSONObject; + +/** Resolves v0 channel or manifest URL and compares against the installed build. */ +public final class OtaUpdateChecker { + private static final int MAX_CHANNEL_BYTES = 8 * 1024; + private static final int MAX_MANIFEST_BYTES = 64 * 1024; + private static final int MAX_SIGN_BYTES = 16 * 1024; + + private OtaUpdateChecker() {} + + public static final class Result { + public final OtaManifest manifest; + public final int installedVersionCode; + public final String installedVersionName; + public final boolean updateAvailable; + public final String sourceUrl; + public final String error; + + Result(OtaManifest manifest, int installedVersionCode, String installedVersionName, + boolean updateAvailable, String sourceUrl, String error) { + this.manifest = manifest; + this.installedVersionCode = installedVersionCode; + this.installedVersionName = installedVersionName != null ? installedVersionName : ""; + this.updateAvailable = updateAvailable; + this.sourceUrl = sourceUrl != null ? sourceUrl : ""; + this.error = error; + } + + static Result error(String sourceUrl, String message) { + return new Result(null, 0, "", false, sourceUrl, message); + } + } + + public static int installedVersionCode(Context context) { + return OtaVersion.installed().packed(); + } + + public static String installedVersionName(Context context) { + try { + PackageManager pm = context.getPackageManager(); + PackageInfo info = pm.getPackageInfo(context.getPackageName(), 0); + return info.versionName != null ? info.versionName : OtaVersion.installed().displayName(); + } catch (PackageManager.NameNotFoundException e) { + return OtaVersion.installed().displayName(); + } + } + + public static Result check(Context context, String entryUrl) { + return check(context, entryUrl, true); + } + + public static Result check(Context context, String entryUrl, boolean strictVerification) { + if (entryUrl == null || entryUrl.trim().isEmpty()) { + return Result.error("", "No OTA channel URL configured"); + } + String normalized = entryUrl.trim(); + int installed = installedVersionCode(context); + String installedName = installedVersionName(context); + try { + OtaManifest manifest = resolveManifest(normalized); + if (manifest == null) { + return Result.error(normalized, "Invalid manifest JSON"); + } + if (!manifest.isValid()) { + return Result.error(normalized, "Manifest missing version or download URL"); + } + manifest = enrichFromSignBundle(manifest, strictVerification); + long sizeBytes = resolveDisplaySizeBytes(manifest); + if (sizeBytes > 0L) { + manifest = new OtaManifest( + manifest.major, + manifest.minor, + manifest.build, + manifest.versionCode, + manifest.versionName, + manifest.apkUrl, + manifest.signUrl, + manifest.sha256Hex, + manifest.hasHttpBundle() ? manifest.packageSizeBytes : sizeBytes, + manifest.mandatory, + manifest.releaseNotes, + manifest.bundleUrl, + manifest.bundleSha256Hex, + manifest.hasHttpBundle() ? sizeBytes : manifest.bundleSizeBytes); + } + boolean available = OtaVersion.isUpdateAvailable( + manifest.effectiveVersionCode(), installed); + return new Result(manifest, installed, installedName, available, normalized, null); + } catch (Exception e) { + return Result.error( + normalized, + e.getMessage() != null ? e.getMessage() : e.getClass().getSimpleName()); + } + } + + static OtaManifest resolveManifest(String entryUrl) throws Exception { + JSONObject root = OtaJsonFetch.getJson(entryUrl, MAX_MANIFEST_BYTES); + if (root.has("apkUrl")) { + return OtaManifest.fromJson(root); + } + OtaChannelPointer channel = OtaChannelPointer.fromJson(root); + if (!channel.isValid()) { + throw new IllegalStateException("Channel JSON missing manifestUrl"); + } + return fetchManifest(channel.manifestUrl); + } + + static OtaManifest fetchManifest(String manifestUrl) throws Exception { + return OtaManifest.fromJson(OtaJsonFetch.getJson(manifestUrl, MAX_MANIFEST_BYTES)); + } + + static OtaManifest enrichFromSignBundle(OtaManifest manifest, boolean strictVerification) throws Exception { + if (manifest == null) { + return manifest; + } + if (!manifest.sha256Hex.isEmpty()) { + return manifest; + } + if (manifest.signUrl.isEmpty()) { + if (strictVerification) { + throw new IllegalStateException("Manifest missing sha256/signUrl"); + } + return manifest; + } + OtaSignBundle sign = OtaSignBundle.fromJson( + OtaJsonFetch.getJson(manifest.signUrl, MAX_SIGN_BYTES)); + if (sign.sha256Hex.isEmpty()) { + if (strictVerification) { + throw new IllegalStateException("sign.json missing sha256"); + } + return manifest; + } + return new OtaManifest(manifest.major, manifest.minor, manifest.build, manifest.versionCode, + manifest.versionName, manifest.apkUrl, manifest.signUrl, sign.sha256Hex, + manifest.packageSizeBytes, manifest.mandatory, manifest.releaseNotes, + manifest.bundleUrl, manifest.bundleSha256Hex, manifest.bundleSizeBytes); + } + + static long resolveDisplaySizeBytes(OtaManifest manifest) throws Exception { + if (manifest.hasHttpBundle()) { + if (manifest.bundleSizeBytes > 0L) { + return manifest.bundleSizeBytes; + } + long len = OtaJsonFetch.getContentLength(manifest.bundleUrl); + if (len > 0L) { + return len; + } + } + if (manifest.packageSizeBytes > 0L) { + return manifest.packageSizeBytes; + } + if (!manifest.apkUrl.isEmpty()) { + return OtaJsonFetch.getContentLength(manifest.apkUrl); + } + return 0L; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ota/OtaUpdateCoordinator.java b/app/src/main/java/com/foxx/androidcast/ota/OtaUpdateCoordinator.java new file mode 100644 index 0000000..842bf11 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ota/OtaUpdateCoordinator.java @@ -0,0 +1,141 @@ +package com.foxx.androidcast.ota; + +/********************************************************************* + * OtaUpdateCoordinator.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class OtaUpdateCoordinator + * Contributors: + * - Anton Afanasyeu (2 commits, 137 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 04de2b9dd7b10206c7b2bcc26b2362fea30a7050a691b639920ac061c082b4ae +**********************************************************************/ +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.ResultReceiver; +import android.widget.Toast; + +import androidx.appcompat.app.AlertDialog; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.BuildConfig; +import com.foxx.androidcast.R; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** Starts {@link OtaUpdateService} and hosts update prompts for visible activities. */ +public final class OtaUpdateCoordinator { + private static final AtomicBoolean sUpdateDialogOpen = new AtomicBoolean(false); + + private OtaUpdateCoordinator() {} + + public static String resolveEntryUrl(Context context) { + String url = AppPreferences.getOtaChannelUrl(context); + if (url.isEmpty()) { + url = BuildConfig.OTA_CHANNEL_URL_DEFAULT != null + ? BuildConfig.OTA_CHANNEL_URL_DEFAULT.trim() : ""; + } + if (url.isEmpty() && BuildConfig.OTA_MANIFEST_URL_DEFAULT != null) { + url = BuildConfig.OTA_MANIFEST_URL_DEFAULT.trim(); + } + return url; + } + + public static void requestCheckOnLaunch(Context context) { + OtaUpdateService.enqueueCheckOnLaunch(context.getApplicationContext()); + } + + public static void requestManualCheck(Activity activity) { + ResultReceiver receiver = new ResultReceiver(new Handler(Looper.getMainLooper())) { + @Override + protected void onReceiveResult(int resultCode, Bundle resultData) { + if (activity.isFinishing()) { + return; + } + if (resultCode == OtaUpdateService.RESULT_ERROR) { + String err = resultData != null + ? resultData.getString(OtaUpdateService.EXTRA_ERROR, "?") : "?"; + Toast.makeText(activity, activity.getString(R.string.ota_check_failed, err), + Toast.LENGTH_LONG).show(); + return; + } + if (resultCode == OtaUpdateService.RESULT_UP_TO_DATE) { + String name = resultData != null + ? resultData.getString(OtaUpdateService.EXTRA_INSTALLED_VERSION_NAME, "") : ""; + int code = resultData != null + ? resultData.getInt(OtaUpdateService.EXTRA_INSTALLED_VERSION_CODE, 0) : 0; + Toast.makeText(activity, + activity.getString(R.string.ota_up_to_date, name, code), + Toast.LENGTH_LONG).show(); + return; + } + if (resultCode == OtaUpdateService.RESULT_DISMISSED) { + Toast.makeText(activity, R.string.ota_dismissed_hint, Toast.LENGTH_SHORT).show(); + return; + } + if (resultCode == OtaUpdateService.RESULT_UPDATE_AVAILABLE) { + String json = resultData != null + ? resultData.getString(OtaUpdateService.EXTRA_MANIFEST_JSON) : null; + OtaManifest manifest = OtaManifest.fromJsonString(json); + String sourceUrl = resultData != null + ? resultData.getString(OtaUpdateService.EXTRA_SOURCE_URL, "") : ""; + boolean trustedSource = resultData != null + && resultData.getBoolean(OtaUpdateService.EXTRA_TRUSTED_SOURCE, false); + if (manifest != null) { + presentUpdateDialog(activity, manifest, sourceUrl, trustedSource); + } + } + } + }; + OtaUpdateService.enqueueCheckManual(activity, receiver); + } + + /** + * Shows the update dialog (used from {@link com.foxx.androidcast.MainActivity} when the + * service posts {@link OtaUpdateService#ACTION_UPDATE_AVAILABLE}). + */ + public static void presentUpdateDialog(Activity activity, OtaManifest manifest) { + presentUpdateDialog(activity, manifest, "", false); + } + + public static void presentUpdateDialog(Activity activity, OtaManifest manifest, + String sourceUrl, boolean trustedSource) { + if (manifest == null || activity == null || activity.isFinishing()) { + return; + } + if (!sUpdateDialogOpen.compareAndSet(false, true)) { + return; + } + String notes = manifest.releaseNotes.isEmpty() + ? activity.getString(R.string.ota_no_release_notes) + : manifest.releaseNotes; + String currentVersion = OtaUpdateChecker.installedVersionName(activity) + + " (" + OtaUpdateChecker.installedVersionCode(activity) + ")"; + double sizeMb = manifest.downloadSizeBytes() > 0 + ? (manifest.downloadSizeBytes() / (1024.0 * 1024.0)) : 0.0; + String sizeText = sizeMb > 0 ? String.format(java.util.Locale.US, "%.2f", sizeMb) : "?"; + String message = activity.getString(R.string.ota_update_message, + manifest.displayVersion(), + currentVersion, + sizeText, + notes); + AlertDialog.Builder builder = new AlertDialog.Builder(activity) + .setTitle(R.string.ota_update_title) + .setMessage(message) + .setCancelable(!manifest.mandatory) + .setPositiveButton(R.string.ota_download_install, (d, w) -> + OtaUpdateService.enqueueDownload(activity, manifest, trustedSource, sourceUrl)); + if (!manifest.mandatory) { + builder.setNegativeButton(R.string.ota_later, (d, w) -> + AppPreferences.setOtaDismissedVersionCode(activity, + manifest.effectiveVersionCode())); + } + AlertDialog dialog = builder.create(); + dialog.setOnDismissListener(d -> sUpdateDialogOpen.set(false)); + dialog.show(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ota/OtaUpdateService.java b/app/src/main/java/com/foxx/androidcast/ota/OtaUpdateService.java new file mode 100644 index 0000000..adfaf08 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ota/OtaUpdateService.java @@ -0,0 +1,376 @@ +package com.foxx.androidcast.ota; + +/********************************************************************* + * OtaUpdateService.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class OtaUpdateService + * Contributors: + * - Anton Afanasyeu (2 commits, 372 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 d3fc9f2f38c78893ac5e17c4cc715562d29c10763a11eb64548ba59d4d03dfff +**********************************************************************/ +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.Service; +import android.app.AlarmManager; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.os.IBinder; +import android.os.ResultReceiver; + +import androidx.annotation.Nullable; +import androidx.core.app.NotificationCompat; +import androidx.core.content.ContextCompat; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.BuildConfig; +import com.foxx.androidcast.MainActivity; +import com.foxx.androidcast.R; +import com.foxx.androidcast.util.CastBackgroundExecutor; + +import java.io.File; +import java.util.List; + +/** + * Standalone OTA lifecycle: channel/manifest fetch, optional user prompt via broadcast, + * and foreground APK download + install intent. + */ +public final class OtaUpdateService extends Service { + public static final String ACTION_CHECK_ON_LAUNCH = "com.foxx.androidcast.ota.CHECK_ON_LAUNCH"; + public static final String ACTION_CHECK_MANUAL = "com.foxx.androidcast.ota.CHECK_MANUAL"; + public static final String ACTION_CHECK_PERIODIC = "com.foxx.androidcast.ota.CHECK_PERIODIC"; + public static final String ACTION_DOWNLOAD = "com.foxx.androidcast.ota.DOWNLOAD"; + + public static final String EXTRA_MANIFEST_JSON = "manifestJson"; + public static final String EXTRA_RESULT_RECEIVER = "resultReceiver"; + public static final String EXTRA_SOURCE_URL = "sourceUrl"; + public static final String EXTRA_TRUSTED_SOURCE = "trustedSource"; + + public static final String ACTION_UPDATE_AVAILABLE = "com.foxx.androidcast.ota.UPDATE_AVAILABLE"; + + public static final String EXTRA_ERROR = "error"; + public static final String EXTRA_INSTALLED_VERSION_NAME = "installedVersionName"; + public static final String EXTRA_INSTALLED_VERSION_CODE = "installedVersionCode"; + + public static final int RESULT_UP_TO_DATE = 1; + public static final int RESULT_UPDATE_AVAILABLE = 2; + public static final int RESULT_ERROR = 3; + public static final int RESULT_DISMISSED = 4; + + private static final String CHANNEL_OTA = "ota_updates"; + private static final int NOTIFICATION_DOWNLOAD = 2001; + + public static void enqueueCheckOnLaunch(Context context) { + Intent i = new Intent(context, OtaUpdateService.class); + i.setAction(ACTION_CHECK_ON_LAUNCH); + context.startService(i); + } + + public static void enqueueCheckManual(Context context, @Nullable ResultReceiver resultReceiver) { + Intent i = new Intent(context, OtaUpdateService.class); + i.setAction(ACTION_CHECK_MANUAL); + if (resultReceiver != null) { + i.putExtra(EXTRA_RESULT_RECEIVER, resultReceiver); + } + context.startService(i); + } + + public static void enqueueDownload(Context context, OtaManifest manifest) { + enqueueDownload(context, manifest, false, ""); + } + + public static void enqueueDownload(Context context, OtaManifest manifest, boolean trustedSource, + String sourceUrl) { + if (manifest == null) { + return; + } + Intent i = new Intent(context, OtaUpdateService.class); + i.setAction(ACTION_DOWNLOAD); + i.putExtra(EXTRA_MANIFEST_JSON, manifest.toJsonString()); + i.putExtra(EXTRA_TRUSTED_SOURCE, trustedSource); + i.putExtra(EXTRA_SOURCE_URL, sourceUrl != null ? sourceUrl : ""); + ContextCompat.startForegroundService(context, i); + } + + @Override + public void onCreate() { + super.onCreate(); + ensureChannel(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (intent == null || intent.getAction() == null) { + stopSelf(startId); + return START_NOT_STICKY; + } + String action = intent.getAction(); + if (ACTION_DOWNLOAD.equals(action)) { + String json = intent.getStringExtra(EXTRA_MANIFEST_JSON); + OtaManifest manifest = OtaManifest.fromJsonString(json); + if (manifest == null || !manifest.isValid()) { + stopSelf(startId); + return START_NOT_STICKY; + } + boolean trustedSource = intent.getBooleanExtra(EXTRA_TRUSTED_SOURCE, false); + String sourceUrl = intent.getStringExtra(EXTRA_SOURCE_URL); + startDownloadJob(manifest, trustedSource, sourceUrl, startId); + return START_NOT_STICKY; + } + CastBackgroundExecutor.execute(() -> { + try { + if (ACTION_CHECK_ON_LAUNCH.equals(action)) { + runCheckOnLaunch(); + } else if (ACTION_CHECK_MANUAL.equals(action)) { + ResultReceiver receiver = null; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + receiver = intent.getParcelableExtra(EXTRA_RESULT_RECEIVER, ResultReceiver.class); + } else { + receiver = intent.getParcelableExtra(EXTRA_RESULT_RECEIVER); + } + runCheckManual(receiver); + } else if (ACTION_CHECK_PERIODIC.equals(action)) { + runCheckPeriodic(); + } + } finally { + stopSelf(startId); + } + }); + return START_NOT_STICKY; + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + private void runCheckOnLaunch() { + if (!AppPreferences.isOtaCheckOnLaunch(this)) { + return; + } + OtaRuntimeSettings settings = OtaSettingsStore.load(this); + scheduleNextCheck(settings.checkIntervalMs); + if (settings.sourceUrls.isEmpty()) { + return; + } + long now = System.currentTimeMillis(); + if (now - AppPreferences.getOtaLastCheckMs(this) < settings.checkIntervalMs) { + return; + } + AppPreferences.setOtaLastCheckMs(this, now); + OtaUpdateChecker.Result result = checkRoundRobin(settings); + if (result.error != null || !result.updateAvailable || result.manifest == null) { + return; + } + if (result.manifest.effectiveVersionCode() == AppPreferences.getOtaDismissedVersionCode(this)) { + return; + } + sendUpdateBroadcast(result.manifest, result.sourceUrl, settings.trusted); + } + + private void runCheckPeriodic() { + OtaRuntimeSettings settings = OtaSettingsStore.load(this); + scheduleNextCheck(settings.checkIntervalMs); + if (!AppPreferences.isOtaCheckOnLaunch(this) || settings.sourceUrls.isEmpty()) { + return; + } + long now = System.currentTimeMillis(); + if (now - AppPreferences.getOtaLastCheckMs(this) < settings.checkIntervalMs) { + return; + } + AppPreferences.setOtaLastCheckMs(this, now); + OtaUpdateChecker.Result result = checkRoundRobin(settings); + if (result.error != null || !result.updateAvailable || result.manifest == null) { + return; + } + if (result.manifest.effectiveVersionCode() == AppPreferences.getOtaDismissedVersionCode(this)) { + return; + } + sendUpdateBroadcast(result.manifest, result.sourceUrl, settings.trusted); + } + + private void runCheckManual(@Nullable ResultReceiver receiver) { + OtaRuntimeSettings settings = OtaSettingsStore.load(this); + scheduleNextCheck(settings.checkIntervalMs); + if (settings.sourceUrls.isEmpty()) { + deliver(receiver, RESULT_ERROR, bundleError(getString(R.string.ota_no_url))); + return; + } + OtaUpdateChecker.Result result = checkRoundRobin(settings); + if (result.error != null) { + deliver(receiver, RESULT_ERROR, bundleError(result.error)); + return; + } + if (!result.updateAvailable || result.manifest == null) { + Bundle b = new Bundle(); + b.putString(EXTRA_INSTALLED_VERSION_NAME, result.installedVersionName); + b.putInt(EXTRA_INSTALLED_VERSION_CODE, result.installedVersionCode); + deliver(receiver, RESULT_UP_TO_DATE, b); + return; + } + if (result.manifest.effectiveVersionCode() == AppPreferences.getOtaDismissedVersionCode(this)) { + deliver(receiver, RESULT_DISMISSED, Bundle.EMPTY); + return; + } + Bundle b = new Bundle(); + b.putString(EXTRA_MANIFEST_JSON, result.manifest.toJsonString()); + b.putString(EXTRA_SOURCE_URL, result.sourceUrl); + b.putBoolean(EXTRA_TRUSTED_SOURCE, settings.trusted); + deliver(receiver, RESULT_UPDATE_AVAILABLE, b); + } + + private static void deliver(@Nullable ResultReceiver receiver, int code, Bundle data) { + if (receiver == null) { + return; + } + receiver.send(code, data != null ? data : Bundle.EMPTY); + } + + private Bundle bundleError(String message) { + Bundle b = new Bundle(); + b.putString(EXTRA_ERROR, message); + return b; + } + + private OtaUpdateChecker.Result checkRoundRobin(OtaRuntimeSettings settings) { + List urls = settings.sourceUrls; + if (urls.isEmpty()) { + return OtaUpdateChecker.Result.error("", getString(R.string.ota_no_url)); + } + int start = AppPreferences.getOtaRoundRobinIndex(this); + if (start >= urls.size()) { + start = 0; + } + int next = (start + 1) % urls.size(); + AppPreferences.setOtaRoundRobinIndex(this, next); + OtaUpdateChecker.Result lastError = null; + for (int i = 0; i < urls.size(); i++) { + int idx = (start + i) % urls.size(); + String source = urls.get(idx); + boolean strictVerification = !(settings.trusted && BuildConfig.DEBUG); + OtaUpdateChecker.Result result = OtaUpdateChecker.check(this, source, strictVerification); + if (result.error == null) { + return result; + } + lastError = result; + } + if (lastError != null) { + return lastError; + } + return OtaUpdateChecker.Result.error("", "No OTA sources configured"); + } + + private void sendUpdateBroadcast(OtaManifest manifest, String sourceUrl, boolean trustedSource) { + Intent i = new Intent(ACTION_UPDATE_AVAILABLE); + i.setPackage(getPackageName()); + i.putExtra(EXTRA_MANIFEST_JSON, manifest.toJsonString()); + i.putExtra(EXTRA_SOURCE_URL, sourceUrl != null ? sourceUrl : ""); + i.putExtra(EXTRA_TRUSTED_SOURCE, trustedSource); + sendBroadcast(i); + } + + private void startDownloadJob(OtaManifest manifest, boolean trustedSource, String sourceUrl, int startId) { + new Thread(() -> { + NotificationManager nm = getSystemService(NotificationManager.class); + try { + Notification initial = buildDownloadNotification(0, 0, true); + startForeground(NOTIFICATION_DOWNLOAD, initial); + OtaManifest checkedManifest = manifest; + if (trustedSource && BuildConfig.DEBUG) { + checkedManifest = new OtaManifest( + manifest.major, + manifest.minor, + manifest.build, + manifest.versionCode, + manifest.versionName, + manifest.apkUrl, + manifest.signUrl, + "", + manifest.packageSizeBytes, + manifest.mandatory, + manifest.releaseNotes, + manifest.bundleUrl, + "", + manifest.bundleSizeBytes); + } + File apk = OtaApkInstaller.downloadApk(this, checkedManifest, (downloaded, total) -> { + Notification n = buildDownloadNotification(downloaded, total, total <= 0); + nm.notify(NOTIFICATION_DOWNLOAD, n); + }); + stopForeground(STOP_FOREGROUND_REMOVE); + nm.cancel(NOTIFICATION_DOWNLOAD); + OtaApkInstaller.launchInstall(getApplicationContext(), apk); + } catch (Exception e) { + String msg = e.getMessage() != null ? e.getMessage() : e.getClass().getSimpleName(); + Notification err = new NotificationCompat.Builder(this, CHANNEL_OTA) + .setSmallIcon(R.drawable.ic_notification) + .setContentTitle(getString(R.string.ota_download_title)) + .setContentText(getString(R.string.ota_download_failed, msg)) + .setPriority(NotificationCompat.PRIORITY_DEFAULT) + .build(); + nm.notify(NOTIFICATION_DOWNLOAD + 1, err); + stopForeground(STOP_FOREGROUND_REMOVE); + nm.cancel(NOTIFICATION_DOWNLOAD); + } finally { + stopSelf(startId); + } + }, "OtaApkDownload").start(); + } + + private Notification buildDownloadNotification(long downloaded, long total, boolean indeterminate) { + NotificationCompat.Builder b = new NotificationCompat.Builder(this, CHANNEL_OTA) + .setSmallIcon(R.drawable.ic_notification) + .setContentTitle(getString(R.string.ota_download_title)) + .setContentText(getString(R.string.ota_downloading)) + .setOnlyAlertOnce(true) + .setOngoing(true) + .setPriority(NotificationCompat.PRIORITY_LOW); + if (indeterminate || total <= 0) { + b.setProgress(0, 0, true); + } else { + int max = 100; + int prog = (int) Math.min(max, downloaded * max / total); + b.setProgress(max, prog, false); + } + return b.build(); + } + + private void ensureChannel() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + return; + } + NotificationChannel ch = new NotificationChannel( + CHANNEL_OTA, + getString(R.string.ota_notification_channel_name), + NotificationManager.IMPORTANCE_LOW); + NotificationManager nm = getSystemService(NotificationManager.class); + nm.createNotificationChannel(ch); + } + + private void scheduleNextCheck(long delayMs) { + AlarmManager alarm = getSystemService(AlarmManager.class); + if (alarm == null) { + return; + } + long triggerAt = System.currentTimeMillis() + Math.max(10_000L, delayMs); + Intent intent = new Intent(this, OtaUpdateService.class); + intent.setAction(ACTION_CHECK_PERIODIC); + PendingIntent pi = PendingIntent.getService( + this, + 3001, + intent, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + alarm.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerAt, pi); + } else { + alarm.set(AlarmManager.RTC_WAKEUP, triggerAt, pi); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ota/OtaVersion.java b/app/src/main/java/com/foxx/androidcast/ota/OtaVersion.java new file mode 100644 index 0000000..de83264 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ota/OtaVersion.java @@ -0,0 +1,60 @@ +package com.foxx.androidcast.ota; + +/********************************************************************* + * OtaVersion.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class OtaVersion + * Contributors: + * - Anton Afanasyeu (2 commits, 56 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 4a7d39b7a223c2361aad2601f067cf91c9203dd292f64d209a5de4d78bb33d34 +**********************************************************************/ +import com.foxx.androidcast.BuildConfig; + +/** major.minor.build packed the same way as Gradle {@code versionCode}. */ +public final class OtaVersion { + public static final int MAX_COMPONENT = 99; + + public final int major; + public final int minor; + public final int build; + + public OtaVersion(int major, int minor, int build) { + this.major = major; + this.minor = minor; + this.build = build; + } + + public static int pack(int major, int minor, int build) { + if (major < 0 || minor < 0 || build < 0 + || major > MAX_COMPONENT || minor > MAX_COMPONENT || build > MAX_COMPONENT) { + throw new IllegalArgumentException("OTA version out of range 0..99"); + } + return major * 10_000 + minor * 100 + build; + } + + public int packed() { + return pack(major, minor, build); + } + + public String displayName() { + return major + "." + minor + "." + build; + } + + public static OtaVersion fromPacked(int packed) { + int major = packed / 10_000; + int minor = (packed / 100) % 100; + int build = packed % 100; + return new OtaVersion(major, minor, build); + } + + public static OtaVersion installed() { + return new OtaVersion(BuildConfig.VERSION_MAJOR, BuildConfig.VERSION_MINOR, BuildConfig.VERSION_BUILD); + } + + public static boolean isUpdateAvailable(int remotePacked, int installedPacked) { + return remotePacked > installedPacked; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/AudioDecoder.java b/app/src/main/java/com/foxx/androidcast/receiver/AudioDecoder.java new file mode 100644 index 0000000..77eca5f --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/AudioDecoder.java @@ -0,0 +1,427 @@ +package com.foxx.androidcast.receiver; + +/********************************************************************* + * AudioDecoder.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class AudioDecoder + * Contributors: + * - Anton Afanasyeu (6 commits, 419 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 5a735f2a711c2676e71bdb7b3541c08055fee63c37d5f81be669402dfeca1167 +**********************************************************************/ +import android.content.Context; +import android.media.AudioAttributes; +import android.media.AudioFormat; +import android.media.AudioManager; +import android.media.AudioTrack; +import android.media.MediaCodec; +import android.media.MediaFormat; +import android.os.Build; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; + +import com.foxx.androidcast.media.AacAdtsHelper; +import com.foxx.androidcast.media.PcmLevelAnalyzer; +import com.foxx.androidcast.receiver.av.AudioFilterChain; +import com.foxx.androidcast.receiver.av.ReceiverAvRuntime; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +/** AAC decoder → AudioTrack; low-latency live playback (no sender-PTS sleep). */ +public class AudioDecoder { + private static final String TAG = "AudioDecoder"; + private static final String MIME = MediaFormat.MIMETYPE_AUDIO_AAC; + private static final int MAX_INPUT_QUEUE = 48; + + public interface RenderCallback { + void onPcmRendered(int bytes, PcmLevelAnalyzer.Levels levels); + } + + public static final class Stats { + public long framesQueued; + public long framesFed; + public long pcmBytesWritten; + public long pcmSilentBlocks; + public long pcmAudibleBlocks; + public long decodeErrors; + public long queueDrops; + public long writeShortfalls; + public float lastPeak; + public float lastRms; + } + + private final Context appContext; + private final HandlerThread workerThread = new HandlerThread("AudioDecoderCtrl"); + private Handler worker; + private final LinkedBlockingQueue inputQueue = new LinkedBlockingQueue<>(MAX_INPUT_QUEUE); + private final Stats stats = new Stats(); + + private MediaCodec codec; + private AudioTrack track; + private volatile boolean configured; + private volatile boolean draining; + private Thread drainThread; + private int sampleRate = 44100; + private int channels = 2; + private boolean useAdtsMode; + private RenderCallback renderCallback; + private PendingFrame retryFrame; + private long lastDropLogMs; + + private static final class PendingFrame { + final long ptsUs; + final byte[] data; + + PendingFrame(long ptsUs, byte[] data) { + this.ptsUs = ptsUs; + this.data = data; + } + } + + public AudioDecoder(Context context) { + this.appContext = context.getApplicationContext(); + workerThread.start(); + worker = new Handler(workerThread.getLooper()); + } + + public void setRenderCallback(RenderCallback callback) { + this.renderCallback = callback; + } + + public Stats getStats() { + return stats; + } + + public void configure(int sampleRate, int channels, byte[] csd0) throws IOException { + final IOException[] error = new IOException[1]; + final Object lock = new Object(); + worker.post(() -> { + try { + releaseOnWorker(); + AudioDecoder.this.sampleRate = sampleRate; + AudioDecoder.this.channels = channels; + useAdtsMode = csd0 == null || csd0.length < 2; + + MediaFormat format = MediaFormat.createAudioFormat(MIME, sampleRate, channels); + if (useAdtsMode) { + format.setInteger(MediaFormat.KEY_IS_ADTS, 1); + } else { + format.setByteBuffer("csd-0", ByteBuffer.wrap(csd0)); + } + codec = MediaCodec.createDecoderByType(MIME); + codec.configure(format, null, null, 0); + codec.start(); + createAudioTrack(sampleRate, channels); + ReceiverAvRuntime.audio().reset(sampleRate, channels); + configured = true; + draining = true; + retryFrame = null; + startDrainThread(); + Log.i(TAG, "Audio ready " + sampleRate + "Hz ch=" + channels + + " mode=" + (useAdtsMode ? "ADTS" : "raw+csd") + + " csdLen=" + (csd0 != null ? csd0.length : 0) + + " qMax=" + MAX_INPUT_QUEUE); + } catch (IOException e) { + error[0] = e; + } catch (Exception e) { + error[0] = new IOException(e); + } finally { + synchronized (lock) { + lock.notifyAll(); + } + } + }); + synchronized (lock) { + try { + lock.wait(5000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + if (error[0] != null) { + throw error[0]; + } + } + + private void startDrainThread() { + drainThread = new Thread(this::drainLoop, "AudioDecoderDrain"); + drainThread.setPriority(Thread.MAX_PRIORITY - 1); + drainThread.start(); + } + + private void createAudioTrack(int sampleRate, int channels) { + int channelMask = channels >= 2 + ? AudioFormat.CHANNEL_OUT_STEREO + : AudioFormat.CHANNEL_OUT_MONO; + int minBuf = AudioTrack.getMinBufferSize(sampleRate, channelMask, AudioFormat.ENCODING_PCM_16BIT); + int bufSize = Math.max(minBuf * 4, 16384); + track = new AudioTrack.Builder() + .setAudioAttributes(new AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_MEDIA) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) + .build()) + .setAudioFormat(new AudioFormat.Builder() + .setEncoding(AudioFormat.ENCODING_PCM_16BIT) + .setSampleRate(sampleRate) + .setChannelMask(channelMask) + .build()) + .setBufferSizeInBytes(bufSize) + .setTransferMode(AudioTrack.MODE_STREAM) + .build(); + track.setVolume(1.0f); + requestAudioFocus(); + track.play(); + Log.i(TAG, "AudioTrack buf=" + bufSize + " playState=" + track.getPlayState()); + } + + /** Drops queued AAC input without tearing down the decoder (e.g. after video keyframe wait). */ + public void clearInputQueue() { + inputQueue.clear(); + retryFrame = null; + } + + public void queueFrame(long ptsUs, byte[] data) { + if (data == null || data.length == 0) { + return; + } + stats.framesQueued++; + PendingFrame frame = new PendingFrame(ptsUs, data.clone()); + if (inputQueue.offer(frame)) { + return; + } + int dropped = inputQueue.size() + (retryFrame != null ? 1 : 0); + inputQueue.clear(); + retryFrame = null; + if (dropped > 0) { + stats.queueDrops += dropped; + logDropBurst(); + } + if (!inputQueue.offer(frame)) { + stats.queueDrops++; + logDropBurst(); + } + } + + private void logDropBurst() { + long now = System.currentTimeMillis(); + if (now - lastDropLogMs > 2000) { + lastDropLogMs = now; + Log.w(TAG, "AAC input drops=" + stats.queueDrops + " q=" + inputQueue.size()); + } + } + + private void drainLoop() { + MediaCodec.BufferInfo info = new MediaCodec.BufferInfo(); + while (draining) { + try { + if (retryFrame != null) { + feedFrameSync(retryFrame, info); + } + PendingFrame frame = inputQueue.poll(5, TimeUnit.MILLISECONDS); + if (frame != null && codec != null) { + feedFrameSync(frame, info); + } + drainOutputSync(info); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } catch (Exception e) { + stats.decodeErrors++; + if (draining) { + Log.w(TAG, "drainLoop: " + e.getMessage()); + } + } + } + } + + private void feedFrameSync(PendingFrame frame, MediaCodec.BufferInfo info) { + retryFrame = null; + byte[] data = frame.data; + if (useAdtsMode) { + data = AacAdtsHelper.wrapIfNeeded(data, sampleRate, channels); + } + int inIndex = codec.dequeueInputBuffer(5_000); + if (inIndex < 0) { + retryFrame = frame; + return; + } + ByteBuffer buffer = codec.getInputBuffer(inIndex); + if (buffer == null) { + retryFrame = frame; + return; + } + buffer.clear(); + buffer.put(data); + codec.queueInputBuffer(inIndex, 0, data.length, frame.ptsUs, 0); + stats.framesFed++; + drainOutputSync(info); + } + + private void drainOutputSync(MediaCodec.BufferInfo info) { + if (codec == null) { + return; + } + for (;;) { + int outIndex = codec.dequeueOutputBuffer(info, 0); + if (outIndex == MediaCodec.INFO_TRY_AGAIN_LATER) { + break; + } + if (outIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { + Log.i(TAG, "Decoder output: " + codec.getOutputFormat()); + continue; + } + if (outIndex < 0) { + continue; + } + ByteBuffer outBuf = codec.getOutputBuffer(outIndex); + if (outBuf != null && info.size > 0 && track != null + && (info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) == 0) { + byte[] pcm = new byte[info.size]; + outBuf.position(info.offset); + outBuf.limit(info.offset + info.size); + outBuf.get(pcm); + PcmLevelAnalyzer.Levels levels = PcmLevelAnalyzer.analyze(pcm, pcm.length); + stats.lastPeak = levels.peak; + stats.lastRms = levels.rms; + if (levels.silent) { + stats.pcmSilentBlocks++; + } else { + stats.pcmAudibleBlocks++; + } + ReceiverAvRuntime.audio().process(pcm, pcm.length, sampleRate, channels); + int written = writePcm(pcm); + if (written > 0) { + stats.pcmBytesWritten += written; + if (renderCallback != null) { + renderCallback.onPcmRendered(written, levels); + } + } else if (written < pcm.length) { + stats.writeShortfalls++; + } + } + codec.releaseOutputBuffer(outIndex, false); + } + } + + private int writePcm(byte[] pcm) { + if (track == null || pcm.length == 0) { + return 0; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + int w = track.write(pcm, 0, pcm.length, AudioTrack.WRITE_BLOCKING); + return Math.max(0, w); + } + return writePcmLegacy(pcm); + } + + private int writePcmLegacy(byte[] pcm) { + int total = 0; + int offset = 0; + int idle = 0; + while (offset < pcm.length && idle < 40) { + int w = track.write(pcm, offset, pcm.length - offset); + if (w > 0) { + total += w; + offset += w; + idle = 0; + continue; + } + idle++; + try { + Thread.sleep(1); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } + } + return total; + } + + private void requestAudioFocus() { + AudioManager am = (AudioManager) appContext.getSystemService(Context.AUDIO_SERVICE); + if (am != null) { + am.requestAudioFocus(focusChange -> { + }, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); + } + } + + public void flushAndStop() { + draining = false; + configured = false; + inputQueue.clear(); + retryFrame = null; + final Object lock = new Object(); + worker.post(() -> { + releaseOnWorker(); + synchronized (lock) { + lock.notifyAll(); + } + }); + synchronized (lock) { + try { + lock.wait(500); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + } + + public void release() { + flushAndStop(); + } + + private void releaseOnWorker() { + draining = false; + configured = false; + retryFrame = null; + inputQueue.clear(); + if (drainThread != null) { + drainThread.interrupt(); + try { + drainThread.join(400); + } catch (InterruptedException ignored) { + Thread.currentThread().interrupt(); + } + drainThread = null; + } + if (codec != null) { + try { + codec.stop(); + } catch (Exception ignored) { + } + codec.release(); + codec = null; + } + if (track != null) { + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + track.pause(); + track.flush(); + } + track.stop(); + } catch (Exception ignored) { + } + track.release(); + track = null; + } + abandonAudioFocus(); + } + + private void abandonAudioFocus() { + AudioManager am = (AudioManager) appContext.getSystemService(Context.AUDIO_SERVICE); + if (am != null) { + am.abandonAudioFocus(null); + } + } + + public void releaseAndQuit() { + release(); + workerThread.quitSafely(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/LibvpxVideoDecoder.java b/app/src/main/java/com/foxx/androidcast/receiver/LibvpxVideoDecoder.java new file mode 100644 index 0000000..65096f4 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/LibvpxVideoDecoder.java @@ -0,0 +1,102 @@ +package com.foxx.androidcast.receiver; + +/********************************************************************* + * LibvpxVideoDecoder.java + * Created at: Mon 18 May 2026 17:05:47 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class LibvpxVideoDecoder + * Contributors: + * - Anton Afanasyeu (3 commits, 96 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 51d754efd8877e0817033f023a3a1aa9e3b4b4d316aee7d6981314fb65c485e7 +**********************************************************************/ +import android.util.Log; +import android.view.Surface; + +import com.foxx.androidcast.media.codec.VideoDecoderSink; +import com.foxx.androidcast.media.codec.jni.NativeCodecBridge; +import com.foxx.androidcast.receiver.av.ReceiverAvRuntime; + +import java.io.IOException; + +/** Software VP8/VP9 decode via libvpx, rendering to a {@link Surface}. */ +public final class LibvpxVideoDecoder implements VideoDecoderSink { + private static final String TAG = "LibvpxVideoDecoder"; + private static final int DECODE_FAIL_LOG_EVERY = 16; + + private final Object lock = new Object(); + private int decodeFailLogCount; + private long nativeHandle; + private Surface outputSurface; + private Listener listener; + private boolean released; + private boolean firstFrameNotified; + + @Override + public void configure(String mime, int width, int height, byte[] csd0, byte[] csd1, Surface surface, + Listener listener) throws IOException { + synchronized (lock) { + releaseLocked(); + if (!NativeCodecBridge.isLibvpxAvailable()) { + throw new IOException("libvpx not available"); + } + nativeHandle = NativeCodecBridge.vpxDecoderCreate(mime); + if (nativeHandle == 0L) { + throw new IOException("libvpx decoder init failed for " + mime); + } + this.outputSurface = surface; + this.listener = listener; + this.released = false; + this.firstFrameNotified = false; + Log.i(TAG, "Configured libvpx decoder " + mime + " " + width + "x" + height); + } + } + + @Override + public void queueFrame(long ptsUs, boolean keyFrame, byte[] data) { + synchronized (lock) { + if (released || nativeHandle == 0L || outputSurface == null || data == null || data.length == 0) { + return; + } + if (NativeCodecBridge.vpxDecodeFrame(nativeHandle, data, ptsUs, outputSurface)) { + ReceiverAvRuntime.video().onFrameDecoded(ptsUs); + notifyRenderedLocked(); + } else if ((++decodeFailLogCount % DECODE_FAIL_LOG_EVERY) == 1) { + Log.w(TAG, "vpx decode failed len=" + data.length + " key=" + keyFrame); + } + } + } + + @Override + public void release() { + synchronized (lock) { + releaseLocked(); + } + } + + private void releaseLocked() { + released = true; + listener = null; + outputSurface = null; + firstFrameNotified = false; + if (nativeHandle != 0L) { + NativeCodecBridge.vpxDecoderRelease(nativeHandle); + nativeHandle = 0L; + } + } + + private void notifyRenderedLocked() { + Listener cb = listener; + if (cb == null) { + return; + } + if (!firstFrameNotified) { + firstFrameNotified = true; + Log.i(TAG, "First frame rendered (libvpx)"); + cb.onFirstFrameRendered(); + } else { + cb.onFrameRendered(); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/PlaybackViewState.java b/app/src/main/java/com/foxx/androidcast/receiver/PlaybackViewState.java new file mode 100644 index 0000000..38aac15 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/PlaybackViewState.java @@ -0,0 +1,32 @@ +package com.foxx.androidcast.receiver; + +/********************************************************************* + * PlaybackViewState.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class PlaybackViewState + * Contributors: + * - Anton Afanasyeu (2 commits, 28 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 9fcecc11dc789abfa9db81d9829d4caa3c8d17f41733d5d36c01e344652004cf +**********************************************************************/ +/** Zoom/pan state for receiver diagnostics (updated from playback UI). */ +public final class PlaybackViewState { + private static volatile int zoomPercent; + + private PlaybackViewState() {} + + public static void setZoomPercent(int percent) { + zoomPercent = percent; + } + + /** Deviation from 100% scale, e.g. +15 or −10. */ + public static int getZoomPercent() { + return zoomPercent; + } + + public static void reset() { + zoomPercent = 0; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/ReceiverCastService.java b/app/src/main/java/com/foxx/androidcast/receiver/ReceiverCastService.java new file mode 100644 index 0000000..1e05550 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/ReceiverCastService.java @@ -0,0 +1,1062 @@ +package com.foxx.androidcast.receiver; + +/********************************************************************* + * ReceiverCastService.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class ReceiverCastService + * Contributors: + * - Anton Afanasyeu (18 commits, 1026 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 19d789a6606081796e55d6b81346ec4b3d8b98b288e80ab6e44eae8d98084804 +**********************************************************************/ +import android.app.NotificationManager; +import android.app.Service; +import android.content.Intent; +import android.os.Build; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IBinder; +import android.os.Looper; +import android.os.PowerManager; +import android.os.RemoteCallbackList; +import android.os.RemoteException; +import android.util.Log; +import android.view.Surface; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.CastActiveState; +import com.foxx.androidcast.CastNotifications; +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.CastTrayNotifier; +import com.foxx.androidcast.ICastReceiverService; +import com.foxx.androidcast.ICastStatusCallback; +import com.foxx.androidcast.IntentExtras; +import com.foxx.androidcast.R; +import com.foxx.androidcast.CastConfig; +import com.foxx.androidcast.diagnostics.CastDiagnosticsFormatter; +import com.foxx.androidcast.diagnostics.CastMtuSampler; +import com.foxx.androidcast.diagnostics.CpuLoadSampler; +import com.foxx.androidcast.media.codec.CodecSessionRegistry; +import com.foxx.androidcast.media.codec.PassthroughCodecPolicy; +import com.foxx.androidcast.media.codec.VideoCodecBackend; +import com.foxx.androidcast.media.codec.VideoDecoderFactory; +import com.foxx.androidcast.media.codec.VideoDecoderSink; +import com.foxx.androidcast.discovery.DiscoveryManager; +import com.foxx.androidcast.live.LiveCastControlPlane; +import com.foxx.androidcast.network.transport.TransportLossStats; +import com.foxx.androidcast.network.transport.TransportLossStatsBridge; +import com.foxx.androidcast.network.control.NetworkStatsSnapshot; +import com.foxx.androidcast.stats.SessionStatsContext; +import com.foxx.androidcast.stats.SessionStatsRecorder; +import com.foxx.androidcast.stats.SessionStatsStore; +import com.foxx.androidcast.network.control.PassThroughNetworkControlPlane; +import com.foxx.androidcast.network.selftest.NetworkSelfTestBridge; +import com.foxx.androidcast.util.CastBackgroundExecutor; + +import java.util.Arrays; + +/** + * Foreground receiver: discovery, listen, decode. + * Playback UI opens only after {@link CastProtocol#MSG_STREAM_CONFIG} (sender is actually streaming). + */ +public class ReceiverCastService extends Service { + private static final String TAG = "ReceiverCastService"; + public static final String ACTION_START = "com.foxx.androidcast.RECEIVER_START"; + public static final String ACTION_STOP = "com.foxx.androidcast.STOP_RECV"; + public static final String ACTION_PLAYBACK_UI = "com.foxx.androidcast.RECV_PLAYBACK_UI"; + public static final String EXTRA_PLAYBACK_UI_VISIBLE = "playback_ui_visible"; + public static final String EXTRA_PIN = "pin"; + public static final String EXTRA_ALLOW_AUDIO = "allow_audio"; + + private enum Phase { + IDLE, LISTENING, CONNECTED, STREAMING + } + + private final RemoteCallbackList callbacks = new RemoteCallbackList<>(); + private final Handler mainHandler = new Handler(Looper.getMainLooper()); + private HandlerThread videoDecodeThread; + private Handler videoDecodeHandler; + private final Object audioDecoderLock = new Object(); + + private DiscoveryManager discovery; + private ReceiverSession session; + private VideoDecoderSink videoDecoder; + private AudioDecoder audioDecoder; + private Surface attachedSurface; + private String status = ""; + private CastSettings settings = new CastSettings(); + private Phase phase = Phase.IDLE; + + private int pendingWidth; + private int pendingHeight; + /** Stream config size used for letterboxing (not decoder padding). */ + private int displayWidth; + private int displayHeight; + private byte[] pendingCsd0; + private byte[] pendingCsd1; + private boolean hasPendingConfig; + private volatile boolean reconfiguring; + private volatile boolean awaitingKeyframe = true; + private boolean playbackLaunched; + /** True while {@link ReceiverPlaybackActivity} is in the foreground (started/stopped). */ + private volatile boolean playbackUiVisible; + private int decoderWidth; + private int decoderHeight; + private boolean decoderActive; + + /** Set from receiver UI before each listen session. */ + private boolean allowIncomingAudio = true; + /** null until first audio config this session; then mirrors user preference. */ + private Boolean audioAccepted; + private int pendingAudioRate; + private int pendingAudioChannels; + private byte[] pendingAudioCsd; + private PowerManager.WakeLock wakeLock; + private String activePin = com.foxx.androidcast.CastConfig.DEFAULT_PIN; + private final StreamMetrics streamMetrics = new StreamMetrics(); + private String negotiatedVideoMime; + private CastSettings remoteCastSettings; + private NetworkStatsSnapshot lastLocalStats; + private boolean streamIdle; + private volatile boolean castEnded; + private long lastVideoFrameMs; + private long lastStreamConfigMs; + private final TransportLossStats transportLoss = new TransportLossStats(); + private SessionStatsRecorder sessionStatsRecorder; + + private final Runnable idleWatchdog = new Runnable() { + @Override + public void run() { + checkStreamIdle(); + mainHandler.postDelayed(this, 500); + } + }; + + private final ICastReceiverService.Stub binder = new ICastReceiverService.Stub() { + @Override + public void registerCallback(ICastStatusCallback callback) { + if (callback != null) { + callbacks.register(callback); + broadcastStatus(status); + } + } + + @Override + public void unregisterCallback(ICastStatusCallback callback) { + if (callback != null) { + callbacks.unregister(callback); + } + } + + @Override + public String getStatus() { + return status; + } + + @Override + public void attachVideoSurface(Surface surface) { + mainHandler.post(() -> attachSurface(surface)); + } + + @Override + public void detachVideoSurface() { + mainHandler.post(ReceiverCastService.this::detachSurfaceOnly); + } + + @Override + public void stopReceiving() { + stopSelfSafely(); + } + + @Override + public String getDiagnosticsText() { + return buildDiagnosticsText(); + } + }; + + @Override + public void onCreate() { + super.onCreate(); + NetworkSelfTestBridge.startCapture(this); + CastNotifications.createChannels(this); + if (AppPreferences.isGrabSessionStats(this)) { + SessionStatsStore.pruneOnAppStart(this); + } + videoDecodeThread = new HandlerThread("VideoDecode"); + videoDecodeThread.start(); + videoDecodeHandler = new Handler(videoDecodeThread.getLooper()); + CpuLoadSampler.warmUp(); + mainHandler.post(idleWatchdog); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (intent != null && ACTION_STOP.equals(intent.getAction())) { + stopSelfSafely(); + return START_NOT_STICKY; + } + if (intent != null && ACTION_PLAYBACK_UI.equals(intent.getAction())) { + playbackUiVisible = intent.getBooleanExtra(EXTRA_PLAYBACK_UI_VISIBLE, false); + if (!playbackUiVisible) { + playbackLaunched = false; + } + return START_STICKY; + } + if (intent != null && ACTION_START.equals(intent.getAction())) { + String pin = intent.getStringExtra(EXTRA_PIN); + if (pin == null) { + pin = AppPreferences.getPin(this); + } + CastSettings fromIntent = IntentExtras.getCastSettings(intent); + if (fromIntent != null) { + settings = fromIntent; + } else { + settings = AppPreferences.loadReceiverDefaults(this); + } + allowIncomingAudio = intent.getBooleanExtra(EXTRA_ALLOW_AUDIO, + AppPreferences.isPlayIncomingAudio(this)); + activePin = pin; + restartListening(pin); + } else if (intent == null && phase == Phase.IDLE) { + allowIncomingAudio = AppPreferences.isPlayIncomingAudio(this); + settings = AppPreferences.loadReceiverDefaults(this); + activePin = AppPreferences.getPin(this); + restartListening(activePin); + } + return START_STICKY; + } + + private final Object sessionLock = new Object(); + + private void restartListening(String pin) { + synchronized (sessionLock) { + restartListeningLocked(pin); + } + } + + private void restartListeningLocked(String pin) { + stopSessionOnly(); + castEnded = false; + resetStreamState(); + pendingWidth = 0; + pendingHeight = 0; + playbackLaunched = false; + phase = Phase.LISTENING; + acquireWakeLock(); + startForeground(CastNotifications.ID_RECEIVER, + CastNotifications.receiver(this, getString(R.string.receiver_listening), ReceiverCastService.class)); + CastActiveState.setReceiverListening(true); + CastTrayNotifier.refresh(this); + + if (videoDecoder != null) { + videoDecoder.release(); + } + if (audioDecoder != null) { + synchronized (audioDecoderLock) { + audioDecoder.release(); + } + } + videoDecoder = VideoDecoderFactory.createDecoder(); + synchronized (audioDecoderLock) { + audioDecoder = new AudioDecoder(this); + audioDecoder.setRenderCallback((pcmBytes, levels) -> streamMetrics.onAudioRendered( + pcmBytes, levels.peak, levels.rms, levels.silent)); + } + + session = new ReceiverSession(this, pin, settings, new ReceiverSession.Listener() { + @Override + public void onListening() { + mainHandler.post(ReceiverCastService.this::startDiscoveryAnnouncing); + } + + @Override + public void onCastSessionStarting() { + if (AppPreferences.isGrabSessionStats(ReceiverCastService.this)) { + if (sessionStatsRecorder == null) { + sessionStatsRecorder = new SessionStatsRecorder("recv", + settings.getTransport()); + SessionStatsContext.bind(sessionStatsRecorder); + } + } + } + + @Override + public void onStatus(String s) { + updateStatus(s); + } + + @Override + public void onAuthenticated(String senderName, CastSettings remoteSettings, String videoMime) { + synchronized (ReceiverCastService.this) { + if (remoteSettings != null && remoteSettings.isAudioRequested() && allowIncomingAudio) { + audioAccepted = true; + } + } + mainHandler.post(() -> onSenderConnected(senderName, remoteSettings, videoMime)); + } + + @Override + public void onStreamConfig(int width, int height, byte[] csd0, byte[] csd1) { + mainHandler.post(() -> onStreamConfigReceived(width, height, csd0, csd1)); + } + + @Override + public void onVideoFrame(long ptsUs, boolean keyFrame, byte[] data) { + final long nowMs = System.currentTimeMillis(); + mainHandler.post(() -> lastVideoFrameMs = nowMs); + if (awaitingKeyframe && !keyFrame) { + synchronized (transportLoss) { + transportLoss.recvVideoSkippedAwaitingKey++; + } + return; + } + if (keyFrame) { + awaitingKeyframe = false; + reconfiguring = false; + } + final int frameBytes = data != null ? data.length : 0; + final byte[] frameData = data; + mainHandler.post(() -> { + if (streamIdle) { + onStreamResumedAfterIdle(); + } + streamMetrics.onVideoPacket(keyFrame, frameBytes); + synchronized (transportLoss) { + transportLoss.recvVideoPackets++; + } + }); + if (videoDecodeHandler != null) { + videoDecodeHandler.post(() -> { + if (videoDecoder != null) { + videoDecoder.queueFrame(ptsUs, keyFrame, frameData); + } + }); + } + } + + @Override + public void onAudioConfig(int sampleRate, int channels, byte[] csd0) { + // Network I/O must stay on the session reader thread (StrictMode). + final boolean accept; + synchronized (ReceiverCastService.this) { + if (audioAccepted == null) { + accept = allowIncomingAudio; + audioAccepted = accept; + if (session != null) { + session.sendAudioConsent(accept); + } + } else { + accept = Boolean.TRUE.equals(audioAccepted); + } + } + final boolean accepted = accept; + if (accepted) { + synchronized (audioDecoderLock) { + if (audioDecoder != null) { + try { + audioDecoder.configure(sampleRate, channels, csd0); + } catch (Exception e) { + Log.e(TAG, "Audio configure on config msg failed", e); + } + } + } + } + mainHandler.post(() -> onAudioConfigReceived(sampleRate, channels, csd0, accepted)); + } + + @Override + public void onAudioFrame(long ptsUs, byte[] data) { + if (castEnded || awaitingKeyframe || streamIdle) { + return; + } + final int frameBytes = data != null ? data.length : 0; + final boolean accept; + synchronized (ReceiverCastService.this) { + accept = Boolean.TRUE.equals(audioAccepted); + } + if (accept) { + synchronized (audioDecoderLock) { + if (audioDecoder != null) { + audioDecoder.queueFrame(ptsUs, data); + } + } + } + mainHandler.post(() -> { + streamMetrics.onAudioPacket(frameBytes); + synchronized (transportLoss) { + transportLoss.recvAudioPackets++; + } + }); + } + + @Override + public void onCastEnded() { + mainHandler.postAtFrontOfQueue(ReceiverCastService.this::stopAudioPlaybackImmediate); + } + + @Override + public void onDisconnected() { + mainHandler.post(ReceiverCastService.this::onSenderDisconnected); + } + + @Override + public void onNetworkAdviceApplied() { + } + + @Override + public void onPeerNetworkStats(NetworkStatsSnapshot stats) { + mainHandler.post(() -> streamMetrics.onPeerStats(stats)); + } + + @Override + public void onDiagPingSample(com.foxx.androidcast.network.diag.DiagPingMetrics.Snapshot snapshot) { + mainHandler.post(() -> streamMetrics.onDiagPingSample(snapshot)); + } + }, this::enrichReceiverStats); + session.start(); + updateStatus(getString(R.string.receiver_ready, pin, settings.getTransport().toUpperCase())); + openPlaybackAwaiting(R.string.playback_listening); + Log.i(TAG, "Listening PIN=" + pin + " audio=" + allowIncomingAudio); + } + + private void onSenderConnected(String senderName, CastSettings remoteSettings, String videoMime) { + phase = Phase.CONNECTED; + castEnded = false; + if (AppPreferences.isGrabSessionStats(this)) { + if (sessionStatsRecorder == null) { + sessionStatsRecorder = new SessionStatsRecorder("recv", settings.getTransport()); + SessionStatsContext.bind(sessionStatsRecorder); + sessionStatsRecorder.setClientCount(1); + } + sessionStatsRecorder.mergeSettings(remoteSettings); + sessionStatsRecorder.setCodecs(videoMime, "AAC"); + } + negotiatedVideoMime = videoMime; + String audioCodec = remoteSettings != null && remoteSettings.isAudioRequested() ? "AAC" : "none"; + LiveCastControlPlane.onCastStart(this, "android_receiver", videoMime, audioCodec, + settings.getBitrateMode().name().toLowerCase()); + remoteCastSettings = remoteSettings; + streamIdle = false; + streamMetrics.reset(); + lastVideoFrameMs = 0; + String codecLabel = videoMime != null + ? com.foxx.androidcast.media.CodecNegotiator.displayName(videoMime) : "?"; + updateStatus(getString(R.string.casting_from_codec, senderName, codecLabel)); + broadcastAuthenticated(senderName); + openPlaybackAwaiting(R.string.playback_awaiting_stream); + if (remoteSettings != null && remoteSettings.isAudioRequested() && allowIncomingAudio) { + audioAccepted = true; + sendAudioConsentAsync(true); + Log.i(TAG, "Audio accepted for sender (pre-config)"); + } else if (remoteSettings != null && remoteSettings.isAudioRequested()) { + updateStatus(getString(R.string.audio_skipped)); + } + Log.i(TAG, "Sender connected: " + senderName + " codec=" + videoMime); + } + + private void sendAudioConsentAsync(final boolean accept) { + CastBackgroundExecutor.execute(() -> { + if (session != null) { + session.sendAudioConsent(accept); + } + }); + } + + private void stopAudioPlaybackImmediate() { + castEnded = true; + synchronized (audioDecoderLock) { + if (audioDecoder != null) { + audioDecoder.flushAndStop(); + audioDecoder = new AudioDecoder(this); + audioDecoder.setRenderCallback((pcmBytes, levels) -> streamMetrics.onAudioRendered( + pcmBytes, levels.peak, levels.rms, levels.silent)); + } + } + Log.i(TAG, "Audio playback stopped"); + } + + private void onSenderDisconnected() { + stopAudioPlaybackImmediate(); + phase = Phase.LISTENING; + audioAccepted = null; + remoteCastSettings = null; + streamIdle = false; + lastVideoFrameMs = 0; + negotiatedVideoMime = null; + pendingWidth = 0; + pendingHeight = 0; + displayWidth = 0; + displayHeight = 0; + hasPendingConfig = false; + resetDecoderState(); + enterAwaitingMode(R.string.playback_listening, true); + updateStatus(getString(R.string.receiver_ready, activePin, settings.getTransport().toUpperCase())); + Log.i(TAG, "Sender disconnected — listening again"); + } + + private void checkStreamIdle() { + if (phase != Phase.STREAMING || streamIdle || lastVideoFrameMs <= 0) { + return; + } + long nowMs = System.currentTimeMillis(); + if (reconfiguring || awaitingKeyframe) { + if (lastStreamConfigMs > 0 && nowMs - lastStreamConfigMs < 20_000L) { + return; + } + } + long idleMs = nowMs - lastVideoFrameMs; + if (idleMs >= CastConfig.STREAM_IDLE_TIMEOUT_MS) { + Log.i(TAG, "Stream idle " + idleMs + "ms — awaiting"); + if (sessionStatsRecorder != null) { + sessionStatsRecorder.noteIdleTimeout(); + } + enterAwaitingMode(R.string.playback_awaiting_stream, false); + } + } + + /** Called when video resumes after idle on the same TCP session. */ + private void onStreamResumedAfterIdle() { + if (!streamIdle) { + return; + } + streamIdle = false; + enterAwaitingKeyframe(); + openPlaybackAwaiting(R.string.playback_awaiting_stream); + scheduleDecoderConfigureRetries(); + } + + /** Stops decode, shows robot overlay; keeps TCP session if still connected. */ + private void enterAwaitingMode(int messageResId, boolean fullReset) { + streamIdle = true; + enterAwaitingKeyframe(); + if (fullReset) { + hasPendingConfig = false; + resetDecoderState(); + if (videoDecoder != null) { + videoDecoder.release(); + videoDecoder = VideoDecoderFactory.createDecoder(); + } + streamMetrics.reset(); + } + broadcastStreamIdle(); + openPlaybackAwaiting(messageResId); + } + + private void resetStreamState() { + hasPendingConfig = false; + enterAwaitingKeyframe(); + pendingWidth = 0; + pendingHeight = 0; + displayWidth = 0; + displayHeight = 0; + pendingCsd0 = null; + pendingCsd1 = null; + resetDecoderState(); + } + + private void resetDecoderState() { + decoderActive = false; + decoderWidth = 0; + decoderHeight = 0; + } + + private void enterAwaitingKeyframe() { + awaitingKeyframe = true; + flushAudioInput(); + } + + private void flushAudioInput() { + synchronized (audioDecoderLock) { + if (audioDecoder != null) { + audioDecoder.clearInputQueue(); + } + } + } + + private void onAudioConfigReceived(int sampleRate, int channels, byte[] csd0, boolean accepted) { + pendingAudioRate = sampleRate; + pendingAudioChannels = channels; + pendingAudioCsd = csd0; + if (accepted) { + updateStatus(getString(R.string.audio_playing)); + } else { + synchronized (audioDecoderLock) { + if (audioDecoder != null) { + audioDecoder.release(); + audioDecoder = new AudioDecoder(this); + audioDecoder.setRenderCallback((pcmBytes, levels) -> streamMetrics.onAudioRendered( + pcmBytes, levels.peak, levels.rms, levels.silent)); + } + } + updateStatus(getString(R.string.audio_skipped)); + } + Log.i(TAG, "Audio consent: " + accepted); + } + + private void onStreamConfigReceived(int width, int height, byte[] csd0, byte[] csd1) { + com.foxx.androidcast.media.StreamDimensionResolver.Size size = + com.foxx.androidcast.media.StreamDimensionResolver.resolve(width, height, csd0); + if (size.width <= 0 || size.height <= 0) { + Log.w(TAG, "Ignoring invalid stream config " + width + "x" + height); + return; + } + boolean same = hasPendingConfig + && pendingWidth == size.width + && pendingHeight == size.height + && Arrays.equals(pendingCsd0, csd0) + && Arrays.equals(pendingCsd1, csd1); + if (same && decoderActive) { + Log.d(TAG, "Stream config unchanged " + size.width + "x" + size.height); + return; + } + boolean firstConfig = !hasPendingConfig; + boolean wasIdle = streamIdle; + boolean decoderWasActive = decoderActive; + phase = Phase.STREAMING; + streamIdle = false; + if (firstConfig) { + streamMetrics.reset(); + } + reconfiguring = true; + enterAwaitingKeyframe(); + lastVideoFrameMs = System.currentTimeMillis(); + lastStreamConfigMs = lastVideoFrameMs; + if (firstConfig || wasIdle || !decoderWasActive) { + openPlaybackAwaiting(R.string.playback_awaiting_stream); + } + pendingWidth = size.width; + pendingHeight = size.height; + displayWidth = size.width; + displayHeight = size.height; + pendingCsd0 = csd0; + pendingCsd1 = csd1; + hasPendingConfig = true; + decoderActive = false; + notifyPlaybackDimensions(displayWidth, displayHeight); + scheduleDecoderConfigureRetries(); + if (sessionStatsRecorder != null) { + sessionStatsRecorder.setResolution(pendingWidth, pendingHeight); + } + Log.i(TAG, "Stream config " + pendingWidth + "x" + pendingHeight); + } + + private void scheduleDecoderConfigureRetries() { + tryConfigureDecoder(); + mainHandler.postDelayed(this::tryConfigureDecoder, 250); + mainHandler.postDelayed(this::tryConfigureDecoder, 750); + mainHandler.postDelayed(this::tryConfigureDecoder, 2000); + } + + /** Opens or refreshes fullscreen UI with robot overlay (listening / waiting for stream). */ + private void openPlaybackAwaiting(int messageResId) { + if (!playbackUiVisible) { + return; + } + playbackLaunched = true; + Intent intent = new Intent(this, ReceiverPlaybackActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); + intent.putExtra(ReceiverPlaybackActivity.EXTRA_SHOW_AWAITING, true); + intent.putExtra(ReceiverPlaybackActivity.EXTRA_AWAITING_MESSAGE, messageResId); + startActivity(intent); + } + + private void notifyPlaybackDimensions(int width, int height) { + broadcastStreamStarted(width, height); + if (!playbackUiVisible) { + return; + } + Intent intent = new Intent(this, ReceiverPlaybackActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); + intent.putExtra(ReceiverPlaybackActivity.EXTRA_WIDTH, width); + intent.putExtra(ReceiverPlaybackActivity.EXTRA_HEIGHT, height); + startActivity(intent); + } + + private void closePlaybackUi() { + if (!playbackLaunched) { + return; + } + Intent intent = new Intent(this, ReceiverPlaybackActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); + intent.putExtra(ReceiverPlaybackActivity.EXTRA_FINISH, true); + startActivity(intent); + playbackLaunched = false; + } + + private void startDiscoveryAnnouncing() { + if (discovery != null) { + return; + } + discovery = new DiscoveryManager(this); + com.foxx.androidcast.network.CastTransportFactory.init(this); + int announcePort = com.foxx.androidcast.CastConfig.portForTransport(settings.getTransport()); + discovery.startAnnouncing(this, AppPreferences.getUsername(this), announcePort, + settings.getTransport(), true, activePin); + Log.i(TAG, "Discovery announcing on port " + announcePort); + } + + private void stopSessionOnly() { + if (discovery != null) { + discovery.stop(); + discovery = null; + } + if (session != null) { + session.stop(); + session = null; + } + try { + Thread.sleep(80); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + private void acquireWakeLock() { + if (wakeLock != null && wakeLock.isHeld()) { + return; + } + PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); + wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "AndroidCast:Receive"); + wakeLock.acquire(4 * 60 * 60 * 1000L); + } + + private void releaseWakeLock() { + if (wakeLock != null && wakeLock.isHeld()) { + wakeLock.release(); + } + wakeLock = null; + } + + private void tryConfigureDecoder() { + if (!hasPendingConfig || attachedSurface == null || !attachedSurface.isValid()) { + Log.i(TAG, "Decoder waiting: config=" + hasPendingConfig + + " surface=" + (attachedSurface != null && attachedSurface.isValid())); + return; + } + if (decoderActive && decoderWidth == pendingWidth && decoderHeight == pendingHeight) { + Log.d(TAG, "Decoder already active at " + decoderWidth + "x" + decoderHeight); + return; + } + try { + if (videoDecoder != null) { + videoDecoder.release(); + } + videoDecoder = VideoDecoderFactory.createDecoder(); + String mime = negotiatedVideoMime != null ? negotiatedVideoMime + : android.media.MediaFormat.MIMETYPE_VIDEO_AVC; + CodecSessionRegistry.setVideoBackend(VideoCodecBackend.MEDIA_CODEC_HW, mime); + if (remoteCastSettings != null) { + CastSettings.AudioCodec effectiveAudio = + com.foxx.androidcast.media.AudioNegotiator.effective(remoteCastSettings); + CodecSessionRegistry.setVideoPreference(remoteCastSettings.getVideoCodec()); + CodecSessionRegistry.setAudioPreference(effectiveAudio); + CodecSessionRegistry.setAudioBackend( + PassthroughCodecPolicy.audioBackendFor( + effectiveAudio, + remoteCastSettings.isAudioRequested())); + CodecSessionRegistry.setProtectionSummary(PassthroughCodecPolicy.protectionDescription( + remoteCastSettings.getStreamProtection(), + remoteCastSettings.getTransport(), + effectiveAudio)); + } + videoDecoder.configure(mime, pendingWidth, pendingHeight, pendingCsd0, pendingCsd1, attachedSurface, + new VideoDecoderSink.Listener() { + @Override + public void onFirstFrameRendered() { + ReceiverCastService.this.onFirstFrameRendered(); + } + + @Override + public void onFrameRendered() { + ReceiverCastService.this.onFrameRendered(); + } + + @Override + public void onOutputSizeChanged(int width, int height) { + ReceiverCastService.this.onDecoderOutputSize(width, height); + } + }); + decoderActive = true; + reconfiguring = false; + decoderWidth = pendingWidth; + decoderHeight = pendingHeight; + com.foxx.androidcast.receiver.av.ReceiverAvRuntime.video() + .onConfigured(pendingWidth, pendingHeight); + updateStatus(getString(R.string.playback_awaiting_stream)); + broadcastStreamStarted(pendingWidth, pendingHeight); + Log.i(TAG, "Decoder started " + pendingWidth + "x" + pendingHeight); + } catch (Exception e) { + decoderActive = false; + synchronized (transportLoss) { + transportLoss.recvVideoDecodeErrors++; + } + Log.e(TAG, "Video configure failed", e); + updateStatus("Video: " + e.getMessage()); + } + } + + private void onFirstFrameRendered() { + mainHandler.post(() -> { + streamMetrics.onRenderedFrame(); + Log.i(TAG, "First frame on screen"); + streamIdle = false; + if (pendingWidth > 0 && pendingHeight > 0) { + updateStatus(getString(R.string.playing_resolution, pendingWidth, pendingHeight)); + } + broadcastVideoRendering(); + }); + } + + private void onFrameRendered() { + mainHandler.post(() -> streamMetrics.onRenderedFrame()); + } + + private void onDecoderOutputSize(int width, int height) { + mainHandler.post(() -> { + if (width <= 0 || height <= 0) { + return; + } + decoderWidth = width; + decoderHeight = height; + Log.i(TAG, "Decoder output size " + width + "x" + height + + " (display " + displayWidth + "x" + displayHeight + ")"); + }); + } + + private void enrichReceiverStats(NetworkStatsSnapshot s, long nowMs) { + s.encodeFps = streamMetrics.getDecodeFps(); + TransportLossStats snap = buildReceiverLossSnapshot(); + TransportLossStatsBridge.applyTo(s, snap); + if (sessionStatsRecorder != null) { + sessionStatsRecorder.sampleNetwork(s, streamMetrics.getLastPeer()); + } + NetworkStatsSnapshot peer = streamMetrics.getLastPeer(); + CastSettings tune = remoteCastSettings != null ? remoteCastSettings : settings; + com.foxx.androidcast.CastTuningEngine.EffectiveParams eff = + com.foxx.androidcast.CastTuningEngine.resolve(tune, peer); + s.suggestedBitrateKbps = eff.videoBitrate / 1000; + s.targetBitrateKbps = eff.videoBitrate / 1000; + if (s.recvBitrateKbps > 0 && eff.videoBitrate / 1000 > s.recvBitrateKbps * 1.15f) { + s.congestionLevel = Math.max(s.congestionLevel, 1); + } + float inFps = streamMetrics.getInFps(); + float renderFps = streamMetrics.getRenderFps(); + if (inFps > 12f && renderFps > 0 && renderFps < inFps * 0.7f) { + s.congestionLevel = Math.max(s.congestionLevel, 2); + } + lastLocalStats = s.copy(); + } + + private String buildDiagnosticsText() { + NetworkStatsSnapshot peer = streamMetrics.getLastPeer(); + return CastDiagnosticsFormatter.formatHtml( + streamMetrics, + settings.getTransport(), + negotiatedVideoMime, + pendingWidth, + pendingHeight, + decoderWidth, + decoderHeight, + streamIdle, + settings, + remoteCastSettings, + peer, + lastLocalStats, + PlaybackViewState.getZoomPercent(), + CastMtuSampler.sample(this)); + } + + private TransportLossStats buildReceiverLossSnapshot() { + TransportLossStats snap = session != null + ? session.getTransportLossStats() : new TransportLossStats(); + synchronized (transportLoss) { + snap.recvVideoSkippedAwaitingKey = transportLoss.recvVideoSkippedAwaitingKey; + snap.recvVideoPackets = transportLoss.recvVideoPackets; + snap.recvAudioPackets = transportLoss.recvAudioPackets; + snap.recvVideoDecodeErrors = transportLoss.recvVideoDecodeErrors; + } + if (audioDecoder != null) { + AudioDecoder.Stats ast = audioDecoder.getStats(); + snap.recvAudioDecodeErrors = ast.decodeErrors; + snap.recvAudioQueueDrops = ast.queueDrops; + } + return snap; + } + + private void finishSessionStatsAsync() { + String video = negotiatedVideoMime != null ? negotiatedVideoMime : ""; + String audio = Boolean.TRUE.equals(audioAccepted) ? "AAC" : "none"; + String bwMode = settings != null ? settings.getBitrateMode().name().toLowerCase() : ""; + LiveCastControlPlane.onCastStop(video, audio, bwMode); + final SessionStatsRecorder recorder = sessionStatsRecorder; + sessionStatsRecorder = null; + if (recorder == null) { + return; + } + recorder.setResolution(pendingWidth, pendingHeight); + recorder.mergeLoss(buildReceiverLossSnapshot()); + recorder.finish(getApplicationContext()); + } + + private void attachSurface(Surface surface) { + if (surface == null || !surface.isValid()) { + Log.w(TAG, "attachSurface: invalid surface"); + return; + } + if (surface.equals(attachedSurface) && decoderActive) { + Log.d(TAG, "Surface unchanged, decoder active"); + return; + } + attachedSurface = surface; + Log.i(TAG, "Surface attached, configuring decoder"); + scheduleDecoderConfigureRetries(); + } + + private void detachSurfaceOnly() { + attachedSurface = null; + resetDecoderState(); + if (videoDecoder != null) { + videoDecoder.release(); + videoDecoder = VideoDecoderFactory.createDecoder(); + } + if (hasPendingConfig && phase == Phase.STREAMING) { + enterAwaitingKeyframe(); + scheduleDecoderConfigureRetries(); + } + } + + private void updateStatus(String s) { + status = s; + broadcastStatus(s); + NotificationManager nm = getSystemService(NotificationManager.class); + nm.notify(CastNotifications.ID_RECEIVER, + CastNotifications.receiver(this, s, ReceiverCastService.class)); + } + + private void broadcastStatus(String s) { + broadcastToCallbacks(cb -> { + try { + cb.onStatus(s); + } catch (RemoteException ignored) { + } + }); + } + + private void broadcastAuthenticated(String name) { + broadcastToCallbacks(cb -> { + try { + cb.onAuthenticated(name); + } catch (RemoteException ignored) { + } + }); + } + + private void broadcastStreamStarted(int w, int h) { + broadcastToCallbacks(cb -> { + try { + cb.onStreamStarted(w, h); + } catch (RemoteException ignored) { + } + }); + } + + private void broadcastVideoRendering() { + broadcastToCallbacks(cb -> { + try { + cb.onVideoRendering(); + } catch (RemoteException ignored) { + } + }); + } + + private void broadcastStreamIdle() { + broadcastToCallbacks(cb -> { + try { + cb.onStreamIdle(); + } catch (RemoteException ignored) { + } + }); + } + + private void broadcastDisconnected() { + broadcastToCallbacks(cb -> { + try { + cb.onDisconnected(); + } catch (RemoteException ignored) { + } + }); + } + + private interface CallbackAction { + void dispatch(ICastStatusCallback callback) throws RemoteException; + } + + private void broadcastToCallbacks(CallbackAction action) { + synchronized (callbacks) { + int n = callbacks.beginBroadcast(); + try { + for (int i = 0; i < n; i++) { + try { + action.dispatch(callbacks.getBroadcastItem(i)); + } catch (RemoteException ignored) { + } + } + } finally { + callbacks.finishBroadcast(); + } + } + } + + private void releaseAll() { + finishSessionStatsAsync(); + CastActiveState.setReceiverListening(false); + CastTrayNotifier.refresh(this); + phase = Phase.IDLE; + resetStreamState(); + playbackLaunched = false; + audioAccepted = null; + stopSessionOnly(); + closePlaybackUi(); + releaseWakeLock(); + if (videoDecoder != null) { + videoDecoder.release(); + videoDecoder = null; + } + synchronized (audioDecoderLock) { + if (audioDecoder != null) { + audioDecoder.release(); + audioDecoder = null; + } + } + attachedSurface = null; + CodecSessionRegistry.clear(); + } + + private void stopSelfSafely() { + releaseAll(); + callbacks.kill(); + stopForeground(STOP_FOREGROUND_REMOVE); + stopSelf(); + } + + @Override + public IBinder onBind(Intent intent) { + return binder; + } + + @Override + public void onDestroy() { + mainHandler.removeCallbacks(idleWatchdog); + releaseAll(); + if (videoDecodeThread != null) { + videoDecodeThread.quitSafely(); + videoDecodeThread = null; + videoDecodeHandler = null; + } + callbacks.kill(); + NetworkSelfTestBridge.stopCapture(this); + super.onDestroy(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/ReceiverPlaybackActivity.java b/app/src/main/java/com/foxx/androidcast/receiver/ReceiverPlaybackActivity.java new file mode 100644 index 0000000..3fd59ad --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/ReceiverPlaybackActivity.java @@ -0,0 +1,663 @@ +package com.foxx.androidcast.receiver; + +/********************************************************************* + * ReceiverPlaybackActivity.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class ReceiverPlaybackActivity + * Contributors: + * - Anton Afanasyeu (14 commits, 648 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 38e5f45548413568ec9d715352930b3e934665f48cea81e45fb22d80f47875c0 +**********************************************************************/ +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.content.ServiceConnection; +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.RemoteException; +import android.widget.ImageButton; +import android.widget.Toast; +import android.graphics.SurfaceTexture; +import android.view.Surface; +import android.view.TextureView; +import android.view.View; +import android.view.WindowManager; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; +import android.view.animation.AccelerateDecelerateInterpolator; +import android.widget.ImageView; +import android.widget.TextView; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.DrawerHostActivity; +import com.foxx.androidcast.CastThemeHelper; +import com.foxx.androidcast.PermissionHelper; +import com.foxx.androidcast.PictureInPictureHelper; +import com.foxx.androidcast.ICastReceiverService; +import com.foxx.androidcast.ICastStatusCallback; +import com.foxx.androidcast.R; +import com.foxx.androidcast.receiver.av.ReceiverVideoGlHub; +import com.foxx.androidcast.ui.AspectRatioFrameLayout; +import com.foxx.androidcast.ui.PlaybackTextureTransform; +import com.foxx.androidcast.ui.ZoomPanContainer; + +import androidx.core.text.HtmlCompat; + +/** + * Fullscreen display: dancing-robot overlay while listening / waiting; + * video surface shown only after the first decoded frame. + */ +public class ReceiverPlaybackActivity extends DrawerHostActivity { + public static final String EXTRA_WIDTH = "video_width"; + public static final String EXTRA_HEIGHT = "video_height"; + public static final String EXTRA_FINISH = "finish_playback"; + public static final String EXTRA_SHOW_AWAITING = "show_awaiting"; + public static final String EXTRA_AWAITING_MESSAGE = "awaiting_message"; + public static final String EXTRA_AUTO_START_LISTENING = "auto_start_listening"; + + private AspectRatioFrameLayout aspectContainer; + private TextureView textureView; + private View awaitingOverlay; + private TextView diagnosticsText; + private ImageView robotView; + private TextView awaitingMessage; + private ImageButton pipButton; + private final Handler mainHandler = new Handler(Looper.getMainLooper()); + /** Sender connected or actively streaming — PiP allowed after permissions. */ + private boolean castSessionActive; + private boolean inPictureInPicture; + private SurfaceTexture surfaceTexture; + private int videoWidth; + private int videoHeight; + private boolean streamRendering; + private boolean surfaceSentToService; + private AnimatorSet robotAnimator; + + private ICastReceiverService receiverService; + private boolean bound; + private boolean autoStartListening; + private boolean listeningCancelled; + + private final ICastStatusCallback.Stub statusCallback = new ICastStatusCallback.Stub() { + @Override + public void onStatus(String status) {} + + @Override + public void onAuthenticated(String senderName) { + runOnUiThread(() -> { + onCastSessionStarted(); + showAwaitingOverlay(R.string.playback_awaiting_stream); + }); + } + + @Override + public void onStreamStarted(int width, int height) { + runOnUiThread(() -> updateVideoSize(width, height)); + } + + @Override + public void onVideoRendering() { + runOnUiThread(() -> { + streamRendering = true; + hideAwaitingOverlay(); + ZoomPanContainer zoom = findViewById(R.id.zoom_container); + if (zoom != null) { + zoom.resetTransform(); + } + applyTextureFitCenter(); + updateDiagnosticsVisibility(); + }); + } + + @Override + public void onStreamIdle() { + runOnUiThread(() -> { + streamRendering = false; + surfaceSentToService = false; + showAwaitingOverlay(R.string.playback_awaiting_stream); + updateDiagnosticsVisibility(); + }); + } + + @Override + public void onDisconnected() { + runOnUiThread(() -> { + onCastSessionEnded(); + onStreamLost(); + }); + } + }; + + private final Runnable diagnosticsRefresh = new Runnable() { + @Override + public void run() { + refreshDiagnostics(); + mainHandler.postDelayed(this, 500); + } + }; + + private final ServiceConnection connection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + receiverService = ICastReceiverService.Stub.asInterface(service); + bound = true; + try { + receiverService.registerCallback(statusCallback); + } catch (RemoteException ignored) { + } + attachSurfaceIfReady(); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + receiverService = null; + bound = false; + } + }; + + @Override + protected void applyActivityTheme() { + CastThemeHelper.applyTheme(this); + setTheme(R.style.Theme_AndroidCast_Fullscreen); + } + + @Override + protected int getContentLayoutId() { + return R.layout.activity_playback; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (handleCommandIntent(getIntent())) { + return; + } + applyFullscreen(); + + readSizeFromIntent(getIntent()); + + ZoomPanContainer zoomContainer = findViewById(R.id.zoom_container); + aspectContainer = findViewById(R.id.aspect_container); + textureView = findViewById(R.id.surface_playback); + zoomContainer.setOnZoomChangedListener(PlaybackViewState::setZoomPercent); + awaitingOverlay = findViewById(R.id.overlay_awaiting); + diagnosticsText = findViewById(R.id.text_diagnostics); + robotView = findViewById(R.id.image_robot); + awaitingMessage = findViewById(R.id.text_awaiting_message); + pipButton = findViewById(R.id.button_pip); + if (pipButton != null) { + pipButton.setOnClickListener(v -> tryEnterPictureInPicture(true)); + } + textureView.setSurfaceTextureListener(surfaceListener); + applyAspectRatio(); + updatePipUi(); + if (AppPreferences.isReceiverPipEnabled(this) && PictureInPictureHelper.isSupported()) { + PictureInPictureHelper.applyParams(this, 16, 9); + } + + autoStartListening = getIntent().getBooleanExtra(EXTRA_AUTO_START_LISTENING, false); + if (autoStartListening) { + startListeningService(); + showAwaitingOverlay(R.string.playback_listening); + } else if (getIntent().getBooleanExtra(EXTRA_SHOW_AWAITING, true)) { + int msg = getIntent().getIntExtra(EXTRA_AWAITING_MESSAGE, R.string.playback_listening); + showAwaitingOverlay(msg); + } + } + + private void startListeningService() { + String pin = AppPreferences.getPin(this); + boolean allowAudio = AppPreferences.isPlayIncomingAudio(this); + ReceiverPrefs.setAllowAudio(this, allowAudio); + CastSettings settings = AppPreferences.loadReceiverDefaults(this); + Intent intent = new Intent(this, ReceiverCastService.class); + intent.setAction(ReceiverCastService.ACTION_START); + intent.putExtra(ReceiverCastService.EXTRA_PIN, pin); + intent.putExtra(ReceiverCastService.EXTRA_ALLOW_AUDIO, allowAudio); + intent.putExtra(CastSettings.EXTRA, settings); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(intent); + } else { + startService(intent); + } + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + setIntent(intent); + if (handleCommandIntent(intent)) { + return; + } + readSizeFromIntent(intent); + if (videoWidth > 0 && videoHeight > 0 && !streamRendering) { + surfaceSentToService = false; + } + updateVideoSize(videoWidth, videoHeight); + if (intent.getBooleanExtra(EXTRA_SHOW_AWAITING, false)) { + int msg = intent.getIntExtra(EXTRA_AWAITING_MESSAGE, R.string.playback_listening); + showAwaitingOverlay(msg); + } + } + + @Override + protected void onResume() { + super.onResume(); + if (!inPictureInPicture) { + PermissionHelper.remindForReceiverPlayback(this); + } + if (awaitingOverlay != null && awaitingOverlay.getVisibility() == View.VISIBLE) { + startRobotAnimation(); + } + mainHandler.post(diagnosticsRefresh); + updateDiagnosticsVisibility(); + updatePipUi(); + } + + @Override + public void onUserLeaveHint() { + super.onUserLeaveHint(); + if (shouldAutoEnterPipOnLeave()) { + tryEnterPictureInPicture(false); + } + } + + @Override + public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) { + super.onPictureInPictureModeChanged(isInPictureInPictureMode); + inPictureInPicture = isInPictureInPictureMode; + applyPipChromeVisibility(); + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == PermissionHelper.REQUEST_RECEIVER_PLAYBACK) { + updatePipUi(); + } + } + + @Override + protected void onPause() { + mainHandler.removeCallbacks(diagnosticsRefresh); + stopRobotAnimation(); + super.onPause(); + } + + private boolean handleCommandIntent(Intent intent) { + if (intent != null && intent.getBooleanExtra(EXTRA_FINISH, false)) { + finish(); + return true; + } + return false; + } + + private void readSizeFromIntent(Intent intent) { + videoWidth = intent.getIntExtra(EXTRA_WIDTH, 0); + videoHeight = intent.getIntExtra(EXTRA_HEIGHT, 0); + } + + @Override + protected void onStart() { + super.onStart(); + setPlaybackUiVisible(true); + bindService(new Intent(this, ReceiverCastService.class), connection, Context.BIND_AUTO_CREATE); + } + + @Override + protected void onStop() { + setPlaybackUiVisible(false); + if (autoStartListening && !listeningCancelled && !castSessionActive && !streamRendering + && bound && receiverService != null) { + try { + receiverService.stopReceiving(); + listeningCancelled = true; + } catch (RemoteException ignored) { + } + } + if (bound && receiverService != null) { + try { + receiverService.unregisterCallback(statusCallback); + } catch (RemoteException ignored) { + } + } + detachSurface(); + if (bound) { + unbindService(connection); + bound = false; + receiverService = null; + } + super.onStop(); + } + + private void setPlaybackUiVisible(boolean visible) { + Intent intent = new Intent(this, ReceiverCastService.class); + intent.setAction(ReceiverCastService.ACTION_PLAYBACK_UI); + intent.putExtra(ReceiverCastService.EXTRA_PLAYBACK_UI_VISIBLE, visible); + startService(intent); + } + + private void onStreamLost() { + streamRendering = false; + showAwaitingOverlay(R.string.playback_stream_lost); + } + + private void showAwaitingOverlay(int messageResId) { + streamRendering = false; + PlaybackViewState.reset(); + if (awaitingOverlay == null) { + return; + } + awaitingOverlay.setVisibility(View.VISIBLE); + awaitingOverlay.bringToFront(); + if (awaitingMessage != null) { + awaitingMessage.setText(messageResId); + } + startRobotAnimation(); + } + + private void hideAwaitingOverlay() { + if (awaitingOverlay != null) { + awaitingOverlay.setVisibility(View.GONE); + } + stopRobotAnimation(); + updateDiagnosticsVisibility(); + } + + private void updateDiagnosticsVisibility() { + if (diagnosticsText == null) { + return; + } + boolean show = AppPreferences.isShowReceiverDebugOverlay(this) && streamRendering; + diagnosticsText.setVisibility(show ? View.VISIBLE : View.GONE); + if (show) { + diagnosticsText.bringToFront(); + } + } + + private void refreshDiagnostics() { + if (diagnosticsText == null || !AppPreferences.isShowReceiverDebugOverlay(this) + || !bound || receiverService == null) { + return; + } + if (!streamRendering) { + return; + } + try { + String text = receiverService.getDiagnosticsText(); + if (text != null) { + diagnosticsText.setText(HtmlCompat.fromHtml(text, HtmlCompat.FROM_HTML_MODE_LEGACY)); + } + } catch (RemoteException ignored) { + } + } + + private void startRobotAnimation() { + if (robotView == null) { + return; + } + stopRobotAnimation(); + ObjectAnimator bounce = ObjectAnimator.ofFloat(robotView, View.TRANSLATION_Y, 0f, -32f); + bounce.setDuration(500); + bounce.setInterpolator(new AccelerateDecelerateInterpolator()); + bounce.setRepeatMode(ValueAnimator.REVERSE); + bounce.setRepeatCount(ValueAnimator.INFINITE); + ObjectAnimator wiggle = ObjectAnimator.ofFloat(robotView, View.ROTATION, -12f, 12f); + wiggle.setDuration(400); + wiggle.setInterpolator(new AccelerateDecelerateInterpolator()); + wiggle.setRepeatMode(ValueAnimator.REVERSE); + wiggle.setRepeatCount(ValueAnimator.INFINITE); + robotAnimator = new AnimatorSet(); + robotAnimator.playTogether(bounce, wiggle); + robotAnimator.start(); + } + + private void stopRobotAnimation() { + if (robotAnimator != null) { + robotAnimator.cancel(); + robotAnimator = null; + } + if (robotView != null) { + robotView.animate().cancel(); + robotView.setTranslationY(0f); + robotView.setRotation(0f); + } + } + + private void updateVideoSize(int width, int height) { + if (width <= 0 || height <= 0) { + return; + } + videoWidth = width; + videoHeight = height; + if (castSessionActive && AppPreferences.isReceiverPipEnabled(this) + && PermissionHelper.hasReceiverPlaybackReady(this)) { + PictureInPictureHelper.applyParams(this, videoWidth, videoHeight); + } + applyAspectRatio(); + applyTextureFitCenter(); + if (surfaceTexture != null) { + surfaceTexture.setDefaultBufferSize(videoWidth, videoHeight); + if (surfaceSentToService) { + detachSurface(); + } + attachSurfaceIfReady(); + } + } + + private void applyTextureFitCenter() { + if (textureView == null || videoWidth <= 0 || videoHeight <= 0) { + return; + } + if (textureView.getWidth() == 0 || textureView.getHeight() == 0) { + textureView.post(this::applyTextureFitCenter); + return; + } + PlaybackTextureTransform.applyFitCenter(textureView, videoWidth, videoHeight); + } + + private void applyFullscreen() { + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + | View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + if (getSupportActionBar() != null) { + getSupportActionBar().hide(); + } + } + + private void applyAspectRatio() { + // Full-screen TextureView; letterboxing via transform only (avoids double-scaling). + aspectContainer.setAspectRatio(0, 0); + } + + private final TextureView.SurfaceTextureListener surfaceListener = + new TextureView.SurfaceTextureListener() { + @Override + public void onSurfaceTextureAvailable(SurfaceTexture texture, int width, int height) { + surfaceTexture = texture; + if (videoWidth > 0 && videoHeight > 0) { + texture.setDefaultBufferSize(videoWidth, videoHeight); + } + surfaceSentToService = false; + attachSurfaceIfReady(); + } + + @Override + public void onSurfaceTextureSizeChanged(SurfaceTexture texture, int width, int height) { + if (videoWidth > 0 && videoHeight > 0) { + texture.setDefaultBufferSize(videoWidth, videoHeight); + } + applyTextureFitCenter(); + // Rotation often recreates the texture; re-bind decoder to the new Surface. + surfaceSentToService = false; + attachSurfaceIfReady(); + } + + @Override + public boolean onSurfaceTextureDestroyed(SurfaceTexture texture) { + surfaceSentToService = false; + detachSurface(); + surfaceTexture = null; + return true; + } + + @Override + public void onSurfaceTextureUpdated(SurfaceTexture texture) { + } + }; + + private void attachSurfaceIfReady() { + if (surfaceSentToService || !bound || receiverService == null || surfaceTexture == null) { + return; + } + try { + int w = videoWidth > 0 ? videoWidth : 1280; + int h = videoHeight > 0 ? videoHeight : 720; + Surface surface = ReceiverVideoGlHub.bindDisplay(this, surfaceTexture, w, h); + receiverService.attachVideoSurface(surface); + surfaceSentToService = true; + } catch (RemoteException ignored) { + } + } + + private void detachSurface() { + if (!surfaceSentToService && receiverService == null) { + ReceiverVideoGlHub.release(this); + return; + } + if (receiverService != null) { + try { + receiverService.detachVideoSurface(); + } catch (RemoteException ignored) { + } + } + surfaceSentToService = false; + ReceiverVideoGlHub.release(this); + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + if (hasFocus && !inPictureInPicture) { + applyFullscreen(); + } + } + + private void onCastSessionStarted() { + castSessionActive = true; + if (AppPreferences.isReceiverPipEnabled(this)) { + PermissionHelper.remindForReceiverPlayback(this); + } + updatePipUi(); + } + + private void onCastSessionEnded() { + castSessionActive = false; + updatePipUi(); + } + + private void updatePipUi() { + if (pipButton == null) { + return; + } + boolean sessionVisible = castSessionActive || streamRendering + || (awaitingOverlay != null && awaitingOverlay.getVisibility() == View.VISIBLE); + boolean show = sessionVisible && AppPreferences.isReceiverPipEnabled(this) + && PictureInPictureHelper.isSupported() + && PermissionHelper.hasReceiverPlaybackReady(this); + pipButton.setVisibility(show ? View.VISIBLE : View.GONE); + if (show) { + pipButton.bringToFront(); + } + } + + /** Auto PiP when leaving the app during an active cast, not while waiting for a sender. */ + private boolean shouldAutoEnterPipOnLeave() { + if (!AppPreferences.isReceiverPipEnabled(this) + || !PermissionHelper.hasReceiverPlaybackReady(this)) { + return false; + } + return castSessionActive || streamRendering; + } + + private void tryEnterPictureInPicture(boolean userInitiated) { + if (!AppPreferences.isReceiverPipEnabled(this)) { + return; + } + if (!castSessionActive && !streamRendering + && (awaitingOverlay == null || awaitingOverlay.getVisibility() != View.VISIBLE)) { + if (userInitiated) { + Toast.makeText(this, R.string.pip_unavailable, Toast.LENGTH_SHORT).show(); + } + return; + } + if (!PermissionHelper.hasReceiverPlaybackReady(this)) { + if (userInitiated) { + PermissionHelper.remindForReceiverPlayback(this); + } + return; + } + if (!PictureInPictureHelper.isSupported()) { + if (userInitiated) { + Toast.makeText(this, R.string.pip_unavailable, Toast.LENGTH_SHORT).show(); + } + return; + } + if (!PictureInPictureHelper.isAllowedForApp(this)) { + if (userInitiated) { + PictureInPictureHelper.showEnableInSettingsDialog(this); + } + return; + } + if (!PictureInPictureHelper.enter(this, videoWidth, videoHeight) && userInitiated) { + PictureInPictureHelper.showEnableInSettingsDialog(this); + } + } + + private void applyPipChromeVisibility() { + View handle = findViewById(R.id.settings_drawer_handle); + if (handle != null) { + handle.setVisibility(inPictureInPicture ? View.GONE : View.VISIBLE); + } + if (pipButton != null) { + boolean showPip = (castSessionActive || streamRendering + || (awaitingOverlay != null && awaitingOverlay.getVisibility() == View.VISIBLE)) + && AppPreferences.isReceiverPipEnabled(this) + && PictureInPictureHelper.isSupported() + && PermissionHelper.hasReceiverPlaybackReady(this); + pipButton.setVisibility(inPictureInPicture || !showPip ? View.GONE : View.VISIBLE); + } + if (inPictureInPicture) { + if (diagnosticsText != null) { + diagnosticsText.setVisibility(View.GONE); + } + if (awaitingOverlay != null && streamRendering) { + awaitingOverlay.setVisibility(View.GONE); + } + stopRobotAnimation(); + } else { + updateDiagnosticsVisibility(); + if (!streamRendering && awaitingOverlay != null + && awaitingOverlay.getVisibility() == View.VISIBLE) { + startRobotAnimation(); + } + if (castSessionActive) { + applyFullscreen(); + } + updatePipUi(); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/ReceiverPrefs.java b/app/src/main/java/com/foxx/androidcast/receiver/ReceiverPrefs.java new file mode 100644 index 0000000..41dafb9 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/ReceiverPrefs.java @@ -0,0 +1,35 @@ +package com.foxx.androidcast.receiver; + +/********************************************************************* + * ReceiverPrefs.java + * Created at: Fri 15 May 2026 17:47:09 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class ReceiverPrefs + * Contributors: + * - Anton Afanasyeu (2 commits, 31 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 bf8d517929f2ce54e581aaaa707310b6844ed26b12e1e2d38522c866cc803e1c +**********************************************************************/ +import android.content.Context; +import android.content.SharedPreferences; + +/** Receiver UI preferences (PIN is entered each session; audio choice is remembered). */ +public final class ReceiverPrefs { + private static final String PREFS = "receiver_prefs"; + private static final String KEY_ALLOW_AUDIO = "allow_audio"; + + private ReceiverPrefs() {} + + public static boolean isAllowAudio(Context context) { + return prefs(context).getBoolean(KEY_ALLOW_AUDIO, true); + } + + public static void setAllowAudio(Context context, boolean allow) { + prefs(context).edit().putBoolean(KEY_ALLOW_AUDIO, allow).apply(); + } + + private static SharedPreferences prefs(Context context) { + return context.getApplicationContext().getSharedPreferences(PREFS, Context.MODE_PRIVATE); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/ReceiverSession.java b/app/src/main/java/com/foxx/androidcast/receiver/ReceiverSession.java new file mode 100644 index 0000000..543ebce --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/ReceiverSession.java @@ -0,0 +1,342 @@ +package com.foxx.androidcast.receiver; + +/********************************************************************* + * ReceiverSession.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class ReceiverSession + * Contributors: + * - Anton Afanasyeu (12 commits, 326 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 a0df3c3e1589bdaaa4869da1b6208660f870637a135c06b0946263ca85d095c2 +**********************************************************************/ +import android.util.Log; + +import android.content.Context; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.CastConfig; +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.DeviceInfo; +import com.foxx.androidcast.network.CastCodecFlags; +import com.foxx.androidcast.network.CastFramingContext; +import com.foxx.androidcast.network.CastProtocol; +import com.foxx.androidcast.network.CastSession; +import com.foxx.androidcast.network.CastSessionGate; +import com.foxx.androidcast.network.CastTransport; +import com.foxx.androidcast.network.CastTransportFactory; +import com.foxx.androidcast.network.transport.ProtectionNegotiationPrompts; +import com.foxx.androidcast.network.transport.StreamProtectionNegotiation; +import com.foxx.androidcast.network.UdpCastTransport; +import com.foxx.androidcast.network.quic.QuicCronetCastTransport; +import com.foxx.androidcast.network.transport.TransportLossStats; +import com.foxx.androidcast.network.control.NetworkFeedbackManager; +import com.foxx.androidcast.network.control.NetworkStatsSnapshot; +import com.foxx.androidcast.network.diag.DiagPingMetrics; +import com.foxx.androidcast.network.control.PassThroughNetworkControlPlane; + +import java.io.IOException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicBoolean; + +/** Server: PIN auth, then forward encoded A/V to decoders. */ +public class ReceiverSession { + private static final String TAG = "ReceiverSession"; + + public interface Listener { + void onStatus(String status); + + void onAuthenticated(String senderName, CastSettings remoteSettings, String negotiatedVideoMime); + + void onStreamConfig(int width, int height, byte[] csd0, byte[] csd1); + + void onVideoFrame(long ptsUs, boolean keyFrame, byte[] data); + + void onAudioConfig(int sampleRate, int channels, byte[] csd0); + + void onAudioFrame(long ptsUs, byte[] data); + + void onDisconnected(); + + /** Sender sent {@link CastProtocol#MSG_GOODBYE} — stop audio/video playback immediately. */ + void onCastEnded(); + + /** TCP/UDP listen socket is bound; safe to advertise on the LAN. */ + void onListening(); + + /** About to accept a sender and run handshake (bind session stats before I/O). */ + void onCastSessionStarting(); + + void onNetworkAdviceApplied(); + + void onPeerNetworkStats(NetworkStatsSnapshot stats); + + /** Diagnostic ping-pong sample (developer setting). */ + default void onDiagPingSample(DiagPingMetrics.Snapshot snapshot) { + } + } + + private final Context appContext; + private final String pin; + private final CastSettings localSettings; + private final Listener listener; + private final ExecutorService executor = Executors.newSingleThreadExecutor(new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + Thread t = new Thread(r, "ReceiverIO"); + t.setDaemon(true); + return t; + } + }); + private final AtomicBoolean running = new AtomicBoolean(false); + + private CastSession session; + private CastTransport listenTransport; + private final CastSessionGate inboundSessionGate = new CastSessionGate(); + private boolean loggedFirstVideoFrame; + private NetworkFeedbackManager networkFeedback; + private PassThroughNetworkControlPlane.StatsEnricher statsEnricher; + + public ReceiverSession(Context context, String pin, CastSettings localSettings, Listener listener) { + this(context, pin, localSettings, listener, null); + } + + public ReceiverSession(Context context, String pin, CastSettings localSettings, Listener listener, + PassThroughNetworkControlPlane.StatsEnricher statsEnricher) { + this.appContext = context.getApplicationContext(); + this.pin = pin; + this.localSettings = localSettings; + this.listener = listener; + this.statsEnricher = statsEnricher; + } + + public void start() { + if (running.get()) { + stop(); + } + if (!running.compareAndSet(false, true)) { + return; + } + executor.execute(this::runServer); + } + + public void stop() { + running.set(false); + if (session != null) { + session.close(); + session = null; + } + if (listenTransport != null) { + listenTransport.close(); + listenTransport = null; + } + inboundSessionGate.reset(); + } + + public TransportLossStats getTransportLossStats() { + if (listenTransport != null) { + return listenTransport.getLossStats(); + } + return new TransportLossStats(); + } + + public void sendAudioConsent(boolean accept) { + if (session == null) { + return; + } + try { + session.send(CastProtocol.MSG_AUDIO_CONSENT, CastProtocol.audioConsentPayload(accept)); + } catch (IOException e) { + Log.w(TAG, "Failed to send audio consent", e); + } + } + + private void runServer() { + while (running.get()) { + try { + if (listenTransport == null) { + com.foxx.androidcast.network.CastTransportFactory.init(appContext); + listenTransport = CastTransportFactory.create(localSettings); + inboundSessionGate.reset(); + listenTransport.setInboundSessionGate(inboundSessionGate); + listenTransport.setFramingContext(new CastFramingContext( + 0, + DeviceInfo.getPlaceholderId(appContext), + CastCodecFlags.localDecoderVideoMask(), + CastCodecFlags.localAudioMask())); + session = new CastSession(listenTransport); + int listenPort = CastConfig.portForTransport(localSettings.getTransport()); + session.prepareListen(listenPort); + listener.onListening(); + postStatus("Listening (" + listenTransport.getModeLabel() + ") port " + + listenPort); + } else if (session == null) { + session = new CastSession(listenTransport); + } + inboundSessionGate.reset(); + listener.onCastSessionStarting(); + networkFeedback = new NetworkFeedbackManager(session, false); + if (networkFeedback.getPlane() instanceof PassThroughNetworkControlPlane) { + PassThroughNetworkControlPlane plane = + (PassThroughNetworkControlPlane) networkFeedback.getPlane(); + plane.setStatsEnricher(statsEnricher); + if (AppPreferences.isDevDiagPingPongEnabled(appContext)) { + networkFeedback.configureDiagPing(true, + AppPreferences.getDevDiagPingResponseMode(appContext), + listener::onDiagPingSample); + } + } + session.acceptClient(); + CastSession.HandshakeResult hs = session.serverHandshake(pin, localSettings); + applyNegotiatedProtection(hs.settings); + listener.onAuthenticated(hs.senderName, hs.settings, hs.negotiatedVideoMime); + postStatus("Streaming from " + hs.senderName); + readStream(); + } catch (java.io.EOFException e) { + if (running.get()) { + Log.i(TAG, "Connection closed"); + postStatus("Sender disconnected"); + } + } catch (IOException e) { + if (running.get()) { + if (isProtocolDesync(e)) { + Log.w(TAG, "Session desync (peer closed or corrupt stream): " + e.getMessage()); + postStatus("Connection reset — waiting for sender…"); + } else { + Log.e(TAG, "Session error", e); + postStatus(e.getMessage() != null ? e.getMessage() : "Session error"); + } + } + } catch (Exception e) { + if (running.get()) { + Log.e(TAG, "Session error", e); + postStatus(e.getMessage() != null ? e.getMessage() : "Session error"); + } + } finally { + if (session != null) { + session.releaseConnection(); + session = null; + } + if (listenTransport != null) { + listenTransport.close(); + listenTransport = null; + } + inboundSessionGate.reset(); + loggedFirstVideoFrame = false; + networkFeedback = null; + listener.onDisconnected(); + } + if (running.get()) { + postStatus("Waiting for sender…"); + } + } + } + + private void readStream() throws IOException { + while (running.get()) { + if (networkFeedback != null) { + networkFeedback.tick(); + } + CastProtocol.Message msg; + try { + msg = session.receive(500); + } catch (java.io.EOFException e) { + Log.i(TAG, "Sender closed connection"); + return; + } + if (msg == null) { + continue; + } + if (networkFeedback != null && networkFeedback.handleMessage(msg)) { + listener.onNetworkAdviceApplied(); + if (msg.type == CastProtocol.MSG_NETWORK_STATS) { + try { + listener.onPeerNetworkStats(CastProtocol.parseNetworkStats(msg.payload)); + } catch (IOException ignored) { + } + } + continue; + } + switch (msg.type) { + case CastProtocol.MSG_STREAM_CONFIG: + CastProtocol.StreamConfig vcfg = CastProtocol.parseStreamConfig(msg.payload); + listener.onStreamConfig(vcfg.width, vcfg.height, vcfg.csd0, vcfg.csd1); + break; + case CastProtocol.MSG_VIDEO_FRAME: + CastProtocol.VideoFrame vf = CastProtocol.parseVideoFrame(msg.payload); + recordNetworkBytes(vf.data != null ? vf.data.length : 0); + if (!loggedFirstVideoFrame) { + loggedFirstVideoFrame = true; + Log.i(TAG, "First video over network " + + (vf.keyFrame ? "KEY" : "P") + " len=" + + (vf.data != null ? vf.data.length : 0)); + } + listener.onVideoFrame(vf.ptsUs, vf.keyFrame, vf.data); + break; + case CastProtocol.MSG_AUDIO_CONFIG: + CastProtocol.AudioConfig acfg = CastProtocol.parseAudioConfig(msg.payload); + listener.onAudioConfig(acfg.sampleRate, acfg.channels, acfg.csd0); + break; + case CastProtocol.MSG_AUDIO_FRAME: + CastProtocol.AudioFrame af = CastProtocol.parseAudioFrame(msg.payload); + recordNetworkBytes(af.data != null ? af.data.length : 0); + listener.onAudioFrame(af.ptsUs, af.data); + break; + case CastProtocol.MSG_GOODBYE: + postStatus("Sender stopped casting"); + listener.onCastEnded(); + return; + default: + break; + } + } + } + + private void recordNetworkBytes(int bytes) { + if (networkFeedback != null && networkFeedback.getPlane() instanceof PassThroughNetworkControlPlane) { + ((PassThroughNetworkControlPlane) networkFeedback.getPlane()).recordBytes(bytes); + } + } + + private static boolean isProtocolDesync(IOException e) { + String msg = e.getMessage(); + if (msg == null) { + return false; + } + return msg.contains("Invalid payload length") + || msg.contains("Invalid blob length") + || msg.contains("Connection reset") + || msg.contains("Broken pipe"); + } + + private void applyNegotiatedProtection(CastSettings remoteSettings) { + if (listenTransport == null) { + return; + } + UdpCastTransport udp = null; + if (listenTransport instanceof UdpCastTransport) { + udp = (UdpCastTransport) listenTransport; + } else if (listenTransport instanceof QuicCronetCastTransport) { + udp = ((QuicCronetCastTransport) listenTransport).getUdpTransport(); + } + if (udp != null) { + StreamProtectionNegotiation negotiated = CastTransportFactory.applyNegotiatedUdpProtection( + udp, localSettings, remoteSettings, true); + String summary = ProtectionNegotiationPrompts.summarize(appContext, negotiated); + Log.i(TAG, summary); + postStatus(summary); + if (negotiated.prompt != null) { + String hint = ProtectionNegotiationPrompts.format(appContext, negotiated.prompt, true); + Log.i(TAG, hint); + postStatus(hint); + } + } + } + + private void postStatus(String status) { + listener.onStatus(status); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/StreamMetrics.java b/app/src/main/java/com/foxx/androidcast/receiver/StreamMetrics.java new file mode 100644 index 0000000..9d82302 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/StreamMetrics.java @@ -0,0 +1,285 @@ +package com.foxx.androidcast.receiver; + +/********************************************************************* + * StreamMetrics.java + * Created at: Fri 15 May 2026 18:17:39 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class StreamMetrics + * Contributors: + * - Anton Afanasyeu (6 commits, 265 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 d8a6a1d9253073899f2be582d7334435d8b5e69563656098aef7749f038234ab +**********************************************************************/ +import com.foxx.androidcast.network.control.NetworkStatsSnapshot; +import com.foxx.androidcast.network.diag.DiagPingMetrics; + +/** Receiver-side counters for diagnostics overlay and bandwidth estimates. */ +public final class StreamMetrics { + private long videoPackets; + private long audioPackets; + private long audioRenderedWrites; + private long audioPcmSilentBlocks; + private long audioPcmAudibleBlocks; + private float audioVuSmoothed; + private float audioLastPeakDb; + private float audioLastRmsDb; + private long keyFrames; + private long deltaFrames; + private long videoBytes; + private long audioBytes; + private long renderedFrames; + private long windowVideoBytes; + private long windowVideoPackets; + private long windowStartMs; + private float lastSecondInFps; + private long lastVideoPacketMs; + private long lastRenderedFrameMs; + private long firstVideoPacketMs; + private int peerRttMs; + private int peerRecvKbps; + private int peerSendKbps; + private NetworkStatsSnapshot lastPeer; + private DiagPingMetrics.Snapshot diagPing = DiagPingMetrics.Snapshot.EMPTY; + + public synchronized void reset() { + videoPackets = 0; + audioPackets = 0; + audioRenderedWrites = 0; + audioPcmSilentBlocks = 0; + audioPcmAudibleBlocks = 0; + audioVuSmoothed = 0f; + audioLastPeakDb = -96f; + audioLastRmsDb = -96f; + keyFrames = 0; + deltaFrames = 0; + videoBytes = 0; + audioBytes = 0; + renderedFrames = 0; + windowVideoBytes = 0; + windowVideoPackets = 0; + windowStartMs = 0; + lastSecondInFps = 0f; + lastVideoPacketMs = 0; + lastRenderedFrameMs = 0; + firstVideoPacketMs = 0; + peerRttMs = 0; + peerRecvKbps = 0; + peerSendKbps = 0; + lastPeer = null; + diagPing = DiagPingMetrics.Snapshot.EMPTY; + } + + public synchronized void onDiagPingSample(DiagPingMetrics.Snapshot sample) { + diagPing = sample != null ? sample : DiagPingMetrics.Snapshot.EMPTY; + if (diagPing.avgRttMs > 0) { + peerRttMs = diagPing.avgRttMs; + } else if (diagPing.lastRttMs > 0) { + peerRttMs = diagPing.lastRttMs; + } + } + + public synchronized DiagPingMetrics.Snapshot getDiagPing() { + return diagPing; + } + + public synchronized void onVideoPacket(boolean keyFrame, int bytes) { + long now = System.currentTimeMillis(); + videoPackets++; + if (keyFrame) { + keyFrames++; + } else { + deltaFrames++; + } + videoBytes += bytes; + if (windowStartMs == 0) { + windowStartMs = now; + } + long windowElapsed = now - windowStartMs; + if (windowElapsed >= 1000) { + lastSecondInFps = windowVideoPackets; + windowVideoPackets = 0; + windowVideoBytes = 0; + windowStartMs = now; + } + windowVideoPackets++; + windowVideoBytes += bytes; + if (firstVideoPacketMs == 0) { + firstVideoPacketMs = now; + } + lastVideoPacketMs = now; + } + + public synchronized void onAudioPacket(int bytes) { + audioPackets++; + audioBytes += bytes; + } + + public synchronized void onAudioRendered(int pcmBytes, float peak, float rms, boolean silent) { + if (pcmBytes > 0) { + audioRenderedWrites++; + } + if (silent) { + audioPcmSilentBlocks++; + } else { + audioPcmAudibleBlocks++; + } + float instant = Math.max(peak, rms); + audioVuSmoothed = instant > audioVuSmoothed + ? instant * 0.35f + audioVuSmoothed * 0.65f + : instant * 0.12f + audioVuSmoothed * 0.88f; + if (peak > 1e-9f) { + audioLastPeakDb = (float) (20.0 * Math.log10(peak)); + } + if (rms > 1e-9f) { + audioLastRmsDb = (float) (20.0 * Math.log10(rms)); + } + } + + public synchronized long getAudioRenderedWrites() { + return audioRenderedWrites; + } + + public synchronized long getAudioPcmSilentBlocks() { + return audioPcmSilentBlocks; + } + + public synchronized long getAudioPcmAudibleBlocks() { + return audioPcmAudibleBlocks; + } + + public synchronized int getAudioVuPercent() { + return com.foxx.androidcast.media.PcmLevelAnalyzer.vuPercent(audioVuSmoothed); + } + + public synchronized float getAudioLastPeakDb() { + return audioLastPeakDb; + } + + public synchronized float getAudioLastRmsDb() { + return audioLastRmsDb; + } + + public synchronized void onRenderedFrame() { + renderedFrames++; + lastRenderedFrameMs = System.currentTimeMillis(); + } + + public synchronized void onPeerStats(NetworkStatsSnapshot peer) { + if (peer == null) { + return; + } + lastPeer = peer; + peerRttMs = peer.rttMs; + peerRecvKbps = peer.recvBitrateKbps; + peerSendKbps = peer.sendBitrateKbps; + } + + public synchronized NetworkStatsSnapshot getLastPeer() { + return lastPeer; + } + + public synchronized long getLastVideoPacketMs() { + return lastVideoPacketMs; + } + + public synchronized float getInFps() { + long now = System.currentTimeMillis(); + float inFps = lastSecondInFps > 0 ? lastSecondInFps : computeFps(videoPackets, firstVideoPacketMs, now); + return inFps; + } + + public synchronized float getRenderFps() { + long now = System.currentTimeMillis(); + return computeFps(renderedFrames, firstVideoPacketMs, lastRenderedFrameMs > 0 ? lastRenderedFrameMs : now); + } + + public synchronized int getBwInKbps() { + return computeLocalKbps(System.currentTimeMillis()); + } + + public synchronized long getVideoPackets() { + return videoPackets; + } + + public synchronized long getAudioPackets() { + return audioPackets; + } + + public synchronized long getKeyFrames() { + return keyFrames; + } + + public synchronized long getDeltaFrames() { + return deltaFrames; + } + + public synchronized int getAvgKbPerFrame() { + if (videoPackets <= 0) { + return 0; + } + return (int) (videoBytes / videoPackets / 1024); + } + + public synchronized long getLastFrameIdleMs() { + if (lastVideoPacketMs <= 0) { + return -1; + } + return System.currentTimeMillis() - lastVideoPacketMs; + } + + public synchronized int getPeerRttMs() { + return peerRttMs; + } + + public synchronized int getPeerSendKbps() { + return peerSendKbps; + } + + public synchronized int getPeerRecvKbps() { + return peerRecvKbps; + } + + public synchronized float getDecodeFps() { + return getRenderFps(); + } + + /** Plain-text fallback (tests / logging). */ + public synchronized String format(String transport, String videoCodec, int streamW, int streamH, int renderW, + int renderH, boolean idle) { + StringBuilder sb = new StringBuilder(); + sb.append("In FPS: ").append(String.format("%.1f", getInFps())); + sb.append(" Render: ").append(String.format("%.1f", getRenderFps())); + sb.append(" BW: ").append(getBwInKbps()).append(" kbps"); + sb.append(idle ? " idle" : " live"); + return sb.toString(); + } + + private int computeLocalKbps(long now) { + if (windowStartMs == 0 || windowVideoBytes == 0) { + return peerRecvKbps; + } + long elapsed = now - windowStartMs; + if (elapsed < 200) { + return peerRecvKbps; + } + int kbps = (int) (windowVideoBytes * 8L / elapsed); + if (elapsed > 4000) { + windowStartMs = now; + windowVideoBytes = 0; + } + return kbps; + } + + private static float computeFps(long count, long startMs, long endMs) { + if (count <= 1 || startMs <= 0) { + return 0f; + } + long end = endMs > startMs ? endMs : System.currentTimeMillis(); + float sec = (end - startMs) / 1000f; + if (sec < 0.05f) { + return 0f; + } + return count / sec; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/VideoDecoder.java b/app/src/main/java/com/foxx/androidcast/receiver/VideoDecoder.java new file mode 100644 index 0000000..a70d235 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/VideoDecoder.java @@ -0,0 +1,219 @@ +package com.foxx.androidcast.receiver; + +/********************************************************************* + * VideoDecoder.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class VideoDecoder + * Contributors: + * - Anton Afanasyeu (7 commits, 213 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 198572dccc10d66707f67d249a8ba20391fc8967d8d07737bf162b6b96a85ac4 +**********************************************************************/ +import android.media.MediaCodec; +import android.media.MediaFormat; +import android.util.Log; +import android.view.Surface; + +import com.foxx.androidcast.media.CodecNegotiator; +import com.foxx.androidcast.media.H264Bitstream; +import com.foxx.androidcast.media.codec.VideoDecoderSink; +import com.foxx.androidcast.receiver.av.ReceiverAvRuntime; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.ArrayDeque; +import java.util.Queue; + +/** Thread-safe hardware video decoder feeding a Surface. */ +public class VideoDecoder implements VideoDecoderSink { + private static final String TAG = "VideoDecoder"; + + private final Object lock = new Object(); + private MediaCodec codec; + private final Queue pending = new ArrayDeque<>(); + private boolean configured; + private boolean released; + private VideoDecoderSink.Listener listener; + private boolean firstFrameNotified; + + private String mime = MediaFormat.MIMETYPE_VIDEO_AVC; + + public void configure(String mime, int width, int height, byte[] csd0, byte[] csd1, Surface surface, + VideoDecoderSink.Listener listener) throws IOException { + synchronized (lock) { + releaseLocked(); + released = false; + this.listener = listener; + this.mime = mime != null ? mime : MediaFormat.MIMETYPE_VIDEO_AVC; + firstFrameNotified = false; + MediaFormat format = MediaFormat.createVideoFormat(this.mime, width, height); + format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, width * height * 2); + if (csd0 != null && csd0.length > 0) { + byte[] c0 = CodecNegotiator.isH264(this.mime) ? H264Bitstream.toAnnexB(csd0) : csd0; + format.setByteBuffer("csd-0", ByteBuffer.wrap(c0)); + } + if (csd1 != null && csd1.length > 0) { + byte[] c1 = CodecNegotiator.isH264(this.mime) ? H264Bitstream.toAnnexB(csd1) : csd1; + format.setByteBuffer("csd-1", ByteBuffer.wrap(c1)); + } + codec = MediaCodec.createDecoderByType(this.mime); + codec.configure(format, surface, null, 0); + codec.start(); + configured = true; + Log.i(TAG, "Configured " + CodecNegotiator.displayName(this.mime) + " " + width + "x" + height); + drainPendingLocked(); + } + } + + public void queueFrame(long ptsUs, boolean keyFrame, byte[] data) { + synchronized (lock) { + if (released || data == null || data.length == 0) { + return; + } + byte[] annexB = needsAnnexB(mime) ? H264Bitstream.toAnnexB(data) : data; + if (!configured || codec == null) { + pending.add(new PendingFrame(ptsUs, keyFrame, annexB)); + return; + } + decodeFrameLocked(ptsUs, keyFrame, annexB); + } + } + + public void release() { + synchronized (lock) { + releaseLocked(); + } + } + + private void releaseLocked() { + configured = false; + released = true; + listener = null; + firstFrameNotified = false; + pending.clear(); + MediaCodec c = codec; + codec = null; + if (c != null) { + try { + c.stop(); + } catch (Exception ignored) { + } + try { + c.release(); + } catch (Exception ignored) { + } + } + } + + private void drainPendingLocked() { + PendingFrame frame; + while ((frame = pending.poll()) != null) { + decodeFrameLocked(frame.ptsUs, frame.keyFrame, frame.data); + } + } + + private void decodeFrameLocked(long ptsUs, boolean keyFrame, byte[] data) { + MediaCodec c = codec; + if (c == null || !configured) { + return; + } + try { + int inIndex = c.dequeueInputBuffer(10_000); + if (inIndex < 0) { + return; + } + ByteBuffer buffer = c.getInputBuffer(inIndex); + if (buffer == null) { + return; + } + buffer.clear(); + buffer.put(data); + int flags = keyFrame ? MediaCodec.BUFFER_FLAG_KEY_FRAME : 0; + c.queueInputBuffer(inIndex, 0, data.length, ptsUs, flags); + drainOutputLocked(c); + } catch (IllegalStateException e) { + Log.w(TAG, "Decode skipped (codec state): " + e.getMessage()); + } catch (Exception e) { + Log.e(TAG, "Decode error", e); + } + } + + private void drainOutputLocked(MediaCodec c) { + try { + MediaCodec.BufferInfo info = new MediaCodec.BufferInfo(); + for (;;) { + int outIndex = c.dequeueOutputBuffer(info, 10_000); + if (outIndex == MediaCodec.INFO_TRY_AGAIN_LATER) { + break; + } + if (outIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { + MediaFormat fmt = c.getOutputFormat(); + Log.i(TAG, "Output format: " + fmt); + notifyOutputSizeLocked(fmt); + continue; + } + if (outIndex < 0) { + continue; + } + boolean render = info.size > 0 + && (info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) == 0; + c.releaseOutputBuffer(outIndex, render); + if (render) { + ReceiverAvRuntime.video().onFrameDecoded(info.presentationTimeUs); + notifyFirstFrameLocked(); + } + } + } catch (IllegalStateException e) { + Log.w(TAG, "Drain skipped (codec state): " + e.getMessage()); + } + } + + private void notifyOutputSizeLocked(MediaFormat format) { + if (listener == null || format == null) { + return; + } + int w = format.getInteger(MediaFormat.KEY_WIDTH); + int h = format.getInteger(MediaFormat.KEY_HEIGHT); + if (format.containsKey("crop-right") && format.containsKey("crop-left")) { + w = format.getInteger("crop-right") + 1 - format.getInteger("crop-left"); + } + if (format.containsKey("crop-bottom") && format.containsKey("crop-top")) { + h = format.getInteger("crop-bottom") + 1 - format.getInteger("crop-top"); + } + if (w > 0 && h > 0) { + listener.onOutputSizeChanged(w, h); + } + } + + private void notifyFirstFrameLocked() { + if (listener == null) { + return; + } + Listener cb = listener; + if (!firstFrameNotified) { + firstFrameNotified = true; + Log.i(TAG, "First frame rendered"); + cb.onFirstFrameRendered(); + } else { + cb.onFrameRendered(); + } + } + + private static boolean needsAnnexB(String mime) { + return CodecNegotiator.isH264(mime) || CodecNegotiator.isHevc(mime); + } + + private static final class PendingFrame { + final long ptsUs; + final boolean keyFrame; + final byte[] data; + + PendingFrame(long ptsUs, boolean keyFrame, byte[] data) { + this.ptsUs = ptsUs; + this.keyFrame = keyFrame; + this.data = data; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/av/AudioFilter.java b/app/src/main/java/com/foxx/androidcast/receiver/av/AudioFilter.java new file mode 100644 index 0000000..cec0e64 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/av/AudioFilter.java @@ -0,0 +1,9 @@ +package com.foxx.androidcast.receiver.av; + +/** In-place PCM filter (16-bit interleaved) between AAC decoder and {@link android.media.AudioTrack}. */ +public interface AudioFilter { + /** @param intensity 0 = bypass effect, 10 = maximum for this filter */ + void process(byte[] pcm, int bytes, int sampleRate, int channels, int intensity); + + default void reset(int sampleRate, int channels) {} +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/av/AudioFilterChain.java b/app/src/main/java/com/foxx/androidcast/receiver/av/AudioFilterChain.java new file mode 100644 index 0000000..b066764 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/av/AudioFilterChain.java @@ -0,0 +1,31 @@ +package com.foxx.androidcast.receiver.av; + +/** Ordered PCM filters (decoder → chain → AudioTrack). */ +public final class AudioFilterChain { + private final AudioFilter[] filters; + private final int intensity; + + public AudioFilterChain(AudioFilter[] filters, int intensity) { + this.filters = filters != null ? filters : new AudioFilter[0]; + this.intensity = Math.max(0, Math.min(10, intensity)); + } + + public static AudioFilterChain passthrough() { + return new AudioFilterChain(new AudioFilter[] {new PassthroughAudioFilter()}, 0); + } + + public void reset(int sampleRate, int channels) { + for (AudioFilter f : filters) { + f.reset(sampleRate, channels); + } + } + + public void process(byte[] pcm, int bytes, int sampleRate, int channels) { + if (pcm == null || bytes <= 0) { + return; + } + for (AudioFilter f : filters) { + f.process(pcm, bytes, sampleRate, channels, intensity); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/av/BassBoostAudioFilter.java b/app/src/main/java/com/foxx/androidcast/receiver/av/BassBoostAudioFilter.java new file mode 100644 index 0000000..27c5980 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/av/BassBoostAudioFilter.java @@ -0,0 +1,40 @@ +package com.foxx.androidcast.receiver.av; + +/** + * Boosts energy below ~150 Hz and gently reduces mids/highs at higher intensity. + */ +public final class BassBoostAudioFilter implements AudioFilter { + private float[] lowL; + private float[] lowR; + private int channels; + + @Override + public void reset(int sampleRate, int channels) { + this.channels = Math.max(1, channels); + lowL = new float[this.channels]; + lowR = new float[this.channels]; + } + + @Override + public void process(byte[] pcm, int bytes, int sampleRate, int channels, int intensity) { + if (intensity <= 0 || sampleRate <= 0) { + return; + } + if (lowL == null || this.channels != channels) { + reset(sampleRate, channels); + } + float g = PcmAudioFilters.intensityGain(intensity); + float alpha = (float) (1.0 - Math.exp(-2.0 * Math.PI * 150.0 / sampleRate)); + float bassGain = 1f + 1.2f * g; + float trebleCut = 1f - 0.35f * g; + PcmAudioFilters.process16Le(pcm, bytes, channels, (sample, ch, frame) -> { + float[] state = ch == 0 ? lowL : (ch == 1 ? lowR : lowL); + int idx = Math.min(ch, state.length - 1); + state[idx] += alpha * (sample - state[idx]); + float low = state[idx]; + float high = sample - low; + float out = sample + (bassGain - 1f) * low + (trebleCut - 1f) * high; + return Math.max(-1f, Math.min(1f, out)); + }); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/av/DolbySurroundAudioFilter.java b/app/src/main/java/com/foxx/androidcast/receiver/av/DolbySurroundAudioFilter.java new file mode 100644 index 0000000..3d3467b --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/av/DolbySurroundAudioFilter.java @@ -0,0 +1,60 @@ +package com.foxx.androidcast.receiver.av; + +/** + * Stereo headphone spatialization stub: crossfeed + short delays (5.1 or 7.1 flavor). + */ +public final class DolbySurroundAudioFilter implements AudioFilter { + private final boolean sevenOne; + private float[] delayL; + private float[] delayR; + private int writeIdx; + private int channels; + + DolbySurroundAudioFilter(boolean sevenOne) { + this.sevenOne = sevenOne; + } + + @Override + public void reset(int sampleRate, int channels) { + this.channels = channels; + int maxDelay = sampleRate > 0 ? Math.max(32, sampleRate * 12 / 1000) : 512; + delayL = new float[maxDelay]; + delayR = new float[maxDelay]; + writeIdx = 0; + } + + @Override + public void process(byte[] pcm, int bytes, int sampleRate, int channels, int intensity) { + if (intensity <= 0 || channels < 2 || sampleRate <= 0) { + return; + } + if (delayL == null || this.channels != channels) { + reset(sampleRate, channels); + } + float g = PcmAudioFilters.intensityGain(intensity); + int d1 = Math.min(delayL.length - 1, sampleRate * 3 / 1000); + int d2 = Math.min(delayL.length - 1, sampleRate * 7 / 1000); + int d3 = sevenOne ? Math.min(delayL.length - 1, sampleRate * 11 / 1000) : 0; + float wet = 0.22f * g; + int frames = bytes / (2 * channels); + int off = 0; + for (int i = 0; i < frames; i++) { + float l = PcmAudioFilters.readSample(pcm, off); + float r = PcmAudioFilters.readSample(pcm, off + 2); + delayL[writeIdx] = l; + delayR[writeIdx] = r; + float tapL = delayL[(writeIdx - d1 + delayL.length) % delayL.length]; + float tapR = delayR[(writeIdx - d1 + delayR.length) % delayR.length]; + float wideL = l + wet * (tapR * 0.6f + delayR[(writeIdx - d2 + delayR.length) % delayR.length] * 0.3f); + float wideR = r + wet * (tapL * 0.6f + delayL[(writeIdx - d2 + delayL.length) % delayL.length] * 0.3f); + if (sevenOne && d3 > 0) { + wideL += wet * 0.15f * delayR[(writeIdx - d3 + delayR.length) % delayR.length]; + wideR += wet * 0.15f * delayL[(writeIdx - d3 + delayL.length) % delayL.length]; + } + PcmAudioFilters.writeSample(pcm, off, wideL); + PcmAudioFilters.writeSample(pcm, off + 2, wideR); + writeIdx = (writeIdx + 1) % delayL.length; + off += 2 * channels; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/av/GlExperimentalVideoPipeline.java b/app/src/main/java/com/foxx/androidcast/receiver/av/GlExperimentalVideoPipeline.java new file mode 100644 index 0000000..2363b0e --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/av/GlExperimentalVideoPipeline.java @@ -0,0 +1,33 @@ +package com.foxx.androidcast.receiver.av; + +import android.content.Context; + +/** GLES post-decode path for immersive / HDR experimental presets. */ +public final class GlExperimentalVideoPipeline implements ReceiverVideoPipeline { + private final Context appContext; + private final ReceiverVideoPreset preset; + + public GlExperimentalVideoPipeline(Context context, ReceiverVideoPreset preset) { + this.appContext = context.getApplicationContext(); + this.preset = preset; + } + + @Override + public void onFrameDecoded(long ptsUs) { + ReceiverVideoGlHub.onFrameDecoded(appContext); + } + + @Override + public void onConfigured(int width, int height) { + ReceiverVideoGlHub.refreshPreset(appContext); + } + + @Override + public void onReleased() { + ReceiverVideoGlHub.release(appContext); + } + + public ReceiverVideoPreset getPreset() { + return preset; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/av/ImmersiveAudioFilter.java b/app/src/main/java/com/foxx/androidcast/receiver/av/ImmersiveAudioFilter.java new file mode 100644 index 0000000..2688552 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/av/ImmersiveAudioFilter.java @@ -0,0 +1,51 @@ +package com.foxx.androidcast.receiver.av; + +/** + * Lightweight clarity chain (no ML): DC/high-pass, noise gate, gentle presence, limiter. + * Aligns with receiver live path in {@code AV_QUALITY_QA_SESSION.md} §8A audio. + */ +public final class ImmersiveAudioFilter implements AudioFilter { + private float hpL; + private float hpR; + private float env; + private int channels; + + @Override + public void reset(int sampleRate, int channels) { + this.channels = Math.max(1, channels); + hpL = hpR = env = 0f; + } + + @Override + public void process(byte[] pcm, int bytes, int sampleRate, int channels, int intensity) { + if (intensity <= 0 || sampleRate <= 0) { + return; + } + if (this.channels != channels) { + reset(sampleRate, channels); + } + float g = PcmAudioFilters.intensityGain(intensity); + float hpAlpha = (float) (1.0 - Math.exp(-2.0 * Math.PI * 90.0 / sampleRate)); + float envAlpha = (float) (1.0 - Math.exp(-2.0 * Math.PI * 12.0 / sampleRate)); + float gateThresh = 0.008f * (1f - 0.5f * g); + float presence = 0.15f * g; + float ceiling = 0.98f - 0.05f * g; + PcmAudioFilters.process16Le(pcm, bytes, channels, (sample, ch, frame) -> { + float hp = ch == 0 ? hpL : (ch == 1 ? hpR : hpL); + hp += hpAlpha * (sample - hp); + if (ch == 0) { + hpL = hp; + } else if (ch == 1) { + hpR = hp; + } + float x = sample - hp; + float ax = Math.abs(x); + env += envAlpha * (ax - env); + if (env < gateThresh) { + x *= 0.25f + 0.75f * (env / Math.max(gateThresh, 1e-6f)); + } + float bright = x + presence * (x - hp); + return Math.max(-ceiling, Math.min(ceiling, bright * (1f + 0.08f * g))); + }); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/av/PassthroughAudioFilter.java b/app/src/main/java/com/foxx/androidcast/receiver/av/PassthroughAudioFilter.java new file mode 100644 index 0000000..92c39f8 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/av/PassthroughAudioFilter.java @@ -0,0 +1,9 @@ +package com.foxx.androidcast.receiver.av; + +/** No-op audio filter (preset DEFAULT). */ +public final class PassthroughAudioFilter implements AudioFilter { + @Override + public void process(byte[] pcm, int bytes, int sampleRate, int channels, int intensity) { + // passthrough + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/av/PassthroughVideoPipeline.java b/app/src/main/java/com/foxx/androidcast/receiver/av/PassthroughVideoPipeline.java new file mode 100644 index 0000000..6e7b23f --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/av/PassthroughVideoPipeline.java @@ -0,0 +1,13 @@ +package com.foxx.androidcast.receiver.av; + +/** Direct decode→display Surface (preset DEFAULT). */ +public final class PassthroughVideoPipeline implements ReceiverVideoPipeline { + static final PassthroughVideoPipeline INSTANCE = new PassthroughVideoPipeline(); + + private PassthroughVideoPipeline() {} + + @Override + public void onFrameDecoded(long ptsUs) { + // Frame already on the display Surface. + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/av/PcmAudioFilters.java b/app/src/main/java/com/foxx/androidcast/receiver/av/PcmAudioFilters.java new file mode 100644 index 0000000..295b55f --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/av/PcmAudioFilters.java @@ -0,0 +1,43 @@ +package com.foxx.androidcast.receiver.av; + +/** Lightweight 16-bit PCM helpers for experimental receiver filters. */ +final class PcmAudioFilters { + private PcmAudioFilters() {} + + static float intensityGain(int intensity) { + return Math.max(0f, Math.min(10, intensity)) / 10f; + } + + static void process16Le(byte[] pcm, int bytes, int channels, SampleProcessor proc) { + int frames = bytes / (2 * channels); + int off = 0; + for (int i = 0; i < frames; i++) { + for (int ch = 0; ch < channels; ch++) { + float s = readSample(pcm, off); + s = proc.process(s, ch, i); + writeSample(pcm, off, s); + off += 2; + } + } + } + + static float readSample(byte[] pcm, int off) { + int lo = pcm[off] & 0xff; + int hi = pcm[off + 1]; + int v = (hi << 8) | lo; + if (v > 32767) { + v -= 65536; + } + return v / 32768f; + } + + static void writeSample(byte[] pcm, int off, float s) { + int v = Math.round(Math.max(-1f, Math.min(1f, s)) * 32767f); + pcm[off] = (byte) (v & 0xff); + pcm[off + 1] = (byte) ((v >> 8) & 0xff); + } + + interface SampleProcessor { + float process(float sample, int channel, int frameIndex); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverAudioPreset.java b/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverAudioPreset.java new file mode 100644 index 0000000..696d1dd --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverAudioPreset.java @@ -0,0 +1,25 @@ +package com.foxx.androidcast.receiver.av; + +/** Receiver audio enhancement preset (developer / experimental). */ +public enum ReceiverAudioPreset { + DEFAULT, + BASS_BOOST, + IMMERSIVE, + DOLBY_51, + DOLBY_71; + + public static ReceiverAudioPreset fromName(String name, ReceiverAudioPreset fallback) { + if (name == null) { + return fallback; + } + try { + return valueOf(name.trim().toUpperCase()); + } catch (IllegalArgumentException e) { + return fallback; + } + } + + public boolean supportsIntensity() { + return this != DEFAULT; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverAvPipelineFactory.java b/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverAvPipelineFactory.java new file mode 100644 index 0000000..3247261 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverAvPipelineFactory.java @@ -0,0 +1,40 @@ +package com.foxx.androidcast.receiver.av; + +import android.content.Context; + +import com.foxx.androidcast.AppPreferences; + +public final class ReceiverAvPipelineFactory { + private ReceiverAvPipelineFactory() {} + + public static ReceiverVideoPipeline createVideo(Context context) { + Context app = context.getApplicationContext(); + ReceiverVideoPreset preset = AppPreferences.getReceiverVideoPreset(app); + switch (preset) { + case IMMERSIVE: + case HDR: + return new GlExperimentalVideoPipeline(app, preset); + case DEFAULT: + default: + return ReceiverVideoPipeline.passthrough(); + } + } + + public static AudioFilterChain createAudio(Context context) { + ReceiverAudioPreset preset = AppPreferences.getReceiverAudioPreset(context); + int intensity = AppPreferences.getReceiverAvIntensity(context); + switch (preset) { + case BASS_BOOST: + return new AudioFilterChain(new AudioFilter[] {new BassBoostAudioFilter()}, intensity); + case IMMERSIVE: + return new AudioFilterChain(new AudioFilter[] {new ImmersiveAudioFilter()}, intensity); + case DOLBY_51: + return new AudioFilterChain(new AudioFilter[] {new DolbySurroundAudioFilter(false)}, intensity); + case DOLBY_71: + return new AudioFilterChain(new AudioFilter[] {new DolbySurroundAudioFilter(true)}, intensity); + case DEFAULT: + default: + return AudioFilterChain.passthrough(); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverAvRuntime.java b/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverAvRuntime.java new file mode 100644 index 0000000..e8b8606 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverAvRuntime.java @@ -0,0 +1,31 @@ +package com.foxx.androidcast.receiver.av; + +import android.content.Context; + +/** Live receiver A/V pipelines (reloaded from developer settings). */ +public final class ReceiverAvRuntime { + private static volatile ReceiverVideoPipeline videoPipeline = ReceiverVideoPipeline.passthrough(); + private static volatile AudioFilterChain audioChain = AudioFilterChain.passthrough(); + + private ReceiverAvRuntime() {} + + public static ReceiverVideoPipeline video() { + return videoPipeline; + } + + public static AudioFilterChain audio() { + return audioChain; + } + + public static void reload(Context context) { + Context app = context.getApplicationContext(); + videoPipeline = ReceiverAvPipelineFactory.createVideo(app); + audioChain = ReceiverAvPipelineFactory.createAudio(app); + audioChain.reset(48_000, 2); + if (!ReceiverVideoGlHub.isGlMode(app)) { + ReceiverVideoGlHub.release(app); + } else { + ReceiverVideoGlHub.refreshPreset(app); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverVideoGlHub.java b/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverVideoGlHub.java new file mode 100644 index 0000000..c43965c --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverVideoGlHub.java @@ -0,0 +1,68 @@ +package com.foxx.androidcast.receiver.av; + +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.view.Surface; + +import com.foxx.androidcast.AppPreferences; + +/** Routes decoder output through GLES when an experimental video preset is active. */ +public final class ReceiverVideoGlHub { + private static final Object LOCK = new Object(); + private static ReceiverVideoGlRenderer renderer; + + private ReceiverVideoGlHub() {} + + public static boolean isGlMode(Context context) { + ReceiverVideoPreset p = AppPreferences.getReceiverVideoPreset(context); + return p == ReceiverVideoPreset.IMMERSIVE || p == ReceiverVideoPreset.HDR; + } + + /** @return Surface for {@code MediaCodec} / libvpx (decoder input). */ + public static Surface bindDisplay(Context context, SurfaceTexture display, int width, int height) { + synchronized (LOCK) { + if (!isGlMode(context)) { + releaseLocked(); + return new Surface(display); + } + if (renderer == null) { + renderer = new ReceiverVideoGlRenderer(); + } + renderer.setPreset( + AppPreferences.getReceiverVideoPreset(context), + AppPreferences.getReceiverAvIntensity(context)); + return renderer.bindDisplay(display, width, height); + } + } + + public static void refreshPreset(Context context) { + synchronized (LOCK) { + if (renderer != null && isGlMode(context)) { + renderer.setPreset( + AppPreferences.getReceiverVideoPreset(context), + AppPreferences.getReceiverAvIntensity(context)); + } + } + } + + public static void onFrameDecoded(Context context) { + synchronized (LOCK) { + if (renderer != null && isGlMode(context)) { + renderer.onDecoderFrameAvailable(); + } + } + } + + public static void release(Context context) { + synchronized (LOCK) { + releaseLocked(); + } + } + + private static void releaseLocked() { + if (renderer != null) { + renderer.release(); + renderer = null; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverVideoGlRenderer.java b/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverVideoGlRenderer.java new file mode 100644 index 0000000..54be8dd --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverVideoGlRenderer.java @@ -0,0 +1,293 @@ +package com.foxx.androidcast.receiver.av; + +import android.graphics.SurfaceTexture; +import android.opengl.EGL14; +import android.opengl.EGLConfig; +import android.opengl.EGLContext; +import android.opengl.EGLDisplay; +import android.opengl.EGLSurface; +import android.opengl.GLES11Ext; +import android.opengl.GLES20; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; +import android.view.Surface; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; + +/** + * GLES2 bridge: decoder renders to an external-OES {@link SurfaceTexture}, then a preset shader + * draws into the {@link android.view.TextureView} display surface. + */ +final class ReceiverVideoGlRenderer { + private static final String TAG = "ReceiverVideoGl"; + private static final int GL_TEXTURE_EXTERNAL_OES = 0x8D65; + + private static final String VERT_OES = + "#extension GL_OES_EGL_image_external : require\n" + + "attribute vec4 aPosition;\n" + + "attribute vec2 aTexCoord;\n" + + "varying vec2 vTexCoord;\n" + + "void main() {\n" + + " gl_Position = aPosition;\n" + + " vTexCoord = aTexCoord;\n" + + "}\n"; + + private static final String FRAG_OES = + "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "varying vec2 vTexCoord;\n" + + "uniform samplerExternalOES uTexture;\n" + + "uniform float uIntensity;\n" + + "uniform int uPreset;\n" + + "void main() {\n" + + " vec2 uv = vTexCoord;\n" + + " vec4 src = texture2D(uTexture, uv);\n" + + " vec3 c = src.rgb;\n" + + " float t = clamp(uIntensity, 0.0, 1.0);\n" + + " if (t <= 0.001) {\n" + + " gl_FragColor = src;\n" + + " return;\n" + + " }\n" + + " vec2 px = vec2(1.0 / 720.0, 1.0 / 1280.0);\n" + + " vec3 n = texture2D(uTexture, uv + vec2(px.x, 0.0)).rgb;\n" + + " vec3 s = texture2D(uTexture, uv - vec2(px.x, 0.0)).rgb;\n" + + " vec3 e = texture2D(uTexture, uv + vec2(0.0, px.y)).rgb;\n" + + " vec3 w = texture2D(uTexture, uv - vec2(0.0, px.y)).rgb;\n" + + " vec3 blur = (n + s + e + w + c) * 0.2;\n" + + " vec3 outCol;\n" + + " if (uPreset == 1) {\n" + + " vec3 hdr = c * (1.0 + 0.45 * t);\n" + + " hdr = hdr / (hdr + vec3(0.55));\n" + + " hdr = pow(hdr, vec3(0.9));\n" + + " float luma = dot(hdr, vec3(0.299, 0.587, 0.114));\n" + + " hdr = mix(vec3(luma), hdr, 1.0 + 0.3 * t);\n" + + " outCol = mix(c, hdr, t);\n" + + " } else {\n" + + " vec3 denoise = mix(c, blur, 0.4 * t);\n" + + " vec3 sharp = denoise + (denoise - blur) * (0.35 * t);\n" + + " float luma = dot(sharp, vec3(0.299, 0.587, 0.114));\n" + + " outCol = mix(vec3(luma), sharp, 1.0 + 0.08 * t);\n" + + " outCol = mix(c, outCol, t);\n" + + " }\n" + + " gl_FragColor = vec4(clamp(outCol, 0.0, 1.0), src.a);\n" + + "}\n"; + + private static final float[] QUAD = { + -1f, -1f, 0f, 1f, + 1f, -1f, 1f, 1f, + -1f, 1f, 0f, 0f, + 1f, 1f, 1f, 0f, + }; + + private final Handler mainHandler = new Handler(Looper.getMainLooper()); + + private EGLDisplay eglDisplay = EGL14.EGL_NO_DISPLAY; + private EGLContext eglContext = EGL14.EGL_NO_CONTEXT; + private EGLSurface outputEglSurface = EGL14.EGL_NO_SURFACE; + + private int program; + private int oesTextureId; + private SurfaceTexture decoderTexture; + private Surface decoderSurface; + private SurfaceTexture displayTexture; + private int viewportW = 1; + private int viewportH = 1; + private volatile ReceiverVideoPreset preset = ReceiverVideoPreset.IMMERSIVE; + private volatile int intensity = 5; + private volatile boolean frameAvailable; + private FloatBuffer quadBuffer; + + Surface bindDisplay(SurfaceTexture display, int width, int height) { + release(); + displayTexture = display; + viewportW = Math.max(1, width); + viewportH = Math.max(1, height); + display.setDefaultBufferSize(viewportW, viewportH); + initEgl(new Surface(display)); + createDecoderInput(); + return decoderSurface; + } + + void setPreset(ReceiverVideoPreset preset, int intensity) { + this.preset = preset != null ? preset : ReceiverVideoPreset.IMMERSIVE; + this.intensity = Math.max(0, Math.min(10, intensity)); + } + + void onDecoderFrameAvailable() { + frameAvailable = true; + drawFrameInternal(); + } + + void release() { + if (Looper.myLooper() == mainHandler.getLooper()) { + releaseOnGlThread(); + } else { + mainHandler.post(this::releaseOnGlThread); + } + } + + private void createDecoderInput() { + int[] textures = new int[1]; + GLES20.glGenTextures(1, textures, 0); + oesTextureId = textures[0]; + GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, oesTextureId); + GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); + GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); + GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); + GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); + + decoderTexture = new SurfaceTexture(oesTextureId); + decoderTexture.setDefaultBufferSize(viewportW, viewportH); + decoderTexture.setOnFrameAvailableListener(st -> onDecoderFrameAvailable(), mainHandler); + decoderSurface = new Surface(decoderTexture); + } + + private void initEgl(Surface outputSurface) { + eglDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY); + if (eglDisplay == EGL14.EGL_NO_DISPLAY) { + throw new IllegalStateException("eglGetDisplay failed"); + } + int[] version = new int[2]; + if (!EGL14.eglInitialize(eglDisplay, version, 0, version, 1)) { + throw new IllegalStateException("eglInitialize failed"); + } + EGLConfig config = chooseConfig(eglDisplay); + int[] ctxAttr = {EGL14.EGL_CONTEXT_CLIENT_VERSION, 2, EGL14.EGL_NONE}; + eglContext = EGL14.eglCreateContext(eglDisplay, config, EGL14.EGL_NO_CONTEXT, ctxAttr, 0); + outputEglSurface = EGL14.eglCreateWindowSurface(eglDisplay, config, outputSurface, + new int[] {EGL14.EGL_NONE}, 0); + if (!EGL14.eglMakeCurrent(eglDisplay, outputEglSurface, outputEglSurface, eglContext)) { + throw new IllegalStateException("eglMakeCurrent failed"); + } + program = buildProgram(VERT_OES, FRAG_OES); + quadBuffer = ByteBuffer.allocateDirect(QUAD.length * 4).order(ByteOrder.nativeOrder()) + .asFloatBuffer(); + quadBuffer.put(QUAD).position(0); + GLES20.glViewport(0, 0, viewportW, viewportH); + Log.i(TAG, "GLES video bridge " + viewportW + "x" + viewportH); + } + + private void drawFrameInternal() { + if (decoderTexture == null || outputEglSurface == EGL14.EGL_NO_SURFACE || !frameAvailable) { + return; + } + frameAvailable = false; + try { + if (!EGL14.eglMakeCurrent(eglDisplay, outputEglSurface, outputEglSurface, eglContext)) { + return; + } + decoderTexture.updateTexImage(); + GLES20.glViewport(0, 0, viewportW, viewportH); + GLES20.glClearColor(0f, 0f, 0f, 1f); + GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); + GLES20.glUseProgram(program); + int aPos = GLES20.glGetAttribLocation(program, "aPosition"); + int aTex = GLES20.glGetAttribLocation(program, "aTexCoord"); + int uTex = GLES20.glGetUniformLocation(program, "uTexture"); + int uInt = GLES20.glGetUniformLocation(program, "uIntensity"); + int uPreset = GLES20.glGetUniformLocation(program, "uPreset"); + GLES20.glActiveTexture(GLES20.GL_TEXTURE0); + GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, oesTextureId); + GLES20.glUniform1i(uTex, 0); + GLES20.glUniform1f(uInt, intensity / 10f); + GLES20.glUniform1i(uPreset, preset == ReceiverVideoPreset.HDR ? 1 : 0); + quadBuffer.position(0); + GLES20.glEnableVertexAttribArray(aPos); + GLES20.glVertexAttribPointer(aPos, 2, GLES20.GL_FLOAT, false, 16, quadBuffer); + quadBuffer.position(2); + GLES20.glEnableVertexAttribArray(aTex); + GLES20.glVertexAttribPointer(aTex, 2, GLES20.GL_FLOAT, false, 16, quadBuffer); + GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); + GLES20.glDisableVertexAttribArray(aPos); + GLES20.glDisableVertexAttribArray(aTex); + EGL14.eglSwapBuffers(eglDisplay, outputEglSurface); + } catch (Exception e) { + Log.w(TAG, "drawFrame: " + e.getMessage()); + } + } + + private void releaseOnGlThread() { + if (decoderSurface != null) { + decoderSurface.release(); + decoderSurface = null; + } + if (decoderTexture != null) { + decoderTexture.release(); + decoderTexture = null; + } + if (oesTextureId != 0) { + int[] t = new int[] {oesTextureId}; + GLES20.glDeleteTextures(1, t, 0); + oesTextureId = 0; + } + if (eglDisplay != EGL14.EGL_NO_DISPLAY) { + EGL14.eglMakeCurrent(eglDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE, + EGL14.EGL_NO_CONTEXT); + if (outputEglSurface != EGL14.EGL_NO_SURFACE) { + EGL14.eglDestroySurface(eglDisplay, outputEglSurface); + outputEglSurface = EGL14.EGL_NO_SURFACE; + } + if (eglContext != EGL14.EGL_NO_CONTEXT) { + EGL14.eglDestroyContext(eglDisplay, eglContext); + eglContext = EGL14.EGL_NO_CONTEXT; + } + EGL14.eglTerminate(eglDisplay); + eglDisplay = EGL14.EGL_NO_DISPLAY; + } + displayTexture = null; + } + + private static EGLConfig chooseConfig(EGLDisplay display) { + int[] attribs = { + EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT, + EGL14.EGL_SURFACE_TYPE, EGL14.EGL_WINDOW_BIT, + EGL14.EGL_RED_SIZE, 8, + EGL14.EGL_GREEN_SIZE, 8, + EGL14.EGL_BLUE_SIZE, 8, + EGL14.EGL_ALPHA_SIZE, 8, + EGL14.EGL_NONE + }; + EGLConfig[] configs = new EGLConfig[1]; + int[] num = new int[1]; + if (!EGL14.eglChooseConfig(display, attribs, 0, configs, 0, 1, num, 0)) { + throw new IllegalStateException("eglChooseConfig failed"); + } + return configs[0]; + } + + private static int buildProgram(String vert, String frag) { + int vs = compile(GLES20.GL_VERTEX_SHADER, vert); + int fs = compile(GLES20.GL_FRAGMENT_SHADER, frag); + int prog = GLES20.glCreateProgram(); + GLES20.glAttachShader(prog, vs); + GLES20.glAttachShader(prog, fs); + GLES20.glLinkProgram(prog); + int[] link = new int[1]; + GLES20.glGetProgramiv(prog, GLES20.GL_LINK_STATUS, link, 0); + if (link[0] == 0) { + String log = GLES20.glGetProgramInfoLog(prog); + GLES20.glDeleteProgram(prog); + throw new IllegalStateException("Program link failed: " + log); + } + GLES20.glDeleteShader(vs); + GLES20.glDeleteShader(fs); + return prog; + } + + private static int compile(int type, String src) { + int shader = GLES20.glCreateShader(type); + GLES20.glShaderSource(shader, src); + GLES20.glCompileShader(shader); + int[] ok = new int[1]; + GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, ok, 0); + if (ok[0] == 0) { + String log = GLES20.glGetShaderInfoLog(shader); + GLES20.glDeleteShader(shader); + throw new IllegalStateException("Shader compile failed: " + log); + } + return shader; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverVideoPipeline.java b/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverVideoPipeline.java new file mode 100644 index 0000000..86c3663 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverVideoPipeline.java @@ -0,0 +1,18 @@ +package com.foxx.androidcast.receiver.av; + +/** Hook between video decoder output and display (direct Surface or GLES bridge). */ +public interface ReceiverVideoPipeline { + /** + * Called after {@code releaseOutputBuffer(..., render=true)} (or libvpx render). For GLES + * experimental presets, triggers shader draw to the TextureView surface. + */ + void onFrameDecoded(long ptsUs); + + default void onConfigured(int width, int height) {} + + default void onReleased() {} + + static ReceiverVideoPipeline passthrough() { + return PassthroughVideoPipeline.INSTANCE; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverVideoPreset.java b/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverVideoPreset.java new file mode 100644 index 0000000..19bc0d0 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/receiver/av/ReceiverVideoPreset.java @@ -0,0 +1,23 @@ +package com.foxx.androidcast.receiver.av; + +/** Receiver video enhancement preset (developer / experimental). */ +public enum ReceiverVideoPreset { + DEFAULT, + IMMERSIVE, + HDR; + + public boolean supportsIntensity() { + return this != DEFAULT; + } + + public static ReceiverVideoPreset fromName(String name, ReceiverVideoPreset fallback) { + if (name == null) { + return fallback; + } + try { + return valueOf(name.trim().toUpperCase()); + } catch (IllegalArgumentException e) { + return fallback; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessCoordinator.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessCoordinator.java new file mode 100644 index 0000000..03dc381 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessCoordinator.java @@ -0,0 +1,62 @@ +package com.foxx.androidcast.remoteaccess; + +import android.content.Context; +import android.util.Log; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.vpn.VpnServiceClient; + +/** Start/stop remote access foreground polling + VPN based on developer mode. */ +public final class RemoteAccessCoordinator { + private static final String TAG = "RemoteAccessCoord"; + + private RemoteAccessCoordinator() {} + + public static void applyMode(Context context, RemoteAccessMode mode) { + Context app = context.getApplicationContext(); + if (mode == null || mode == RemoteAccessMode.DISABLED) { + Log.i(TAG, "disabling remote access"); + RemoteAccessService.sendDisableOnce(app); + RemoteAccessService.stop(app); + VpnServiceClient.get(app).tearDown(); + AppPreferences.clearDevRemoteAccessSession(app); + RemoteAccessStatusStore.record( + app, + RemoteAccessMode.DISABLED, + RemoteAccessStatusStore.STATE_OFF, + "RemoteAccessCoordinator.applyMode", + RemoteAccessStatusStore.INITIATOR_USER, + "", + ""); + return; + } + if (mode == RemoteAccessMode.WIREGUARD || mode == RemoteAccessMode.RSSH) { + RemoteAccessService.start(app, mode); + return; + } + Log.w(TAG, "unsupported mode " + mode); + } + + public static void syncFromPreferences(Context context) { + applyMode(context, AppPreferences.getDevRemoteAccessMode(context)); + } + + public static void onBootIfNeeded(Context context) { + RemoteAccessMode mode = AppPreferences.getDevRemoteAccessMode(context); + if (mode.isActive()) { + RemoteAccessService.start(context.getApplicationContext(), mode); + } + } + + /** Reconnect WireGuard when dev routing prefs change while mode is active. */ + public static void onVpnRoutingPreferenceChanged(Context context) { + Context app = context.getApplicationContext(); + RemoteAccessMode mode = AppPreferences.getDevRemoteAccessMode(app); + if (mode != RemoteAccessMode.WIREGUARD) { + return; + } + Log.i(TAG, "VPN routing preference changed — reconnecting tunnel"); + VpnServiceClient.get(app).tearDown(); + RemoteAccessService.start(app, RemoteAccessMode.WIREGUARD); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessFailureReason.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessFailureReason.java new file mode 100644 index 0000000..cf01638 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessFailureReason.java @@ -0,0 +1,105 @@ +package com.foxx.androidcast.remoteaccess; + +import android.content.Context; + +import java.net.ConnectException; +import java.net.SocketTimeoutException; +import java.net.UnknownHostException; +import java.util.Locale; + +/** Human-readable remote-access failure text for status store and diagnostics. */ +public final class RemoteAccessFailureReason { + private RemoteAccessFailureReason() {} + + public static String fromPollException(Context context, Exception e) { + String host = heartbeatHost(context); + if (e instanceof SocketTimeoutException) { + return "heartbeat HTTP timeout — device→" + host + " (30s connect/read)"; + } + if (e instanceof UnknownHostException) { + return "heartbeat DNS failed — " + host + " (" + safeMsg(e) + ")"; + } + if (e instanceof ConnectException) { + return "heartbeat TCP connect failed — " + host + " (" + safeMsg(e) + ")"; + } + if (e instanceof IllegalStateException) { + String msg = safeMsg(e); + if ("no_backend_url".equals(msg)) { + return "no crash/OTA URL configured — cannot resolve heartbeat.php"; + } + if (msg.startsWith("http_")) { + return "heartbeat HTTP " + msg.substring(5) + " — " + host; + } + return "heartbeat error — " + msg; + } + return e.getClass().getSimpleName() + ": " + safeMsg(e); + } + + public static boolean isControlPlaneMethod(String method) { + if (method == null || method.isEmpty()) { + return false; + } + return method.contains("runPoll") + || method.contains("RemoteAccessHeartbeatClient") + || method.contains("postRa"); + } + + public static boolean isTunnelMethod(String method) { + if (method == null || method.isEmpty()) { + return false; + } + return method.contains("VpnServiceClient") + || method.contains("ReverseSshTunnelBridge") + || method.contains("handleConnect"); + } + + public static String heartbeatHost(Context context) { + String url = RemoteAccessHeartbeatClient.resolveHeartbeatUrl(context); + if (url.isEmpty()) { + return "(no URL configured)"; + } + try { + String host = new java.net.URL(url).getHost(); + if (host != null && !host.isEmpty()) { + return host; + } + } catch (Exception ignored) { + } + return url.length() > 48 ? url.substring(0, 48) + "…" : url; + } + + public static String heartbeatUrlForDiagnostics(Context context) { + String url = RemoteAccessHeartbeatClient.resolveHeartbeatUrl(context); + if (url.isEmpty()) { + return "(unset — set crash upload or OTA URL in dev settings)"; + } + return url; + } + + private static String safeMsg(Exception e) { + String m = e.getMessage(); + if (m == null || m.isEmpty()) { + return e.getClass().getSimpleName(); + } + if ("timeout".equalsIgnoreCase(m)) { + return "timeout"; + } + return m; + } + + /** Legacy bare "timeout" from old builds — expand for diagnostics display. */ + public static String expandForDisplay(Context context, String method, String failReason) { + if (failReason == null || failReason.isEmpty()) { + return failReason; + } + if (isControlPlaneMethod(method) + && ("timeout".equalsIgnoreCase(failReason) + || failReason.toLowerCase(Locale.US).contains("timed out"))) { + return fromPollException(context, new SocketTimeoutException(failReason)); + } + if (failReason.equals("RSSH connect failed or timed out")) { + return failReason + " — device→bastion (JSch 30s + 35s wait; check ra.apps.f0xx.org:443)"; + } + return failReason; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessHeartbeatClient.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessHeartbeatClient.java new file mode 100644 index 0000000..6154a4d --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessHeartbeatClient.java @@ -0,0 +1,106 @@ +package com.foxx.androidcast.remoteaccess; + +import android.content.Context; +import android.util.Log; + +import com.foxx.androidcast.BuildConfig; +import com.foxx.androidcast.crash.CrashSettingsStore; + +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; + +/** POST heartbeat type:ra to BE (shared by RemoteAccessService). */ +public final class RemoteAccessHeartbeatClient { + private static final String TAG = "RemoteAccessHB"; + private static final int HTTP_TIMEOUT_MS = 30_000; + + private RemoteAccessHeartbeatClient() {} + + public static String resolveHeartbeatUrl(Context context) { + String crash = CrashSettingsStore.load(context).uploadUrl; + if (crash != null && !crash.trim().isEmpty()) { + return toHeartbeatUrl(crash.trim()); + } + String ota = com.foxx.androidcast.AppPreferences.getOtaChannelUrl(context); + if (ota != null && !ota.trim().isEmpty()) { + return toHeartbeatUrl(ota.trim()); + } + if (BuildConfig.OTA_CHANNEL_URL_DEFAULT != null && !BuildConfig.OTA_CHANNEL_URL_DEFAULT.trim().isEmpty()) { + return toHeartbeatUrl(BuildConfig.OTA_CHANNEL_URL_DEFAULT.trim()); + } + return ""; + } + + public static String toHeartbeatUrl(String backend) { + if (backend.contains("/api/upload.php")) { + return backend.replace("/api/upload.php", "/api/heartbeat.php"); + } + if (backend.endsWith("/")) { + return backend + "api/heartbeat.php"; + } + return backend + "/api/heartbeat.php"; + } + + /** @return parsed heartbeat object from response, or null on failure */ + public static JSONObject postRa(Context context, JSONObject heartbeatBody) throws Exception { + String url = resolveHeartbeatUrl(context); + if (url.isEmpty()) { + throw new IllegalStateException("no_backend_url"); + } + JSONObject req = new JSONObject(); + req.put("heartbeat", heartbeatBody); + String text = httpPostJson(url, req.toString()); + JSONObject resp = new JSONObject(text); + return resp.optJSONObject("heartbeat"); + } + + private static String httpPostJson(String url, String body) throws Exception { + HttpURLConnection c = (HttpURLConnection) new URL(url).openConnection(); + c.setRequestMethod("POST"); + c.setConnectTimeout(HTTP_TIMEOUT_MS); + c.setReadTimeout(HTTP_TIMEOUT_MS); + c.setDoOutput(true); + c.setRequestProperty("Content-Type", "application/json; charset=utf-8"); + byte[] bytes = body.getBytes(StandardCharsets.UTF_8); + try (OutputStream os = c.getOutputStream()) { + os.write(bytes); + } + int code = c.getResponseCode(); + String resp = readBody(c); + c.disconnect(); + if (code < 200 || code >= 300) { + Log.w(TAG, "heartbeat HTTP " + code + " body=" + resp); + throw new IllegalStateException("http_" + code); + } + return resp; + } + + private static String readBody(HttpURLConnection c) { + try (BufferedReader br = new BufferedReader( + new InputStreamReader(c.getInputStream(), StandardCharsets.UTF_8))) { + StringBuilder sb = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + sb.append(line); + if (sb.length() > 8192) { + break; + } + } + return sb.toString(); + } catch (Exception e) { + try (BufferedReader br = new BufferedReader( + new InputStreamReader(c.getErrorStream(), StandardCharsets.UTF_8))) { + String line = br.readLine(); + return line != null ? line : ""; + } catch (Exception ignored) { + return ""; + } + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessMode.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessMode.java new file mode 100644 index 0000000..53c72b2 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessMode.java @@ -0,0 +1,44 @@ +package com.foxx.androidcast.remoteaccess; + +import java.util.Locale; + +/** Developer setting: on-demand remote debug transport. */ +public enum RemoteAccessMode { + /** Remote access off; tear down tunnels and notify BE. */ + DISABLED, + /** WireGuard outbound tunnel (v1). */ + WIREGUARD, + /** Reverse SSH — alpha essential; selectable when implemented. */ + RSSH; + + public static RemoteAccessMode fromStored(String name) { + if (name == null || name.isEmpty()) { + return DISABLED; + } + try { + return valueOf(name.trim().toUpperCase(Locale.ROOT)); + } catch (IllegalArgumentException e) { + if ("NONE".equalsIgnoreCase(name)) { + return DISABLED; + } + return DISABLED; + } + } + + /** BE heartbeat opt_in_mode / capabilities value. */ + public String toApiValue() { + switch (this) { + case WIREGUARD: + return "wireguard"; + case RSSH: + return "rssh"; + case DISABLED: + default: + return "none"; + } + } + + public boolean isActive() { + return this == WIREGUARD || this == RSSH; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessService.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessService.java new file mode 100644 index 0000000..98cdc45 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessService.java @@ -0,0 +1,392 @@ +package com.foxx.androidcast.remoteaccess; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.IBinder; +import android.os.SystemClock; +import android.util.Log; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.CastTrayNotifier; +import com.foxx.androidcast.DeviceInfo; +import com.foxx.androidcast.remoteaccess.control.RemoteAccessControlClient; +import com.foxx.androidcast.vpn.VpnServiceClient; + +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.util.Collections; +import java.util.Random; +import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import org.json.JSONArray; +import org.json.JSONObject; + +/** Jittered heartbeat type:ra polling while remote access mode is active. */ +public final class RemoteAccessService extends Service { + private static final String TAG = "RemoteAccessSvc"; + + public static final String ACTION_START = "com.foxx.androidcast.remoteaccess.START"; + public static final String ACTION_STOP = "com.foxx.androidcast.remoteaccess.STOP"; + public static final String ACTION_POLL = "com.foxx.androidcast.remoteaccess.POLL"; + public static final String ACTION_DISABLE_ONCE = "com.foxx.androidcast.remoteaccess.DISABLE_ONCE"; + public static final String EXTRA_MODE = "mode"; + + private static final int MIN_POLL_MS = 60_000; + private static final int MAX_POLL_MS = 420_000; + + private final ExecutorService executor = Executors.newSingleThreadExecutor(); + private final Random random = new Random(); + private String sessionRandom = ""; + + private String loadOrCreateSessionRandom() { + String stored = AppPreferences.getDevRemoteAccessRandom(this); + if (stored != null && !stored.isEmpty()) { + sessionRandom = stored; + return sessionRandom; + } + sessionRandom = UUID.randomUUID().toString(); + AppPreferences.setDevRemoteAccessRandom(this, sessionRandom); + return sessionRandom; + } + + private void checkSessionExpiry() { + long exp = AppPreferences.getDevRemoteAccessExpiresAt(this); + if (exp > 0 && exp < System.currentTimeMillis() / 1000L) { + Log.i(TAG, "session expired — tearing down tunnel"); + RemoteAccessTunnelHelper.tearDownAll(this); + AppPreferences.clearDevRemoteAccessSession(this); + } + } + + public static void start(Context context, RemoteAccessMode mode) { + Intent i = new Intent(context, RemoteAccessService.class); + i.setAction(ACTION_START); + i.putExtra(EXTRA_MODE, mode.name()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(i); + } else { + context.startService(i); + } + } + + public static void stop(Context context) { + Intent i = new Intent(context, RemoteAccessService.class); + i.setAction(ACTION_STOP); + context.startService(i); + } + + public static void sendDisableOnce(Context context) { + Intent i = new Intent(context, RemoteAccessService.class); + i.setAction(ACTION_DISABLE_ONCE); + context.startService(i); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + String action = intent != null ? intent.getAction() : ACTION_POLL; + if (ACTION_STOP.equals(action)) { + cancelPoll(this); + RemoteAccessTunnelHelper.tearDownAll(this); + stopForeground(STOP_FOREGROUND_REMOVE); + stopSelf(); + CastTrayNotifier.refresh(this); + return START_NOT_STICKY; + } + if (ACTION_DISABLE_ONCE.equals(action)) { + executor.execute(() -> postDisableHeartbeat()); + return START_NOT_STICKY; + } + RemoteAccessMode mode = AppPreferences.getDevRemoteAccessMode(this); + if (intent != null && intent.hasExtra(EXTRA_MODE)) { + mode = RemoteAccessMode.fromStored(intent.getStringExtra(EXTRA_MODE)); + } + if (!mode.isActive()) { + stop(this); + return START_NOT_STICKY; + } + int fgsType = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q + ? android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE + : 0; + CastTrayNotifier.startForeground(this, fgsType); + CastTrayNotifier.ensureTrayService(this); + loadOrCreateSessionRandom(); + checkSessionExpiry(); + final RemoteAccessMode pollMode = mode; + if (ACTION_START.equals(action) || ACTION_POLL.equals(action)) { + executor.execute(() -> runPoll(pollMode)); + } + scheduleNextPoll(); + return START_STICKY; + } + + private void runPoll(RemoteAccessMode mode) { + checkSessionExpiry(); + try { + JSONObject hb = new JSONObject(); + hb.put("type", "ra"); + hb.put("status", "enable"); + hb.put("device_id", DeviceInfo.getDeviceUuid(this)); + hb.put("random", loadOrCreateSessionRandom()); + hb.put("app_version", com.foxx.androidcast.BuildConfig.VERSION_NAME); + hb.put("device", buildDeviceMeta(this)); + hb.put("tunnel_mode", mode.toApiValue()); + hb.put("vpn_route_scope", RemoteAccessVpnRouting.routeScopeLabel( + AppPreferences.getDevRemoteAccessVpnRouteScope(this))); + hb.put("vpn_app_scope", RemoteAccessVpnRouting.appScopeLabel( + AppPreferences.getDevRemoteAccessVpnAppScope(this))); + JSONArray caps = new JSONArray(); + if (mode == RemoteAccessMode.WIREGUARD) { + caps.put("wireguard"); + } else if (mode == RemoteAccessMode.RSSH) { + caps.put("rssh"); + caps.put("ssh_reverse"); + } + caps.put("files_app_home"); + hb.put("capabilities", caps); + + JSONObject resp = RemoteAccessHeartbeatClient.postRa(this, hb); + if (resp == null) { + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_FAILURE, + "RemoteAccessHeartbeatClient.postRa", + RemoteAccessStatusStore.INITIATOR_DEVICE, + "no response from BE", ""); + return; + } + String raAction = resp.optString("action", "wait"); + if ("connect".equals(raAction)) { + handleConnect(mode, resp); + } else if ("disabled".equals(raAction) || "deny".equals(raAction)) { + RemoteAccessTunnelHelper.tearDownAll(this); + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_OFF, + "RemoteAccessService.runPoll", + RemoteAccessStatusStore.INITIATOR_BE, + raAction, resp.optString("session_id", "")); + } else { + String waitReason = resp.optString("reason", ""); + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_WAIT, + "RemoteAccessService.runPoll", + RemoteAccessStatusStore.INITIATOR_BE, + "", waitReason, resp.optString("session_id", "")); + } + } catch (Exception e) { + Log.w(TAG, "poll failed: " + e.getMessage()); + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_FAILURE, + "RemoteAccessService.runPoll", + RemoteAccessStatusStore.INITIATOR_DEVICE, + RemoteAccessFailureReason.fromPollException(this, e), ""); + } + } + + private void postDisableHeartbeat() { + try { + RemoteAccessTunnelHelper.tearDownAll(this); + AppPreferences.clearDevRemoteAccessSession(this); + JSONObject hb = new JSONObject(); + hb.put("type", "ra"); + hb.put("status", "disable"); + hb.put("device_id", DeviceInfo.getDeviceUuid(this)); + hb.put("random", loadOrCreateSessionRandom()); + RemoteAccessHeartbeatClient.postRa(this, hb); + } catch (Exception e) { + Log.w(TAG, "disable notify failed: " + e.getMessage()); + } + } + + private void handleConnect(RemoteAccessMode mode, JSONObject resp) { + String tunnel = resp.optString("tunnel", ""); + String sessionId = resp.optString("session_id", ""); + long expiresAt = resp.optLong("expires_at", 0L); + if (!sessionId.isEmpty()) { + AppPreferences.setDevRemoteAccessSession(this, sessionId, expiresAt); + } + JSONObject creds = resp.optJSONObject("credentials"); + if (creds == null) { + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_FAILURE, + "RemoteAccessService.handleConnect", + RemoteAccessStatusStore.INITIATOR_BE, + "connect without credentials", sessionId); + return; + } + if ("wireguard".equals(tunnel)) { + String wgConfig = WireGuardConfigBuilder.fromConnectCredentials(this, creds); + if (wgConfig.isEmpty()) { + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_FAILURE, + "VpnServiceClient.applyWireGuardConfig", + RemoteAccessStatusStore.INITIATOR_BE, + "empty wireguard config", sessionId); + return; + } + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_CONNECTING, + "VpnServiceClient.applyWireGuardConfig", + RemoteAccessStatusStore.INITIATOR_BE, + "", sessionId); + final String sid = sessionId; + VpnServiceClient.get(this).applyWireGuardConfig(wgConfig, new VpnServiceClient.OperationListener() { + @Override + public void onSuccess() { + updateNotificationConnected(sid, tunnel); + startRemoteControlPlane(sid); + RemoteAccessStatusStore.record( + RemoteAccessService.this, mode, RemoteAccessStatusStore.STATE_SUCCESS, + "VpnServiceClient.applyWireGuardConfig", + RemoteAccessStatusStore.INITIATOR_BE, + "", sid); + } + + @Override + public void onFailure(String reason) { + Log.w(TAG, "wireguard connect failed: " + reason); + RemoteAccessStatusStore.record( + RemoteAccessService.this, mode, RemoteAccessStatusStore.STATE_FAILURE, + "VpnServiceClient.applyWireGuardConfig", + RemoteAccessStatusStore.INITIATOR_BE, + reason, sid); + } + }); + } else if ("ssh_reverse".equals(tunnel)) { + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_CONNECTING, + "ReverseSshTunnelBridge.applyConfig", + RemoteAccessStatusStore.INITIATOR_BE, + "", sessionId); + if (ReverseSshTunnelBridge.applyConfig(this, creds)) { + updateNotificationConnected(sessionId, tunnel); + startRemoteControlPlane(sessionId); + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_SUCCESS, + "ReverseSshTunnelBridge.applyConfig", + RemoteAccessStatusStore.INITIATOR_BE, + "", sessionId); + } else { + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_FAILURE, + "ReverseSshTunnelBridge.applyConfig", + RemoteAccessStatusStore.INITIATOR_BE, + "RSSH connect failed or timed out", sessionId); + } + } else { + Log.w(TAG, "unsupported tunnel in connect: " + tunnel); + RemoteAccessStatusStore.record( + this, mode, RemoteAccessStatusStore.STATE_FAILURE, + "RemoteAccessService.handleConnect", + RemoteAccessStatusStore.INITIATOR_BE, + "unsupported tunnel: " + tunnel, sessionId); + } + } + + private void startRemoteControlPlane(String sessionId) { + RemoteAccessControlClient.get(this).startSession(new RemoteAccessControlClient.OperationListener() { + @Override + public void onSuccess() { + RemoteAccessControlClient.EndpointSnapshot snap = + RemoteAccessControlClient.snapshot(RemoteAccessService.this); + Log.i(TAG, "RA control HTTP on :" + snap.port + " session=" + sessionId); + } + + @Override + public void onFailure(String reason) { + Log.w(TAG, "RA control HTTP failed: " + reason); + } + }); + } + + private void updateNotificationConnected(String sessionId, String tunnel) { + CastTrayNotifier.refresh(this); + } + + private void scheduleNextPoll() { + int delay = MIN_POLL_MS + random.nextInt(MAX_POLL_MS - MIN_POLL_MS + 1); + AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); + if (am == null) { + return; + } + PendingIntent pi = PendingIntent.getService(this, 0, + new Intent(this, RemoteAccessService.class).setAction(ACTION_POLL), + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + long trigger = SystemClock.elapsedRealtime() + delay; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + am.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, trigger, pi); + } else { + am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, trigger, pi); + } + } + + private static void cancelPoll(Context context) { + AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + if (am == null) { + return; + } + PendingIntent pi = PendingIntent.getService(context, 0, + new Intent(context, RemoteAccessService.class).setAction(ACTION_POLL), + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + am.cancel(pi); + } + + private static JSONObject buildDeviceMeta(Context context) throws Exception { + JSONObject device = new JSONObject(); + device.put("name", AppPreferences.getUsername(context)); + device.put("manufacturer", Build.MANUFACTURER); + device.put("brand", Build.BRAND); + device.put("model", Build.MODEL); + device.put("device", Build.DEVICE); + device.put("product", Build.PRODUCT); + device.put("sdk_int", Build.VERSION.SDK_INT); + device.put("release", Build.VERSION.RELEASE); + JSONArray abis = new JSONArray(); + for (String abi : Build.SUPPORTED_ABIS) { + abis.put(abi); + } + device.put("abis", abis); + String lanIp = localLanIpV4(); + if (!lanIp.isEmpty()) { + device.put("lan_ip", lanIp); + } + return device; + } + + private static String localLanIpV4() { + try { + for (NetworkInterface intf : Collections.list(NetworkInterface.getNetworkInterfaces())) { + if (intf == null || !intf.isUp() || intf.isLoopback()) { + continue; + } + for (InetAddress addr : Collections.list(intf.getInetAddresses())) { + if (addr == null || addr.isLoopbackAddress() || !(addr instanceof Inet4Address)) { + continue; + } + String host = addr.getHostAddress(); + if (host != null && !host.isEmpty()) { + return host; + } + } + } + } catch (Exception ignored) { + } + return ""; + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onDestroy() { + executor.shutdownNow(); + super.onDestroy(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessStatusStore.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessStatusStore.java new file mode 100644 index 0000000..733158e --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessStatusStore.java @@ -0,0 +1,117 @@ +package com.foxx.androidcast.remoteaccess; + +import android.content.Context; +import android.content.SharedPreferences; + +import com.foxx.androidcast.CastTrayNotifier; + +/** + * Last remote-access / VPN tunnel event for developer network self-test. + */ +public final class RemoteAccessStatusStore { + private static final String PREFS = "androidcast_remote_access_status"; + private static final String KEY_TYPE = "tunnel_type"; + private static final String KEY_STATE = "state"; + private static final String KEY_METHOD = "method"; + private static final String KEY_INITIATOR = "initiator"; + private static final String KEY_FAIL_REASON = "fail_reason"; + private static final String KEY_UPDATED_MS = "updated_ms"; + private static final String KEY_SESSION_ID = "session_id"; + + public static final String STATE_SUCCESS = "success"; + public static final String STATE_FAILURE = "failure"; + public static final String STATE_CONNECTING = "connecting"; + public static final String STATE_IDLE = "idle"; + public static final String STATE_WAIT = "wait"; + public static final String STATE_OFF = "off"; + + public static final String INITIATOR_DEVICE = "device"; + public static final String INITIATOR_BE = "backend"; + public static final String INITIATOR_USER = "user"; + + private static final String KEY_DETAIL = "detail"; + + private RemoteAccessStatusStore() {} + + public static void record( + Context context, + RemoteAccessMode mode, + String state, + String method, + String initiator, + String failReason, + String sessionId) { + record(context, mode, state, method, initiator, failReason, "", sessionId); + } + + public static void record( + Context context, + RemoteAccessMode mode, + String state, + String method, + String initiator, + String failReason, + String detail, + String sessionId) { + String type = mode == null || mode == RemoteAccessMode.DISABLED + ? "off" : mode.name().toLowerCase(); + prefs(context).edit() + .putString(KEY_TYPE, type) + .putString(KEY_STATE, state != null ? state : STATE_IDLE) + .putString(KEY_METHOD, method != null ? method : "") + .putString(KEY_INITIATOR, initiator != null ? initiator : "") + .putString(KEY_FAIL_REASON, failReason != null ? failReason : "") + .putString(KEY_DETAIL, detail != null ? detail : "") + .putString(KEY_SESSION_ID, sessionId != null ? sessionId : "") + .putLong(KEY_UPDATED_MS, System.currentTimeMillis()) + .apply(); + CastTrayNotifier.refresh(context.getApplicationContext()); + } + + public static Snapshot load(Context context) { + SharedPreferences p = prefs(context); + return new Snapshot( + p.getString(KEY_TYPE, "off"), + p.getString(KEY_STATE, STATE_OFF), + p.getString(KEY_METHOD, ""), + p.getString(KEY_INITIATOR, ""), + p.getString(KEY_FAIL_REASON, ""), + p.getString(KEY_DETAIL, ""), + p.getString(KEY_SESSION_ID, ""), + p.getLong(KEY_UPDATED_MS, 0L)); + } + + private static SharedPreferences prefs(Context context) { + return context.getApplicationContext().getSharedPreferences(PREFS, Context.MODE_PRIVATE); + } + + public static final class Snapshot { + public final String type; + public final String state; + public final String method; + public final String initiator; + public final String failReason; + public final String detail; + public final String sessionId; + public final long updatedMs; + + public Snapshot( + String type, + String state, + String method, + String initiator, + String failReason, + String detail, + String sessionId, + long updatedMs) { + this.type = type != null ? type : "off"; + this.state = state != null ? state : STATE_OFF; + this.method = method != null ? method : ""; + this.initiator = initiator != null ? initiator : ""; + this.failReason = failReason != null ? failReason : ""; + this.detail = detail != null ? detail : ""; + this.sessionId = sessionId != null ? sessionId : ""; + this.updatedMs = updatedMs; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessTunnelHelper.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessTunnelHelper.java new file mode 100644 index 0000000..3bc84ff --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessTunnelHelper.java @@ -0,0 +1,17 @@ +package com.foxx.androidcast.remoteaccess; + +import android.content.Context; + +import com.foxx.androidcast.remoteaccess.control.RemoteAccessControlClient; +import com.foxx.androidcast.vpn.VpnServiceClient; + +/** Tear down all remote-access transports (WireGuard + RSSH + control HTTP). */ +public final class RemoteAccessTunnelHelper { + private RemoteAccessTunnelHelper() {} + + public static void tearDownAll(Context context) { + RemoteAccessControlClient.get(context).stopSessionSync(); + VpnServiceClient.get(context).tearDown(); + ReverseSshTunnelBridge.tearDown(context); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessVpnRouting.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessVpnRouting.java new file mode 100644 index 0000000..39d4632 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/RemoteAccessVpnRouting.java @@ -0,0 +1,84 @@ +package com.foxx.androidcast.remoteaccess; + +import android.content.Context; + +import com.foxx.androidcast.AppPreferences; + +/** Developer VPN routing: which destinations and which apps use the tunnel (WireGuard). */ +public final class RemoteAccessVpnRouting { + public static final String DEFAULT_HUB_ALLOWED_IPS = "172.200.2.1/32"; + public static final String FULL_TUNNEL_ALLOWED_IPS = "0.0.0.0/0, ::/0"; + + public enum RouteScope { + /** Split tunnel — hub WG address only (production default). */ + HUB_ONLY, + /** Route all IPv4/IPv6 through the tunnel when it is up. */ + FULL_TUNNEL; + + public static RouteScope fromStored(String raw) { + if (raw == null || raw.isEmpty()) { + return HUB_ONLY; + } + try { + return valueOf(raw.trim().toUpperCase()); + } catch (IllegalArgumentException e) { + return HUB_ONLY; + } + } + } + + public enum AppScope { + /** Any app whose traffic matches AllowedIPs may use the VPN routes. */ + ALL_APPS, + /** Only this app's traffic uses the VPN routes (VpnService / IncludedApplications). */ + THIS_APP_ONLY; + + public static AppScope fromStored(String raw) { + if (raw == null || raw.isEmpty()) { + return ALL_APPS; + } + try { + return valueOf(raw.trim().toUpperCase()); + } catch (IllegalArgumentException e) { + return ALL_APPS; + } + } + } + + private RemoteAccessVpnRouting() {} + + public static RouteScope routeScope(Context context) { + return AppPreferences.getDevRemoteAccessVpnRouteScope(context); + } + + public static AppScope appScope(Context context) { + return AppPreferences.getDevRemoteAccessVpnAppScope(context); + } + + public static String resolveAllowedIps(RouteScope routeScope, String bePeerAllowedIps) { + if (routeScope == RouteScope.FULL_TUNNEL) { + return FULL_TUNNEL_ALLOWED_IPS; + } + String hub = bePeerAllowedIps != null ? bePeerAllowedIps.trim() : ""; + return hub.isEmpty() ? DEFAULT_HUB_ALLOWED_IPS : hub; + } + + public static void appendInterfaceExtras( + StringBuilder sb, + AppScope appScope, + String packageName) { + if (appScope == AppScope.THIS_APP_ONLY + && packageName != null + && !packageName.isEmpty()) { + sb.append("IncludedApplications = ").append(packageName).append('\n'); + } + } + + public static String routeScopeLabel(RouteScope scope) { + return scope != null ? scope.name().toLowerCase() : RouteScope.HUB_ONLY.name().toLowerCase(); + } + + public static String appScopeLabel(AppScope scope) { + return scope != null ? scope.name().toLowerCase() : AppScope.ALL_APPS.name().toLowerCase(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/ReverseSshTunnelBridge.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/ReverseSshTunnelBridge.java new file mode 100644 index 0000000..c4bb929 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/ReverseSshTunnelBridge.java @@ -0,0 +1,121 @@ +package com.foxx.androidcast.remoteaccess; + +import android.content.Context; +import android.util.Log; + +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.Session; + +import org.json.JSONObject; + +import java.util.Properties; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Outbound reverse SSH (-R) to bastion. Alpha path — no {@link android.net.VpnService}. + */ +public final class ReverseSshTunnelBridge { + private static final String TAG = "RsshTunnelBridge"; + private static final int CONNECT_TIMEOUT_MS = 30_000; + + private static volatile Thread worker; + private static volatile Session session; + private static final AtomicBoolean connected = new AtomicBoolean(false); + + private ReverseSshTunnelBridge() {} + + public static boolean applyConfig(Context context, JSONObject creds) { + if (creds == null) { + return false; + } + tearDown(context); + String host = creds.optString("bastion_host", ""); + int port = creds.optInt("bastion_port", 443); + String user = creds.optString("username", ""); + String pass = creds.optString("password", ""); + int remotePort = creds.optInt("remote_bind_port", 0); + String localHost = creds.optString("local_forward_host", "127.0.0.1"); + int localPort = creds.optInt("local_forward_port", 8022); + if (host.isEmpty() || user.isEmpty() || pass.isEmpty() || remotePort <= 0) { + Log.w(TAG, "incomplete RSSH credentials"); + return false; + } + if (!RsshLocalSshServer.start(context, user, pass, localPort)) { + Log.w(TAG, "local SSH on :" + localPort + " failed"); + return false; + } + CountDownLatch connectedLatch = new CountDownLatch(1); + AtomicBoolean ok = new AtomicBoolean(false); + worker = new Thread(() -> { + try { + JSch jsch = new JSch(); + Session s = jsch.getSession(user, host, port); + s.setPassword(pass); + Properties cfg = new Properties(); + cfg.put("StrictHostKeyChecking", "no"); + s.setConfig(cfg); + s.setServerAliveInterval(30_000); + s.connect(CONNECT_TIMEOUT_MS); + s.setPortForwardingR("127.0.0.1", remotePort, localHost, localPort); + session = s; + connected.set(true); + ok.set(true); + connectedLatch.countDown(); + Log.i(TAG, "RSSH -R " + remotePort + " -> " + localHost + ":" + localPort); + while (s.isConnected() && !Thread.currentThread().isInterrupted()) { + Thread.sleep(5_000); + } + } catch (Exception e) { + Log.w(TAG, "RSSH tunnel failed: " + e.getMessage()); + connectedLatch.countDown(); + } finally { + connected.set(false); + Session s = session; + session = null; + if (s != null) { + try { + s.disconnect(); + } catch (Exception ignored) { + } + } + } + }, "androidcast-rssh"); + worker.setDaemon(true); + worker.start(); + try { + if (!connectedLatch.await(CONNECT_TIMEOUT_MS + 5_000L, TimeUnit.MILLISECONDS)) { + Log.w(TAG, "RSSH connect timed out"); + return false; + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return false; + } + return ok.get(); + } + + public static void tearDown(Context context) { + Thread w = worker; + worker = null; + Session s = session; + session = null; + connected.set(false); + RsshLocalSshServer.stop(); + if (s != null) { + try { + s.disconnect(); + } catch (Exception ignored) { + } + } + if (w != null) { + w.interrupt(); + } + } + + public static boolean isConnected() { + Session s = session; + return s != null && s.isConnected(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/RsshLocalSshServer.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/RsshLocalSshServer.java new file mode 100644 index 0000000..e3dd32a --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/RsshLocalSshServer.java @@ -0,0 +1,86 @@ +package com.foxx.androidcast.remoteaccess; + +import android.content.Context; +import android.util.Log; + +import org.apache.sshd.server.SshServer; +import org.apache.sshd.server.auth.password.PasswordAuthenticator; +import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; +import org.apache.sshd.server.shell.ProcessShellFactory; +import org.apache.sshd.sftp.server.SftpSubsystemFactory; + +import java.util.Collections; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Embedded SSH/SFTP on {@code 127.0.0.1:8022} for RSSH reverse forward target. + * Operator reaches this via bastion forwarded port (same username/password). + */ +public final class RsshLocalSshServer { + private static final String TAG = "RsshLocalSsh"; + + private static volatile SshServer server; + private static volatile String activeUser = ""; + private static final AtomicBoolean running = new AtomicBoolean(false); + + private RsshLocalSshServer() {} + + public static boolean start(Context context, String username, String password, int port) { + stop(); + if (context == null || username == null || username.isEmpty() + || password == null || password.isEmpty()) { + return false; + } + if (port <= 0 || port > 65535) { + port = 8022; + } + final String user = username; + final String pass = password; + final int listenPort = port; + try { + RsshSecuritySetup.ensureReady(context); + java.nio.file.Path hostKey = context.getCacheDir().toPath().resolve("rssh_host.key"); + SshServer sshd = SshServer.setUpDefaultServer(); + sshd.setHost("127.0.0.1"); + sshd.setPort(listenPort); + sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(hostKey)); + sshd.setPasswordAuthenticator((PasswordAuthenticator) (u, p, session) -> + user.equals(u) && pass.equals(p)); + sshd.setShellFactory(new ProcessShellFactory("/system/bin/sh", "-")); + sshd.setSubsystemFactories(Collections.singletonList(new SftpSubsystemFactory())); + sshd.start(); + server = sshd; + activeUser = user; + running.set(true); + Log.i(TAG, "local SSH/SFTP listening 127.0.0.1:" + listenPort + " user=" + user); + return true; + } catch (Throwable e) { + Log.e(TAG, "local SSH start failed: " + e.getMessage(), e); + stop(); + return false; + } + } + + public static void stop() { + running.set(false); + activeUser = ""; + SshServer local = server; + server = null; + if (local != null) { + try { + local.stop(true); + } catch (Exception e) { + Log.d(TAG, "local SSH stop: " + e.getMessage()); + } + } + } + + public static boolean isRunning() { + SshServer local = server; + return running.get() && local != null && local.isStarted(); + } + + public static String activeUsername() { + return activeUser != null ? activeUser : ""; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/RsshSecuritySetup.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/RsshSecuritySetup.java new file mode 100644 index 0000000..c0b9ea7 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/RsshSecuritySetup.java @@ -0,0 +1,45 @@ +package com.foxx.androidcast.remoteaccess; + +import android.content.Context; +import android.util.Log; + +import org.apache.sshd.common.util.OsUtils; +import org.apache.sshd.common.util.io.PathUtils; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +import java.nio.file.Path; +import java.security.Security; +import java.util.concurrent.atomic.AtomicBoolean; + +/** One-time MINA SSHD + BouncyCastle setup for Android (see mina-sshd docs/android.md). */ +final class RsshSecuritySetup { + private static final String TAG = "RsshSecurity"; + private static final AtomicBoolean READY = new AtomicBoolean(false); + + private RsshSecuritySetup() {} + + static void ensureReady(Context context) { + if (!READY.compareAndSet(false, true)) { + return; + } + Context app = context.getApplicationContext(); + try { + try { + Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME); + } catch (Exception ignored) { + } + if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) { + Security.addProvider(new BouncyCastleProvider()); + } + Path home = app.getFilesDir().toPath(); + System.setProperty("user.home", home.toString()); + PathUtils.setUserHomeFolderResolver(() -> home); + OsUtils.setCurrentUser(app.getPackageName()); + Log.i(TAG, "SSHD security providers ready; user.home=" + home); + } catch (Exception e) { + READY.set(false); + Log.e(TAG, "SSHD security setup failed: " + e.getMessage(), e); + throw new IllegalStateException("RSSH security setup failed", e); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/WireGuardConfigBuilder.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/WireGuardConfigBuilder.java new file mode 100644 index 0000000..6e1386a --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/WireGuardConfigBuilder.java @@ -0,0 +1,71 @@ +package com.foxx.androidcast.remoteaccess; + +import android.content.Context; +import android.util.Log; + +import org.json.JSONObject; + +import com.foxx.androidcast.AppPreferences; + +/** Build wireguard-quick style config from BE connect credentials + dev VPN routing prefs. */ +public final class WireGuardConfigBuilder { + private static final String TAG = "WireGuardCfg"; + + private WireGuardConfigBuilder() {} + + public static String fromConnectCredentials(Context context, JSONObject credentials) { + if (context == null) { + return fromConnectCredentials( + credentials, + RemoteAccessVpnRouting.RouteScope.HUB_ONLY, + RemoteAccessVpnRouting.AppScope.ALL_APPS, + null); + } + return fromConnectCredentials( + credentials, + AppPreferences.getDevRemoteAccessVpnRouteScope(context), + AppPreferences.getDevRemoteAccessVpnAppScope(context), + context.getPackageName()); + } + + public static String fromConnectCredentials( + JSONObject credentials, + RemoteAccessVpnRouting.RouteScope routeScope, + RemoteAccessVpnRouting.AppScope appScope, + String packageName) { + if (credentials == null) { + return ""; + } + String priv = credentials.optString("interface_private_key", ""); + String addr = credentials.optString("interface_address", "172.200.2.10/32"); + String peerPub = credentials.optString("peer_public_key", ""); + String endpoint = credentials.optString("peer_endpoint", ""); + String beAllowed = credentials.optString("peer_allowed_ips", ""); + if (priv.isEmpty() || peerPub.isEmpty()) { + Log.w(TAG, "missing wg keys in credentials"); + return ""; + } + if (routeScope == null) { + routeScope = RemoteAccessVpnRouting.RouteScope.HUB_ONLY; + } + if (appScope == null) { + appScope = RemoteAccessVpnRouting.AppScope.ALL_APPS; + } + String allowed = RemoteAccessVpnRouting.resolveAllowedIps(routeScope, beAllowed); + + StringBuilder sb = new StringBuilder(); + sb.append("[Interface]\n"); + sb.append("PrivateKey = ").append(priv).append('\n'); + sb.append("Address = ").append(addr).append('\n'); + RemoteAccessVpnRouting.appendInterfaceExtras(sb, appScope, packageName); + sb.append('\n'); + sb.append("[Peer]\n"); + sb.append("PublicKey = ").append(peerPub).append('\n'); + if (!endpoint.isEmpty()) { + sb.append("Endpoint = ").append(endpoint).append('\n'); + } + sb.append("AllowedIPs = ").append(allowed).append('\n'); + sb.append("PersistentKeepalive = 25\n"); + return sb.toString(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/WireGuardQuickConfig.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/WireGuardQuickConfig.java new file mode 100644 index 0000000..faafff6 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/WireGuardQuickConfig.java @@ -0,0 +1,54 @@ +package com.foxx.androidcast.remoteaccess; + +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** Parse wg-quick snippets used by TUN fallback. */ +public final class WireGuardQuickConfig { + private WireGuardQuickConfig() {} + + public static String parseAddress(String wgConfig) { + if (wgConfig == null) { + return null; + } + Matcher m = Pattern.compile("(?m)^Address\\s*=\\s*(.+)$").matcher(wgConfig); + return m.find() ? m.group(1).trim() : null; + } + + public static String[] parseAllowedRoutes(String wgConfig) { + if (wgConfig == null) { + return new String[0]; + } + Matcher m = Pattern.compile("(?m)^AllowedIPs\\s*=\\s*(.+)$").matcher(wgConfig); + if (!m.find()) { + return new String[0]; + } + String[] parts = m.group(1).trim().split("\\s*,\\s*"); + ArrayList out = new ArrayList<>(); + for (String p : parts) { + if (!p.isEmpty()) { + out.add(p.trim()); + } + } + return out.toArray(new String[0]); + } + + public static String[] parseIncludedApplications(String wgConfig) { + if (wgConfig == null) { + return new String[0]; + } + Matcher m = Pattern.compile("(?m)^IncludedApplications\\s*=\\s*(.+)$").matcher(wgConfig); + if (!m.find()) { + return new String[0]; + } + String[] parts = m.group(1).trim().split("\\s*,\\s*"); + ArrayList out = new ArrayList<>(); + for (String p : parts) { + if (!p.isEmpty()) { + out.add(p.trim()); + } + } + return out.toArray(new String[0]); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlAuth.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlAuth.java new file mode 100644 index 0000000..7da78f7 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlAuth.java @@ -0,0 +1,74 @@ +package com.foxx.androidcast.remoteaccess.control; + +import android.text.TextUtils; + +import java.util.Locale; +import java.util.Map; + +/** Bearer / query-token checks for the RA control HTTP server. */ +public final class RemoteAccessControlAuth { + public static final String HEADER = "Authorization"; + public static final String QUERY_PARAM = "token"; + + private RemoteAccessControlAuth() {} + + public static boolean isAuthorized(String expectedToken, String authorizationHeader, String queryToken) { + if (TextUtils.isEmpty(expectedToken)) { + return false; + } + if (!TextUtils.isEmpty(queryToken) && expectedToken.equals(queryToken.trim())) { + return true; + } + if (TextUtils.isEmpty(authorizationHeader)) { + return false; + } + String header = authorizationHeader.trim(); + if (header.regionMatches(true, 0, "Bearer ", 0, 7)) { + return expectedToken.equals(header.substring(7).trim()); + } + return expectedToken.equals(header); + } + + public static String bearerHeader(String token) { + return "Bearer " + (token != null ? token : ""); + } + + public static String extractQueryToken(String path, Map query) { + if (query != null && query.containsKey(QUERY_PARAM)) { + return query.get(QUERY_PARAM); + } + if (path == null) { + return ""; + } + int q = path.indexOf('?'); + if (q < 0) { + return ""; + } + String qs = path.substring(q + 1); + for (String pair : qs.split("&")) { + int eq = pair.indexOf('='); + if (eq <= 0) { + continue; + } + String key = pair.substring(0, eq); + if (QUERY_PARAM.equals(key)) { + return pair.substring(eq + 1); + } + } + return ""; + } + + public static String normalizePath(String path) { + if (path == null || path.isEmpty()) { + return "/"; + } + int q = path.indexOf('?'); + if (q >= 0) { + path = path.substring(0, q); + } + if (!path.startsWith("/")) { + path = "/" + path; + } + return path.toLowerCase(Locale.US); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient.java new file mode 100644 index 0000000..95196cf --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlClient.java @@ -0,0 +1,326 @@ +package com.foxx.androidcast.remoteaccess.control; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.RemoteException; +import android.util.Log; + +import com.foxx.androidcast.BuildConfig; +import com.foxx.androidcast.IRemoteAccessControlService; +import com.foxx.androidcast.IVpnOperationCallback; +import com.foxx.androidcast.dev.DevAdbConnectInfo; +import com.foxx.androidcast.dev.DevAdbWifiKeeper; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +/** + * Main-process client for {@link RemoteAccessControlService} ({@code :ra_control}). + */ +public final class RemoteAccessControlClient { + private static final String TAG = "RaControlClient"; + private static final long BIND_TIMEOUT_MS = 8_000L; + + private static volatile RemoteAccessControlClient instance; + private static volatile EndpointSnapshot lastSnapshot = EndpointSnapshot.stopped(); + + private final Context appContext; + private final Handler main = new Handler(Looper.getMainLooper()); + private final Object bindLock = new Object(); + private final RemoteAccessControlHostImpl hostImpl; + + private IRemoteAccessControlService service; + private boolean binding; + private CountDownLatch bindLatch; + + public interface OperationListener { + void onSuccess(); + + void onFailure(String reason); + } + + public static final class EndpointSnapshot { + public final boolean running; + public final int port; + public final String token; + public final List urls; + + EndpointSnapshot(boolean running, int port, String token, List urls) { + this.running = running; + this.port = port; + this.token = token != null ? token : ""; + this.urls = urls != null ? urls : Collections.emptyList(); + } + + static EndpointSnapshot stopped() { + return new EndpointSnapshot(false, 0, "", Collections.emptyList()); + } + } + + private RemoteAccessControlClient(Context context) { + appContext = context.getApplicationContext(); + hostImpl = new RemoteAccessControlHostImpl(appContext); + } + + public static RemoteAccessControlClient get(Context context) { + if (instance == null) { + synchronized (RemoteAccessControlClient.class) { + if (instance == null) { + instance = new RemoteAccessControlClient(context); + } + } + } + return instance; + } + + public static EndpointSnapshot snapshot(Context context) { + EndpointSnapshot snap = lastSnapshot; + if (snap != null && snap.running) { + return snap; + } + RemoteAccessControlClient client = instance; + if (client != null && client.service != null) { + return client.readSnapshotFromService(); + } + return EndpointSnapshot.stopped(); + } + + public static DevAdbConnectInfo.RaControlEndpoint snapshotForAdb(Context context) { + EndpointSnapshot snap = snapshot(context); + if (!snap.running || snap.port <= 0) { + return null; + } + return new DevAdbConnectInfo.RaControlEndpoint(snap.port, snap.token, snap.urls); + } + + private final ServiceConnection connection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder binder) { + synchronized (bindLock) { + service = IRemoteAccessControlService.Stub.asInterface(binder); + binding = false; + if (bindLatch != null) { + bindLatch.countDown(); + } + } + registerHostIfNeeded(); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + synchronized (bindLock) { + service = null; + binding = false; + } + updateSnapshot(EndpointSnapshot.stopped()); + } + }; + + public void startSession(OperationListener listener) { + runWithService(s -> { + try { + if (s.isRunning()) { + refreshSnapshot(); + deliver(listener, true, null); + return; + } + s.start(new IVpnOperationCallback.Stub() { + @Override + public void onSuccess() { + refreshSnapshot(); + notifyAdbJsonRefresh(); + deliver(listener, true, null); + } + + @Override + public void onFailure(String reason) { + updateSnapshot(EndpointSnapshot.stopped()); + deliver(listener, false, reason); + } + }); + } catch (RemoteException e) { + deliver(listener, false, e.getMessage()); + } + }); + } + + public void stopSession() { + runWithService(s -> { + try { + s.stop(new IVpnOperationCallback.Stub() { + @Override + public void onSuccess() { + updateSnapshot(EndpointSnapshot.stopped()); + notifyAdbJsonRefresh(); + } + + @Override + public void onFailure(String reason) { + updateSnapshot(EndpointSnapshot.stopped()); + notifyAdbJsonRefresh(); + } + }); + } catch (RemoteException e) { + Log.w(TAG, "stop failed: " + e.getMessage()); + updateSnapshot(EndpointSnapshot.stopped()); + } + }); + } + + public void stopSessionSync() { + if (!ensureBoundSync()) { + updateSnapshot(EndpointSnapshot.stopped()); + return; + } + try { + service.stop(null); + } catch (RemoteException ignored) { + } + updateSnapshot(EndpointSnapshot.stopped()); + } + + private void refreshSnapshot() { + if (!ensureBoundSync()) { + updateSnapshot(EndpointSnapshot.stopped()); + return; + } + updateSnapshot(readSnapshotFromService()); + } + + private EndpointSnapshot readSnapshotFromService() { + IRemoteAccessControlService s = service; + if (s == null) { + return EndpointSnapshot.stopped(); + } + try { + if (!s.isRunning()) { + return EndpointSnapshot.stopped(); + } + int port = s.getListenPort(); + String token = s.getAuthToken(); + List urls = buildUrls(port); + return new EndpointSnapshot(true, port, token, urls); + } catch (RemoteException e) { + return EndpointSnapshot.stopped(); + } + } + + private static List buildUrls(int port) { + if (port <= 0) { + return Collections.emptyList(); + } + List out = new ArrayList<>(); + out.add("127.0.0.1:" + port); + return out; + } + + private static void updateSnapshot(EndpointSnapshot snap) { + lastSnapshot = snap != null ? snap : EndpointSnapshot.stopped(); + } + + private void notifyAdbJsonRefresh() { + if (BuildConfig.DEBUG) { + DevAdbWifiKeeper.refreshNow(appContext, "ra-control-endpoint"); + } + } + + private void registerHostIfNeeded() { + IRemoteAccessControlService s = service; + if (s == null) { + return; + } + try { + s.registerHost(hostImpl); + } catch (RemoteException e) { + Log.w(TAG, "registerHost failed: " + e.getMessage()); + } + } + + private void deliver(OperationListener listener, boolean ok, String reason) { + if (listener == null) { + return; + } + main.post(() -> { + if (ok) { + listener.onSuccess(); + } else { + listener.onFailure(reason != null ? reason : "error"); + } + }); + } + + private interface ServiceTask { + void run(IRemoteAccessControlService s) throws RemoteException; + } + + private void runWithService(ServiceTask task) { + IRemoteAccessControlService s = service; + if (s != null) { + try { + task.run(s); + } catch (RemoteException e) { + Log.w(TAG, "remote call failed: " + e.getMessage()); + } + return; + } + ensureBoundAsync(); + new Thread(() -> { + if (!ensureBoundSync()) { + return; + } + try { + task.run(service); + } catch (RemoteException e) { + Log.w(TAG, "remote call failed: " + e.getMessage()); + } + }, "RaControlClientBind").start(); + } + + private void ensureBoundAsync() { + synchronized (bindLock) { + if (service != null || binding) { + return; + } + binding = true; + Intent i = new Intent(appContext, RemoteAccessControlService.class); + appContext.startService(i); + appContext.bindService(i, connection, Context.BIND_AUTO_CREATE); + } + } + + private boolean ensureBoundSync() { + if (service != null) { + registerHostIfNeeded(); + return true; + } + synchronized (bindLock) { + if (service != null) { + return true; + } + bindLatch = new CountDownLatch(1); + ensureBoundAsync(); + try { + if (!bindLatch.await(BIND_TIMEOUT_MS, TimeUnit.MILLISECONDS)) { + Log.w(TAG, "RA control bind timeout"); + return false; + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return false; + } finally { + bindLatch = null; + } + } + registerHostIfNeeded(); + return service != null; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHostImpl.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHostImpl.java new file mode 100644 index 0000000..d743d27 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHostImpl.java @@ -0,0 +1,152 @@ +package com.foxx.androidcast.remoteaccess.control; + +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.os.RemoteException; +import android.util.Log; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.BuildConfig; +import com.foxx.androidcast.IRemoteAccessControlHost; +import com.foxx.androidcast.remoteaccess.RemoteAccessCoordinator; +import com.foxx.androidcast.remoteaccess.RemoteAccessMode; +import com.foxx.androidcast.remoteaccess.RemoteAccessStatusStore; +import com.foxx.androidcast.remoteaccess.RemoteAccessVpnRouting; +import com.foxx.androidcast.remoteaccess.ReverseSshTunnelBridge; +import com.foxx.androidcast.vpn.VpnServiceClient; +import com.foxx.androidcast.vpn.VpnState; + +import org.json.JSONObject; + +/** + * Main-process AIDL host: reads/writes {@link AppPreferences} for the RA control web UI. + */ +public final class RemoteAccessControlHostImpl extends IRemoteAccessControlHost.Stub { + private static final String TAG = "RaControlHost"; + + private final Context appContext; + private final Handler main = new Handler(Looper.getMainLooper()); + + public RemoteAccessControlHostImpl(Context context) { + appContext = context.getApplicationContext(); + } + + @Override + public String getSettingsJson() { + try { + RemoteAccessStatusStore.Snapshot status = RemoteAccessStatusStore.load(appContext); + JSONObject settings = RemoteAccessControlPrefsMirror.buildSnapshot( + AppPreferences.getDevRemoteAccessMode(appContext), + AppPreferences.getDevRemoteAccessVpnRouteScope(appContext), + AppPreferences.getDevRemoteAccessVpnAppScope(appContext), + status.sessionId, + AppPreferences.getDevRemoteAccessExpiresAt(appContext)); + JSONObject out = new JSONObject(); + out.put("ok", true); + out.put("settings", settings); + return out.toString(); + } catch (Exception e) { + return errorJson("settings read failed: " + e.getMessage()); + } + } + + @Override + public String applySettingsJson(String bodyJson) { + RemoteAccessControlPrefsMirror.ApplyResult patch = + RemoteAccessControlPrefsMirror.parseApplyPatch(bodyJson); + if (!patch.ok) { + return errorJson(patch.error); + } + if (!patch.hasChanges()) { + return getSettingsJson(); + } + final java.util.concurrent.CountDownLatch latch = new java.util.concurrent.CountDownLatch(1); + final String[] result = new String[1]; + main.post(() -> { + try { + if (patch.mode != null) { + AppPreferences.setDevRemoteAccessMode(appContext, patch.mode); + } + if (patch.routeScope != null) { + AppPreferences.setDevRemoteAccessVpnRouteScope(appContext, patch.routeScope); + } + if (patch.appScope != null) { + AppPreferences.setDevRemoteAccessVpnAppScope(appContext, patch.appScope); + } + if (patch.mode != null) { + RemoteAccessCoordinator.applyMode(appContext, patch.mode); + } else if (patch.routeScope != null || patch.appScope != null) { + RemoteAccessCoordinator.onVpnRoutingPreferenceChanged(appContext); + } + result[0] = getSettingsJson(); + } catch (Exception e) { + result[0] = errorJson("apply failed: " + e.getMessage()); + } finally { + latch.countDown(); + } + }); + try { + latch.await(5_000L, java.util.concurrent.TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return errorJson("apply interrupted"); + } + return result[0] != null ? result[0] : errorJson("apply timeout"); + } + + @Override + public String getInternalsJson() { + try { + RemoteAccessStatusStore.Snapshot status = RemoteAccessStatusStore.load(appContext); + RemoteAccessControlClient.EndpointSnapshot control = + RemoteAccessControlClient.snapshot(appContext); + JSONObject out = new JSONObject(); + out.put("ok", true); + out.put("app_version", BuildConfig.VERSION_NAME); + out.put("git_commit", BuildConfig.GIT_COMMIT_SHORT); + out.put("remote_access_mode", AppPreferences.getDevRemoteAccessMode(appContext).name()); + out.put("vpn_state", VpnServiceClient.get(appContext).getStateIfBound()); + out.put("vpn_state_label", vpnStateLabel(VpnServiceClient.get(appContext).getStateIfBound())); + out.put("vpn_detail", VpnServiceClient.get(appContext).getStateDetailIfBound()); + out.put("rssh_connected", ReverseSshTunnelBridge.isConnected()); + out.put("status", new JSONObject() + .put("state", status.state) + .put("method", status.method) + .put("initiator", status.initiator) + .put("fail_reason", status.failReason) + .put("detail", status.detail) + .put("session_id", status.sessionId) + .put("updated_ms", status.updatedMs)); + if (control != null && control.running) { + out.put("control_http_port", control.port); + out.put("control_urls", new org.json.JSONArray(control.urls)); + } + return out.toString(); + } catch (Exception e) { + Log.w(TAG, "internals failed: " + e.getMessage()); + return errorJson("internals failed: " + e.getMessage()); + } + } + + private static String vpnStateLabel(int state) { + if (state == VpnState.UP) { + return "up"; + } + if (state == VpnState.CONNECTING) { + return "connecting"; + } + if (state == VpnState.ERROR) { + return "error"; + } + return "down"; + } + + private static String errorJson(String message) { + try { + return RemoteAccessControlPrefsMirror.errorResponse(message).toString(); + } catch (Exception e) { + return "{\"ok\":false,\"error\":\"error\"}"; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHttpServer.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHttpServer.java new file mode 100644 index 0000000..9fb5c19 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlHttpServer.java @@ -0,0 +1,432 @@ +package com.foxx.androidcast.remoteaccess.control; + +import android.content.Context; +import android.content.res.AssetManager; +import android.util.Log; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicReference; + +/** Template HTTP server for RA control UI, JSON API, and WebSocket shell. */ +final class RemoteAccessControlHttpServer implements Runnable { + private static final String TAG = "RaControlHttp"; + private static final String ASSET_PREFIX = "ra_control/"; + + interface HostBridge { + String getSettingsJson(); + + String applySettingsJson(String body); + + String getInternalsJson(); + } + + private final Context context; + private final AtomicReference authToken = new AtomicReference<>(""); + private final HostBridge hostBridge; + private final ExecutorService clients = Executors.newCachedThreadPool(r -> { + Thread t = new Thread(r, "RaControlHttpClient"); + t.setDaemon(true); + return t; + }); + + private volatile ServerSocket serverSocket; + private volatile Thread acceptThread; + private volatile int boundPort; + + RemoteAccessControlHttpServer(Context context, HostBridge hostBridge) { + this.context = context.getApplicationContext(); + this.hostBridge = hostBridge; + } + + synchronized int start(int preferredPort) throws IOException { + stopInternal(); + IOException last = null; + for (int attempt = 0; attempt < 32; attempt++) { + int port = attempt == 0 && preferredPort > 0 ? preferredPort : pickRandomPort(); + try (ServerSocket probe = new ServerSocket()) { + probe.setReuseAddress(true); + probe.bind(new InetSocketAddress(port)); + } catch (IOException e) { + last = e; + continue; + } + ServerSocket socket = new ServerSocket(); + socket.setReuseAddress(true); + socket.bind(new InetSocketAddress(port)); + serverSocket = socket; + boundPort = port; + acceptThread = new Thread(this, "RaControlHttp"); + acceptThread.setDaemon(true); + acceptThread.start(); + Log.i(TAG, "listening on :" + port); + return port; + } + if (last != null) { + throw last; + } + throw new IOException("failed to bind RA control HTTP port"); + } + + synchronized void stop() { + stopInternal(); + } + + int getBoundPort() { + return boundPort; + } + + void setAuthToken(String token) { + authToken.set(token != null ? token : ""); + } + + @Override + public void run() { + ServerSocket socket = serverSocket; + if (socket == null) { + return; + } + while (!Thread.currentThread().isInterrupted()) { + try { + Socket client = socket.accept(); + clients.execute(() -> handleClient(client)); + } catch (IOException e) { + if (!Thread.currentThread().isInterrupted()) { + Log.d(TAG, "accept stopped: " + e.getMessage()); + } + break; + } + } + } + + private void handleClient(Socket client) { + try { + client.setSoTimeout(120_000); + byte[] headerBytes = readHeaders(client.getInputStream()); + if (headerBytes == null) { + return; + } + String headers = new String(headerBytes, StandardCharsets.US_ASCII); + HttpRequest request = parseRequest(headers, client.getInputStream()); + if (request == null) { + writeResponse(client, 400, "text/plain", "bad request"); + return; + } + route(client, request, headers); + } catch (Exception e) { + Log.d(TAG, "client error: " + e.getMessage()); + } finally { + try { + client.close(); + } catch (IOException ignored) { + } + } + } + + private void route(Socket client, HttpRequest request, String rawHeaders) throws IOException { + String expected = authToken.get(); + String queryToken = RemoteAccessControlAuth.extractQueryToken(request.path, request.query); + String authHeader = request.headers.getOrDefault("authorization", ""); + boolean authorized = RemoteAccessControlAuth.isAuthorized(expected, authHeader, queryToken); + + String path = RemoteAccessControlAuth.normalizePath(request.path); + if ("/ws/shell".equals(path)) { + if (!authorized) { + writeResponse(client, 401, "text/plain", "unauthorized"); + return; + } + if (!"GET".equalsIgnoreCase(request.method)) { + writeResponse(client, 405, "text/plain", "method not allowed"); + return; + } + if (!rawHeaders.toLowerCase(Locale.US).contains("upgrade: websocket")) { + writeResponse(client, 400, "text/plain", "expected websocket upgrade"); + return; + } + new RemoteAccessControlShellHandler(client, rawHeaders).run(); + return; + } + + if (path.startsWith("/static/")) { + serveAsset(client, path.substring("/static/".length()), "GET".equalsIgnoreCase(request.method)); + return; + } + + if (!authorized && !"/".equals(path) && !path.endsWith(".css")) { + writeResponse(client, 401, "application/json", "{\"ok\":false,\"error\":\"unauthorized\"}"); + return; + } + + if ("/api/settings".equals(path)) { + handleSettingsApi(client, request); + return; + } + if ("/api/internals".equals(path)) { + handleInternalsApi(client, request); + return; + } + if ("/shell".equals(path) && "GET".equalsIgnoreCase(request.method)) { + serveAsset(client, "shell.html", true, expected); + return; + } + if (("/".equals(path) || "/index.html".equals(path)) && "GET".equalsIgnoreCase(request.method)) { + serveAsset(client, "index.html", true, expected); + return; + } + writeResponse(client, 404, "text/plain", "not found"); + } + + private void handleSettingsApi(Socket client, HttpRequest request) throws IOException { + if ("GET".equalsIgnoreCase(request.method)) { + String json = hostBridge.getSettingsJson(); + writeResponse(client, 200, "application/json; charset=utf-8", json != null ? json : "{}"); + return; + } + if ("POST".equalsIgnoreCase(request.method)) { + String body = request.body != null ? request.body : ""; + String json = hostBridge.applySettingsJson(body); + writeResponse(client, 200, "application/json; charset=utf-8", json != null ? json : "{}"); + return; + } + writeResponse(client, 405, "text/plain", "method not allowed"); + } + + private void handleInternalsApi(Socket client, HttpRequest request) throws IOException { + if (!"GET".equalsIgnoreCase(request.method)) { + writeResponse(client, 405, "text/plain", "method not allowed"); + return; + } + String json = hostBridge.getInternalsJson(); + writeResponse(client, 200, "application/json; charset=utf-8", json != null ? json : "{}"); + } + + private void serveAsset(Socket client, String assetName, boolean getOnly) throws IOException { + serveAsset(client, assetName, getOnly, authToken.get()); + } + + private void serveAsset(Socket client, String assetName, boolean getOnly, String token) throws IOException { + if (!getOnly) { + writeResponse(client, 405, "text/plain", "method not allowed"); + return; + } + String safeName = assetName.replace("..", "").replace('\\', '/'); + if (safeName.startsWith("/")) { + safeName = safeName.substring(1); + } + AssetManager assets = context.getAssets(); + String assetPath = ASSET_PREFIX + safeName; + try (InputStream in = assets.open(assetPath)) { + byte[] bytes = readAll(in); + String contentType = contentTypeFor(safeName); + if (safeName.endsWith(".html")) { + String html = new String(bytes, StandardCharsets.UTF_8); + html = html.replace("__AUTH_TOKEN__", token != null ? token : ""); + html = html.replace("__LISTEN_PORT__", String.valueOf(boundPort)); + bytes = html.getBytes(StandardCharsets.UTF_8); + } + writeResponseBytes(client, 200, contentType, bytes); + } catch (IOException e) { + writeResponse(client, 404, "text/plain", "not found"); + } + } + + private static int pickRandomPort() { + int base = 32768; + int span = 65535 - base; + return base + (int) (Math.random() * span); + } + + private synchronized void stopInternal() { + Thread accept = acceptThread; + acceptThread = null; + ServerSocket socket = serverSocket; + serverSocket = null; + boundPort = 0; + if (socket != null) { + try { + socket.close(); + } catch (IOException ignored) { + } + } + if (accept != null) { + accept.interrupt(); + } + } + + private static byte[] readHeaders(InputStream in) throws IOException { + ByteArrayOutputStream buf = new ByteArrayOutputStream(2048); + int state = 0; + while (true) { + int b = in.read(); + if (b < 0) { + return null; + } + buf.write(b); + switch (state) { + case 0: + state = b == '\r' ? 1 : 0; + break; + case 1: + state = b == '\n' ? 2 : 0; + break; + case 2: + state = b == '\r' ? 3 : 0; + break; + case 3: + if (b == '\n') { + return buf.toByteArray(); + } + state = 0; + break; + default: + state = 0; + } + if (buf.size() > 65536) { + return null; + } + } + } + + static HttpRequest parseRequest(String headersBlock, InputStream bodyIn) throws IOException { + int headerEnd = headersBlock.indexOf("\r\n\r\n"); + if (headerEnd < 0) { + return null; + } + String headerSection = headersBlock.substring(0, headerEnd); + String body = headersBlock.length() > headerEnd + 4 + ? headersBlock.substring(headerEnd + 4) + : ""; + String[] lines = headerSection.split("\r\n"); + if (lines.length == 0) { + return null; + } + String[] parts = lines[0].split(" "); + if (parts.length < 2) { + return null; + } + String method = parts[0]; + String rawPath = parts[1]; + Map query = new HashMap<>(); + String path = rawPath; + int q = rawPath.indexOf('?'); + if (q >= 0) { + path = rawPath.substring(0, q); + for (String pair : rawPath.substring(q + 1).split("&")) { + int eq = pair.indexOf('='); + if (eq > 0) { + query.put(pair.substring(0, eq), pair.substring(eq + 1)); + } + } + } + Map headers = new HashMap<>(); + for (int i = 1; i < lines.length; i++) { + int colon = lines[i].indexOf(':'); + if (colon > 0) { + headers.put(lines[i].substring(0, colon).trim().toLowerCase(Locale.US), + lines[i].substring(colon + 1).trim()); + } + } + int contentLength = 0; + if (headers.containsKey("content-length")) { + try { + contentLength = Integer.parseInt(headers.get("content-length")); + } catch (NumberFormatException ignored) { + } + } + if (contentLength > 0) { + byte[] bodyBytes = new byte[contentLength]; + int already = Math.min(body.getBytes(StandardCharsets.UTF_8).length, contentLength); + if (already > 0) { + byte[] prefix = body.getBytes(StandardCharsets.UTF_8); + System.arraycopy(prefix, 0, bodyBytes, 0, already); + } + int off = already; + while (off < contentLength) { + int read = bodyIn.read(bodyBytes, off, contentLength - off); + if (read < 0) { + return null; + } + off += read; + } + body = new String(bodyBytes, StandardCharsets.UTF_8); + } + return new HttpRequest(method, path, query, headers, body); + } + + static final class HttpRequest { + final String method; + final String path; + final Map query; + final Map headers; + final String body; + + HttpRequest( + String method, + String path, + Map query, + Map headers, + String body) { + this.method = method; + this.path = path; + this.query = query; + this.headers = headers; + this.body = body; + } + } + + private static void writeResponse(Socket client, int code, String contentType, String body) + throws IOException { + writeResponseBytes(client, code, contentType, body.getBytes(StandardCharsets.UTF_8)); + } + + private static void writeResponseBytes(Socket client, int code, String contentType, byte[] bytes) + throws IOException { + String status = code == 200 ? "200 OK" + : code == 401 ? "401 Unauthorized" + : code == 404 ? "404 Not Found" + : code == 405 ? "405 Method Not Allowed" + : "400 Bad Request"; + String headers = "HTTP/1.1 " + status + "\r\n" + + "Content-Type: " + contentType + "\r\n" + + "Content-Length: " + bytes.length + "\r\n" + + "Connection: close\r\n\r\n"; + OutputStream out = client.getOutputStream(); + out.write(headers.getBytes(StandardCharsets.US_ASCII)); + out.write(bytes); + out.flush(); + } + + private static String contentTypeFor(String name) { + if (name.endsWith(".css")) { + return "text/css; charset=utf-8"; + } + if (name.endsWith(".js")) { + return "application/javascript; charset=utf-8"; + } + if (name.endsWith(".html")) { + return "text/html; charset=utf-8"; + } + return "application/octet-stream"; + } + + private static byte[] readAll(InputStream in) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] buf = new byte[4096]; + int read; + while ((read = in.read(buf)) >= 0) { + out.write(buf, 0, read); + } + return out.toByteArray(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlPrefsMirror.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlPrefsMirror.java new file mode 100644 index 0000000..a074fa3 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlPrefsMirror.java @@ -0,0 +1,130 @@ +package com.foxx.androidcast.remoteaccess.control; + +import org.json.JSONException; +import org.json.JSONObject; + +import com.foxx.androidcast.remoteaccess.RemoteAccessMode; +import com.foxx.androidcast.remoteaccess.RemoteAccessVpnRouting; + +/** + * JSON schema for the RA control web UI — mirrors developer remote-access settings. + * Apply logic runs in the main process via {@link RemoteAccessControlHostImpl}. + */ +public final class RemoteAccessControlPrefsMirror { + public static final String KEY_MODE = "remote_access_mode"; + public static final String KEY_VPN_ROUTE_SCOPE = "vpn_route_scope"; + public static final String KEY_VPN_APP_SCOPE = "vpn_app_scope"; + public static final String KEY_SESSION_ID = "session_id"; + public static final String KEY_EXPIRES_AT = "expires_at_epoch_sec"; + + private RemoteAccessControlPrefsMirror() {} + + public static JSONObject buildSnapshot( + RemoteAccessMode mode, + RemoteAccessVpnRouting.RouteScope routeScope, + RemoteAccessVpnRouting.AppScope appScope, + String sessionId, + long expiresAtEpochSec) throws JSONException { + JSONObject root = new JSONObject(); + root.put(KEY_MODE, mode != null ? mode.name() : RemoteAccessMode.DISABLED.name()); + root.put(KEY_VPN_ROUTE_SCOPE, routeScope != null ? routeScope.name() + : RemoteAccessVpnRouting.RouteScope.HUB_ONLY.name()); + root.put(KEY_VPN_APP_SCOPE, appScope != null ? appScope.name() + : RemoteAccessVpnRouting.AppScope.ALL_APPS.name()); + root.put(KEY_SESSION_ID, sessionId != null ? sessionId : ""); + root.put(KEY_EXPIRES_AT, expiresAtEpochSec); + JSONObject options = new JSONObject(); + RemoteAccessMode[] modes = RemoteAccessMode.values(); + for (RemoteAccessMode m : modes) { + options.put(m.name(), m.name()); + } + root.put("mode_options", options); + root.put("vpn_route_scope_options", enumNames(RemoteAccessVpnRouting.RouteScope.values())); + root.put("vpn_app_scope_options", enumNames(RemoteAccessVpnRouting.AppScope.values())); + return root; + } + + public static ApplyResult parseApplyPatch(String bodyJson) { + if (bodyJson == null || bodyJson.trim().isEmpty()) { + return ApplyResult.error("empty body"); + } + try { + JSONObject body = new JSONObject(bodyJson); + RemoteAccessMode mode = null; + if (body.has(KEY_MODE)) { + mode = RemoteAccessMode.fromStored(body.optString(KEY_MODE, "")); + } + RemoteAccessVpnRouting.RouteScope routeScope = null; + if (body.has(KEY_VPN_ROUTE_SCOPE)) { + routeScope = RemoteAccessVpnRouting.RouteScope.fromStored( + body.optString(KEY_VPN_ROUTE_SCOPE, "")); + } + RemoteAccessVpnRouting.AppScope appScope = null; + if (body.has(KEY_VPN_APP_SCOPE)) { + appScope = RemoteAccessVpnRouting.AppScope.fromStored( + body.optString(KEY_VPN_APP_SCOPE, "")); + } + return ApplyResult.ok(mode, routeScope, appScope); + } catch (JSONException e) { + return ApplyResult.error("invalid json: " + e.getMessage()); + } + } + + public static JSONObject successResponse(JSONObject settings) throws JSONException { + JSONObject out = new JSONObject(); + out.put("ok", true); + out.put("settings", settings); + return out; + } + + public static JSONObject errorResponse(String message) throws JSONException { + JSONObject out = new JSONObject(); + out.put("ok", false); + out.put("error", message != null ? message : "error"); + return out; + } + + private static JSONObject enumNames(Enum[] values) throws JSONException { + JSONObject out = new JSONObject(); + for (Enum v : values) { + out.put(v.name(), v.name()); + } + return out; + } + + public static final class ApplyResult { + public final boolean ok; + public final String error; + public final RemoteAccessMode mode; + public final RemoteAccessVpnRouting.RouteScope routeScope; + public final RemoteAccessVpnRouting.AppScope appScope; + + private ApplyResult( + boolean ok, + String error, + RemoteAccessMode mode, + RemoteAccessVpnRouting.RouteScope routeScope, + RemoteAccessVpnRouting.AppScope appScope) { + this.ok = ok; + this.error = error; + this.mode = mode; + this.routeScope = routeScope; + this.appScope = appScope; + } + + public static ApplyResult ok( + RemoteAccessMode mode, + RemoteAccessVpnRouting.RouteScope routeScope, + RemoteAccessVpnRouting.AppScope appScope) { + return new ApplyResult(true, null, mode, routeScope, appScope); + } + + public static ApplyResult error(String message) { + return new ApplyResult(false, message, null, null, null); + } + + public boolean hasChanges() { + return mode != null || routeScope != null || appScope != null; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlService.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlService.java new file mode 100644 index 0000000..ea05f61 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlService.java @@ -0,0 +1,201 @@ +package com.foxx.androidcast.remoteaccess.control; + +import android.app.Service; +import android.content.Intent; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.Log; + +import com.foxx.androidcast.IRemoteAccessControlHost; +import com.foxx.androidcast.IRemoteAccessControlService; +import com.foxx.androidcast.IVpnOperationCallback; + +import java.util.UUID; + +/** + * Standalone RA control process ({@code com.foxx.androidcast:ra_control}) — HTTP UI + shell. + */ +public final class RemoteAccessControlService extends Service { + private static final String TAG = "RaControlSvc"; + + private final Object sessionLock = new Object(); + private volatile IRemoteAccessControlHost host; + private volatile String authToken = ""; + private volatile int listenPort; + private volatile boolean running; + + private HandlerThread workerThread; + private Handler worker; + private RemoteAccessControlHttpServer httpServer; + + private final IRemoteAccessControlService.Stub binder = new IRemoteAccessControlService.Stub() { + @Override + public void registerHost(IRemoteAccessControlHost hostRef) { + host = hostRef; + } + + @Override + public void unregisterHost() { + host = null; + } + + @Override + public void start(IVpnOperationCallback callback) { + ensureWorker(); + worker.post(() -> startOnWorker(callback)); + } + + @Override + public void stop(IVpnOperationCallback callback) { + ensureWorker(); + worker.post(() -> { + stopOnWorker(); + notifyOp(callback, true, null); + }); + } + + @Override + public boolean isRunning() { + return running; + } + + @Override + public int getListenPort() { + return listenPort; + } + + @Override + public String getAuthToken() { + return authToken != null ? authToken : ""; + } + }; + + @Override + public void onCreate() { + super.onCreate(); + httpServer = new RemoteAccessControlHttpServer(getApplicationContext(), new HostBridgeImpl()); + Log.i(TAG, "RA control process service created"); + } + + @Override + public IBinder onBind(Intent intent) { + return binder; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + return START_STICKY; + } + + @Override + public void onDestroy() { + stopOnWorker(); + if (workerThread != null) { + workerThread.quitSafely(); + workerThread = null; + worker = null; + } + super.onDestroy(); + } + + private void startOnWorker(IVpnOperationCallback callback) { + synchronized (sessionLock) { + if (running) { + notifyOp(callback, true, null); + return; + } + authToken = UUID.randomUUID().toString(); + httpServer.setAuthToken(authToken); + try { + listenPort = httpServer.start(0); + running = true; + Log.i(TAG, "control plane up :" + listenPort); + notifyOp(callback, true, null); + } catch (Exception e) { + authToken = ""; + listenPort = 0; + running = false; + Log.w(TAG, "start failed: " + e.getMessage()); + notifyOp(callback, false, e.getMessage()); + } + } + } + + private void stopOnWorker() { + synchronized (sessionLock) { + if (httpServer != null) { + httpServer.stop(); + } + running = false; + listenPort = 0; + authToken = ""; + } + } + + private void ensureWorker() { + if (worker != null) { + return; + } + workerThread = new HandlerThread("ra-control-worker"); + workerThread.start(); + worker = new Handler(workerThread.getLooper()); + } + + private static void notifyOp(IVpnOperationCallback callback, boolean ok, String reason) { + if (callback == null) { + return; + } + try { + if (ok) { + callback.onSuccess(); + } else { + callback.onFailure(reason != null ? reason : "error"); + } + } catch (RemoteException e) { + Log.w(TAG, "operation callback died: " + e.getMessage()); + } + } + + private final class HostBridgeImpl implements RemoteAccessControlHttpServer.HostBridge { + @Override + public String getSettingsJson() { + IRemoteAccessControlHost h = host; + if (h == null) { + return "{\"ok\":false,\"error\":\"host not bound\"}"; + } + try { + return h.getSettingsJson(); + } catch (RemoteException e) { + return "{\"ok\":false,\"error\":\"host unreachable\"}"; + } + } + + @Override + public String applySettingsJson(String body) { + IRemoteAccessControlHost h = host; + if (h == null) { + return "{\"ok\":false,\"error\":\"host not bound\"}"; + } + try { + return h.applySettingsJson(body); + } catch (RemoteException e) { + return "{\"ok\":false,\"error\":\"host unreachable\"}"; + } + } + + @Override + public String getInternalsJson() { + IRemoteAccessControlHost h = host; + if (h == null) { + return "{\"ok\":false,\"error\":\"host not bound\"}"; + } + try { + return h.getInternalsJson(); + } catch (RemoteException e) { + return "{\"ok\":false,\"error\":\"host unreachable\"}"; + } + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlShellHandler.java b/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlShellHandler.java new file mode 100644 index 0000000..2f54c48 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/remoteaccess/control/RemoteAccessControlShellHandler.java @@ -0,0 +1,201 @@ +package com.foxx.androidcast.remoteaccess.control; + +import android.util.Log; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Base64; +import java.util.concurrent.atomic.AtomicBoolean; + +/** Minimal WebSocket text channel driving {@code /system/bin/sh} in the app sandbox. */ +final class RemoteAccessControlShellHandler implements Runnable { + private static final String TAG = "RaControlShell"; + private static final String WS_GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + + private final Socket client; + private final String requestHeaders; + + RemoteAccessControlShellHandler(Socket client, String requestHeaders) { + this.client = client; + this.requestHeaders = requestHeaders != null ? requestHeaders : ""; + } + + @Override + public void run() { + try { + if (!performHandshake()) { + return; + } + runShell(); + } catch (Exception e) { + Log.d(TAG, "shell session ended: " + e.getMessage()); + } finally { + try { + client.close(); + } catch (IOException ignored) { + } + } + } + + private boolean performHandshake() throws IOException { + String key = headerValue("Sec-WebSocket-Key"); + if (key.isEmpty()) { + writeRaw("HTTP/1.1 400 Bad Request\r\nConnection: close\r\n\r\n"); + return false; + } + String accept = computeAcceptKey(key); + String response = "HTTP/1.1 101 Switching Protocols\r\n" + + "Upgrade: websocket\r\n" + + "Connection: Upgrade\r\n" + + "Sec-WebSocket-Accept: " + accept + "\r\n\r\n"; + writeRaw(response); + return true; + } + + private void runShell() throws IOException, InterruptedException { + Process process = new ProcessBuilder("/system/bin/sh") + .redirectErrorStream(true) + .start(); + AtomicBoolean open = new AtomicBoolean(true); + Thread reader = new Thread(() -> pumpProcessToClient(process.getInputStream(), open), "RaShellOut"); + reader.start(); + InputStream in = client.getInputStream(); + OutputStream processIn = process.getOutputStream(); + while (open.get()) { + String text = readTextFrame(in); + if (text == null) { + break; + } + if ("\u0004".equals(text)) { + break; + } + processIn.write(text.getBytes(StandardCharsets.UTF_8)); + processIn.flush(); + } + open.set(false); + process.destroy(); + reader.join(2_000L); + sendCloseFrame(); + } + + private void pumpProcessToClient(InputStream processOut, AtomicBoolean open) { + byte[] buf = new byte[4096]; + try { + int read; + while (open.get() && (read = processOut.read(buf)) >= 0) { + if (read == 0) { + continue; + } + String chunk = new String(buf, 0, read, StandardCharsets.UTF_8); + sendTextFrame(chunk); + } + } catch (IOException e) { + open.set(false); + } + } + + private String headerValue(String name) { + for (String line : requestHeaders.split("\r\n")) { + int colon = line.indexOf(':'); + if (colon <= 0) { + continue; + } + if (name.equalsIgnoreCase(line.substring(0, colon).trim())) { + return line.substring(colon + 1).trim(); + } + } + return ""; + } + + private void writeRaw(String text) throws IOException { + client.getOutputStream().write(text.getBytes(StandardCharsets.US_ASCII)); + client.getOutputStream().flush(); + } + + private synchronized void sendTextFrame(String text) throws IOException { + byte[] payload = text.getBytes(StandardCharsets.UTF_8); + OutputStream out = client.getOutputStream(); + out.write(0x81); + if (payload.length <= 125) { + out.write(payload.length); + } else if (payload.length <= 65535) { + out.write(126); + out.write((payload.length >> 8) & 0xFF); + out.write(payload.length & 0xFF); + } else { + throw new IOException("frame too large"); + } + out.write(payload); + out.flush(); + } + + private synchronized void sendCloseFrame() { + try { + OutputStream out = client.getOutputStream(); + out.write(new byte[] {(byte) 0x88, 0x00}); + out.flush(); + } catch (IOException ignored) { + } + } + + private static String readTextFrame(InputStream in) throws IOException { + int b0 = in.read(); + if (b0 < 0) { + return null; + } + int opcode = b0 & 0x0F; + if (opcode == 0x8) { + return null; + } + int b1 = in.read(); + if (b1 < 0) { + return null; + } + boolean masked = (b1 & 0x80) != 0; + int len = b1 & 0x7F; + if (len == 126) { + len = (in.read() << 8) | in.read(); + } else if (len == 127) { + for (int i = 0; i < 8; i++) { + in.read(); + } + return null; + } + byte[] mask = new byte[4]; + if (masked) { + if (in.read(mask) < 4) { + return null; + } + } + byte[] payload = new byte[len]; + int off = 0; + while (off < len) { + int read = in.read(payload, off, len - off); + if (read < 0) { + return null; + } + off += read; + } + if (masked) { + for (int i = 0; i < payload.length; i++) { + payload[i] ^= mask[i % 4]; + } + } + return new String(payload, StandardCharsets.UTF_8); + } + + static String computeAcceptKey(String key) { + try { + MessageDigest md = MessageDigest.getInstance("SHA-1"); + md.update((key + WS_GUID).getBytes(StandardCharsets.US_ASCII)); + return Base64.getEncoder().encodeToString(md.digest()); + } catch (NoSuchAlgorithmException e) { + throw new IllegalStateException(e); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/AudioCapture.java b/app/src/main/java/com/foxx/androidcast/sender/AudioCapture.java new file mode 100644 index 0000000..592d12f --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/AudioCapture.java @@ -0,0 +1,330 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * AudioCapture.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class AudioCapture + * Contributors: + * - Anton Afanasyeu (6 commits, 326 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 914af98a311d798bfd6d439943292b0be1dd5d2f23b0900997f6c02f7f7167a6 +**********************************************************************/ +import android.Manifest; +import android.content.Context; +import android.content.pm.PackageManager; +import android.media.AudioAttributes; +import android.media.AudioFormat; +import android.media.AudioPlaybackCaptureConfiguration; +import android.media.AudioRecord; +import android.media.MediaRecorder; +import android.media.projection.MediaProjection; +import android.os.Build; +import android.util.Log; + +import androidx.core.content.ContextCompat; + +import com.foxx.androidcast.CastConfig; +import com.foxx.androidcast.media.PcmLevelAnalyzer; + +/** + * Captures device playback via MediaProjection (primary) and optionally mixes microphone + * when playback is silent. Playback is never replaced by mic-only capture. + */ +public class AudioCapture { + private static final String TAG = "AudioCapture"; + + public interface Callback { + void onPcm(byte[] pcm, int length, long ptsUs, PcmLevelAnalyzer.Levels levels); + + void onCaptureModeChanged(String mode); + } + + private final Context appContext; + private AudioRecord playbackRecord; + private AudioRecord micRecord; + private Thread thread; + private volatile boolean running; + private volatile String captureMode = "playback"; + + public AudioCapture(Context context) { + this.appContext = context.getApplicationContext(); + } + + public String getCaptureMode() { + return captureMode; + } + + public void start(MediaProjection projection, Callback callback) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + Log.w(TAG, "Audio capture requires API 29+"); + return; + } + if (projection == null) { + startMicOnly(callback); + return; + } + if (!startPlayback(projection)) { + Log.e(TAG, "Playback capture unavailable"); + return; + } + micRecord = canUseMic() ? buildMicRecord() : null; + if (micRecord != null && micRecord.getState() == AudioRecord.STATE_INITIALIZED) { + micRecord.startRecording(); + Log.i(TAG, "Mic mix enabled (playback primary)"); + } else { + micRecord = null; + } + running = true; + playbackRecord.startRecording(); + captureMode = micRecord != null ? "playback+mic" : "playback"; + if (callback != null) { + callback.onCaptureModeChanged(captureMode); + } + Log.i(TAG, "Audio capture started: " + captureMode); + thread = new Thread(() -> mixLoop(callback), "AudioCapture"); + thread.start(); + } + + private void startMicOnly(Callback callback) { + micRecord = canUseMic() ? buildMicRecord() : null; + if (micRecord == null || micRecord.getState() != AudioRecord.STATE_INITIALIZED) { + micRecord = null; + Log.w(TAG, "Mic-only capture unavailable"); + return; + } + running = true; + micRecord.startRecording(); + captureMode = "mic"; + if (callback != null) { + callback.onCaptureModeChanged(captureMode); + } + Log.i(TAG, "Mic-only capture for calibration VU"); + thread = new Thread(() -> micOnlyLoop(callback), "AudioCaptureMic"); + thread.start(); + } + + private void micOnlyLoop(Callback callback) { + int frameBytes = pcmFrameBytes(); + byte[] micBuf = new byte[frameBytes]; + byte[] copy = new byte[frameBytes]; + final long frameNs = 20_000_000L; + long captureEpochNs = -1; + long nextFrameNs = System.nanoTime(); + while (running) { + if (!readFully(micRecord, micBuf, frameBytes)) { + continue; + } + long now = System.nanoTime(); + if (captureEpochNs < 0) { + captureEpochNs = now; + } + if (now < nextFrameNs) { + long sleepMs = (nextFrameNs - now) / 1_000_000L; + if (sleepMs > 0) { + try { + Thread.sleep(sleepMs); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } + } + } else if (now - nextFrameNs > frameNs * 5) { + nextFrameNs = now; + captureEpochNs = now; + } + nextFrameNs += frameNs; + System.arraycopy(micBuf, 0, copy, 0, frameBytes); + long ptsUs = (now - captureEpochNs) / 1000L; + if (callback != null) { + callback.onPcm(copy, frameBytes, ptsUs, + com.foxx.androidcast.media.PcmLevelAnalyzer.analyze(copy, frameBytes)); + } + } + } + + private static int pcmFrameBytes() { + return CastConfig.AUDIO_SAMPLE_RATE * CastConfig.AUDIO_CHANNEL_COUNT * 2 / 50; + } + + private static boolean readFully(AudioRecord record, byte[] buf, int length) { + int off = 0; + while (off < length && record != null) { + int n = record.read(buf, off, length - off); + if (n <= 0) { + return false; + } + off += n; + } + return true; + } + + private boolean startPlayback(MediaProjection projection) { + try { + playbackRecord = buildPlaybackRecord(projection); + if (playbackRecord.getState() != AudioRecord.STATE_INITIALIZED) { + Log.e(TAG, "Playback AudioRecord not initialized"); + releasePlayback(); + return false; + } + return true; + } catch (Exception e) { + Log.e(TAG, "Playback capture setup failed", e); + releasePlayback(); + return false; + } + } + + private AudioRecord buildPlaybackRecord(MediaProjection projection) { + int channelMask = AudioFormat.CHANNEL_IN_STEREO; + int encoding = AudioFormat.ENCODING_PCM_16BIT; + int minBuf = AudioRecord.getMinBufferSize(CastConfig.AUDIO_SAMPLE_RATE, channelMask, encoding); + int bufferSize = Math.max(minBuf, 8192) * 2; + + AudioFormat format = new AudioFormat.Builder() + .setEncoding(encoding) + .setSampleRate(CastConfig.AUDIO_SAMPLE_RATE) + .setChannelMask(channelMask) + .build(); + + AudioPlaybackCaptureConfiguration.Builder capBuilder = + new AudioPlaybackCaptureConfiguration.Builder(projection); + capBuilder.addMatchingUsage(AudioAttributes.USAGE_MEDIA); + capBuilder.addMatchingUsage(AudioAttributes.USAGE_GAME); + capBuilder.addMatchingUsage(AudioAttributes.USAGE_UNKNOWN); + capBuilder.addMatchingUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION); + capBuilder.addMatchingUsage(AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY); + capBuilder.addMatchingUsage(AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE); + capBuilder.addMatchingUsage(AudioAttributes.USAGE_NOTIFICATION); + capBuilder.addMatchingUsage(AudioAttributes.USAGE_ALARM); + capBuilder.addMatchingUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION); + + return new AudioRecord.Builder() + .setAudioFormat(format) + .setBufferSizeInBytes(bufferSize) + .setAudioPlaybackCaptureConfig(capBuilder.build()) + .build(); + } + + private AudioRecord buildMicRecord() { + int channelMask = AudioFormat.CHANNEL_IN_STEREO; + int encoding = AudioFormat.ENCODING_PCM_16BIT; + int minBuf = AudioRecord.getMinBufferSize(CastConfig.AUDIO_SAMPLE_RATE, channelMask, encoding); + int bufferSize = Math.max(minBuf, 8192) * 2; + return new AudioRecord( + MediaRecorder.AudioSource.VOICE_RECOGNITION, + CastConfig.AUDIO_SAMPLE_RATE, + channelMask, + encoding, + bufferSize); + } + + private boolean canUseMic() { + return ContextCompat.checkSelfPermission(appContext, Manifest.permission.RECORD_AUDIO) + == PackageManager.PERMISSION_GRANTED; + } + + private void mixLoop(Callback callback) { + int frameBytes = pcmFrameBytes(); + byte[] playBuf = new byte[frameBytes]; + byte[] micBuf = new byte[frameBytes]; + byte[] mixOut = new byte[frameBytes]; + final long frameNs = 20_000_000L; + long captureEpochNs = -1; + long nextFrameNs = System.nanoTime(); + while (running) { + if (!readFully(playbackRecord, playBuf, frameBytes)) { + continue; + } + long now = System.nanoTime(); + if (captureEpochNs < 0) { + captureEpochNs = now; + } + if (now < nextFrameNs) { + long sleepMs = (nextFrameNs - now) / 1_000_000L; + if (sleepMs > 0) { + try { + Thread.sleep(sleepMs); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } + } + } else if (now - nextFrameNs > frameNs * 5) { + nextFrameNs = now; + captureEpochNs = now; + } + nextFrameNs += frameNs; + int mRead = micRecord != null ? micRecord.read(micBuf, 0, frameBytes) : 0; + System.arraycopy(playBuf, 0, mixOut, 0, frameBytes); + if (mRead > 0 && !hasAudibleSamples(playBuf, frameBytes)) { + for (int i = 0; i < frameBytes; i++) { + mixOut[i] = (byte) Math.max(mixOut[i] & 0xff, micBuf[i] & 0xff); + } + } + String mode = hasAudibleSamples(playBuf, frameBytes) ? "playback" : "playback-quiet"; + if (!mode.equals(captureMode)) { + captureMode = mode; + notifyMode(callback, captureMode); + } + long ptsUs = (now - captureEpochNs) / 1000L; + if (callback != null) { + PcmLevelAnalyzer.Levels levels = PcmLevelAnalyzer.analyze(mixOut, frameBytes); + callback.onPcm(mixOut, frameBytes, ptsUs, levels); + } + } + } + + private static void notifyMode(Callback callback, String mode) { + if (callback != null) { + callback.onCaptureModeChanged(mode); + } + } + + private static boolean hasAudibleSamples(byte[] buf, int len) { + for (int i = 0; i + 1 < len; i += 2) { + short s = (short) ((buf[i] & 0xff) | (buf[i + 1] << 8)); + if (Math.abs(s) > 256) { + return true; + } + } + return false; + } + + public void stop() { + running = false; + if (thread != null) { + try { + thread.join(1000); + } catch (InterruptedException ignored) { + Thread.currentThread().interrupt(); + } + thread = null; + } + releaseMic(); + releasePlayback(); + } + + private void releasePlayback() { + if (playbackRecord != null) { + try { + playbackRecord.stop(); + } catch (Exception ignored) { + } + playbackRecord.release(); + playbackRecord = null; + } + } + + private void releaseMic() { + if (micRecord != null) { + try { + micRecord.stop(); + } catch (Exception ignored) { + } + micRecord.release(); + micRecord = null; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/AudioEncoder.java b/app/src/main/java/com/foxx/androidcast/sender/AudioEncoder.java new file mode 100644 index 0000000..8a261e2 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/AudioEncoder.java @@ -0,0 +1,188 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * AudioEncoder.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class AudioEncoder + * Contributors: + * - Anton Afanasyeu (7 commits, 184 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 36ce52402928a59d3f331eca3c59dfc761e12eda518e258d5b96be48413b1f3f +**********************************************************************/ +import android.media.MediaCodec; +import android.media.MediaCodecInfo; +import android.media.MediaFormat; +import android.util.Log; + +import com.foxx.androidcast.CastConfig; +import com.foxx.androidcast.media.codec.AudioEncoderSink; + +import java.io.IOException; +import java.nio.ByteBuffer; + +/** AAC encoder for captured PCM. */ +public class AudioEncoder implements AudioEncoderSink { + private static final String TAG = "AudioEncoder"; + private static final String MIME = MediaFormat.MIMETYPE_AUDIO_AAC; + + private final Object inputLock = new Object(); + private MediaCodec codec; + private Callback callback; + private volatile boolean running; + private Thread drainThread; + private long droppedPcmFrames; + + public void prepare(Callback callback) throws IOException { + this.callback = callback; + MediaFormat format = MediaFormat.createAudioFormat(MIME, CastConfig.AUDIO_SAMPLE_RATE, CastConfig.AUDIO_CHANNEL_COUNT); + format.setInteger(MediaFormat.KEY_AAC_PROFILE, MediaCodecInfo.CodecProfileLevel.AACObjectLC); + format.setInteger(MediaFormat.KEY_BIT_RATE, CastConfig.AUDIO_BITRATE); + format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 16384); + + codec = MediaCodec.createEncoderByType(MIME); + codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); + codec.start(); + running = true; + primeSilenceFrames(); + drainThread = new Thread(this::drainLoop, "AudioEncoderDrain"); + drainThread.start(); + } + + /** Minimal silence so AAC emits config before mic PCM (no extra thread). */ + private void primeSilenceFrames() { + int frameBytes = CastConfig.AUDIO_SAMPLE_RATE * CastConfig.AUDIO_CHANNEL_COUNT * 2 / 50; + byte[] silence = new byte[frameBytes]; + for (int i = 0; i < 3; i++) { + queuePcm(silence, frameBytes, i * 20_000L); + } + } + + public long getDroppedPcmFrames() { + return droppedPcmFrames; + } + + public void queuePcm(byte[] pcm, int length, long ptsUs) { + if (!running) { + return; + } + synchronized (inputLock) { + MediaCodec c = codec; + if (c == null) { + return; + } + try { + int index = -1; + for (int attempt = 0; attempt < 4 && index < 0; attempt++) { + index = c.dequeueInputBuffer(attempt == 0 ? 0 : 3_000); + } + if (index < 0) { + droppedPcmFrames++; + if (droppedPcmFrames == 1 || droppedPcmFrames % 50 == 0) { + Log.w(TAG, "Dropped PCM frame (encoder input busy), total=" + droppedPcmFrames); + } + return; + } + ByteBuffer buffer = c.getInputBuffer(index); + if (buffer == null) { + return; + } + buffer.clear(); + buffer.put(pcm, 0, length); + c.queueInputBuffer(index, 0, length, ptsUs, 0); + } catch (Exception e) { + Log.w(TAG, "queuePcm failed", e); + } + } + } + + public void stop() { + running = false; + Thread drain = drainThread; + drainThread = null; + if (drain != null) { + try { + drain.join(1000); + } catch (InterruptedException ignored) { + Thread.currentThread().interrupt(); + } + } + synchronized (inputLock) { + MediaCodec c = codec; + codec = null; + if (c != null) { + try { + c.stop(); + } catch (Exception ignored) { + } + try { + c.release(); + } catch (Exception ignored) { + } + } + } + } + + private void drainLoop() { + MediaCodec.BufferInfo info = new MediaCodec.BufferInfo(); + boolean configSent = false; + while (true) { + MediaCodec c; + synchronized (inputLock) { + if (!running) { + break; + } + c = codec; + if (c == null) { + break; + } + } + int index; + try { + index = c.dequeueOutputBuffer(info, 10_000); + } catch (IllegalStateException e) { + break; + } + if (index == MediaCodec.INFO_TRY_AGAIN_LATER) { + continue; + } + if (index == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { + MediaFormat fmt = c.getOutputFormat(); + if (!configSent && callback != null) { + ByteBuffer csd = fmt.getByteBuffer("csd-0"); + callback.onConfig( + CastConfig.AUDIO_SAMPLE_RATE, + CastConfig.AUDIO_CHANNEL_COUNT, + csd != null ? toArray(csd) : new byte[0]); + configSent = true; + } + continue; + } + if (index < 0) { + continue; + } + ByteBuffer buffer = c.getOutputBuffer(index); + if (buffer != null && info.size > 0 && (info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) == 0) { + byte[] data = new byte[info.size]; + buffer.position(info.offset); + buffer.limit(info.offset + info.size); + buffer.get(data); + if (callback != null) { + callback.onEncodedFrame(info.presentationTimeUs, data); + } + } + try { + c.releaseOutputBuffer(index, false); + } catch (IllegalStateException ignored) { + break; + } + } + } + + private static byte[] toArray(ByteBuffer buffer) { + byte[] arr = new byte[buffer.remaining()]; + buffer.duplicate().get(arr); + return arr; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/CastFanoutPump.java b/app/src/main/java/com/foxx/androidcast/sender/CastFanoutPump.java new file mode 100644 index 0000000..651f406 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/CastFanoutPump.java @@ -0,0 +1,197 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * CastFanoutPump.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastFanoutPump + * Contributors: + * - Anton Afanasyeu (4 commits, 193 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 615e22057e4e8cc6a9c991c10a237fd3bd46e598429c7c1725114f3b8d457abd +**********************************************************************/ +import android.util.Log; + +import com.foxx.androidcast.network.CastProtocol; +import com.foxx.androidcast.network.CastSession; +import com.foxx.androidcast.network.control.PassThroughNetworkControlPlane; +import com.foxx.androidcast.stats.SessionStatsContext; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Fan-out send queue to multiple {@link CastSession}s (1:N cast). + * Audio and video use separate lanes so video backlog cannot starve audio. + */ +public final class CastFanoutPump { + private static final String TAG = "CastFanoutPump"; + private static final int MAX_VIDEO_QUEUE = 40; + private static final int MAX_AUDIO_QUEUE = 96; + + private final LinkedBlockingQueue videoQueue = + new LinkedBlockingQueue<>(MAX_VIDEO_QUEUE); + private final LinkedBlockingQueue audioQueue = + new LinkedBlockingQueue<>(MAX_AUDIO_QUEUE); + private final AtomicBoolean running = new AtomicBoolean(false); + private final List sessions = new ArrayList<>(); + private Thread thread; + private Runnable onSendFailed; + private PassThroughNetworkControlPlane statsPlane; + private volatile int droppedPFrames; + private volatile int droppedAudioFrames; + + public void setSessions(List list) { + sessions.clear(); + if (list != null) { + sessions.addAll(list); + } + } + + public int getDroppedPFrames() { + return droppedPFrames; + } + + public int getDroppedAudioFrames() { + return droppedAudioFrames; + } + + public int getQueueDepth() { + return videoQueue.size() + audioQueue.size(); + } + + /** Drops stale video frames (e.g. after capture resize / rotation). */ + public void flushVideoQueue() { + videoQueue.clear(); + } + + public void start(List sessionList, Runnable onSendFailed, + PassThroughNetworkControlPlane statsPlane) { + setSessions(sessionList); + this.onSendFailed = onSendFailed; + this.statsPlane = statsPlane; + if (!running.compareAndSet(false, true)) { + return; + } + thread = new Thread(this::run, "CastFanoutPump"); + thread.setPriority(Thread.NORM_PRIORITY + 1); + thread.start(); + Log.i(TAG, "Started fan-out to " + sessions.size() + " peer(s)"); + } + + public void stop() { + running.set(false); + videoQueue.clear(); + audioQueue.clear(); + if (thread != null) { + thread.interrupt(); + try { + thread.join(1500); + } catch (InterruptedException ignored) { + Thread.currentThread().interrupt(); + } + thread = null; + } + sessions.clear(); + } + + public void enqueueVideo(long ptsUs, boolean keyFrame, byte[] annexBReadyPayload) { + if (!running.get()) { + return; + } + CastSendPump.Outgoing item = CastSendPump.Outgoing.video(ptsUs, keyFrame, annexBReadyPayload); + if (!videoQueue.offer(item)) { + if (!keyFrame) { + dropOneVideoPFrame(); + } + if (!videoQueue.offer(item) && !keyFrame) { + droppedPFrames++; + } + } + } + + public void enqueue(byte type, byte[] payload) { + if (!running.get()) { + return; + } + CastSendPump.Outgoing item = CastSendPump.Outgoing.raw(type, payload); + boolean audio = type == CastProtocol.MSG_AUDIO_FRAME || type == CastProtocol.MSG_AUDIO_CONFIG; + if (audio) { + if (!audioQueue.offer(item)) { + CastSendPump.Outgoing dropped = audioQueue.poll(); + if (dropped != null) { + droppedAudioFrames++; + } + audioQueue.offer(item); + } + return; + } + while (running.get() && !videoQueue.offer(item)) { + dropOneVideoPFrame(); + } + } + + private void dropOneVideoPFrame() { + for (CastSendPump.Outgoing o : videoQueue) { + if (o.type == CastProtocol.MSG_VIDEO_FRAME && !o.keyFrame) { + videoQueue.remove(o); + droppedPFrames++; + return; + } + } + CastSendPump.Outgoing head = videoQueue.poll(); + if (head != null && head.type == CastProtocol.MSG_VIDEO_FRAME && !head.keyFrame) { + droppedPFrames++; + } + } + + private void run() { + while (running.get()) { + try { + CastSendPump.Outgoing item = audioQueue.poll(); + if (item == null) { + item = videoQueue.poll(50, TimeUnit.MILLISECONDS); + } + if (item == null || sessions.isEmpty()) { + continue; + } + byte[] payload = item.buildPayload(); + fanOut(item.type, payload, item.keyFrame); + } catch (InterruptedException e) { + if (!running.get()) { + break; + } + } catch (IOException e) { + Log.w(TAG, "Payload build failed: " + e.getMessage()); + if (onSendFailed != null) { + onSendFailed.run(); + } + } + } + } + + private void fanOut(byte type, byte[] payload, boolean keyFrame) { + int payloadSize = payload != null ? payload.length : 0; + SessionStatsContext.recordOutboundMessage(type, keyFrame, payloadSize); + int peer = 0; + for (CastSession session : sessions) { + peer++; + if (session == null) { + continue; + } + try { + session.send(type, payload); + if (statsPlane != null) { + statsPlane.recordSendBytes(payload.length + 5); + } + } catch (IOException e) { + Log.w(TAG, "Send to peer #" + peer + " failed: " + e.getMessage()); + } + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/CastReceiverTarget.java b/app/src/main/java/com/foxx/androidcast/sender/CastReceiverTarget.java new file mode 100644 index 0000000..1bb37a5 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/CastReceiverTarget.java @@ -0,0 +1,40 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * CastReceiverTarget.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastReceiverTarget + * Contributors: + * - Anton Afanasyeu (2 commits, 36 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 cd2a4275173b4292765948ba688eec345c9224803d3fdfc59f7169bab19f4edb +**********************************************************************/ +import java.io.Serializable; + +/** One cast destination (host, port, capabilities from discovery). */ +public class CastReceiverTarget implements Serializable { + public final String name; + public final String host; + public final int port; + public final String transport; + public final int videoCodecs; + public final int audioCodecs; + public final int placeholderId; + + public CastReceiverTarget(String name, String host, int port, String transport, + int videoCodecs, int audioCodecs, int placeholderId) { + this.name = name; + this.host = host; + this.port = port; + this.transport = transport; + this.videoCodecs = videoCodecs; + this.audioCodecs = audioCodecs; + this.placeholderId = placeholderId; + } + + public String key() { + return host + ":" + port; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/CastSendPump.java b/app/src/main/java/com/foxx/androidcast/sender/CastSendPump.java new file mode 100644 index 0000000..aa76e7a --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/CastSendPump.java @@ -0,0 +1,200 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * CastSendPump.java + * Created at: Fri 15 May 2026 18:37:53 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastSendPump + * Contributors: + * - Anton Afanasyeu (7 commits, 195 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 e6147251c99139c388f2f5a1820528544cffd3322eb24b3d1c5c170e71e86a37 +**********************************************************************/ +import android.util.Log; + +import com.foxx.androidcast.network.CastProtocol; +import com.foxx.androidcast.network.CastSession; +import com.foxx.androidcast.network.control.PassThroughNetworkControlPlane; +import com.foxx.androidcast.stats.SessionStatsContext; + +import java.io.IOException; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +/** Background send queue: audio has its own lane so video backlog cannot starve it. */ +public final class CastSendPump { + private static final String TAG = "CastSendPump"; + private static final int MAX_VIDEO_QUEUE = 40; + private static final int MAX_AUDIO_QUEUE = 96; + + private final LinkedBlockingQueue videoQueue = new LinkedBlockingQueue<>(MAX_VIDEO_QUEUE); + private final LinkedBlockingQueue audioQueue = new LinkedBlockingQueue<>(MAX_AUDIO_QUEUE); + private final AtomicBoolean running = new AtomicBoolean(false); + private Thread thread; + private CastSession session; + private Runnable onSendFailed; + private PassThroughNetworkControlPlane statsPlane; + private volatile int droppedPFrames; + private volatile int droppedAudioFrames; + + public int getDroppedPFrames() { + return droppedPFrames; + } + + public int getDroppedAudioFrames() { + return droppedAudioFrames; + } + + public int getQueueDepth() { + return videoQueue.size() + audioQueue.size(); + } + + /** Drops stale video frames (e.g. after capture resize / rotation). */ + public void flushVideoQueue() { + videoQueue.clear(); + } + + public void start(CastSession session, Runnable onSendFailed) { + start(session, onSendFailed, null); + } + + public void start(CastSession session, Runnable onSendFailed, PassThroughNetworkControlPlane statsPlane) { + this.session = session; + this.onSendFailed = onSendFailed; + this.statsPlane = statsPlane; + if (!running.compareAndSet(false, true)) { + return; + } + thread = new Thread(this::run, "CastSendPump"); + thread.setPriority(Thread.NORM_PRIORITY + 1); + thread.start(); + } + + public void stop() { + running.set(false); + videoQueue.clear(); + audioQueue.clear(); + if (thread != null) { + thread.interrupt(); + try { + thread.join(500); + } catch (InterruptedException ignored) { + Thread.currentThread().interrupt(); + } + thread = null; + } + session = null; + } + + public void enqueueVideo(long ptsUs, boolean keyFrame, byte[] annexBReadyPayload) { + if (!running.get()) { + return; + } + Outgoing item = Outgoing.video(ptsUs, keyFrame, annexBReadyPayload); + if (!videoQueue.offer(item)) { + if (!keyFrame) { + dropOneVideoPFrame(); + } + if (!videoQueue.offer(item) && !keyFrame) { + droppedPFrames++; + } + } + } + + public void enqueue(byte type, byte[] payload) { + if (!running.get()) { + return; + } + Outgoing item = Outgoing.raw(type, payload); + boolean audio = type == CastProtocol.MSG_AUDIO_FRAME || type == CastProtocol.MSG_AUDIO_CONFIG; + if (audio) { + if (!audioQueue.offer(item)) { + Outgoing dropped = audioQueue.poll(); + if (dropped != null) { + droppedAudioFrames++; + } + audioQueue.offer(item); + } + return; + } + while (running.get() && !videoQueue.offer(item)) { + dropOneVideoPFrame(); + } + } + + private void dropOneVideoPFrame() { + for (Outgoing o : videoQueue) { + if (o.type == CastProtocol.MSG_VIDEO_FRAME && !o.keyFrame) { + videoQueue.remove(o); + droppedPFrames++; + return; + } + } + Outgoing head = videoQueue.poll(); + if (head != null && head.type == CastProtocol.MSG_VIDEO_FRAME && !head.keyFrame) { + droppedPFrames++; + } + } + + private void run() { + while (running.get()) { + try { + Outgoing item = audioQueue.poll(); + if (item == null) { + item = videoQueue.poll(50, TimeUnit.MILLISECONDS); + } + if (item == null || session == null) { + continue; + } + byte[] payload = item.buildPayload(); + session.send(item.type, payload); + com.foxx.androidcast.dev.StreamDumpWriter.recordFrame(item.type, payload); + int payloadSize = payload != null ? payload.length : 0; + SessionStatsContext.recordOutboundMessage(item.type, item.keyFrame, payloadSize); + if (statsPlane != null) { + statsPlane.recordSendBytes(payload.length + 5); + } + } catch (InterruptedException e) { + if (!running.get()) { + break; + } + } catch (IOException e) { + Log.w(TAG, "Send failed: " + e.getMessage()); + if (onSendFailed != null) { + onSendFailed.run(); + } + } + } + } + + static final class Outgoing { + final byte type; + final byte[] payload; + final long ptsUs; + final boolean keyFrame; + + Outgoing(byte type, byte[] payload, long ptsUs, boolean keyFrame) { + this.type = type; + this.payload = payload; + this.ptsUs = ptsUs; + this.keyFrame = keyFrame; + } + + public static Outgoing raw(byte type, byte[] payload) { + return new Outgoing(type, payload, 0, false); + } + + public static Outgoing video(long ptsUs, boolean keyFrame, byte[] payload) { + return new Outgoing(CastProtocol.MSG_VIDEO_FRAME, payload, ptsUs, keyFrame); + } + + public byte[] buildPayload() throws IOException { + if (type != CastProtocol.MSG_VIDEO_FRAME) { + return payload; + } + return CastProtocol.videoFramePayload(ptsUs, keyFrame, payload); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/CodecCatalog.java b/app/src/main/java/com/foxx/androidcast/sender/CodecCatalog.java new file mode 100644 index 0000000..d428a99 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/CodecCatalog.java @@ -0,0 +1,395 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * CodecCatalog.java + * Created at: Fri 15 May 2026 20:37:44 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CodecCatalog + * Contributors: + * - Anton Afanasyeu (6 commits, 295 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 46817d6e28afd269c00e5c8699d553b6938eeedbaca7b5f6ac3ce8f4a8021887 +**********************************************************************/ +import android.media.MediaCodecInfo; +import android.media.MediaCodecList; +import android.media.MediaFormat; +import android.os.Build; + +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.media.CodecPriorityCatalog; +import com.foxx.androidcast.media.CodecTier; +import com.foxx.androidcast.media.codec.jni.NativeCodecBridge; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +/** Discovers device video encoder/decoder MIME types and UI codec choices with priority scores. */ +public final class CodecCatalog { + private static volatile CapabilitySnapshot capabilities; + + private CodecCatalog() {} + + public static final class VideoCodecChoice { + public final CastSettings.VideoCodec codec; + public final boolean selectable; + /** Lower = higher priority in UI and AUTO negotiation hints. */ + public final int priorityScore; + + public VideoCodecChoice(CastSettings.VideoCodec codec, boolean selectable, int priorityScore) { + this.codec = codec; + this.selectable = selectable; + this.priorityScore = priorityScore; + } + } + + public static final class AudioCodecChoice { + public final CastSettings.AudioCodec codec; + public final boolean selectable; + public final int priorityScore; + + public AudioCodecChoice(CastSettings.AudioCodec codec, boolean selectable, int priorityScore) { + this.codec = codec; + this.selectable = selectable; + this.priorityScore = priorityScore; + } + } + + /** Selectable codecs for settings spinners (AUTO first, then by ascending priority score). */ + public static List videoCodecChoicesForUi(CastSettings settings) { + ensureCapabilities(); + List out = new ArrayList<>(); + out.add(new VideoCodecChoice(CastSettings.VideoCodec.AUTO, true, 0)); + Set enc = capabilities.hardwareEncoderMimes; + if (enc.contains(MediaFormat.MIMETYPE_VIDEO_AVC)) { + out.add(scoredVideo(CastSettings.VideoCodec.H264, true, settings)); + } + if (enc.contains(MediaFormat.MIMETYPE_VIDEO_HEVC)) { + out.add(scoredVideo(CastSettings.VideoCodec.H265, true, settings)); + } + if (capabilities.softwareEncoderMimes.contains(MediaFormat.MIMETYPE_VIDEO_VP8)) { + out.add(scoredVideo(CastSettings.VideoCodec.LIBVPX_VP8, true, settings)); + } + if (capabilities.softwareEncoderMimes.contains(MediaFormat.MIMETYPE_VIDEO_VP9)) { + out.add(scoredVideo(CastSettings.VideoCodec.LIBVPX_VP9, true, settings)); + } + out.add(scoredVideo(CastSettings.VideoCodec.PASSTHROUGH, true, settings)); + sortVideoChoices(out); + return out; + } + + public static List videoCodecChoicesForUi() { + return videoCodecChoicesForUi(null); + } + + public static List audioCodecChoicesForUi(CastSettings settings) { + List out = new ArrayList<>(); + out.add(new AudioCodecChoice(CastSettings.AudioCodec.AUTO, true, 0)); + // Selectable even without native .so — stub path uses AAC + OPUS/SPEEX backend label (validation). + out.add(scoredAudio(CastSettings.AudioCodec.OPUS, true, settings)); + out.add(scoredAudio(CastSettings.AudioCodec.AAC, true, settings)); + out.add(scoredAudio(CastSettings.AudioCodec.SPEEX, true, settings)); + out.add(scoredAudio(CastSettings.AudioCodec.PASSTHROUGH_DEBUG, true, settings)); + sortAudioChoices(out); + return out; + } + + public static List audioCodecChoicesForUi() { + return audioCodecChoicesForUi(null); + } + + /** Advertised audio encoder lines for diagnostics (MIME + tier + priority). */ + public static List localAdvertisedAudioEncoderLines(CastSettings settings) { + CastSettings s = settings != null ? settings : new CastSettings(); + List out = new ArrayList<>(); + out.add(audioAdvertisedLine(CastSettings.AudioCodec.AAC, MediaFormat.MIMETYPE_AUDIO_AAC, s)); + out.add(audioAdvertisedLine(CastSettings.AudioCodec.OPUS, "audio/opus", s)); + out.add(audioAdvertisedLine(CastSettings.AudioCodec.SPEEX, "audio/speex", s)); + out.add(audioAdvertisedLine(CastSettings.AudioCodec.PASSTHROUGH_DEBUG, "audio/raw", s)); + return out; + } + + public static List localAdvertisedAudioDecoderLines(CastSettings settings) { + return localAdvertisedAudioEncoderLines(settings); + } + + /** Audio codec names advertised on wire (priority order; excludes AUTO). */ + public static List localAdvertisedAudioCodecsInOrder(CastSettings settings) { + List out = new ArrayList<>(); + for (AudioCodecChoice c : audioCodecChoicesForUi(settings)) { + if (c.codec == CastSettings.AudioCodec.AUTO) { + continue; + } + out.add(c.codec.name()); + } + return out; + } + + /** Video MIME types advertised on wire (encoder catalog order). */ + public static List localAdvertisedVideoMimesInOrder() { + return localEncoderMimes(); + } + + /** Video codec labels for diagnostics (priority order; excludes AUTO). */ + public static List localAdvertisedVideoCodecsInOrder(CastSettings settings) { + List out = new ArrayList<>(); + for (VideoCodecChoice c : videoCodecChoicesForUi(settings)) { + if (c.codec == CastSettings.VideoCodec.AUTO) { + continue; + } + out.add(c.codec.name()); + } + return out; + } + + private static String audioAdvertisedLine(CastSettings.AudioCodec codec, String mime, CastSettings settings) { + CodecTier tier = com.foxx.androidcast.media.CodecPriorityCatalog.tierForAudioPreference(codec); + int score = com.foxx.androidcast.media.CodecPriorityCatalog.priorityScore(codec, settings); + String backend = audioBackendLabel(codec); + return String.format(Locale.US, " %s [%s] pri=%d · %s", mime, tier.name(), score, backend); + } + + private static String audioBackendLabel(CastSettings.AudioCodec codec) { + switch (codec) { + case OPUS: + return NativeCodecBridge.isOpusAvailable() ? "Opus native enc" : "Opus stub→AAC enc"; + case SPEEX: + return NativeCodecBridge.isSpeexAvailable() ? "Speex native enc" : "Speex stub→AAC enc"; + case PASSTHROUGH_DEBUG: + return "PCM passthrough (debug)"; + case AAC: + default: + return "MediaCodec AAC enc"; + } + } + + public static List localNativeSoftwareVideoLines(CastSettings settings) { + CastSettings s = settings != null ? settings : new CastSettings(); + List out = new ArrayList<>(); + if (!NativeCodecBridge.isLibvpxAvailable()) { + return out; + } + out.add(nativeVideoLine(MediaFormat.MIMETYPE_VIDEO_VP8, CastSettings.VideoCodec.LIBVPX_VP8, s, "enc")); + out.add(nativeVideoLine(MediaFormat.MIMETYPE_VIDEO_VP9, CastSettings.VideoCodec.LIBVPX_VP9, s, "enc")); + return out; + } + + public static List localNativeSoftwareVideoDecoderLines(CastSettings settings) { + CastSettings s = settings != null ? settings : new CastSettings(); + List out = new ArrayList<>(); + if (!NativeCodecBridge.isLibvpxAvailable()) { + return out; + } + out.add(nativeVideoLine(MediaFormat.MIMETYPE_VIDEO_VP8, CastSettings.VideoCodec.LIBVPX_VP8, s, "dec")); + out.add(nativeVideoLine(MediaFormat.MIMETYPE_VIDEO_VP9, CastSettings.VideoCodec.LIBVPX_VP9, s, "dec")); + return out; + } + + private static String nativeVideoLine(String mime, CastSettings.VideoCodec codec, CastSettings settings, + String role) { + int score = com.foxx.androidcast.media.CodecPriorityCatalog.priorityScore(codec, settings); + return String.format(Locale.US, " [SW:%04d] MIME: '%s', libvpx JNI %s", score, mime, role); + } + + public static List supportedChoices() { + List out = new ArrayList<>(); + for (VideoCodecChoice c : videoCodecChoicesForUi()) { + if (c.selectable) { + out.add(c.codec); + } + } + return out; + } + + public static List localEncoderMimes() { + ensureCapabilities(); + return new ArrayList<>(capabilities.advertisedEncoderMimes); + } + + public static List localDecoderMimes() { + ensureCapabilities(); + return new ArrayList<>(capabilities.advertisedDecoderMimes); + } + + public static boolean hasHardwareCodec(String mime, boolean encoder) { + ensureCapabilities(); + Set set = encoder ? capabilities.hardwareEncoderMimes : capabilities.hardwareDecoderMimes; + return containsIgnoreCase(set, mime); + } + + public static boolean hasSoftwareCodec(String mime, boolean encoder) { + ensureCapabilities(); + Set set = encoder ? capabilities.softwareEncoderMimes : capabilities.softwareDecoderMimes; + return containsIgnoreCase(set, mime); + } + + /** Tier used for scoring on this device for a MIME (HW preferred over SW when both exist). */ + public static CodecTier effectiveTierForVideoMime(String mime, boolean encoder) { + if (hasHardwareCodec(mime, encoder)) { + return CodecTier.HARDWARE; + } + if (hasSoftwareCodec(mime, encoder)) { + return CodecTier.SOFTWARE; + } + return CodecTier.PASSTHROUGH; + } + + public static boolean canUseVideoMimeOnDevice(String mime, boolean encoder) { + return hasHardwareCodec(mime, encoder) || hasSoftwareCodec(mime, encoder); + } + + private static VideoCodecChoice scoredVideo(CastSettings.VideoCodec codec, boolean selectable, + CastSettings settings) { + int score = CodecPriorityCatalog.priorityScore(codec, settings); + return new VideoCodecChoice(codec, selectable, score); + } + + private static AudioCodecChoice scoredAudio(CastSettings.AudioCodec codec, boolean selectable, + CastSettings settings) { + int score = CodecPriorityCatalog.priorityScore(codec, settings); + return new AudioCodecChoice(codec, selectable, score); + } + + private static void sortVideoChoices(List choices) { + if (choices.size() <= 2) { + return; + } + VideoCodecChoice auto = choices.get(0); + List rest = new ArrayList<>(choices.subList(1, choices.size())); + Collections.sort(rest, Comparator.comparingInt(c -> c.priorityScore)); + choices.clear(); + choices.add(auto); + choices.addAll(rest); + } + + private static void sortAudioChoices(List choices) { + if (choices.size() <= 2) { + return; + } + AudioCodecChoice auto = choices.get(0); + List rest = new ArrayList<>(choices.subList(1, choices.size())); + Collections.sort(rest, Comparator.comparingInt(c -> c.priorityScore)); + choices.clear(); + choices.add(auto); + choices.addAll(rest); + } + + /** Clears cached HW/SW probe (call after {@link com.foxx.androidcast.media.CodecPriorityCatalog#reload}). */ + public static void invalidateCapabilities() { + capabilities = null; + } + + private static void ensureCapabilities() { + if (capabilities != null) { + return; + } + synchronized (CodecCatalog.class) { + if (capabilities != null) { + return; + } + capabilities = probeCapabilities(); + } + } + + private static CapabilitySnapshot probeCapabilities() { + Set hwEnc = probeHardwareMimes(true); + Set hwDec = probeHardwareMimes(false); + Set swEnc = new LinkedHashSet<>(); + Set swDec = new LinkedHashSet<>(); + if (NativeCodecBridge.isLibvpxAvailable()) { + swEnc.add(MediaFormat.MIMETYPE_VIDEO_VP8); + swEnc.add(MediaFormat.MIMETYPE_VIDEO_VP9); + swDec.add(MediaFormat.MIMETYPE_VIDEO_VP8); + swDec.add(MediaFormat.MIMETYPE_VIDEO_VP9); + } + Set advertisedEnc = new LinkedHashSet<>(hwEnc); + advertisedEnc.addAll(swEnc); + if (advertisedEnc.isEmpty()) { + advertisedEnc.add(MediaFormat.MIMETYPE_VIDEO_AVC); + } + Set advertisedDec = new LinkedHashSet<>(hwDec); + advertisedDec.addAll(swDec); + if (advertisedDec.isEmpty()) { + advertisedDec.add(MediaFormat.MIMETYPE_VIDEO_AVC); + } + return new CapabilitySnapshot(hwEnc, hwDec, swEnc, swDec, advertisedEnc, advertisedDec); + } + + private static Set probeHardwareMimes(boolean encoder) { + Set out = new LinkedHashSet<>(); + String[] want = { + MediaFormat.MIMETYPE_VIDEO_AVC, + MediaFormat.MIMETYPE_VIDEO_HEVC, + MediaFormat.MIMETYPE_VIDEO_VP9, + MediaFormat.MIMETYPE_VIDEO_VP8, + }; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + MediaCodecList list = new MediaCodecList(MediaCodecList.REGULAR_CODECS); + for (MediaCodecInfo info : list.getCodecInfos()) { + if (info.isEncoder() != encoder) { + continue; + } + for (String type : info.getSupportedTypes()) { + for (String w : want) { + if (w.equalsIgnoreCase(type)) { + out.add(w); + } + } + } + } + } else { + int n = MediaCodecList.getCodecCount(); + for (int i = 0; i < n; i++) { + MediaCodecInfo info = MediaCodecList.getCodecInfoAt(i); + if (info.isEncoder() != encoder) { + continue; + } + for (String type : info.getSupportedTypes()) { + for (String w : want) { + if (w.equalsIgnoreCase(type)) { + out.add(w); + } + } + } + } + } + return out; + } + + private static boolean containsIgnoreCase(Set set, String mime) { + if (mime == null) { + return false; + } + for (String s : set) { + if (s != null && s.equalsIgnoreCase(mime)) { + return true; + } + } + return false; + } + + private static final class CapabilitySnapshot { + final Set hardwareEncoderMimes; + final Set hardwareDecoderMimes; + final Set softwareEncoderMimes; + final Set softwareDecoderMimes; + final Set advertisedEncoderMimes; + final Set advertisedDecoderMimes; + + CapabilitySnapshot(Set hardwareEncoderMimes, Set hardwareDecoderMimes, + Set softwareEncoderMimes, Set softwareDecoderMimes, + Set advertisedEncoderMimes, Set advertisedDecoderMimes) { + this.hardwareEncoderMimes = hardwareEncoderMimes; + this.hardwareDecoderMimes = hardwareDecoderMimes; + this.softwareEncoderMimes = softwareEncoderMimes; + this.softwareDecoderMimes = softwareDecoderMimes; + this.advertisedEncoderMimes = advertisedEncoderMimes; + this.advertisedDecoderMimes = advertisedDecoderMimes; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/DeviceListAdapter.java b/app/src/main/java/com/foxx/androidcast/sender/DeviceListAdapter.java new file mode 100644 index 0000000..a4ba14d --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/DeviceListAdapter.java @@ -0,0 +1,162 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * DeviceListAdapter.java + * Created at: Fri 15 May 2026 17:47:09 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class DeviceListAdapter + * Contributors: + * - Anton Afanasyeu (5 commits, 130 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 a4c5b1e8d95601ce81990177e42d342f86afe8dd704bef1fc4db89cdb5b90670 +**********************************************************************/ +import android.content.Context; +import android.graphics.Typeface; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.foxx.androidcast.R; +import com.foxx.androidcast.discovery.DiscoveryManager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; + +/** Device list with single or multi selection. */ +public class DeviceListAdapter extends BaseAdapter { + private final Context context; + private final LayoutInflater inflater; + private final boolean multiSelect; + private final List devices = new ArrayList<>(); + private int selectedPosition = -1; + private final Set selectedPositions = new LinkedHashSet<>(); + private Set liveDeviceIds = Collections.emptySet(); + private Set liveUsernames = Collections.emptySet(); + + public DeviceListAdapter(Context context, boolean multiSelect) { + this.context = context; + inflater = LayoutInflater.from(context); + this.multiSelect = multiSelect; + } + + public void clearDevices() { + devices.clear(); + selectedPosition = -1; + selectedPositions.clear(); + notifyDataSetChanged(); + } + + public void setDevices(List list) { + devices.clear(); + if (list != null) { + devices.addAll(list); + } + if (selectedPosition >= devices.size()) { + selectedPosition = -1; + } + selectedPositions.removeIf(i -> i >= devices.size()); + notifyDataSetChanged(); + } + + public void setSelectedPosition(int position) { + if (multiSelect) { + if (position >= 0 && position < devices.size()) { + if (selectedPositions.contains(position)) { + selectedPositions.remove(position); + } else { + selectedPositions.add(position); + } + } + } else { + selectedPosition = position; + } + notifyDataSetChanged(); + } + + public int getSelectedPosition() { + return selectedPosition; + } + + public List getSelectedDevices() { + List out = new ArrayList<>(); + if (multiSelect) { + for (int i : selectedPositions) { + if (i >= 0 && i < devices.size()) { + out.add(devices.get(i)); + } + } + } else if (selectedPosition >= 0 && selectedPosition < devices.size()) { + out.add(devices.get(selectedPosition)); + } + return out; + } + + public DiscoveryManager.DiscoveredDevice getSelectedDevice() { + List list = getSelectedDevices(); + return list.isEmpty() ? null : list.get(0); + } + + public void setLiveIndicators(Set deviceIds, Set usernames) { + liveDeviceIds = deviceIds != null ? deviceIds : Collections.emptySet(); + liveUsernames = usernames != null ? usernames : Collections.emptySet(); + notifyDataSetChanged(); + } + + private boolean isLiveCasting(DiscoveryManager.DiscoveredDevice d) { + if (d == null) { + return false; + } + if (d.deviceUuid != null && !d.deviceUuid.isEmpty() && liveDeviceIds.contains(d.deviceUuid)) { + return true; + } + if (d.name != null && !d.name.isEmpty()) { + return liveUsernames.contains(d.name.toLowerCase(Locale.US)); + } + return false; + } + + @Override + public int getCount() { + return devices.size(); + } + + @Override + public DiscoveryManager.DiscoveredDevice getItem(int position) { + return devices.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View row = convertView; + if (row == null) { + row = inflater.inflate(R.layout.item_device, parent, false); + } + TextView label = row.findViewById(R.id.device_label); + DiscoveryManager.DiscoveredDevice d = devices.get(position); + String prefix = d.pinnedRecent + ? context.getString(R.string.discovery_pinned_label) + " · " : ""; + label.setText(prefix + d.name + " — " + d.host + " [" + d.transport.toUpperCase() + "]"); + boolean selected = multiSelect ? selectedPositions.contains(position) : position == selectedPosition; + row.setActivated(selected); + row.setSelected(selected); + label.setTypeface(null, selected ? Typeface.BOLD : Typeface.NORMAL); + if (isLiveCasting(d)) { + label.setBackgroundResource(R.drawable.device_item_live_border); + } else { + label.setBackgroundResource(R.drawable.device_item_background); + } + return row; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/EncoderKeepalive.java b/app/src/main/java/com/foxx/androidcast/sender/EncoderKeepalive.java new file mode 100644 index 0000000..8d955cc --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/EncoderKeepalive.java @@ -0,0 +1,66 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * EncoderKeepalive.java + * Created at: Fri 15 May 2026 20:37:44 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class EncoderKeepalive + * Contributors: + * - Anton Afanasyeu (4 commits, 62 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 04bcde62a3a1122d433e0fefdd1aa469f841cc89aed8f0ddfd2327814bf58131 +**********************************************************************/ +import android.os.Handler; +import android.os.Looper; +import android.util.Log; + +import com.foxx.androidcast.CastConfig; +import com.foxx.androidcast.media.codec.VideoEncoderSink; + +/** + * Periodic keyframe requests so Mediatek/others don't stall on a static screen + * (encoder stops emitting; receiver hits idle overlay). + */ +public final class EncoderKeepalive { + private static final String TAG = "EncoderKeepalive"; + + private final Handler handler; + private VideoEncoderSink encoder; + private boolean running; + + public EncoderKeepalive() { + this(new Handler(Looper.getMainLooper())); + } + + public EncoderKeepalive(Handler handler) { + this.handler = handler != null ? handler : new Handler(Looper.getMainLooper()); + } + + private final Runnable tick = new Runnable() { + @Override + public void run() { + if (!running || encoder == null) { + return; + } + encoder.requestKeyframe(); + Log.d(TAG, "Keepalive keyframe requested"); + handler.postDelayed(this, CastConfig.KEYFRAME_KEEPALIVE_MS); + } + }; + + public void start(VideoEncoderSink encoder) { + this.encoder = encoder; + if (running) { + return; + } + running = true; + handler.postDelayed(tick, CastConfig.KEYFRAME_KEEPALIVE_MS); + } + + public void stop() { + running = false; + handler.removeCallbacks(tick); + encoder = null; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/MultiCastCoordinator.java b/app/src/main/java/com/foxx/androidcast/sender/MultiCastCoordinator.java new file mode 100644 index 0000000..6c0ae0f --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/MultiCastCoordinator.java @@ -0,0 +1,279 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * MultiCastCoordinator.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class MultiCastCoordinator + * Contributors: + * - Anton Afanasyeu (8 commits, 271 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 36a73cee00f829a6ec66f4f6ab1d178d6ec37263026bc09f99f86d881f45462e +**********************************************************************/ +import android.content.Context; +import android.util.Log; + +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.DeviceInfo; +import com.foxx.androidcast.media.AudioNegotiator; +import com.foxx.androidcast.network.CastCodecFlags; +import com.foxx.androidcast.network.CastFramingContext; +import com.foxx.androidcast.network.CastProtocol; +import com.foxx.androidcast.network.CastSession; +import com.foxx.androidcast.network.CastTransport; +import com.foxx.androidcast.network.CastTransportFactory; +import com.foxx.androidcast.network.transport.ProtectionNegotiationPrompts; +import com.foxx.androidcast.network.transport.StreamProtectionNegotiation; +import com.foxx.androidcast.network.UdpCastTransport; +import com.foxx.androidcast.network.quic.QuicCronetCastTransport; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * Manages multiple receiver sessions (connect, handshake, fan-out send). + * Requests keyframes when a peer joins or changes transport. + */ +public final class MultiCastCoordinator { + private static final String TAG = "MultiCastCoordinator"; + private static final int CONNECT_RETRIES = 20; + + public interface KeyframeRequester { + void requestKeyframe(); + } + + public static final class ActivePeer { + public final CastReceiverTarget target; + public final CastSession session; + public CastSettings settings; + public String negotiatedMime; + + ActivePeer(CastReceiverTarget target, CastSession session, CastSettings settings, String mime) { + this.target = target; + this.session = session; + this.settings = settings; + this.negotiatedMime = mime; + } + } + + private final Context appContext; + private final int sessionId; + private final CastFramingContext framingContext; + private final CopyOnWriteArrayList peers = new CopyOnWriteArrayList<>(); + private KeyframeRequester keyframeRequester; + + public MultiCastCoordinator(Context context) { + appContext = context.getApplicationContext(); + sessionId = new Random().nextInt(); + int placeholderId = DeviceInfo.getPlaceholderId(appContext); + framingContext = new CastFramingContext( + sessionId, + placeholderId, + CastCodecFlags.localVideoMask(), + CastCodecFlags.localAudioMask()); + } + + public int getSessionId() { + return sessionId; + } + + public CastFramingContext getFramingContext() { + return framingContext; + } + + public void setKeyframeRequester(KeyframeRequester requester) { + this.keyframeRequester = requester; + } + + public List getPeers() { + return new ArrayList<>(peers); + } + + public List getSessions() { + List out = new ArrayList<>(); + for (ActivePeer p : peers) { + out.add(p.session); + } + return out; + } + + public void connectAndHandshake(List targets, CastSettings baseSettings, + String deviceName, String pin) throws IOException { + peers.clear(); + IOException last = null; + for (CastReceiverTarget t : targets) { + CastSettings peerSettings = cloneSettings(baseSettings); + peerSettings.setTransport(t.transport); + CastSession session = null; + try { + session = createSession(peerSettings); + connectWithRetry(session, t.host, t.port); + CastSession.HandshakeResult hs = session.clientHandshake(deviceName, pin, peerSettings); + applyNegotiatedProtection(session, peerSettings, hs.receiverAdvertisement); + AudioNegotiator.resolveForSender(peerSettings, t.audioCodecs); + peers.add(new ActivePeer(t, session, hs.settings, hs.negotiatedVideoMime)); + Log.i(TAG, "Peer ready " + t.name + " " + hs.negotiatedVideoMime + + " audio=" + peerSettings.getResolvedAudioCodec() + + " score=" + + com.foxx.androidcast.media.CodecNegotiator.priorityScoreForNegotiatedMime( + hs.negotiatedVideoMime, hs.settings)); + } catch (IOException e) { + last = e; + Log.w(TAG, "Peer failed " + t.name + ": " + e.getMessage()); + if (session != null) { + session.close(); + } + } + } + if (peers.isEmpty() && last != null) { + throw last; + } + if (keyframeRequester != null) { + keyframeRequester.requestKeyframe(); + } + } + + public void addPeer(CastReceiverTarget target, CastSettings baseSettings, String deviceName, String pin) + throws IOException { + CastSettings peerSettings = cloneSettings(baseSettings); + peerSettings.setTransport(target.transport); + CastSession session = createSession(peerSettings); + connectWithRetry(session, target.host, target.port); + CastSession.HandshakeResult hs = session.clientHandshake(deviceName, pin, peerSettings); + applyNegotiatedProtection(session, peerSettings, hs.receiverAdvertisement); + AudioNegotiator.resolveForSender(peerSettings, target.audioCodecs); + peers.add(new ActivePeer(target, session, hs.settings, hs.negotiatedVideoMime)); + if (keyframeRequester != null) { + keyframeRequester.requestKeyframe(); + } + } + + public void removePeer(String host, int port) { + String key = host + ":" + port; + for (ActivePeer p : peers) { + if (p.target.key().equals(key)) { + peers.remove(p); + p.session.close(); + break; + } + } + } + + public CastProtocol.Message pollReceive(int timeoutMs) throws IOException { + if (peers.isEmpty()) { + return null; + } + long deadline = System.currentTimeMillis() + timeoutMs; + CastProtocol.Message any = null; + for (ActivePeer p : peers) { + long remaining = deadline - System.currentTimeMillis(); + if (remaining <= 0) { + break; + } + CastProtocol.Message msg = p.session.receive((int) remaining); + if (msg != null) { + any = msg; + } + } + return any; + } + + /** Sends the same control message to every connected peer (e.g. stream config after pipeline ready). */ + public void broadcast(byte type, byte[] payload) { + for (ActivePeer p : peers) { + try { + p.session.send(type, payload); + } catch (IOException e) { + Log.w(TAG, "Broadcast to " + p.target.name + " failed: " + e.getMessage()); + } + } + } + + public void sendGoodbyeAll() { + for (ActivePeer p : peers) { + try { + p.session.send(CastProtocol.MSG_GOODBYE, new byte[0]); + } catch (IOException ignored) { + } + } + } + + public void closeAll() { + for (ActivePeer p : peers) { + try { + p.session.close(); + } catch (Exception ignored) { + } + } + peers.clear(); + } + + private CastSession createSession(CastSettings settings) throws IOException { + CastTransportFactory.init(appContext); + CastSession session = new CastSession(CastTransportFactory.create(settings)); + session.getTransport().setFramingContext(framingContext); + return session; + } + + private void applyNegotiatedProtection(CastSession session, CastSettings local, + CastSettings receiverAdvertisement) { + if (session == null) { + return; + } + CastTransport transport = session.getTransport(); + UdpCastTransport udp = null; + if (transport instanceof UdpCastTransport) { + udp = (UdpCastTransport) transport; + } else if (transport instanceof QuicCronetCastTransport) { + udp = ((QuicCronetCastTransport) transport).getUdpTransport(); + } + if (udp != null) { + CastSettings remote = receiverAdvertisement; + StreamProtectionNegotiation negotiated = CastTransportFactory.applyNegotiatedUdpProtection( + udp, local, remote, false); + Log.i(TAG, ProtectionNegotiationPrompts.summarize(appContext, negotiated)); + if (negotiated.prompt != null) { + Log.i(TAG, ProtectionNegotiationPrompts.format(appContext, negotiated.prompt, false)); + } + } + } + + private void connectWithRetry(CastSession session, String host, int port) throws IOException { + IOException last = null; + for (int i = 0; i < CONNECT_RETRIES; i++) { + try { + session.connect(host, port); + return; + } catch (IOException e) { + last = e; + try { + Thread.sleep(1000); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + throw new IOException("Interrupted", ie); + } + } + } + throw last != null ? last : new IOException("Connect failed"); + } + + private static CastSettings cloneSettings(CastSettings src) { + CastSettings s = new CastSettings(); + s.setTransport(src.getTransport()); + s.setQuality(src.getQuality()); + s.setResolution(src.getResolution()); + s.setAudioEnabled(src.isAudioEnabled()); + s.setVideoCodec(src.getVideoCodec()); + s.setAdjustmentPreset(src.getAdjustmentPreset()); + s.setBitrateMode(src.getBitrateMode()); + s.setNetworkAdoption(src.getNetworkAdoption()); + s.setCaptureMode(src.getCaptureMode()); + s.setStreamProtection(src.getStreamProtection()); + s.setReceiverDisplayResolution(src.getReceiverDisplayResolution()); + return s; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/ScreenCastService.java b/app/src/main/java/com/foxx/androidcast/sender/ScreenCastService.java new file mode 100644 index 0000000..804074e --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/ScreenCastService.java @@ -0,0 +1,1253 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * ScreenCastService.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class ScreenCastService + * Contributors: + * - Anton Afanasyeu (18 commits, 1131 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 239fafac379dab7a0d380509d4d3a46e1742de7f807dd40a3b231ccb5c48d860 +**********************************************************************/ +import android.app.Service; +import android.content.Intent; +import android.content.pm.ServiceInfo; +import android.hardware.display.DisplayManager; +import android.hardware.display.VirtualDisplay; +import android.view.Display; +import android.media.projection.MediaProjection; +import android.media.projection.MediaProjectionManager; +import android.os.Build; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IBinder; +import android.os.Looper; +import android.os.PowerManager; +import android.os.RemoteCallbackList; +import android.os.RemoteException; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Surface; +import android.view.WindowManager; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.CastActiveState; +import com.foxx.androidcast.display.ExternalDisplayCapturePolicy; +import com.foxx.androidcast.display.WiredDisplayMonitor; +import com.foxx.androidcast.CastTrayNotifier; +import com.foxx.androidcast.CastNotifications; +import com.foxx.androidcast.CastConfig; +import com.foxx.androidcast.CastResolution; +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.CastTuningEngine; +import com.foxx.androidcast.ICastSenderService; +import com.foxx.androidcast.ICastStatusCallback; +import com.foxx.androidcast.IntentExtras; +import com.foxx.androidcast.R; +import com.foxx.androidcast.network.CastProtocol; +import com.foxx.androidcast.network.CastSession; +import com.foxx.androidcast.network.CastTransportFactory; +import com.foxx.androidcast.network.control.NetworkFeedbackManager; +import com.foxx.androidcast.network.control.NetworkStatsSnapshot; +import com.foxx.androidcast.network.control.PassThroughNetworkControlPlane; +import com.foxx.androidcast.network.transport.TransportLossStats; +import com.foxx.androidcast.network.transport.TransportLossStatsBridge; +import com.foxx.androidcast.network.selftest.NetworkSelfTestBridge; +import com.foxx.androidcast.media.AudioNegotiator; +import com.foxx.androidcast.media.codec.AudioCodecFactory; +import com.foxx.androidcast.media.codec.CodecSessionRegistry; +import com.foxx.androidcast.media.codec.PassthroughCodecPolicy; +import com.foxx.androidcast.media.codec.VideoCodecFactory; +import com.foxx.androidcast.media.codec.VideoEncoderSink; +import com.foxx.androidcast.media.codec.AudioEncoderSink; +import com.foxx.androidcast.live.LiveCastControlPlane; +import com.foxx.androidcast.stats.SessionStatsContext; +import com.foxx.androidcast.stats.SessionStatsRecorder; +import com.foxx.androidcast.stats.SessionStatsStore; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; + +/** Foreground sender: screen + audio capture → encode → TCP/UDP (survives UI exit). */ +public class ScreenCastService extends Service implements + com.foxx.androidcast.sender.calibration.CalibrationCastDriver.FallbackHost { + private static final String TAG = "ScreenCastService"; + private static final int CONNECT_RETRIES = 20; + private static final long CONNECT_RETRY_MS = 1000; + private static final long CAPTURE_SIZE_UPDATE_DEBOUNCE_MS = 2_000L; + + public static final String EXTRA_RESULT_CODE = "result_code"; + public static final String EXTRA_RESULT_DATA = "result_data"; + public static final String EXTRA_HOST = "host"; + public static final String EXTRA_PORT = "port"; + public static final String EXTRA_PIN = "pin"; + public static final String EXTRA_DEVICE_NAME = "device_name"; + public static final String EXTRA_SENDER_NAME = "sender_name"; + public static final String EXTRA_TARGETS = "cast_targets"; + public static final String EXTRA_CALIBRATION = "calibration_mode"; + public static final String ACTION_STOP = "com.foxx.androidcast.STOP_SEND"; + + private final RemoteCallbackList callbacks = new RemoteCallbackList<>(); + private final Handler mainHandler = new Handler(Looper.getMainLooper()); + private HandlerThread projectionThread; + private Handler projectionHandler; + private final AtomicReference captureSetupError = new AtomicReference<>(); + private final AtomicBoolean stopping = new AtomicBoolean(false); + private final AtomicBoolean casting = new AtomicBoolean(false); + private final AtomicBoolean resourcesReleased = new AtomicBoolean(false); + + private MediaProjection projection; + private VirtualDisplay virtualDisplay; + private VideoEncoderSink videoEncoder; + private EncoderKeepalive encoderKeepalive; + private CastTuningEngine.EffectiveParams effectiveParams; + private long lastSignificantFrameMs; + private final SenderStreamMetrics senderMetrics = new SenderStreamMetrics(); + private final SenderAudioMetrics senderAudioMetrics = new SenderAudioMetrics(); + private AudioEncoderSink audioEncoder; + private AudioCapture audioCapture; + private long audioFramesSent; + private volatile String audioCaptureMode = "playback"; + private CastSession session; + private CastSendPump sendPump; + private CastFanoutPump fanoutPump; + private MultiCastCoordinator multiCoordinator; + private NetworkFeedbackManager networkFeedback; + private PowerManager.WakeLock wakeLock; + private Thread ioThread; + private String status = ""; + + private CastSettings activeSettings; + private int captureWidth; + private int captureHeight; + private int captureDensity; + private DisplayManager displayManager; + private DisplayManager.DisplayListener displayListener; + private Runnable pendingCaptureSizeUpdate; + private CastResolution.Size pendingCaptureSize; + private final AtomicBoolean captureReconfigureInFlight = new AtomicBoolean(false); + private com.foxx.androidcast.sender.calibration.CalibrationCastDriver calibrationDriver; + private volatile boolean calibrationMode; + private volatile boolean cameraMode; + private com.foxx.androidcast.sender.camera.CameraCastCapture cameraCapture; + private SessionStatsRecorder sessionStatsRecorder; + + private final ICastSenderService.Stub binder = new ICastSenderService.Stub() { + @Override + public void registerCallback(ICastStatusCallback callback) { + if (callback != null) { + callbacks.register(callback); + broadcastStatus(status); + } + } + + @Override + public void unregisterCallback(ICastStatusCallback callback) { + if (callback != null) { + callbacks.unregister(callback); + } + } + + @Override + public String getStatus() { + return status; + } + + @Override + public boolean isCasting() { + return casting.get(); + } + + @Override + public void stopCasting() { + stopSelfSafely(); + } + }; + + @Override + public void onCreate() { + super.onCreate(); + NetworkSelfTestBridge.startCapture(this); + if (AppPreferences.isGrabSessionStats(this)) { + SessionStatsStore.pruneOnAppStart(this); + } + CastNotifications.createChannels(this); + com.foxx.androidcast.network.CastTransportFactory.init(this); + com.foxx.androidcast.diagnostics.CpuLoadSampler.warmUp(); + projectionThread = new HandlerThread("CastProjection"); + projectionThread.start(); + projectionHandler = new Handler(projectionThread.getLooper()); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (intent != null && ACTION_STOP.equals(intent.getAction())) { + stopSelfSafely(); + return START_NOT_STICKY; + } + if (casting.get()) { + return START_STICKY; + } + CastSettings startSettings = IntentExtras.getCastSettings(intent); + CastActiveState.setSenderCasting(true); + startSenderForeground(getString(R.string.connecting), + startSettings != null && startSettings.isAudioEnabled()); + ioThread = new Thread(() -> runCast(intent), "ScreenCastIO"); + ioThread.start(); + return START_STICKY; + } + + private void runCast(Intent intent) { + resourcesReleased.set(false); + stopping.set(false); + if (intent == null) { + failAndStop(getString(R.string.error_no_intent)); + return; + } + int resultCode = intent.getIntExtra(EXTRA_RESULT_CODE, 0); + Intent data = IntentExtras.getParcelableIntent(intent, EXTRA_RESULT_DATA); + String host = intent.getStringExtra(EXTRA_HOST); + int port = intent.getIntExtra(EXTRA_PORT, com.foxx.androidcast.CastConfig.CAST_PORT); + String pin = intent.getStringExtra(EXTRA_PIN); + if (pin == null) { + pin = ""; + } + String deviceName = intent.getStringExtra(EXTRA_DEVICE_NAME); + String senderName = intent.getStringExtra(EXTRA_SENDER_NAME); + CastSettings settings = IntentExtras.getCastSettings(intent); + + boolean calibration = settings != null + && settings.getCaptureMode() == CastSettings.CaptureMode.CALIBRATION_TEST; + boolean camera = settings != null && settings.isCameraCapture(); + if (!calibration && !camera && data == null) { + failAndStop(getString(R.string.error_projection_data)); + return; + } + if (host == null || settings == null) { + failAndStop(getString(R.string.error_missing_params)); + return; + } + if (senderName == null || senderName.isEmpty()) { + senderName = AppPreferences.getUsername(this); + } + cameraMode = settings.isCameraCapture(); + calibrationMode = settings.getCaptureMode() == CastSettings.CaptureMode.CALIBRATION_TEST; + if (cameraMode && !com.foxx.androidcast.PlatformCastSupport.isCameraCaptureModeSupported()) { + failAndStop(getString(R.string.capture_camera_requires_api29)); + return; + } + int castPort = com.foxx.androidcast.CastConfig.portForTransport(settings.getTransport()); + if (port <= 0 || port == com.foxx.androidcast.CastConfig.CAST_PORT) { + port = castPort; + } + + acquireWakeLock(); + try { + ArrayList targets = IntentExtras.getReceiverTargets(intent, EXTRA_TARGETS); + if (targets == null || targets.isEmpty()) { + targets = new ArrayList<>(); + targets.add(new CastReceiverTarget( + deviceName != null ? deviceName : host, host, port, settings.getTransport(), 0, 0, 0)); + } + multiCoordinator = new MultiCastCoordinator(this); + multiCoordinator.setKeyframeRequester(() -> runOnProjectionThread(() -> { + if (videoEncoder != null) { + videoEncoder.requestKeyframe(); + } + })); + updateStatus(getString(R.string.connecting_to, host)); + if (AppPreferences.isGrabSessionStats(this)) { + sessionStatsRecorder = new SessionStatsRecorder("send", settings.getTransport()); + SessionStatsContext.bind(sessionStatsRecorder); + } + multiCoordinator.connectAndHandshake(targets, settings, senderName, pin); + List peers = multiCoordinator.getPeers(); + if (peers.isEmpty()) { + throw new IOException("No receivers connected"); + } + MultiCastCoordinator.ActivePeer primary = peers.get(0); + session = primary.session; + settings = primary.settings; + settings.setNegotiatedVideoMime(primary.negotiatedMime); + AudioNegotiator.resolveForSender(settings, primary.target.audioCodecs); + final CastSettings captureSettings = settings; + updateStatus(getString(R.string.authenticating)); + networkFeedback = new NetworkFeedbackManager(session, true); + PassThroughNetworkControlPlane plane = + (PassThroughNetworkControlPlane) networkFeedback.getPlane(); + plane.setStatsEnricher(this::enrichSenderStats); + if (AppPreferences.isDevDiagPingPongEnabled(this)) { + networkFeedback.configureDiagPing(true, + AppPreferences.getDevDiagPingResponseMode(this), + snapshot -> senderMetrics.onDiagPingSample(snapshot)); + } + if (peers.size() > 1) { + fanoutPump = new CastFanoutPump(); + fanoutPump.start(multiCoordinator.getSessions(), () -> stopping.set(true), plane); + } else { + sendPump = new CastSendPump(); + sendPump.start(session, () -> stopping.set(true), plane); + } + com.foxx.androidcast.dev.StreamDumpWriter.startIfEnabled(this); + casting.set(true); + CastActiveState.setSenderCasting(true); + CastTrayNotifier.refresh(this); + LiveCastControlPlane.onCastStart(this, "android_sender", + settings.getNegotiatedVideoMime(), + PassthroughCodecPolicy.displayAudioPreference(AudioNegotiator.effective(settings)), + settings.getBitrateMode().name().toLowerCase()); + activeSettings = settings; + if (AppPreferences.isGrabSessionStats(this)) { + if (sessionStatsRecorder == null) { + sessionStatsRecorder = new SessionStatsRecorder("send", settings.getTransport()); + SessionStatsContext.bind(sessionStatsRecorder); + } + sessionStatsRecorder.mergeSettings(settings); + sessionStatsRecorder.setClientCount(peers.size()); + sessionStatsRecorder.setCodecs(settings.getNegotiatedVideoMime(), + PassthroughCodecPolicy.displayAudioPreference( + AudioNegotiator.effective(settings))); + } + final int projResultCode = resultCode; + final Intent projData = data != null ? new Intent(data) : null; + if (calibration) { + postCaptureSetup(() -> startCalibrationCaptureInternal(captureSettings)); + } else if (camera) { + postCaptureSetup(() -> startCameraCaptureInternal(captureSettings)); + } else { + postCaptureSetup(() -> startCaptureInternal(projResultCode, projData, captureSettings)); + } + scheduleTuningTick(); + while (!stopping.get()) { + IOException setupErr = captureSetupError.get(); + if (setupErr != null) { + throw setupErr; + } + try { + if (networkFeedback != null) { + networkFeedback.tick(); + CastProtocol.Message msg = multiCoordinator != null + ? multiCoordinator.pollReceive(100) + : session.receive(100); + if (msg != null) { + if (networkFeedback.handleMessage(msg)) { + networkFeedback.applyAdvice(networkFeedback.getPlane().getOutboundAdvice()); + } else if (msg.type == CastProtocol.MSG_AUDIO_CONSENT) { + handleAudioConsent(CastProtocol.parseAudioConsent(msg.payload)); + } + } + } + } catch (java.net.SocketException e) { + if (!stopping.get()) { + Log.i(TAG, "Connection lost: " + e.getMessage()); + stopping.set(true); + } + break; + } catch (IOException e) { + if (!stopping.get()) { + Log.i(TAG, "Connection lost: " + e.getMessage()); + stopping.set(true); + } + break; + } + } + } catch (Exception e) { + if (!stopping.get()) { + Log.e(TAG, "Cast failed", e); + failAndStop(e.getMessage() != null ? e.getMessage() : e.toString()); + } + } finally { + releaseAll(); + stopForeground(STOP_FOREGROUND_REMOVE); + stopSelf(); + } + } + + private void connectWithRetry(String host, int port, CastSettings settings) throws IOException { + IOException last = null; + for (int i = 0; i < CONNECT_RETRIES; i++) { + try { + if (session != null) { + session.close(); + } + session = new CastSession(CastTransportFactory.create(settings)); + session.connect(host, port); + return; + } catch (IOException e) { + last = e; + Log.w(TAG, "Connect attempt " + (i + 1) + " failed", e); + if (session != null) { + session.close(); + session = null; + } + try { + Thread.sleep(CONNECT_RETRY_MS); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + throw new IOException("Interrupted", ie); + } + } + } + String detail = last != null && last.getMessage() != null ? last.getMessage() : ""; + if (detail.contains("ECONNREFUSED")) { + throw new IOException(getString(R.string.error_receiver_refused, host, port), last); + } + throw new IOException(getString(R.string.error_connect_failed, host, port), last); + } + + private void postCaptureSetup(CaptureSetupTask task) { + captureSetupError.set(null); + Handler handler = projectionHandler != null ? projectionHandler : mainHandler; + handler.post(() -> { + try { + task.run(); + } catch (IOException e) { + Log.e(TAG, "Capture setup failed", e); + captureSetupError.set(e); + stopping.set(true); + } catch (Exception e) { + Log.e(TAG, "Capture setup failed", e); + captureSetupError.set(new IOException( + e.getMessage() != null ? e.getMessage() : e.toString(), e)); + stopping.set(true); + } + }); + } + + @FunctionalInterface + private interface CaptureSetupTask { + void run() throws IOException; + } + + private void startCalibrationCaptureInternal(CastSettings settings) throws IOException { + CastResolution.Size size = CastResolution.calibrationTestSize(this); + setupVideoPipeline(size, settings, true); + startAudioPipeline(settings, true); + updateStatus(getString(R.string.casting_calibration, captureWidth, captureHeight)); + } + + private void startCameraCaptureInternal(CastSettings settings) throws IOException { + DisplayMetrics metrics = new DisplayMetrics(); + WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); + wm.getDefaultDisplay().getRealMetrics(metrics); + CastResolution.Size size = CastResolution.compute(metrics, settings, getPeerStats()); + setupVideoPipeline(size, settings, false); + Surface surface = videoEncoder != null ? videoEncoder.getInputSurface() : null; + if (surface == null) { + throw new IOException("Encoder surface unavailable for camera"); + } + cameraCapture = new com.foxx.androidcast.sender.camera.CameraCastCapture(this); + try { + cameraCapture.start(surface, captureWidth, captureHeight, activeSettings != null + && activeSettings.isFrontCamera()); + } catch (android.hardware.camera2.CameraAccessException e) { + throw new IOException("Camera open failed: " + e.getMessage(), e); + } + startAudioPipeline(settings, true); + updateStatus(getString(R.string.casting_camera, captureWidth, captureHeight)); + } + + private void startCaptureInternal(int resultCode, Intent data, CastSettings settings) throws IOException { + SenderPreviewService.stop(this); + MediaProjectionManager mgr = + (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE); + projection = mgr.getMediaProjection(resultCode, data); + if (projection == null) { + throw new IOException("MediaProjection unavailable"); + } + + projection.registerCallback(new MediaProjection.Callback() { + @Override + public void onStop() { + Log.w(TAG, "MediaProjection stopped"); + stopping.set(true); + } + }, projectionHandler != null ? projectionHandler : mainHandler); + + DisplayMetrics metrics = new DisplayMetrics(); + WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); + wm.getDefaultDisplay().getRealMetrics(metrics); + CastResolution.Size size = CastResolution.compute(metrics, settings, getPeerStats()); + setupVideoPipeline(size, settings, false); + registerDisplayListener(); + + startAudioPipeline(settings, false); + + String mode = session.getTransport().getModeLabel(); + updateStatus(getString(R.string.casting_active, mode, captureWidth, captureHeight)); + if (videoEncoder != null) { + videoEncoder.requestKeyframe(); + } + } + + private void setupVideoPipeline(CastResolution.Size size, CastSettings settings, boolean calibration) + throws IOException { + Log.d(TAG, "Video capture target displayId=" + resolveCaptureDisplayId() + + " policy=" + AppPreferences.getExternalDisplayCapturePolicy(this).name()); + if (settings.isPassthrough()) { + throw new IOException("Passthrough video is not implemented yet (debug only)"); + } + if (virtualDisplay != null) { + virtualDisplay.release(); + virtualDisplay = null; + } + if (encoderKeepalive != null) { + encoderKeepalive.stop(); + encoderKeepalive = null; + } + if (videoEncoder != null) { + videoEncoder.stop(); + videoEncoder = null; + } + if (fanoutPump != null) { + fanoutPump.flushVideoQueue(); + } else if (sendPump != null) { + sendPump.flushVideoQueue(); + } + + captureWidth = size.width; + captureHeight = size.height; + captureDensity = size.densityDpi; + + NetworkStatsSnapshot peer = null; + if (networkFeedback != null && networkFeedback.getPlane() instanceof PassThroughNetworkControlPlane) { + peer = ((PassThroughNetworkControlPlane) networkFeedback.getPlane()).getLastPeerStats(); + } + effectiveParams = CastTuningEngine.resolve(settings, peer); + String mime = settings.getNegotiatedVideoMime(); + if (mime == null || mime.isEmpty()) { + throw new IOException("No negotiated video codec"); + } + + videoEncoder = VideoCodecFactory.createEncoder(settings.getVideoCodec()); + CodecSessionRegistry.setProtectionSummary(PassthroughCodecPolicy.protectionDescription( + settings.getStreamProtection(), settings.getTransport(), settings.getAudioCodec())); + VideoEncoderSink.Callback videoCb = buildVideoEncoderCallback(mime); + + if (calibration) { + startCalibrationVideoEncoder(mime, effectiveParams, videoCb, true); + return; + } + + Surface surface = videoEncoder.prepare(captureWidth, captureHeight, mime, effectiveParams, videoCb); + Handler keepaliveHandler = projectionHandler != null ? projectionHandler : mainHandler; + encoderKeepalive = new EncoderKeepalive(keepaliveHandler); + encoderKeepalive.start(videoEncoder); + if (projection != null) { + virtualDisplay = projection.createVirtualDisplay( + "AndroidCast", + captureWidth, + captureHeight, + captureDensity, + DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, + surface, + null, + null); + } else { + throw new IOException("MediaProjection required for screen capture"); + } + videoEncoder.requestKeyframe(); + Log.i(TAG, "Video pipeline " + captureWidth + "x" + captureHeight); + } + + private void registerDisplayListener() { + if (displayManager != null) { + return; + } + displayManager = (DisplayManager) getSystemService(DISPLAY_SERVICE); + displayListener = new DisplayManager.DisplayListener() { + @Override + public void onDisplayAdded(int displayId) { + if (displayId != Display.DEFAULT_DISPLAY) { + onExternalDisplayTopologyChanged(); + } + } + + @Override + public void onDisplayRemoved(int displayId) { + if (displayId != Display.DEFAULT_DISPLAY) { + onExternalDisplayTopologyChanged(); + } + } + + @Override + public void onDisplayChanged(int displayId) { + if (displayId == Display.DEFAULT_DISPLAY) { + runOnProjectionThread(ScreenCastService.this::maybeReconfigureForRotation); + } else { + onExternalDisplayTopologyChanged(); + } + } + }; + Handler listenerHandler = projectionHandler != null ? projectionHandler : mainHandler; + displayManager.registerDisplayListener(displayListener, listenerHandler); + } + + private void unregisterDisplayListener() { + if (displayManager != null && displayListener != null) { + displayManager.unregisterDisplayListener(displayListener); + } + displayManager = null; + displayListener = null; + } + + private void onExternalDisplayTopologyChanged() { + WiredDisplayMonitor monitor = WiredDisplayMonitor.getInstance(this); + if (monitor.hasExternalDisplay()) { + Log.i(TAG, "External display: " + monitor.getSummaryLine()); + if (AppPreferences.isDevWiredDisplayHintsEnabled(this)) { + updateStatus(getString(R.string.wired_display_detected_hint)); + } + } + } + + /** + * Display id for MediaProjection capture (roadmap D). Non-default capture not implemented yet. + */ + private int resolveCaptureDisplayId() { + ExternalDisplayCapturePolicy policy = AppPreferences.getExternalDisplayCapturePolicy(this); + if (policy == ExternalDisplayCapturePolicy.DEFAULT_DISPLAY_ONLY) { + return Display.DEFAULT_DISPLAY; + } + if (WiredDisplayMonitor.getInstance(this).hasExternalDisplay()) { + Log.i(TAG, "Capture policy " + policy.name() + " — using default display until wired capture ships"); + } + return Display.DEFAULT_DISPLAY; + } + + private void maybeReconfigureForRotation() { + if (calibrationMode || cameraMode || !casting.get() || projection == null + || activeSettings == null || stopping.get()) { + return; + } + DisplayMetrics metrics = new DisplayMetrics(); + WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); + wm.getDefaultDisplay().getRealMetrics(metrics); + CastResolution.Size size = CastResolution.compute(metrics, activeSettings, getPeerStats()); + scheduleCaptureSizeUpdate(size, "rotation"); + } + + private boolean captureSizeChangeSignificant(CastResolution.Size size) { + if (size.width == captureWidth && size.height == captureHeight) { + return false; + } + int dw = Math.abs(size.width - captureWidth); + int dh = Math.abs(size.height - captureHeight); + return dw >= Math.max(32, captureWidth / 10) || dh >= Math.max(32, captureHeight / 10); + } + + private void scheduleCaptureSizeUpdate(CastResolution.Size size, String reason) { + if (calibrationMode || cameraMode || !casting.get() || projection == null + || activeSettings == null || stopping.get()) { + return; + } + if (!captureSizeChangeSignificant(size)) { + return; + } + pendingCaptureSize = size; + Handler handler = projectionHandler != null ? projectionHandler : mainHandler; + if (pendingCaptureSizeUpdate != null) { + handler.removeCallbacks(pendingCaptureSizeUpdate); + } + pendingCaptureSizeUpdate = () -> applyCaptureSizeUpdate(reason); + handler.postDelayed(pendingCaptureSizeUpdate, CAPTURE_SIZE_UPDATE_DEBOUNCE_MS); + } + + private void applyCaptureSizeUpdate(String reason) { + pendingCaptureSizeUpdate = null; + if (calibrationMode || cameraMode || !casting.get() || projection == null + || activeSettings == null || stopping.get() || pendingCaptureSize == null) { + return; + } + CastResolution.Size size = pendingCaptureSize; + pendingCaptureSize = null; + if (!captureSizeChangeSignificant(size)) { + return; + } + if (!captureReconfigureInFlight.compareAndSet(false, true)) { + Log.d(TAG, "Capture size update skipped (" + reason + "): reconfigure in flight"); + scheduleCaptureSizeUpdate(size, reason); + return; + } + try { + setupVideoPipeline(size, activeSettings, false); + if ("rotation".equals(reason)) { + updateStatus(getString(R.string.casting_rotated, captureWidth, captureHeight)); + } + Log.i(TAG, "Capture reconfigured (" + reason + ") " + captureWidth + "x" + captureHeight); + } catch (IOException e) { + Log.e(TAG, "Capture reconfigure failed (" + reason + ")", e); + } finally { + captureReconfigureInFlight.set(false); + } + } + + private void cancelPendingCaptureSizeUpdate() { + pendingCaptureSize = null; + if (pendingCaptureSizeUpdate == null) { + return; + } + Handler handler = projectionHandler != null ? projectionHandler : mainHandler; + handler.removeCallbacks(pendingCaptureSizeUpdate); + pendingCaptureSizeUpdate = null; + } + + private NetworkStatsSnapshot getPeerStats() { + if (networkFeedback != null && networkFeedback.getPlane() instanceof PassThroughNetworkControlPlane) { + return ((PassThroughNetworkControlPlane) networkFeedback.getPlane()).getLastPeerStats(); + } + return null; + } + + private void enrichSenderStats(NetworkStatsSnapshot s, long nowMs) { + s.encodeFps = senderMetrics.getLastSecondFps(); + if (fanoutPump != null) { + s.encodeQueueDepth = fanoutPump.getQueueDepth(); + s.droppedPFrames = fanoutPump.getDroppedPFrames(); + s.droppedAudioFrames = fanoutPump.getDroppedAudioFrames(); + } else if (sendPump != null) { + s.encodeQueueDepth = sendPump.getQueueDepth(); + s.droppedPFrames = sendPump.getDroppedPFrames(); + } + TransportLossStats snap = buildSenderLossSnapshot(); + TransportLossStatsBridge.applyTo(s, snap); + if (sessionStatsRecorder != null) { + sessionStatsRecorder.sampleNetwork(s, getPeerStats()); + } + s.audioActive = audioEncoder != null && audioFramesSent > 0; + s.audioFramesSent = audioFramesSent; + s.audioCaptureVuPercent = senderAudioMetrics.getVuPercent(); + s.audioCaptureSilentBlocks = senderAudioMetrics.getSilentBlocks(); + s.audioCaptureAudibleBlocks = senderAudioMetrics.getAudibleBlocks(); + s.audioCapturePeakDb = senderAudioMetrics.getLastPeakDb(); + s.audioCaptureRmsDb = senderAudioMetrics.getLastRmsDb(); + if (effectiveParams != null) { + s.targetBitrateKbps = effectiveParams.videoBitrate / 1000; + } + if (activeSettings != null) { + CastTuningEngine.EffectiveParams eff = CastTuningEngine.resolve(activeSettings, getPeerStats()); + s.suggestedBitrateKbps = eff.videoBitrate / 1000; + } + NetworkStatsSnapshot peer = getPeerStats(); + if (peer != null && peer.recvBitrateKbps > 0 && s.sendBitrateKbps > peer.recvBitrateKbps * 1.2f) { + s.congestionLevel = Math.max(s.congestionLevel, 1); + } + int qDepth = fanoutPump != null ? fanoutPump.getQueueDepth() + : (sendPump != null ? sendPump.getQueueDepth() : 0); + if (qDepth > 20) { + s.congestionLevel = Math.max(s.congestionLevel, 2); + } + } + + private void scheduleTuningTick() { + mainHandler.postDelayed(() -> { + if (!casting.get() || stopping.get() || activeSettings == null) { + return; + } + NetworkStatsSnapshot peer = getPeerStats(); + PassThroughNetworkControlPlane plane = networkFeedback != null + && networkFeedback.getPlane() instanceof PassThroughNetworkControlPlane + ? (PassThroughNetworkControlPlane) networkFeedback.getPlane() : null; + if (plane != null) { + NetworkStatsSnapshot local = plane.buildLocalStats(System.currentTimeMillis()); + senderMetrics.onNetworkSample(local.sendBitrateKbps, + peer != null ? peer.rttMs : 0); + } + CastTuningEngine.EffectiveParams next = CastTuningEngine.resolve(activeSettings, peer); + long idleMs = lastSignificantFrameMs > 0 + ? System.currentTimeMillis() - lastSignificantFrameMs : 0; + if (idleMs > CastConfig.KEYFRAME_KEEPALIVE_MS && videoEncoder != null) { + runOnProjectionThread(() -> videoEncoder.requestKeyframe()); + } + if (effectiveParams != null && next.videoBitrate != effectiveParams.videoBitrate) { + Log.d(TAG, "Tuning bitrate " + (next.videoBitrate / 1000) + " kbps (next pipeline)"); + } + effectiveParams = next; + maybeAdaptCaptureSize(peer); + String mime = activeSettings != null ? activeSettings.getNegotiatedVideoMime() : null; + CastSendPump pumpForStats = sendPump; + updateStatus(senderMetrics.format(mime, captureWidth, captureHeight, pumpForStats, senderAudioMetrics, + activeSettings != null && activeSettings.isAudioEnabled())); + scheduleTuningTick(); + }, 2_000); + } + + private void maybeAdaptCaptureSize(NetworkStatsSnapshot peer) { + if (calibrationMode || cameraMode || activeSettings == null + || activeSettings.getResolution() != CastSettings.Resolution.ADAPTIVE) { + return; + } + DisplayMetrics metrics = new DisplayMetrics(); + WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); + wm.getDefaultDisplay().getRealMetrics(metrics); + CastResolution.Size size = CastResolution.compute(metrics, activeSettings, peer); + scheduleCaptureSizeUpdate(size, "adaptive"); + } + + private void runOnProjectionThread(Runnable action) { + Handler handler = projectionHandler != null ? projectionHandler : mainHandler; + if (Looper.myLooper() == handler.getLooper()) { + action.run(); + } else { + handler.post(action); + } + } + + private void startAudioPipeline(CastSettings settings, boolean calibrationOnlyMic) { + if (!settings.isAudioEnabled() || Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { + Log.i(TAG, "Audio capture disabled for this session"); + return; + } + if (projection == null && !calibrationOnlyMic) { + Log.w(TAG, "Audio skipped — no MediaProjection"); + return; + } + try { + if (audioEncoder != null) { + audioEncoder.stop(); + } + if (audioCapture != null) { + audioCapture.stop(); + } + CastSettings.AudioCodec effectiveAudio = AudioNegotiator.effective(settings); + audioEncoder = AudioCodecFactory.createEncoder(settings); + CodecSessionRegistry.setAudioBackend( + PassthroughCodecPolicy.audioBackendFor(effectiveAudio, true)); + audioEncoder.prepare(new AudioEncoderSink.Callback() { + private boolean configSent; + + @Override + public void onConfig(int sampleRate, int channels, byte[] csd0) { + if (configSent || stopping.get()) { + return; + } + configSent = true; + Log.i(TAG, "Sending audio config " + sampleRate + "Hz"); + sendSafe(CastProtocol.MSG_AUDIO_CONFIG, + () -> CastProtocol.audioConfigPayload(sampleRate, channels, csd0)); + } + + @Override + public void onEncodedFrame(long ptsUs, byte[] frameData) { + if (frameData == null || frameData.length == 0) { + return; + } + audioFramesSent++; + sendSafe(CastProtocol.MSG_AUDIO_FRAME, + () -> CastProtocol.audioFramePayload(ptsUs, frameData)); + } + }); + audioFramesSent = 0; + senderAudioMetrics.reset(); + audioCaptureMode = "playback"; + audioCapture = new AudioCapture(this); + MediaProjection audioProjection = calibrationOnlyMic ? null : projection; + audioCapture.start(audioProjection, new AudioCapture.Callback() { + @Override + public void onPcm(byte[] pcm, int length, long ptsUs, + com.foxx.androidcast.media.PcmLevelAnalyzer.Levels levels) { + senderAudioMetrics.onPcm(levels); + if (calibrationDriver != null) { + calibrationDriver.setVuFromPcm(pcm, length); + } + if (audioEncoder != null) { + audioEncoder.queuePcm(pcm, length, ptsUs); + } + } + + @Override + public void onCaptureModeChanged(String mode) { + audioCaptureMode = mode; + Log.i(TAG, "Audio capture mode: " + mode); + } + }); + Log.i(TAG, "Audio pipeline started"); + } catch (IOException e) { + Log.e(TAG, "Audio pipeline failed", e); + } + } + + private void handleAudioConsent(boolean accept) { + if (accept) { + if (audioEncoder == null && activeSettings != null) { + startAudioPipeline(activeSettings, activeSettings != null + && activeSettings.getCaptureMode() == CastSettings.CaptureMode.CALIBRATION_TEST); + } + Log.i(TAG, "Receiver accepted audio"); + } else { + if (audioCapture != null) { + audioCapture.stop(); + audioCapture = null; + } + if (audioEncoder != null) { + audioEncoder.stop(); + audioEncoder = null; + } + Log.i(TAG, "Receiver declined audio"); + } + } + + private void enqueueVideoFrame(long ptsUs, boolean keyFrame, byte[] frameData) { + if (fanoutPump != null) { + fanoutPump.enqueueVideo(ptsUs, keyFrame, frameData); + } else if (sendPump != null) { + sendPump.enqueueVideo(ptsUs, keyFrame, frameData); + } + } + + private void sendSafe(byte type, PayloadBuilder builder) { + if (stopping.get() || (sendPump == null && fanoutPump == null)) { + return; + } + try { + byte[] payload = builder.build(); + if (fanoutPump != null) { + fanoutPump.enqueue(type, payload); + } else { + sendPump.enqueue(type, payload); + } + } catch (IOException e) { + if (!stopping.get()) { + Log.w(TAG, "Payload build failed: " + e.getMessage()); + stopping.set(true); + } + } + } + + private interface PayloadBuilder { + byte[] build() throws IOException; + } + + private void acquireWakeLock() { + PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); + wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "AndroidCast:Send"); + wakeLock.acquire(4 * 60 * 60 * 1000L); + } + + private void releaseWakeLock() { + if (wakeLock != null && wakeLock.isHeld()) { + wakeLock.release(); + } + wakeLock = null; + } + + private void releaseAll() { + if (!resourcesReleased.compareAndSet(false, true)) { + return; + } + finishSessionStatsAsync(); + stopping.set(true); + casting.set(false); + CastActiveState.setSenderCasting(false); + CastTrayNotifier.refresh(this); + networkFeedback = null; + calibrationMode = false; + cameraMode = false; + if (audioCapture != null) { + audioCapture.stop(); + audioCapture = null; + } + if (audioEncoder != null) { + audioEncoder.stop(); + audioEncoder = null; + } + Handler ph = projectionHandler; + if (ph != null) { + CountDownLatch latch = new CountDownLatch(1); + ph.post(() -> { + releaseProjectionCapture(); + latch.countDown(); + }); + try { + latch.await(3, TimeUnit.SECONDS); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } else { + releaseProjectionCapture(); + } + if (projectionThread != null) { + projectionThread.quitSafely(); + try { + projectionThread.join(1500); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + projectionThread = null; + projectionHandler = null; + } + if (multiCoordinator != null) { + multiCoordinator.sendGoodbyeAll(); + } else if (session != null) { + try { + session.send(CastProtocol.MSG_GOODBYE, new byte[0]); + } catch (Exception ignored) { + } + } + if (sendPump != null) { + sendPump.stop(); + sendPump = null; + } + com.foxx.androidcast.dev.StreamDumpWriter.finalizeIfActive(this); + if (fanoutPump != null) { + fanoutPump.stop(); + fanoutPump = null; + } + if (multiCoordinator != null) { + multiCoordinator.closeAll(); + multiCoordinator = null; + } else if (session != null) { + session.close(); + session = null; + } + releaseWakeLock(); + } + + private void failAndStop(String message) { + updateStatus(message); + stopping.set(true); + } + + private void stopSelfSafely() { + if (!stopping.compareAndSet(false, true)) { + return; + } + Thread stopper = new Thread(() -> { + releaseAll(); + mainHandler.post(() -> { + stopForeground(STOP_FOREGROUND_REMOVE); + stopSelf(); + }); + }, "CastStop"); + stopper.start(); + } + + private void startSenderForeground(String text, boolean withAudio) { + android.app.Notification n = CastNotifications.sender(this, text, ScreenCastService.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + int fgsType = ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION; + if (withAudio) { + fgsType |= ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE; + } + startForeground(CastNotifications.ID_SENDER, n, fgsType); + } else { + startForeground(CastNotifications.ID_SENDER, n); + } + } + + private TransportLossStats buildSenderLossSnapshot() { + TransportLossStats snap = session != null + ? session.getTransport().getLossStats() : new TransportLossStats(); + if (sendPump != null) { + snap.sendDroppedVideoP = sendPump.getDroppedPFrames(); + snap.sendDroppedAudio = sendPump.getDroppedAudioFrames(); + snap.sendQueueDepth = sendPump.getQueueDepth(); + } else if (fanoutPump != null) { + snap.sendDroppedVideoP = fanoutPump.getDroppedPFrames(); + snap.sendDroppedAudio = fanoutPump.getDroppedAudioFrames(); + snap.sendQueueDepth = fanoutPump.getQueueDepth(); + } + return snap; + } + + private void finishSessionStatsAsync() { + String vCodec = activeSettings != null ? activeSettings.getNegotiatedVideoMime() : ""; + String aCodec = activeSettings != null + ? PassthroughCodecPolicy.displayAudioPreference(AudioNegotiator.effective(activeSettings)) + : ""; + String bwMode = activeSettings != null + ? activeSettings.getBitrateMode().name().toLowerCase() + : ""; + LiveCastControlPlane.onCastStop(vCodec, aCodec, bwMode); + final SessionStatsRecorder recorder = sessionStatsRecorder; + sessionStatsRecorder = null; + if (recorder == null) { + return; + } + if (activeSettings != null) { + recorder.setResolution(captureWidth, captureHeight); + recorder.setCaptureMode(activeSettings.getCaptureMode() != null + ? activeSettings.getCaptureMode().name() : ""); + } + recorder.mergeLoss(buildSenderLossSnapshot()); + recorder.finish(getApplicationContext()); + } + + private void logEncodedCodecSample(String mime, byte[] frameData) { + String probe = com.foxx.androidcast.media.EncodedStreamProbe.describeKeyframe(mime, frameData); + Log.i(TAG, "Encoded stream: " + com.foxx.androidcast.media.CodecNegotiator.displayName(mime) + + " — " + probe); + } + + private void updateStatus(String text) { + status = text; + broadcastStatus(text); + android.app.NotificationManager nm = getSystemService(android.app.NotificationManager.class); + nm.notify(CastNotifications.ID_SENDER, + CastNotifications.sender(this, text, ScreenCastService.class)); + } + + private void broadcastStatus(String s) { + synchronized (callbacks) { + int n = callbacks.beginBroadcast(); + try { + for (int i = 0; i < n; i++) { + try { + callbacks.getBroadcastItem(i).onStatus(s); + } catch (RemoteException ignored) { + } + } + } finally { + callbacks.finishBroadcast(); + } + } + } + + private VideoEncoderSink.Callback buildVideoEncoderCallback(String mime) { + return new VideoEncoderSink.Callback() { + @Override + public void onConfig(int w, int h, byte[] csd0, byte[] csd1) { + if (stopping.get()) { + return; + } + try { + byte[] payload = CastProtocol.streamConfigPayload(w, h, csd0, csd1); + if (fanoutPump != null && multiCoordinator != null) { + multiCoordinator.broadcast(CastProtocol.MSG_STREAM_CONFIG, payload); + } else { + sendSafe(CastProtocol.MSG_STREAM_CONFIG, () -> payload); + } + Log.i(TAG, "Stream config " + w + "x" + h + + " peers=" + (multiCoordinator != null ? multiCoordinator.getPeers().size() : 1)); + runOnProjectionThread(() -> { + if (videoEncoder != null) { + videoEncoder.requestKeyframe(); + } + }); + } catch (IOException e) { + Log.w(TAG, "Stream config failed: " + e.getMessage()); + } + } + + @Override + public void onEncodedFrame(long ptsUs, boolean keyFrame, byte[] frameData) { + if ((sendPump == null && fanoutPump == null) || frameData == null) { + return; + } + boolean tiny = effectiveParams != null && effectiveParams.skipTinyPFrames + && !keyFrame + && frameData.length < CastConfig.MIN_SIGNIFICANT_FRAME_BYTES; + if (tiny) { + return; + } + lastSignificantFrameMs = System.currentTimeMillis(); + senderMetrics.onEncodedFrame(keyFrame); + if (keyFrame) { + logEncodedCodecSample(mime, frameData); + } + enqueueVideoFrame(ptsUs, keyFrame, frameData); + } + }; + } + + private void startCalibrationVideoEncoder(String mime, CastTuningEngine.EffectiveParams params, + VideoEncoderSink.Callback videoCb, boolean tryGles) throws IOException { + if (encoderKeepalive != null) { + encoderKeepalive.stop(); + encoderKeepalive = null; + } + if (calibrationDriver != null) { + calibrationDriver.release(); + calibrationDriver = null; + } + if (videoEncoder != null) { + videoEncoder.stop(); + } + CastSettings.VideoCodec vPref = activeSettings != null + ? activeSettings.getVideoCodec() : CastSettings.VideoCodec.AUTO; + videoEncoder = VideoCodecFactory.createEncoder(vPref); + float density = getResources().getDisplayMetrics().density; + calibrationDriver = new com.foxx.androidcast.sender.calibration.CalibrationCastDriver(this, this); + if (tryGles) { + Surface surface = videoEncoder.prepare(captureWidth, captureHeight, mime, params, videoCb); + calibrationDriver.attachSurface(videoEncoder, surface, captureWidth, captureHeight, density); + videoEncoder.requestKeyframe(); + Log.i(TAG, "Calibration encoder (GLES try) " + captureWidth + "x" + captureHeight + " mime=" + mime); + } else { + videoEncoder.prepareBufferInput(captureWidth, captureHeight, mime, params, videoCb); + calibrationDriver.attachBuffer(videoEncoder, captureWidth, captureHeight, density); + videoEncoder.requestKeyframe(); + Log.i(TAG, "Calibration encoder (buffer) " + captureWidth + "x" + captureHeight + " mime=" + mime); + } + } + + @Override + public void onCalibrationNeedBufferEncoder() { + if (!calibrationMode || stopping.get() || activeSettings == null) { + return; + } + String mime = activeSettings.getNegotiatedVideoMime(); + if (mime == null || mime.isEmpty()) { + return; + } + runOnProjectionThread(() -> { + try { + startCalibrationVideoEncoder(mime, effectiveParams, buildVideoEncoderCallback(mime), false); + } catch (IOException e) { + Log.e(TAG, "Calibration buffer fallback failed", e); + failAndStop("Calibration video failed"); + } + }); + } + + private void releaseProjectionCapture() { + cancelPendingCaptureSizeUpdate(); + captureReconfigureInFlight.set(false); + unregisterDisplayListener(); + if (virtualDisplay != null) { + virtualDisplay.release(); + virtualDisplay = null; + } + if (encoderKeepalive != null) { + encoderKeepalive.stop(); + encoderKeepalive = null; + } + if (cameraCapture != null) { + cameraCapture.stop(); + cameraCapture = null; + } + if (calibrationDriver != null) { + calibrationDriver.release(); + calibrationDriver = null; + } + if (videoEncoder != null) { + videoEncoder.stop(); + videoEncoder = null; + } + if (projection != null) { + projection.stop(); + projection = null; + } + } + + @Override + public IBinder onBind(Intent intent) { + return binder; + } + + @Override + public void onDestroy() { + stopping.set(true); + releaseAll(); + callbacks.kill(); + NetworkSelfTestBridge.stopCapture(this); + super.onDestroy(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/SenderActivity.java b/app/src/main/java/com/foxx/androidcast/sender/SenderActivity.java new file mode 100644 index 0000000..d4b06e0 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/SenderActivity.java @@ -0,0 +1,541 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * SenderActivity.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SenderActivity + * Contributors: + * - Anton Afanasyeu (11 commits, 530 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 082e2d349e90cdbd8693d4c8b6ec2b074963fe63626c33e8305353007871389c +**********************************************************************/ +import android.app.Activity; +import android.content.Intent; +import android.media.projection.MediaProjectionConfig; +import android.media.projection.MediaProjectionManager; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.view.View; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ListView; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.OnBackPressedCallback; +import androidx.appcompat.app.AlertDialog; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.DrawerHostActivity; +import com.foxx.androidcast.CastActiveState; +import com.foxx.androidcast.CastActivityTracker; +import com.foxx.androidcast.CastConfig; +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.PermissionHelper; +import com.foxx.androidcast.PlatformCastSupport; +import com.foxx.androidcast.R; +import com.foxx.androidcast.live.LiveCastPeerTracker; +import com.foxx.androidcast.discovery.DiscoveryManager; +import com.foxx.androidcast.discovery.PinnedReceiversStore; +import com.foxx.androidcast.discovery.ReceiverCompatibility; +import com.google.android.material.switchmaterial.SwitchMaterial; + +public class SenderActivity extends DrawerHostActivity { + private static final int REQUEST_MEDIA_PROJECTION = 2001; + private static final int REQUEST_PREVIEW_PROJECTION = 2002; + + private final CastSettings castSettings = new CastSettings(); + private final Handler handler = new Handler(Looper.getMainLooper()); + private DiscoveryManager discovery; + private DeviceListAdapter deviceAdapter; + private SenderCapturePreview capturePreview; + private SenderScreenPreview screenPreview; + + private TextView statusText; + private ProgressBar discoveryProgress; + private EditText pinInput; + private SwitchMaterial muteSwitch; + private Button startButton; + private boolean pinLocked; + + private enum DiscoveryPhase { + IDLE, SCANNING, PAUSED + } + + private DiscoveryPhase discoveryPhase = DiscoveryPhase.IDLE; + private int discoverySecondsLeft; + private boolean lastScanBurst; + private final Runnable autoScanRunnable = () -> beginScanPass(false); + + private String pendingPin; + private String pendingHost; + private int pendingPort; + private String pendingDeviceName; + private java.util.ArrayList pendingTargets; + + private boolean pendingCameraLaunch; + private boolean previewConsentDeclined; + private boolean previewConsentInFlight; + private final java.util.List lastDiscovered = + new java.util.ArrayList<>(); + + @Override + protected int getContentLayoutId() { + return R.layout.activity_sender; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + PermissionHelper.request(this); + + castSettings.copyFrom(AppPreferences.loadSenderDefaults(this)); + screenPreview = new SenderScreenPreview(this); + + statusText = findViewById(R.id.text_status); + pinInput = findViewById(R.id.edit_pin); + muteSwitch = findViewById(R.id.switch_mute); + startButton = findViewById(R.id.btn_start_cast); + discoveryProgress = findViewById(R.id.progress_discovery); + + pinInput.setText(AppPreferences.getPin(this)); + muteSwitch.setChecked(!castSettings.isAudioRequested()); + muteSwitch.setOnCheckedChangeListener((btn, muted) -> + castSettings.setAudioEnabled(!muted)); + + capturePreview = new SenderCapturePreview( + findViewById(R.id.texture_preview), + findViewById(R.id.text_preview_label), + screenPreview); + View.OnClickListener requestPreviewConsent = v -> { + if (screenPreview.needsProjection(castSettings.getCaptureMode())) { + previewConsentDeclined = false; + maybeRequestPreviewConsent(); + } + }; + findViewById(R.id.text_preview_label).setOnClickListener(requestPreviewConsent); + findViewById(R.id.texture_preview).setOnClickListener(requestPreviewConsent); + ListView listView = findViewById(R.id.list_devices); + listView.setChoiceMode(CastConfig.MULTI_RECEIVER_ENABLED + ? ListView.CHOICE_MODE_MULTIPLE : ListView.CHOICE_MODE_SINGLE); + deviceAdapter = new DeviceListAdapter(this, CastConfig.MULTI_RECEIVER_ENABLED); + listView.setAdapter(deviceAdapter); + listView.setOnItemClickListener((parent, view, position, id) -> { + deviceAdapter.setSelectedPosition(position); + java.util.List selectedList = + deviceAdapter.getSelectedDevices(); + if (selectedList.isEmpty()) { + return; + } + if (!CastConfig.MULTI_RECEIVER_ENABLED) { + for (DiscoveryManager.DiscoveredDevice selected : selectedList) { + if (!castSettings.getTransport().equals(selected.transport)) { + Toast.makeText(this, R.string.transport_mismatch, Toast.LENGTH_LONG).show(); + break; + } + } + } + if (selectedList.size() == 1) { + DiscoveryManager.DiscoveredDevice selected = selectedList.get(0); + statusText.setText(getString(R.string.device_selected, selected.name, selected.host, + selected.transport.toUpperCase())); + } else { + statusText.setText(getString(R.string.devices_selected, selectedList.size())); + } + }); + + discovery = new DiscoveryManager(this); + discovery.setListener(new DiscoveryManager.Listener() { + @Override + public void onDevicesUpdated(java.util.List deviceList) { + lastDiscovered.clear(); + lastDiscovered.addAll(deviceList); + publishFilteredDevices(); + } + + @Override + public void onScanStarted() { + discoveryPhase = DiscoveryPhase.SCANNING; + long passMs = lastScanBurst + ? CastConfig.DISCOVERY_BURST_MS : CastConfig.DISCOVERY_SCAN_PASS_MS; + discoverySecondsLeft = Math.max(1, (int) (passMs / 1000)); + discoveryProgress.setVisibility(View.VISIBLE); + } + + @Override + public void onScanEnded() { + discoveryPhase = DiscoveryPhase.PAUSED; + discoverySecondsLeft = (int) (CastConfig.DISCOVERY_PAUSE_MS / 1000); + discoveryProgress.setVisibility(View.GONE); + handler.removeCallbacks(autoScanRunnable); + handler.postDelayed(autoScanRunnable, CastConfig.DISCOVERY_PAUSE_MS); + } + }); + + getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (CastActiveState.isSenderCasting()) { + Toast.makeText(SenderActivity.this, R.string.cast_in_progress_pin_locked, + Toast.LENGTH_SHORT).show(); + } else { + finish(); + } + } + }); + + startButton.setOnClickListener(v -> + PlatformCastSupport.runWithAudioPolicy(this, castSettings, this::startCastFlow)); + + findViewById(R.id.panel_preview).post(() -> { + refreshPreview(); + maybeRequestPreviewConsent(); + }); + } + + @Override + protected void onResume() { + super.onResume(); + castSettings.copyFrom(AppPreferences.loadSenderDefaults(this)); + publishFilteredDevices(); + muteSwitch.setChecked(!castSettings.isAudioRequested()); + pinLocked = CastActiveState.isSenderCasting(); + pinInput.setEnabled(!pinLocked); + startButton.setEnabled(!pinLocked); + muteSwitch.setEnabled(!pinLocked); + if (pinLocked) { + Toast.makeText(this, R.string.cast_in_progress_pin_locked, Toast.LENGTH_SHORT).show(); + } + refreshPreview(); + if (screenPreview.needsProjection(castSettings.getCaptureMode()) && screenPreview.hasConsent()) { + findViewById(R.id.panel_preview).post(this::refreshPreview); + } else if (!previewConsentDeclined && !previewConsentInFlight) { + findViewById(R.id.panel_preview).post(this::maybeRequestPreviewConsent); + } + PermissionHelper.remindIfMissing(this, castSettings.isAudioEnabled()); + LiveCastPeerTracker.start(this, (deviceIds, usernames) -> runOnUiThread(() -> { + if (deviceAdapter != null) { + deviceAdapter.setLiveIndicators(deviceIds, usernames); + } + })); + } + + private void publishFilteredDevices() { + if (deviceAdapter == null) { + return; + } + java.util.LinkedHashMap merged = + new java.util.LinkedHashMap<>(); + for (DiscoveryManager.DiscoveredDevice d : PinnedReceiversStore.load(this)) { + if (ReceiverCompatibility.isCompatible(d, castSettings)) { + merged.put(d.host + ":" + d.port, d); + } + } + for (DiscoveryManager.DiscoveredDevice d : lastDiscovered) { + if (!ReceiverCompatibility.isCompatible(d, castSettings)) { + continue; + } + String key = d.host + ":" + d.port; + DiscoveryManager.DiscoveredDevice prev = merged.get(key); + if (prev != null && prev.pinnedRecent) { + d.pinnedRecent = true; + } + merged.put(key, d); + } + java.util.List compatible = + new java.util.ArrayList<>(merged.values()); + deviceAdapter.setDevices(compatible); + if (statusText == null) { + return; + } + statusText.setText(compatible.isEmpty() + ? (lastDiscovered.isEmpty() + ? getString(R.string.searching) + : getString(R.string.no_compatible_receivers)) + : getString(R.string.found_receivers, compatible.size())); + } + + private void refreshPreview() { + if (capturePreview == null) { + return; + } + capturePreview.updateForMode(castSettings.getCaptureMode()); + } + + private void maybeRequestPreviewConsent() { + if (previewConsentDeclined || previewConsentInFlight) { + return; + } + CastSettings.CaptureMode mode = castSettings.getCaptureMode(); + if (!screenPreview.needsProjection(mode) || screenPreview.hasConsent()) { + return; + } + previewConsentInFlight = true; + MediaProjectionManager mgr = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE); + startActivityForResult(createScreenCaptureIntent(mgr), REQUEST_PREVIEW_PROJECTION); + } + + @Override + protected void onPause() { + LiveCastPeerTracker.stop(); + if (capturePreview != null) { + capturePreview.pause(); + } + super.onPause(); + } + + @Override + protected void onDestroy() { + if (capturePreview != null) { + capturePreview.stop(); + } + if (screenPreview != null) { + screenPreview.releaseConsent(); + } + super.onDestroy(); + } + + @Override + protected void onStart() { + super.onStart(); + beginScanPass(false); + } + + @Override + protected void onStop() { + handler.removeCallbacks(autoScanRunnable); + if (discovery != null) { + discovery.stop(); + } + discoveryPhase = DiscoveryPhase.IDLE; + super.onStop(); + } + + private void beginScanPass(boolean userInitiated) { + if (discovery != null && discovery.isBrowsing()) { + return; + } + if (userInitiated) { + deviceAdapter.clearDevices(); + statusText.setText(R.string.rescanning); + } else if (deviceAdapter.getCount() == 0) { + statusText.setText(R.string.searching); + } + if (discovery != null) { + discovery.stop(); + if (userInitiated) { + discovery.clearDevices(); + } + } + lastScanBurst = userInitiated; + discovery.startBrowsing(userInitiated); + } + + private void startCastFlow() { + PermissionHelper.remindIfMissing(this, castSettings.isAudioEnabled()); + if (!PermissionHelper.hasAll(this)) { + return; + } + if (castSettings.isPassthrough()) { + Toast.makeText(this, R.string.codec_passthrough_unavailable, Toast.LENGTH_LONG).show(); + return; + } + + String pin = pinInput.getText().toString().trim(); + if (!AppPreferences.getPin(this).equals(pin)) { + AppPreferences.setPin(this, pin); + } + + java.util.List selectedList = + deviceAdapter.getSelectedDevices(); + if (selectedList.isEmpty()) { + Toast.makeText(this, R.string.select_receiver, Toast.LENGTH_SHORT).show(); + return; + } + for (DiscoveryManager.DiscoveredDevice d : selectedList) { + if (!d.pinMatches(pin)) { + showPinMismatchDialog(selectedList); + return; + } + } + + if (CastConfig.MULTI_RECEIVER_ENABLED && selectedList.size() > CastConfig.MAX_RECEIVERS) { + Toast.makeText(this, getString(R.string.too_many_receivers, CastConfig.MAX_RECEIVERS), + Toast.LENGTH_LONG).show(); + return; + } + + pendingTargets = new java.util.ArrayList<>(); + for (DiscoveryManager.DiscoveredDevice d : selectedList) { + if (!CastConfig.MULTI_RECEIVER_ENABLED + && !castSettings.getTransport().equals(d.transport)) { + Toast.makeText(this, R.string.transport_mismatch, Toast.LENGTH_LONG).show(); + return; + } + PinnedReceiversStore.recordSuccess(this, d); + pendingTargets.add(new CastReceiverTarget(d.name, d.host, d.port, d.transport, + d.videoCodecs, d.audioCodecs, d.placeholderId)); + } + DiscoveryManager.DiscoveredDevice first = selectedList.get(0); + pendingHost = first.host; + pendingPort = first.port; + pendingDeviceName = selectedList.size() > 1 + ? first.name + " +" + (selectedList.size() - 1) : first.name; + pendingPin = pin; + + proceedCaptureConsent(); + } + + private void showPinMismatchDialog(java.util.List selectedList) { + final EditText input = new EditText(this); + input.setHint(R.string.pin_session_hint); + input.setInputType(android.text.InputType.TYPE_CLASS_NUMBER + | android.text.InputType.TYPE_NUMBER_VARIATION_PASSWORD); + new AlertDialog.Builder(this) + .setTitle(R.string.pin_mismatch_title) + .setMessage(R.string.pin_mismatch_message) + .setView(input) + .setPositiveButton(android.R.string.ok, (d, w) -> { + String sessionPin = input.getText().toString().trim(); + pinInput.setText(sessionPin); + for (DiscoveryManager.DiscoveredDevice dev : selectedList) { + if (!dev.pinMatches(sessionPin)) { + Toast.makeText(this, R.string.pin_mismatch_title, Toast.LENGTH_LONG).show(); + return; + } + } + pendingPin = sessionPin; + pendingTargets = new java.util.ArrayList<>(); + for (DiscoveryManager.DiscoveredDevice dev : selectedList) { + pendingTargets.add(new CastReceiverTarget(dev.name, dev.host, dev.port, + dev.transport, dev.videoCodecs, dev.audioCodecs, dev.placeholderId)); + } + DiscoveryManager.DiscoveredDevice first = selectedList.get(0); + pendingHost = first.host; + pendingPort = first.port; + pendingDeviceName = selectedList.size() > 1 + ? first.name + " +" + (selectedList.size() - 1) : first.name; + proceedCaptureConsent(); + }) + .setNegativeButton(android.R.string.cancel, null) + .show(); + } + + private void proceedCaptureConsent() { + if (castSettings.getCaptureMode() == CastSettings.CaptureMode.CALIBRATION_TEST) { + launchCastService(null, Activity.RESULT_OK); + return; + } + if (castSettings.isCameraCapture()) { + if (androidx.core.content.ContextCompat.checkSelfPermission(this, + android.Manifest.permission.CAMERA) != android.content.pm.PackageManager.PERMISSION_GRANTED) { + androidx.core.app.ActivityCompat.requestPermissions(this, + new String[] {android.Manifest.permission.CAMERA}, PermissionHelper.REQUEST_CODE); + pendingCameraLaunch = true; + return; + } + launchCastService(null, Activity.RESULT_OK); + return; + } + if (screenPreview.hasConsent()) { + screenPreview.pauseForCastStart(); + launchCastService(screenPreview.getProjectionData(), screenPreview.getProjectionResultCode()); + return; + } + MediaProjectionManager mgr = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE); + startActivityForResult(createScreenCaptureIntent(mgr), REQUEST_MEDIA_PROJECTION); + } + + private android.content.Intent createScreenCaptureIntent(MediaProjectionManager mgr) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE + && castSettings.getCaptureMode() == CastSettings.CaptureMode.USER_CHOICE) { + MediaProjectionConfig config = MediaProjectionConfig.createConfigForUserChoice(); + return mgr.createScreenCaptureIntent(config); + } + return mgr.createScreenCaptureIntent(); + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == PermissionHelper.REQUEST_CODE && pendingCameraLaunch) { + pendingCameraLaunch = false; + if (grantResults.length > 0 && grantResults[0] == android.content.pm.PackageManager.PERMISSION_GRANTED) { + launchCastService(null, Activity.RESULT_OK); + } else { + Toast.makeText(this, R.string.capture_camera_permission_denied, Toast.LENGTH_LONG).show(); + } + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == REQUEST_PREVIEW_PROJECTION) { + previewConsentInFlight = false; + if (resultCode == Activity.RESULT_OK && data != null) { + screenPreview.setProjectionResult(resultCode, data); + previewConsentDeclined = false; + findViewById(R.id.panel_preview).post(() -> { + refreshPreview(); + findViewById(R.id.panel_preview).postDelayed(this::refreshPreview, 200); + }); + } else { + previewConsentDeclined = true; + refreshPreview(); + } + return; + } + if (requestCode != REQUEST_MEDIA_PROJECTION) { + return; + } + if (resultCode != Activity.RESULT_OK || pendingHost == null) { + Toast.makeText(this, R.string.capture_denied, Toast.LENGTH_SHORT).show(); + return; + } + screenPreview.setProjectionResult(resultCode, data); + launchCastService(data, resultCode); + } + + private void launchCastService(Intent projectionData, int resultCode) { + if (screenPreview != null) { + screenPreview.pauseForCastStart(); + } + pinLocked = true; + pinInput.setEnabled(false); + startButton.setEnabled(false); + muteSwitch.setEnabled(false); + + Intent serviceIntent = new Intent(this, ScreenCastService.class); + serviceIntent.putExtra(ScreenCastService.EXTRA_RESULT_CODE, resultCode); + if (projectionData != null) { + serviceIntent.putExtra(ScreenCastService.EXTRA_RESULT_DATA, new Intent(projectionData)); + } + serviceIntent.putExtra(ScreenCastService.EXTRA_HOST, pendingHost); + serviceIntent.putExtra(ScreenCastService.EXTRA_PORT, pendingPort); + serviceIntent.putExtra(ScreenCastService.EXTRA_PIN, pendingPin != null ? pendingPin : ""); + serviceIntent.putExtra(ScreenCastService.EXTRA_DEVICE_NAME, pendingDeviceName); + serviceIntent.putExtra(ScreenCastService.EXTRA_SENDER_NAME, AppPreferences.getUsername(this)); + serviceIntent.putExtra(CastSettings.EXTRA, castSettings); + if (castSettings.getCaptureMode() == CastSettings.CaptureMode.CALIBRATION_TEST) { + serviceIntent.putExtra(ScreenCastService.EXTRA_CALIBRATION, true); + } + if (pendingTargets != null && !pendingTargets.isEmpty()) { + serviceIntent.putExtra(ScreenCastService.EXTRA_TARGETS, pendingTargets); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(serviceIntent); + } else { + startService(serviceIntent); + } + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + Toast.makeText(this, R.string.sender_check_notification, Toast.LENGTH_LONG).show(); + moveTaskToBack(true); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/SenderAudioMetrics.java b/app/src/main/java/com/foxx/androidcast/sender/SenderAudioMetrics.java new file mode 100644 index 0000000..48be395 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/SenderAudioMetrics.java @@ -0,0 +1,72 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * SenderAudioMetrics.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SenderAudioMetrics + * Contributors: + * - Anton Afanasyeu (2 commits, 68 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 e9fabee1f157bc069f89481a2f5d9bb0b503e7dcf77a8282ebce6974089b1cf8 +**********************************************************************/ +import com.foxx.androidcast.media.PcmLevelAnalyzer; + +/** Pre-encode PCM level stats on the sender. */ +public final class SenderAudioMetrics { + private long silentBlocks; + private long audibleBlocks; + private float vuSmoothed; + private float lastPeakDb = -96f; + private float lastRmsDb = -96f; + + public synchronized void onPcm(PcmLevelAnalyzer.Levels levels) { + if (levels == null) { + return; + } + if (levels.silent) { + silentBlocks++; + } else { + audibleBlocks++; + } + float instant = Math.max(levels.peak, levels.rms); + vuSmoothed = instant > vuSmoothed + ? instant * 0.35f + vuSmoothed * 0.65f + : instant * 0.12f + vuSmoothed * 0.88f; + if (levels.peak > 1e-9f) { + lastPeakDb = levels.peakDb(); + } + if (levels.rms > 1e-9f) { + lastRmsDb = (float) (20.0 * Math.log10(levels.rms)); + } + } + + public synchronized void reset() { + silentBlocks = 0; + audibleBlocks = 0; + vuSmoothed = 0f; + lastPeakDb = -96f; + lastRmsDb = -96f; + } + + public synchronized long getSilentBlocks() { + return silentBlocks; + } + + public synchronized long getAudibleBlocks() { + return audibleBlocks; + } + + public synchronized int getVuPercent() { + return PcmLevelAnalyzer.vuPercent(vuSmoothed); + } + + public synchronized float getLastPeakDb() { + return lastPeakDb; + } + + public synchronized float getLastRmsDb() { + return lastRmsDb; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/SenderCapturePreview.java b/app/src/main/java/com/foxx/androidcast/sender/SenderCapturePreview.java new file mode 100644 index 0000000..83f5a1c --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/SenderCapturePreview.java @@ -0,0 +1,312 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * SenderCapturePreview.java + * Created at: Sun 17 May 2026 18:17:14 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SenderCapturePreview + * Contributors: + * - Anton Afanasyeu (4 commits, 308 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 f929bdc17ad56e989460b0d6d090ee734db470b5b08d7931d22f5ece19040058 +**********************************************************************/ +import android.Manifest; +import android.content.Context; +import android.content.pm.PackageManager; +import android.graphics.Canvas; +import android.graphics.SurfaceTexture; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraDevice; +import android.hardware.camera2.CameraManager; +import android.hardware.camera2.CaptureRequest; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; +import android.util.Size; +import android.view.TextureView; +import android.widget.TextView; + +import androidx.core.content.ContextCompat; + +import com.foxx.androidcast.CastActiveState; +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.R; +import com.foxx.androidcast.sender.calibration.TvCalibrationGenerator; + +import java.util.Collections; + +/** Live preview of the configured capture source on the sender screen (not the cast pipeline). */ +public final class SenderCapturePreview { + private static final String TAG = "SenderCapturePreview"; + + private final TextureView textureView; + private final TextView labelView; + private final SenderScreenPreview screenPreview; + private HandlerThread thread; + private Handler handler; + private CameraDevice camera; + private android.hardware.camera2.CameraCaptureSession session; + private boolean useFront; + private CastSettings.CaptureMode activeMode = CastSettings.CaptureMode.FULL_SCREEN; + + public SenderCapturePreview(TextureView texture, TextView label, SenderScreenPreview screen) { + this.textureView = texture; + this.labelView = label; + this.screenPreview = screen; + textureView.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { + if (right - left > 0 && bottom - top > 0 + && screenPreview != null + && screenPreview.needsProjection(activeMode) + && screenPreview.hasConsent()) { + labelView.setVisibility(android.view.View.GONE); + textureView.setVisibility(android.view.View.VISIBLE); + screenPreview.attach(textureView, activeMode); + } + }); + } + + public SenderScreenPreview getScreenPreview() { + return screenPreview; + } + + public void updateForMode(CastSettings.CaptureMode mode) { + activeMode = mode; + stopCamera(); + if (CastActiveState.isSenderCasting()) { + showCastingPlaceholder(); + return; + } + if (mode == CastSettings.CaptureMode.CAMERA) { + useFront = false; + startCameraPreview(); + } else if (mode == CastSettings.CaptureMode.CAMERA_FRONT) { + useFront = true; + startCameraPreview(); + } else if (mode == CastSettings.CaptureMode.CALIBRATION_TEST) { + showCalibrationPreview(); + } else if (screenPreview != null && screenPreview.needsProjection(mode)) { + if (screenPreview.hasConsent()) { + labelView.setVisibility(android.view.View.GONE); + textureView.setVisibility(android.view.View.VISIBLE); + screenPreview.attach(textureView, mode); + } else { + showLabel(R.string.preview_tap_for_screen); + } + } else { + showLabel(R.string.preview_placeholder); + } + } + + private void showLabel(int textRes) { + if (screenPreview != null) { + screenPreview.stop(); + } + textureView.setVisibility(android.view.View.GONE); + labelView.setVisibility(android.view.View.VISIBLE); + labelView.setText(labelView.getContext().getString(textRes)); + } + + public void showCastingPlaceholder() { + if (screenPreview != null) { + screenPreview.pausePreview(); + } + stopCamera(); + textureView.setVisibility(android.view.View.GONE); + labelView.setVisibility(android.view.View.VISIBLE); + labelView.setText(labelView.getContext().getString(R.string.preview_casting_active)); + } + + private void showCalibrationPreview() { + if (screenPreview != null) { + screenPreview.stop(); + } + labelView.setVisibility(android.view.View.GONE); + textureView.setVisibility(android.view.View.VISIBLE); + textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { + @Override + public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { + drawCalibrationFrame(); + } + + @Override + public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { + drawCalibrationFrame(); + } + + @Override + public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { + return true; + } + + @Override + public void onSurfaceTextureUpdated(SurfaceTexture surface) {} + }); + if (textureView.isAvailable()) { + drawCalibrationFrame(); + } + } + + private void drawCalibrationFrame() { + int w = Math.max(320, textureView.getWidth()); + int h = Math.max(240, textureView.getHeight()); + Canvas canvas = textureView.lockCanvas(); + if (canvas == null) { + return; + } + try { + TvCalibrationGenerator.drawChart(canvas, w, h, textureView.getContext()); + } finally { + textureView.unlockCanvasAndPost(canvas); + } + } + + private void startCameraPreview() { + if (screenPreview != null) { + screenPreview.stop(); + } + Context ctx = textureView.getContext(); + if (ContextCompat.checkSelfPermission(ctx, Manifest.permission.CAMERA) + != PackageManager.PERMISSION_GRANTED) { + showLabel(R.string.capture_camera_permission_denied); + return; + } + labelView.setVisibility(android.view.View.GONE); + textureView.setVisibility(android.view.View.VISIBLE); + if (textureView.isAvailable()) { + openCamera(textureView.getSurfaceTexture()); + } else { + textureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { + @Override + public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { + openCamera(surface); + } + + @Override + public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {} + + @Override + public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { + stop(); + return true; + } + + @Override + public void onSurfaceTextureUpdated(SurfaceTexture surface) {} + }); + } + } + + private void openCamera(SurfaceTexture surface) { + Context ctx = textureView.getContext().getApplicationContext(); + thread = new HandlerThread("SenderPreviewCam"); + thread.start(); + handler = new Handler(thread.getLooper()); + try { + CameraManager mgr = ctx.getSystemService(CameraManager.class); + String id = chooseCamera(mgr, useFront); + if (id == null) { + showLabel(R.string.capture_camera_open_failed); + return; + } + surface.setDefaultBufferSize(640, 480); + mgr.openCamera(id, new CameraDevice.StateCallback() { + @Override + public void onOpened(CameraDevice device) { + camera = device; + try { + android.view.Surface previewSurface = new android.view.Surface(surface); + CaptureRequest.Builder b = + device.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); + b.addTarget(previewSurface); + device.createCaptureSession(Collections.singletonList(previewSurface), + new android.hardware.camera2.CameraCaptureSession.StateCallback() { + @Override + public void onConfigured( + android.hardware.camera2.CameraCaptureSession s) { + session = s; + try { + s.setRepeatingRequest(b.build(), null, handler); + } catch (CameraAccessException e) { + Log.w(TAG, "Preview request failed", e); + } + } + + @Override + public void onConfigureFailed( + android.hardware.camera2.CameraCaptureSession s) { + Log.w(TAG, "Preview session failed"); + } + }, handler); + } catch (CameraAccessException e) { + Log.w(TAG, "Preview session", e); + } + } + + @Override + public void onDisconnected(CameraDevice device) { + device.close(); + } + + @Override + public void onError(CameraDevice device, int error) { + device.close(); + } + }, handler); + } catch (CameraAccessException | SecurityException e) { + Log.w(TAG, "Open camera failed", e); + showLabel(R.string.capture_camera_open_failed); + } + } + + private static String chooseCamera(CameraManager mgr, boolean front) throws CameraAccessException { + int want = front ? CameraCharacteristics.LENS_FACING_FRONT + : CameraCharacteristics.LENS_FACING_BACK; + for (String id : mgr.getCameraIdList()) { + Integer facing = mgr.getCameraCharacteristics(id) + .get(CameraCharacteristics.LENS_FACING); + if (facing != null && facing == want) { + return id; + } + } + String[] ids = mgr.getCameraIdList(); + return ids.length > 0 ? ids[0] : null; + } + + public void pause() { + stopCamera(); + if (screenPreview != null) { + screenPreview.pausePreview(); + } + } + + public void stop() { + stopCamera(); + if (screenPreview != null) { + screenPreview.stop(); + } + } + + private void stopCamera() { + if (session != null) { + try { + session.close(); + } catch (Exception ignored) { + } + session = null; + } + if (camera != null) { + try { + camera.close(); + } catch (Exception ignored) { + } + camera = null; + } + if (thread != null) { + thread.quitSafely(); + thread = null; + } + handler = null; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/SenderPreviewService.java b/app/src/main/java/com/foxx/androidcast/sender/SenderPreviewService.java new file mode 100644 index 0000000..7afd53c --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/SenderPreviewService.java @@ -0,0 +1,75 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * SenderPreviewService.java + * Created at: Tue 19 May 2026 12:23:39 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SenderPreviewService + * Contributors: + * - Anton Afanasyeu (2 commits, 71 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 78df1d1f91b8baa1c9c4cb6344006edd47d13d1380a146ce7f450ca3fe87e913 +**********************************************************************/ +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.IBinder; + +import androidx.annotation.Nullable; + +import com.foxx.androidcast.CastNotifications; + +/** + * Foreground service so {@link SenderScreenPreview} can use MediaProjection on Android 10+. + * Stopped when screen cast {@link ScreenCastService} starts (that service holds projection FGS). + */ +public final class SenderPreviewService extends Service { + private static volatile boolean running; + + public static boolean isRunning() { + return running; + } + + public static void start(Context context) { + Intent intent = new Intent(context, SenderPreviewService.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(intent); + } else { + context.startService(intent); + } + } + + public static void stop(Context context) { + context.stopService(new Intent(context, SenderPreviewService.class)); + } + + @Override + public void onCreate() { + super.onCreate(); + CastNotifications.createChannels(this); + running = true; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + startForeground(CastNotifications.ID_SENDER + 100, + CastNotifications.sender(this, getString(com.foxx.androidcast.R.string.preview_screen_active), + SenderPreviewService.class)); + return START_STICKY; + } + + @Override + public void onDestroy() { + running = false; + stopForeground(STOP_FOREGROUND_REMOVE); + super.onDestroy(); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/SenderResolutionUi.java b/app/src/main/java/com/foxx/androidcast/sender/SenderResolutionUi.java new file mode 100644 index 0000000..d2ece53 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/SenderResolutionUi.java @@ -0,0 +1,111 @@ +package com.foxx.androidcast.sender; + +import android.content.Context; + +import androidx.appcompat.app.AppCompatActivity; + +import android.widget.Spinner; + +import com.foxx.androidcast.BuildConfig; +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.CastSettingsBinder; +import com.foxx.androidcast.R; + +/** Binds {@link R.id#spinner_sender_resolution} per {@link SenderResolutionUiMode}. */ +public final class SenderResolutionUi { + private SenderResolutionUi() {} + + public static SenderResolutionUiMode mode(Context context) { + if (!BuildConfig.DEBUG) { + return SenderResolutionUiMode.SEPARATED; + } + return AppPreferences.getDevSenderResolutionUiMode(context); + } + + public static void bindSenderResolution(AppCompatActivity activity, CastSettings settings) { + Spinner spinner = activity.findViewById(R.id.spinner_sender_resolution); + if (spinner == null) { + return; + } + switch (mode(activity)) { + case LEGACY: + bindLegacy(activity, settings, spinner); + break; + case COMBINED: + bindCombined(activity, settings, spinner); + break; + case SEPARATED: + default: + bindSeparated(activity, settings, spinner); + break; + } + } + + public static void readSenderResolution(AppCompatActivity activity, CastSettings settings) { + Spinner spinner = activity.findViewById(R.id.spinner_sender_resolution); + if (spinner != null) { + CastSettingsBinder.readEnumSpinner(spinner, settings::setResolution); + } + } + + /** Original / 720p / 480p / Auto. */ + private static void bindSeparated(AppCompatActivity activity, CastSettings settings, Spinner spinner) { + CastSettings.Resolution[] modes = { + CastSettings.Resolution.FULL, + CastSettings.Resolution.HD_720P, + CastSettings.Resolution.SD_480P, + CastSettings.Resolution.ADAPTIVE, + }; + String[] labels = { + activity.getString(R.string.resolution_preset_original), + activity.getString(R.string.resolution_preset_720p), + activity.getString(R.string.resolution_preset_480p), + activity.getString(R.string.resolution_preset_auto), + }; + CastSettingsBinder.bindEnumSpinner(spinner, modes, labels, settings.getResolution(), + settings::setResolution); + } + + /** Fixed 480p + fixed 720p + native original + bandwidth adaptive. */ + private static void bindCombined(AppCompatActivity activity, CastSettings settings, Spinner spinner) { + CastSettings.Resolution[] modes = { + CastSettings.Resolution.SD_480P, + CastSettings.Resolution.HD_720P, + CastSettings.Resolution.FULL, + CastSettings.Resolution.ADAPTIVE, + }; + String[] labels = { + activity.getString(R.string.resolution_preset_480p), + activity.getString(R.string.resolution_preset_720p), + activity.getString(R.string.resolution_combined_original), + activity.getString(R.string.resolution_combined_adaptive), + }; + CastSettingsBinder.bindEnumSpinner(spinner, modes, labels, settings.getResolution(), + settings::setResolution); + } + + /** Pre-refactor sender resolution list (subset previously in CastSettingsBinder). */ + private static void bindLegacy(AppCompatActivity activity, CastSettings settings, Spinner spinner) { + CastSettings.Resolution[] modes = { + CastSettings.Resolution.ADAPTIVE, + CastSettings.Resolution.FIXED_1080P, + CastSettings.Resolution.FIXED_720P, + CastSettings.Resolution.FULL, + CastSettings.Resolution.THREE_QUARTERS, + CastSettings.Resolution.HALF, + CastSettings.Resolution.HD_720P, + }; + String[] labels = { + activity.getString(R.string.resolution_adaptive), + activity.getString(R.string.resolution_fixed_1080p), + activity.getString(R.string.resolution_fixed_720p), + activity.getString(R.string.resolution_full), + activity.getString(R.string.resolution_75), + activity.getString(R.string.resolution_half), + activity.getString(R.string.resolution_720p), + }; + CastSettingsBinder.bindEnumSpinner(spinner, modes, labels, settings.getResolution(), + settings::setResolution); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/SenderResolutionUiMode.java b/app/src/main/java/com/foxx/androidcast/sender/SenderResolutionUiMode.java new file mode 100644 index 0000000..3999a0e --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/SenderResolutionUiMode.java @@ -0,0 +1,15 @@ +package com.foxx.androidcast.sender; + +/** + * Developer-only: how the sender resolution spinner is presented. + *

    + *
  • {@link #SEPARATED} — Original / 720p / 480p / Auto (default)
  • + *
  • {@link #LEGACY} — full pre-refactor preset list
  • + *
  • {@link #COMBINED} — fixed 480p + fixed 720p + full original + BW adaptive
  • + *
+ */ +public enum SenderResolutionUiMode { + SEPARATED, + LEGACY, + COMBINED +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/SenderScreenPreview.java b/app/src/main/java/com/foxx/androidcast/sender/SenderScreenPreview.java new file mode 100644 index 0000000..50f33f4 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/SenderScreenPreview.java @@ -0,0 +1,231 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * SenderScreenPreview.java + * Created at: Sun 17 May 2026 18:17:14 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SenderScreenPreview + * Contributors: + * - Anton Afanasyeu (4 commits, 219 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 b9b6dbedccd033a03ad46b7c964368a50143de6c208d2b14a4dd51ad359e4237 +**********************************************************************/ +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.graphics.SurfaceTexture; +import android.hardware.display.DisplayManager; +import android.hardware.display.VirtualDisplay; +import android.media.projection.MediaProjection; +import android.media.projection.MediaProjectionManager; +import android.os.Handler; +import android.os.Looper; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Surface; +import android.view.TextureView; +import android.view.WindowManager; + +import com.foxx.androidcast.CastActiveState; +import com.foxx.androidcast.CastSettings; + +/** + * Live screen preview via MediaProjection into a {@link TextureView} (prep only, not the cast encoder). + */ +public final class SenderScreenPreview { + private static final String TAG = "SenderScreenPreview"; + private static final int PREVIEW_DPI = 160; + + private final Context appContext; + private MediaProjection projection; + private VirtualDisplay virtualDisplay; + private final Handler mainHandler = new Handler(Looper.getMainLooper()); + private int resultCode; + private Intent resultData; + private TextureView boundTexture; + private CastSettings.CaptureMode boundMode; + + public SenderScreenPreview(Context context) { + appContext = context.getApplicationContext(); + } + + public boolean needsProjection(CastSettings.CaptureMode mode) { + return mode == CastSettings.CaptureMode.FULL_SCREEN + || mode == CastSettings.CaptureMode.USER_CHOICE; + } + + public void setProjectionResult(int resultCode, Intent data) { + this.resultCode = resultCode; + this.resultData = data != null ? new Intent(data) : null; + } + + public Intent getProjectionData() { + return resultData != null ? new Intent(resultData) : null; + } + + public int getProjectionResultCode() { + return resultCode; + } + + /** User granted capture consent (may not have an active {@link MediaProjection} after pause). */ + public boolean hasConsent() { + return resultCode == Activity.RESULT_OK && resultData != null; + } + + public boolean hasProjection() { + return hasConsent(); + } + + public void attach(TextureView textureView, CastSettings.CaptureMode mode) { + if (CastActiveState.isSenderCasting() || !needsProjection(mode) || !hasConsent()) { + return; + } + boundTexture = textureView; + boundMode = mode; + textureView.setSurfaceTextureListener(surfaceListener); + textureView.post(() -> ensureVirtualDisplay(textureView, mode)); + } + + private final TextureView.SurfaceTextureListener surfaceListener = + new TextureView.SurfaceTextureListener() { + @Override + public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { + if (boundTexture != null && boundMode != null) { + ensureVirtualDisplay(boundTexture, boundMode); + } + } + + @Override + public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { + if (boundTexture != null && boundMode != null && width > 0 && height > 0) { + ensureVirtualDisplay(boundTexture, boundMode); + } + } + + @Override + public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { + pausePreview(); + return true; + } + + @Override + public void onSurfaceTextureUpdated(SurfaceTexture surface) {} + }; + + private void ensureProjection() { + if (projection != null || resultData == null) { + return; + } + if (!CastActiveState.isSenderCasting() && !SenderPreviewService.isRunning()) { + SenderPreviewService.start(appContext); + } + MediaProjectionManager mgr = + appContext.getSystemService(MediaProjectionManager.class); + projection = mgr.getMediaProjection(resultCode, resultData); + if (projection == null) { + Log.w(TAG, "MediaProjection unavailable for preview"); + return; + } + projection.registerCallback(new MediaProjection.Callback() { + @Override + public void onStop() { + pausePreview(); + projection = null; + } + }, mainHandler); + } + + private void ensureVirtualDisplay(TextureView textureView, CastSettings.CaptureMode mode) { + if (CastActiveState.isSenderCasting() || !needsProjection(mode) || !hasConsent()) { + return; + } + try { + ensureProjection(); + if (projection == null) { + return; + } + DisplayMetrics metrics = new DisplayMetrics(); + WindowManager wm = (WindowManager) appContext.getSystemService(Context.WINDOW_SERVICE); + wm.getDefaultDisplay().getRealMetrics(metrics); + int viewW = textureView.getWidth(); + int viewH = textureView.getHeight(); + if (viewW <= 0 || viewH <= 0) { + textureView.post(() -> ensureVirtualDisplay(textureView, mode)); + return; + } + int w = Math.max(320, viewW); + int h = Math.max(240, viewH); + SurfaceTexture st = textureView.getSurfaceTexture(); + if (st == null) { + return; + } + st.setDefaultBufferSize(w, h); + if (virtualDisplay != null) { + virtualDisplay.resize(w, h, PREVIEW_DPI); + virtualDisplay.setSurface(new Surface(st)); + Log.i(TAG, "Screen preview resized " + w + "x" + h); + return; + } + virtualDisplay = projection.createVirtualDisplay( + "CastPreview", + w, + h, + PREVIEW_DPI, + DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, + new Surface(st), + null, + mainHandler); + Log.i(TAG, "Screen preview " + w + "x" + h); + } catch (Exception e) { + Log.w(TAG, "Screen preview failed: " + e.getMessage(), e); + pausePreview(); + } + } + + /** Tear down preview display only; keep consent for resume or cast START. */ + public void pausePreview() { + if (virtualDisplay != null) { + virtualDisplay.release(); + virtualDisplay = null; + } + } + + public void stop() { + boundTexture = null; + boundMode = null; + pausePreview(); + if (projection != null) { + try { + projection.stop(); + } catch (Exception ignored) { + } + projection = null; + } + if (!CastActiveState.isSenderCasting()) { + SenderPreviewService.stop(appContext); + } + } + + /** Pause preview surface only; keep MediaProjection consent for cast START. */ + public void pauseForCastStart() { + boundTexture = null; + boundMode = null; + pausePreview(); + if (projection != null) { + try { + projection.stop(); + } catch (Exception ignored) { + } + projection = null; + } + SenderPreviewService.stop(appContext); + } + + /** Release consent and active capture (leaving sender screen). */ + public void releaseConsent() { + stop(); + resultCode = 0; + resultData = null; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/SenderStreamMetrics.java b/app/src/main/java/com/foxx/androidcast/sender/SenderStreamMetrics.java new file mode 100644 index 0000000..11af25c --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/SenderStreamMetrics.java @@ -0,0 +1,103 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * SenderStreamMetrics.java + * Created at: Fri 15 May 2026 20:37:44 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SenderStreamMetrics + * Contributors: + * - Anton Afanasyeu (3 commits, 84 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 65d468449f4cd236559457f2519730c3c07688bfe3082a961c081d6bd629d7f0 +**********************************************************************/ +import com.foxx.androidcast.network.diag.DiagPingMetrics; + +/** Sender-side encode/send counters for notification diagnostics. */ +public final class SenderStreamMetrics { + private long encodedFrames; + private long keyFrames; + private long windowFrames; + private long windowStartMs; + private float lastSecondFps; + private int lastSendKbps; + private int peerRttMs; + private DiagPingMetrics.Snapshot diagPing = DiagPingMetrics.Snapshot.EMPTY; + + public synchronized void onDiagPingSample(DiagPingMetrics.Snapshot sample) { + diagPing = sample != null ? sample : DiagPingMetrics.Snapshot.EMPTY; + if (diagPing.avgRttMs > 0) { + peerRttMs = diagPing.avgRttMs; + } else if (diagPing.lastRttMs > 0) { + peerRttMs = diagPing.lastRttMs; + } + } + + public synchronized void onEncodedFrame(boolean keyFrame) { + long now = System.currentTimeMillis(); + encodedFrames++; + if (keyFrame) { + keyFrames++; + } + if (windowStartMs == 0) { + windowStartMs = now; + } + if (now - windowStartMs >= 1000) { + lastSecondFps = windowFrames; + windowFrames = 0; + windowStartMs = now; + } + windowFrames++; + } + + public synchronized float getLastSecondFps() { + return lastSecondFps; + } + + public synchronized void onNetworkSample(int sendKbps, int rttMs) { + if (sendKbps > 0) { + lastSendKbps = sendKbps; + } + if (rttMs > 0) { + peerRttMs = rttMs; + } + } + + public synchronized String format(String videoCodec, int captureW, int captureH, CastSendPump pump, + SenderAudioMetrics audio, boolean audioEnabled) { + float fps = lastSecondFps > 0 ? lastSecondFps : 0f; + StringBuilder sb = new StringBuilder(); + if (videoCodec != null && !videoCodec.isEmpty()) { + sb.append(com.foxx.androidcast.media.CodecNegotiator.displayName(videoCodec)).append(' '); + } + sb.append(captureW).append('x').append(captureH); + sb.append(" · enc ").append(fps > 0 ? String.format("%.0f", fps) : "?").append(" fps"); + if (lastSendKbps > 0) { + sb.append(" · tx ").append(lastSendKbps).append(" kbps"); + } + if (peerRttMs > 0) { + sb.append(" · rtt ").append(peerRttMs).append("ms"); + } + if (diagPing.enabled && diagPing.pongsRx > 0) { + sb.append(" · ping ").append(diagPing.avgRttMs > 0 ? diagPing.avgRttMs : diagPing.lastRttMs).append("ms"); + } + if (pump != null) { + int dropped = pump.getDroppedPFrames(); + int q = pump.getQueueDepth(); + if (dropped > 0 || q > 8) { + sb.append(" · q").append(q); + if (dropped > 0) { + sb.append(" drop").append(dropped); + } + } + } + if (audioEnabled && audio != null) { + int vu = audio.getVuPercent(); + sb.append(" · aud ").append(vu).append('%'); + if (audio.getAudibleBlocks() == 0 && audio.getSilentBlocks() > 30) { + sb.append(" (silent cap)"); + } + } + return sb.toString(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/VideoEncoder.java b/app/src/main/java/com/foxx/androidcast/sender/VideoEncoder.java new file mode 100644 index 0000000..06d507e --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/VideoEncoder.java @@ -0,0 +1,283 @@ +package com.foxx.androidcast.sender; + +/********************************************************************* + * VideoEncoder.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class VideoEncoder + * Contributors: + * - Anton Afanasyeu (8 commits, 279 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 40dcb27fe239420b524f86cc5cd367356bfa116b23b59ce08ef4d81a71d3dcbb +**********************************************************************/ +import android.graphics.Bitmap; +import android.media.MediaCodec; +import android.media.MediaCodecInfo; +import android.media.MediaFormat; +import android.os.Build; +import android.os.Bundle; +import android.util.Log; +import android.view.Surface; + +import com.foxx.androidcast.CastTuningEngine; +import com.foxx.androidcast.media.RgbToYuv420; +import com.foxx.androidcast.media.codec.VideoEncoderSink; + +import java.io.IOException; +import java.nio.ByteBuffer; + +/** Hardware video encoder (H.264 / H.265 / VP8 / VP9) via MediaCodec. */ +public class VideoEncoder implements VideoEncoderSink { + private static final String TAG = "VideoEncoder"; + + private MediaCodec codec; + private Surface inputSurface; + private boolean bufferInput; + private RgbToYuv420.Layout yuvLayout = RgbToYuv420.Layout.I420; + private byte[] yuvScratch; + private Callback callback; + private int width; + private int height; + private volatile boolean running; + private Thread drainThread; + private String mime; + + public Surface getInputSurface() { + return inputSurface; + } + + public void requestKeyframe() { + if (codec == null || !running) { + return; + } + try { + Bundle params = new Bundle(); + params.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0); + codec.setParameters(params); + } catch (Exception e) { + Log.w(TAG, "Keyframe request failed: " + e.getMessage()); + } + } + + public Surface prepare(int width, int height, String mime, CastTuningEngine.EffectiveParams params, + Callback callback) throws IOException { + return prepareInternal(width, height, mime, params, callback, false); + } + + /** Software-fed frames (calibration chart) via YUV buffers — no input Surface. */ + public void prepareBufferInput(int width, int height, String mime, CastTuningEngine.EffectiveParams params, + Callback callback) throws IOException { + prepareInternal(width, height, mime, params, callback, true); + } + + private Surface prepareInternal(int width, int height, String mime, CastTuningEngine.EffectiveParams params, + Callback callback, boolean buffer) throws IOException { + this.width = width; + this.height = height; + this.mime = mime; + this.callback = callback; + this.bufferInput = buffer; + yuvScratch = buffer ? new byte[RgbToYuv420.bufferSize(width, height)] : null; + + codec = MediaCodec.createEncoderByType(mime); + yuvLayout = buffer ? pickYuvLayout(codec, mime) : RgbToYuv420.Layout.I420; + + MediaFormat tuned = buildFormat(width, height, mime, params, true, buffer, yuvLayout); + MediaFormat basic = buildFormat(width, height, mime, params, false, buffer, yuvLayout); + + if (!tryConfigure(codec, tuned)) { + Log.w(TAG, "Tuned encoder format rejected; retrying with basic format"); + codec.release(); + codec = MediaCodec.createEncoderByType(mime); + yuvLayout = buffer ? pickYuvLayout(codec, mime) : RgbToYuv420.Layout.I420; + basic = buildFormat(width, height, mime, params, false, buffer, yuvLayout); + if (!tryConfigure(codec, basic)) { + codec.release(); + codec = null; + throw new IOException("Encoder configure failed for " + mime + " " + width + "x" + height); + } + } + + if (bufferInput) { + inputSurface = null; + } else { + inputSurface = codec.createInputSurface(); + } + codec.start(); + running = true; + drainThread = new Thread(this::drainLoop, "VideoEncoderDrain"); + drainThread.start(); + Log.i(TAG, (bufferInput ? "Buffer/" + yuvLayout : "Surface") + " encoder " + mime + + " " + width + "x" + height + " @ " + params.videoFps + "fps"); + return inputSurface; + } + + private static RgbToYuv420.Layout pickYuvLayout(MediaCodec codec, String mime) { + MediaCodecInfo.CodecCapabilities caps = codec.getCodecInfo().getCapabilitiesForType(mime); + for (int fmt : caps.colorFormats) { + if (fmt == MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar) { + return RgbToYuv420.Layout.NV12; + } + } + return RgbToYuv420.Layout.I420; + } + + public void queueBitmapFrame(Bitmap bitmap, long ptsUs) { + if (!bufferInput || codec == null || !running || bitmap == null) { + return; + } + byte[] yuv = RgbToYuv420.fromBitmap(bitmap, yuvLayout); + queueYuvFrame(yuv, ptsUs); + } + + public void queueYuvFrame(byte[] yuv, long ptsUs) { + if (!bufferInput || codec == null || !running || yuv == null) { + return; + } + try { + int index = codec.dequeueInputBuffer(0); + if (index < 0) { + return; + } + ByteBuffer buffer = codec.getInputBuffer(index); + if (buffer == null) { + return; + } + buffer.clear(); + int len = Math.min(buffer.remaining(), yuv.length); + buffer.put(yuv, 0, len); + codec.queueInputBuffer(index, 0, len, ptsUs, 0); + } catch (Exception e) { + Log.w(TAG, "queueYuvFrame: " + e.getMessage()); + } + } + + private static MediaFormat buildFormat(int width, int height, String mime, + CastTuningEngine.EffectiveParams params, boolean tuned, boolean buffer, + RgbToYuv420.Layout layout) { + MediaFormat format = MediaFormat.createVideoFormat(mime, width, height); + int color; + if (!buffer) { + color = MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface; + } else if (layout == RgbToYuv420.Layout.NV12) { + color = MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar; + } else { + color = MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar; + } + format.setInteger(MediaFormat.KEY_COLOR_FORMAT, color); + format.setInteger(MediaFormat.KEY_BIT_RATE, params.videoBitrate); + format.setInteger(MediaFormat.KEY_FRAME_RATE, params.videoFps); + format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, params.keyframeIntervalSec); + if (!tuned || !params.requestLowLatency) { + return format; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + format.setInteger(MediaFormat.KEY_BITRATE_MODE, + MediaCodecInfo.EncoderCapabilities.BITRATE_MODE_CBR); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + format.setInteger(MediaFormat.KEY_PRIORITY, 0); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + format.setInteger(MediaFormat.KEY_OPERATING_RATE, params.videoFps); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + format.setInteger(MediaFormat.KEY_LOW_LATENCY, 1); + } + return format; + } + + private static boolean tryConfigure(MediaCodec codec, MediaFormat format) { + try { + codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); + Log.i(TAG, "Using encoder format: " + format); + return true; + } catch (IllegalArgumentException | IllegalStateException e) { + Log.w(TAG, "Encoder configure rejected: " + format + " — " + e.getMessage()); + return false; + } + } + + public void stop() { + running = false; + bufferInput = false; + if (drainThread != null) { + try { + drainThread.join(1500); + } catch (InterruptedException ignored) { + Thread.currentThread().interrupt(); + } + } + if (codec != null) { + try { + codec.stop(); + } catch (Exception ignored) { + } + codec.release(); + codec = null; + } + if (inputSurface != null) { + inputSurface.release(); + inputSurface = null; + } + yuvScratch = null; + } + + private void drainLoop() { + MediaCodec.BufferInfo info = new MediaCodec.BufferInfo(); + boolean configSent = false; + while (running) { + MediaCodec c = codec; + if (c == null) { + break; + } + int index = c.dequeueOutputBuffer(info, 5_000); + if (index == MediaCodec.INFO_TRY_AGAIN_LATER) { + continue; + } + if (index == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { + sendConfig(c.getOutputFormat(), configSent); + configSent = true; + continue; + } + if (index < 0) { + continue; + } + ByteBuffer buffer = c.getOutputBuffer(index); + if (buffer != null && info.size > 0) { + byte[] data = new byte[info.size]; + buffer.position(info.offset); + buffer.limit(info.offset + info.size); + buffer.get(data); + boolean keyFrame = (info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) == 0 + && (info.flags & MediaCodec.BUFFER_FLAG_KEY_FRAME) != 0; + if ((info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) == 0 && callback != null) { + callback.onEncodedFrame(info.presentationTimeUs, keyFrame, data); + } + } + c.releaseOutputBuffer(index, false); + if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) { + break; + } + } + } + + private void sendConfig(MediaFormat format, boolean alreadySent) { + if (alreadySent || callback == null) { + return; + } + ByteBuffer sps = format.getByteBuffer("csd-0"); + ByteBuffer pps = format.getByteBuffer("csd-1"); + byte[] csd0 = sps != null ? toArray(sps) : new byte[0]; + byte[] csd1 = pps != null ? toArray(pps) : new byte[0]; + callback.onConfig(width, height, csd0, csd1); + } + + private static byte[] toArray(ByteBuffer buffer) { + byte[] arr = new byte[buffer.remaining()]; + ByteBuffer dup = buffer.duplicate(); + dup.get(arr); + return arr; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/calibration/CalibrationCastDriver.java b/app/src/main/java/com/foxx/androidcast/sender/calibration/CalibrationCastDriver.java new file mode 100644 index 0000000..83cf063 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/calibration/CalibrationCastDriver.java @@ -0,0 +1,210 @@ +package com.foxx.androidcast.sender.calibration; + +/********************************************************************* + * CalibrationCastDriver.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CalibrationCastDriver + * Contributors: + * - Anton Afanasyeu (3 commits, 206 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 54293eb993f043396f4f41e4ff26c86120572b482cc5e0d2b02489a8ede8c904 +**********************************************************************/ +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; +import android.view.Surface; + +import com.foxx.androidcast.media.PcmLevelAnalyzer; +import com.foxx.androidcast.media.codec.VideoEncoderSink; + +/** + * Renders calibration chart + VU border into the video encoder (GLES surface or YUV buffer fallback). + */ +public final class CalibrationCastDriver { + private static final String TAG = "CalibrationCastDriver"; + private static final int EGL_FAIL_THRESHOLD = 5; + + public interface FallbackHost { + /** Recreate encoder with {@link VideoEncoderSink#prepareBufferInput} after GLES failure. */ + void onCalibrationNeedBufferEncoder(); + } + + private enum FeedMode { + GLES_SURFACE, + YUV_BUFFER + } + + private final Context appContext; + private final HandlerThread thread; + private final Handler handler; + private final FallbackHost fallbackHost; + private CalibrationEglRenderer eglRenderer; + private VideoEncoderSink videoEncoder; + private Bitmap chartBitmap; + private Bitmap frameBitmap; + private Canvas frameCanvas; + private int width; + private int height; + private float density; + private int scrollPx; + private volatile float vuLevel; + private volatile boolean running; + private Runnable tick; + private long encodeStartNs; + private FeedMode feedMode = FeedMode.YUV_BUFFER; + private int eglFailures; + private boolean fallbackRequested; + + public CalibrationCastDriver(Context context) { + this(context, null); + } + + public CalibrationCastDriver(Context context, FallbackHost fallbackHost) { + appContext = context.getApplicationContext(); + this.fallbackHost = fallbackHost; + thread = new HandlerThread("CalibrationCast"); + thread.start(); + handler = new Handler(thread.getLooper()); + } + + /** Preferred path: GLES into encoder {@link Surface}. */ + public void attachSurface(VideoEncoderSink encoder, Surface encoderSurface, int width, int height, float density) { + this.videoEncoder = encoder; + initBitmaps(width, height, density); + eglFailures = 0; + fallbackRequested = false; + try { + eglRenderer = new CalibrationEglRenderer(); + eglRenderer.start(encoderSurface, width, height); + feedMode = FeedMode.GLES_SURFACE; + Log.i(TAG, "Calibration GLES " + width + "x" + height); + } catch (Exception e) { + Log.w(TAG, "GLES init failed: " + e.getMessage()); + releaseEgl(); + feedMode = FeedMode.YUV_BUFFER; + requestBufferEncoderFallback(); + } + running = true; + encodeStartNs = System.nanoTime(); + startTick(); + } + + /** Reliable path when GLES cannot use the encoder surface (e.g. EGL_BAD_ACCESS on MTK). */ + public void attachBuffer(VideoEncoderSink encoder, int width, int height, float density) { + this.videoEncoder = encoder; + releaseEgl(); + feedMode = FeedMode.YUV_BUFFER; + initBitmaps(width, height, density); + running = true; + encodeStartNs = System.nanoTime(); + startTick(); + Log.i(TAG, "Calibration buffer feed " + width + "x" + height); + } + + private void initBitmaps(int w, int h, float density) { + this.width = w; + this.height = h; + this.density = density; + scrollPx = 0; + chartBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + Canvas chartCanvas = new Canvas(chartBitmap); + TvCalibrationGenerator.drawChart(chartCanvas, w, h, appContext); + frameBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); + frameCanvas = new Canvas(frameBitmap); + } + + public void setVuFromPcm(byte[] pcm, int length) { + PcmLevelAnalyzer.Levels levels = PcmLevelAnalyzer.analyze(pcm, length); + float instant = Math.max(levels.peak, levels.rms); + if (levels.silent) { + vuLevel *= 0.88f; + } else { + vuLevel = instant * 0.7f + vuLevel * 0.3f; + } + } + + private void startTick() { + tick = new Runnable() { + @Override + public void run() { + if (!running || frameCanvas == null) { + return; + } + long frameStart = System.nanoTime(); + drawFrame(); + scrollPx += Math.max(1, Math.round(1f * density)); + long elapsedMs = (System.nanoTime() - frameStart) / 1_000_000L; + long delay = feedMode == FeedMode.GLES_SURFACE + ? Math.max(1L, 33L - elapsedMs) + : Math.max(1L, 50L - elapsedMs); + handler.postDelayed(this, delay); + } + }; + handler.post(tick); + } + + private void drawFrame() { + frameCanvas.drawBitmap(chartBitmap, 0f, 0f, null); + TvCalibrationGenerator.drawBorderOverlay( + frameCanvas, width, height, density, scrollPx, vuLevel); + long ptsUs = (System.nanoTime() - encodeStartNs) / 1000L; + if (feedMode == FeedMode.GLES_SURFACE && eglRenderer != null && eglRenderer.isReady()) { + if (eglRenderer.draw(frameBitmap, System.nanoTime())) { + eglFailures = 0; + return; + } + eglFailures++; + if (eglFailures >= EGL_FAIL_THRESHOLD) { + Log.w(TAG, "GLES feed failed " + eglFailures + " times — switching to buffer"); + releaseEgl(); + feedMode = FeedMode.YUV_BUFFER; + requestBufferEncoderFallback(); + } + return; + } + if (videoEncoder != null && feedMode == FeedMode.YUV_BUFFER) { + videoEncoder.queueBitmapFrame(frameBitmap, ptsUs); + } + } + + private void requestBufferEncoderFallback() { + if (fallbackRequested || fallbackHost == null) { + return; + } + fallbackRequested = true; + handler.post(() -> fallbackHost.onCalibrationNeedBufferEncoder()); + } + + private void releaseEgl() { + if (eglRenderer != null) { + eglRenderer.release(); + eglRenderer = null; + } + } + + public void stop() { + running = false; + handler.removeCallbacksAndMessages(null); + releaseEgl(); + if (chartBitmap != null) { + chartBitmap.recycle(); + chartBitmap = null; + } + if (frameBitmap != null) { + frameBitmap.recycle(); + frameBitmap = null; + } + frameCanvas = null; + videoEncoder = null; + } + + public void release() { + stop(); + thread.quitSafely(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/calibration/CalibrationEglRenderer.java b/app/src/main/java/com/foxx/androidcast/sender/calibration/CalibrationEglRenderer.java new file mode 100644 index 0000000..e95c203 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/calibration/CalibrationEglRenderer.java @@ -0,0 +1,246 @@ +package com.foxx.androidcast.sender.calibration; + +/********************************************************************* + * CalibrationEglRenderer.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * Contributors: + * - Anton Afanasyeu (2 commits, 242 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 c067a19ffda0d221dc66ebe9fa7551bee0519261c9da3a036441d9a6a73712f8 +**********************************************************************/ +import android.graphics.Bitmap; +import android.opengl.EGL14; +import android.opengl.EGLConfig; +import android.opengl.EGLContext; +import android.opengl.EGLDisplay; +import android.opengl.EGLExt; +import android.opengl.EGLSurface; +import android.opengl.GLES20; +import android.opengl.GLUtils; +import android.util.Log; +import android.view.Surface; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; + +/** Draws a bitmap into a MediaCodec encoder input {@link Surface} via GLES2. */ +final class CalibrationEglRenderer { + private static final String TAG = "CalibrationEglRenderer"; + + private static final String VERT = + "attribute vec4 aPosition;\n" + + "attribute vec2 aTexCoord;\n" + + "varying vec2 vTexCoord;\n" + + "void main() {\n" + + " gl_Position = aPosition;\n" + + " vTexCoord = aTexCoord;\n" + + "}\n"; + + private static final String FRAG = + "precision mediump float;\n" + + "varying vec2 vTexCoord;\n" + + "uniform sampler2D uTexture;\n" + + "void main() {\n" + + " gl_FragColor = texture2D(uTexture, vTexCoord);\n" + + "}\n"; + + private static final float[] QUAD = { + -1f, -1f, 0f, 1f, + 1f, -1f, 1f, 1f, + -1f, 1f, 0f, 0f, + 1f, 1f, 1f, 0f, + }; + + private EGLDisplay eglDisplay = EGL14.EGL_NO_DISPLAY; + private EGLContext eglContext = EGL14.EGL_NO_CONTEXT; + private EGLSurface eglSurface = EGL14.EGL_NO_SURFACE; + private int program; + private int textureId; + private int aPosition; + private int aTexCoord; + private int uTexture; + private FloatBuffer quadBuffer; + private int width; + private int height; + /** {@link EGLExt#EGL_RECORDABLE_ANDROID} — required for MediaCodec input surfaces. */ + private static final int EGL_RECORDABLE_ANDROID = 0x3142; + + boolean isReady() { + return eglDisplay != EGL14.EGL_NO_DISPLAY && eglSurface != EGL14.EGL_NO_SURFACE; + } + + void start(Surface surface, int width, int height) { + this.width = width; + this.height = height; + eglDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY); + if (eglDisplay == EGL14.EGL_NO_DISPLAY) { + throw new IllegalStateException("eglGetDisplay failed"); + } + int[] version = new int[2]; + if (!EGL14.eglInitialize(eglDisplay, version, 0, version, 1)) { + throw new IllegalStateException("eglInitialize failed"); + } + EGLConfig eglConfig = chooseConfig(eglDisplay); + int[] contextAttribs = {EGL14.EGL_CONTEXT_CLIENT_VERSION, 2, EGL14.EGL_NONE}; + eglContext = EGL14.eglCreateContext(eglDisplay, eglConfig, EGL14.EGL_NO_CONTEXT, contextAttribs, 0); + if (eglContext == EGL14.EGL_NO_CONTEXT) { + throw new IllegalStateException("eglCreateContext failed"); + } + int[] surfaceAttribs = {EGL14.EGL_NONE}; + eglSurface = EGL14.eglCreateWindowSurface(eglDisplay, eglConfig, surface, surfaceAttribs, 0); + if (eglSurface == EGL14.EGL_NO_SURFACE) { + throw new IllegalStateException("eglCreateWindowSurface failed"); + } + if (!makeCurrent()) { + throw new IllegalStateException("eglMakeCurrent failed: 0x" + + Integer.toHexString(EGL14.eglGetError())); + } + program = buildProgram(VERT, FRAG); + aPosition = GLES20.glGetAttribLocation(program, "aPosition"); + aTexCoord = GLES20.glGetAttribLocation(program, "aTexCoord"); + uTexture = GLES20.glGetUniformLocation(program, "uTexture"); + int[] textures = new int[1]; + GLES20.glGenTextures(1, textures, 0); + textureId = textures[0]; + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId); + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR); + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); + quadBuffer = ByteBuffer.allocateDirect(QUAD.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); + quadBuffer.put(QUAD).position(0); + GLES20.glViewport(0, 0, width, height); + Log.i(TAG, "EGL calibration renderer " + width + "x" + height); + } + + /** @return false if EGL could not present this frame (caller should fall back to buffer input). */ + boolean draw(Bitmap bitmap, long ptsNs) { + if (eglDisplay == EGL14.EGL_NO_DISPLAY || bitmap == null) { + return false; + } + if (!makeCurrent()) { + return false; + } + GLES20.glViewport(0, 0, width, height); + GLES20.glClearColor(0f, 0f, 0f, 1f); + GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); + GLES20.glUseProgram(program); + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId); + GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); + GLES20.glUniform1i(uTexture, 0); + quadBuffer.position(0); + GLES20.glVertexAttribPointer(aPosition, 2, GLES20.GL_FLOAT, false, 16, quadBuffer); + quadBuffer.position(2); + GLES20.glVertexAttribPointer(aTexCoord, 2, GLES20.GL_FLOAT, false, 16, quadBuffer); + GLES20.glEnableVertexAttribArray(aPosition); + GLES20.glEnableVertexAttribArray(aTexCoord); + GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); + GLES20.glDisableVertexAttribArray(aPosition); + GLES20.glDisableVertexAttribArray(aTexCoord); + EGLExt.eglPresentationTimeANDROID(eglDisplay, eglSurface, ptsNs); + if (!EGL14.eglSwapBuffers(eglDisplay, eglSurface)) { + Log.w(TAG, "eglSwapBuffers failed: 0x" + Integer.toHexString(EGL14.eglGetError())); + return false; + } + return true; + } + + private boolean makeCurrent() { + if (eglContext.equals(EGL14.eglGetCurrentContext()) + && eglSurface.equals(EGL14.eglGetCurrentSurface(EGL14.EGL_DRAW))) { + return true; + } + if (!EGL14.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) { + Log.w(TAG, "eglMakeCurrent failed: 0x" + Integer.toHexString(EGL14.eglGetError())); + return false; + } + return true; + } + + void release() { + if (textureId != 0) { + int[] t = new int[] {textureId}; + GLES20.glDeleteTextures(1, t, 0); + textureId = 0; + } + if (program != 0) { + GLES20.glDeleteProgram(program); + program = 0; + } + if (eglDisplay != EGL14.EGL_NO_DISPLAY) { + EGL14.eglMakeCurrent(eglDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_CONTEXT); + if (eglSurface != EGL14.EGL_NO_SURFACE) { + EGL14.eglDestroySurface(eglDisplay, eglSurface); + } + if (eglContext != EGL14.EGL_NO_CONTEXT) { + EGL14.eglDestroyContext(eglDisplay, eglContext); + } + EGL14.eglTerminate(eglDisplay); + } + eglDisplay = EGL14.EGL_NO_DISPLAY; + eglContext = EGL14.EGL_NO_CONTEXT; + eglSurface = EGL14.EGL_NO_SURFACE; + } + + private static EGLConfig chooseConfig(EGLDisplay display) { + int[] attribList = { + EGL14.EGL_RENDERABLE_TYPE, EGL14.EGL_OPENGL_ES2_BIT, + EGL14.EGL_RED_SIZE, 8, + EGL14.EGL_GREEN_SIZE, 8, + EGL14.EGL_BLUE_SIZE, 8, + EGL14.EGL_ALPHA_SIZE, 8, + EGL_RECORDABLE_ANDROID, 1, + EGL14.EGL_NONE + }; + EGLConfig[] configs = new EGLConfig[16]; + int[] numConfigs = new int[1]; + if (!EGL14.eglChooseConfig(display, attribList, 0, configs, 0, configs.length, numConfigs, 0) + || numConfigs[0] <= 0) { + throw new IllegalStateException("eglChooseConfig failed (recordable)"); + } + for (int i = 0; i < numConfigs[0]; i++) { + int[] recordable = new int[1]; + if (EGL14.eglGetConfigAttrib(display, configs[i], EGL_RECORDABLE_ANDROID, recordable, 0) + && recordable[0] != 0) { + return configs[i]; + } + } + return configs[0]; + } + + private static int buildProgram(String vertexSource, String fragmentSource) { + int vs = compileShader(GLES20.GL_VERTEX_SHADER, vertexSource); + int fs = compileShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource); + int program = GLES20.glCreateProgram(); + GLES20.glAttachShader(program, vs); + GLES20.glAttachShader(program, fs); + GLES20.glLinkProgram(program); + int[] link = new int[1]; + GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, link, 0); + if (link[0] == 0) { + String err = GLES20.glGetProgramInfoLog(program); + GLES20.glDeleteProgram(program); + throw new IllegalStateException("Program link failed: " + err); + } + GLES20.glDeleteShader(vs); + GLES20.glDeleteShader(fs); + return program; + } + + private static int compileShader(int type, String source) { + int shader = GLES20.glCreateShader(type); + GLES20.glShaderSource(shader, source); + GLES20.glCompileShader(shader); + int[] compiled = new int[1]; + GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0); + if (compiled[0] == 0) { + String err = GLES20.glGetShaderInfoLog(shader); + GLES20.glDeleteShader(shader); + throw new IllegalStateException("Shader compile failed: " + err); + } + return shader; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/calibration/CalibrationSourceDimensions.java b/app/src/main/java/com/foxx/androidcast/sender/calibration/CalibrationSourceDimensions.java new file mode 100644 index 0000000..05cc1df --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/calibration/CalibrationSourceDimensions.java @@ -0,0 +1,72 @@ +package com.foxx.androidcast.sender.calibration; + +/********************************************************************* + * CalibrationSourceDimensions.java + * Created at: Sun 17 May 2026 15:45:19 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CalibrationSourceDimensions + * Contributors: + * - Anton Afanasyeu (2 commits, 68 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 57257f30c63b96dc5078835ccd9c7cc6992e70ca6181fdfb872fdd17f53f0750 +**********************************************************************/ +import android.content.Context; +import android.graphics.BitmapFactory; + +import com.foxx.androidcast.CastConfig; +import com.foxx.androidcast.CastResolution; +import com.foxx.androidcast.R; + +/** + * Encoder size for calibration mode — derived from the chart asset (or procedural fallback), + * not a fixed resolution. + */ +public final class CalibrationSourceDimensions { + private static final int PROCEDURAL_FALLBACK_W = 500; + private static final int PROCEDURAL_FALLBACK_H = 400; + + private CalibrationSourceDimensions() {} + + public static CastResolution.Size resolve(Context context) { + int w = PROCEDURAL_FALLBACK_W; + int h = PROCEDURAL_FALLBACK_H; + if (context != null) { + BitmapFactory.Options opts = new BitmapFactory.Options(); + opts.inJustDecodeBounds = true; + BitmapFactory.decodeResource( + context.getApplicationContext().getResources(), + R.drawable.calibration_chart_reference, + opts); + if (opts.outWidth > 0 && opts.outHeight > 0) { + w = opts.outWidth; + h = opts.outHeight; + } + } + int[] capped = capLongEdge(even(w), even(h), CastConfig.CALIBRATION_MAX_LONG_EDGE); + return new CastResolution.Size(capped[0], capped[1], 240); + } + + /** Visible for unit tests without Android resources. */ + public static CastResolution.Size fromIntrinsic(int width, int height, int maxLongEdge) { + int[] capped = capLongEdge(even(width), even(height), maxLongEdge); + return new CastResolution.Size(capped[0], capped[1], 240); + } + + private static int[] capLongEdge(int width, int height, int maxLong) { + if (maxLong <= 0) { + return new int[] {width, height}; + } + int longEdge = Math.max(width, height); + if (longEdge <= maxLong) { + return new int[] {width, height}; + } + float ratio = (float) maxLong / longEdge; + return new int[] {even(Math.max(2, (int) (width * ratio))), + even(Math.max(2, (int) (height * ratio)))}; + } + + private static int even(int v) { + return Math.max(2, v & ~1); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/calibration/TvCalibrationGenerator.java b/app/src/main/java/com/foxx/androidcast/sender/calibration/TvCalibrationGenerator.java new file mode 100644 index 0000000..d6cd60e --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/calibration/TvCalibrationGenerator.java @@ -0,0 +1,177 @@ +package com.foxx.androidcast.sender.calibration; + +/********************************************************************* + * TvCalibrationGenerator.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class TvCalibrationGenerator + * Contributors: + * - Anton Afanasyeu (3 commits, 173 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 bed472c91e11a096153068d8bc3fb9d7bf9582ca0f3b66ad6c84cb38b8a12b41 +**********************************************************************/ +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.RectF; + +import com.foxx.androidcast.R; + +/** + * Draws a TV calibration chart (color bars + pluge) with gray reference areas transparent. + */ +public final class TvCalibrationGenerator { + private static final int[] BAR_COLORS = { + Color.WHITE, Color.YELLOW, Color.CYAN, Color.GREEN, + Color.MAGENTA, Color.RED, Color.BLUE + }; + + private TvCalibrationGenerator() {} + + public static void drawChart(Canvas canvas, int width, int height, Context context) { + if (context == null) { + drawProceduralChart(canvas, width, height); + return; + } + canvas.drawColor(Color.BLACK); + Bitmap ref = loadReference(context); + if (ref != null) { + drawReferenceWithTransparentGray(canvas, ref, width, height); + ref.recycle(); + return; + } + drawProceduralChart(canvas, width, height); + } + + private static Bitmap loadReference(Context context) { + try { + return BitmapFactory.decodeResource(context.getResources(), R.drawable.calibration_chart_reference); + } catch (Exception e) { + return null; + } + } + + private static void drawReferenceWithTransparentGray(Canvas canvas, Bitmap ref, int w, int h) { + int refW = ref.getWidth(); + int refH = ref.getHeight(); + float scale = Math.min((float) w / refW, (float) h / refH); + int dw = Math.max(2, (int) (refW * scale)) & ~1; + int dh = Math.max(2, (int) (refH * scale)) & ~1; + Bitmap scaled = Bitmap.createScaledBitmap(ref, dw, dh, true); + Bitmap keyed = scaled.copy(Bitmap.Config.ARGB_8888, true); + scaled.recycle(); + int[] pixels = new int[dw * dh]; + keyed.getPixels(pixels, 0, dw, 0, 0, dw, dh); + for (int i = 0; i < pixels.length; i++) { + int p = pixels[i]; + int r = (p >> 16) & 0xff; + int g = (p >> 8) & 0xff; + int b = p & 0xff; + if (isGray(r, g, b)) { + pixels[i] = 0; + } + } + keyed.setPixels(pixels, 0, dw, 0, 0, dw, dh); + float left = (w - dw) / 2f; + float top = (h - dh) / 2f; + canvas.drawBitmap(keyed, left, top, null); + keyed.recycle(); + } + + private static boolean isGray(int r, int g, int b) { + return Math.abs(r - g) < 25 && Math.abs(g - b) < 25 && r > 40 && r < 200; + } + + private static void drawProceduralChart(Canvas canvas, int width, int height) { + Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); + int barH = (int) (height * 0.55f); + int barW = width / BAR_COLORS.length; + for (int i = 0; i < BAR_COLORS.length; i++) { + paint.setColor(BAR_COLORS[i]); + canvas.drawRect(i * barW, 0, (i + 1) * barW, barH, paint); + } + int lowerTop = barH; + int cols = 8; + int cellW = width / cols; + for (int c = 0; c < cols; c++) { + int level = 255 - (c * 255 / (cols - 1)); + if (c == 0 || c == cols - 1) { + continue; + } + paint.setColor(Color.rgb(level, level, level)); + canvas.drawRect(c * cellW, lowerTop, (c + 1) * cellW, height, paint); + } + paint.setColor(Color.WHITE); + canvas.drawRect(0, lowerTop, cellW, height, paint); + paint.setColor(Color.BLACK); + canvas.drawRect((cols - 1) * cellW, lowerTop, width, height, paint); + } + + /** Blue/white vertical stripe border with optional VU-driven stripe width (8dp border). */ + public static void drawAnimatedBorder(Canvas canvas, int width, int height, float density, + int scrollPx, float vuLevel, Context context) { + drawChart(canvas, width, height, context); + drawBorderOverlay(canvas, width, height, density, scrollPx, vuLevel); + } + + /** Draws only the animated border (chart must already be on the canvas / bitmap). */ + public static void drawBorderOverlay(Canvas canvas, int width, int height, float density, + int scrollPx, float vuLevel) { + int borderPx = Math.max(2, Math.round(8f * density)); + int stripe = Math.max(1, Math.round(1f * density)); + int maxScroll = width + height; + int offset = scrollPx % Math.max(1, maxScroll); + float vu = Math.max(0f, Math.min(1f, vuLevel)); + int blueWidth = Math.max(stripe, Math.round(stripe + vu * borderPx * 1.35f)); + drawStripeFrame(canvas, width, height, borderPx, stripe, blueWidth, offset); + } + + private static void drawStripeFrame(Canvas canvas, int width, int height, int border, + int stripe, int blueWidth, int offset) { + Paint paint = new Paint(); + int cycle = stripe + blueWidth; + RectF top = new RectF(0, 0, width, border); + RectF bottom = new RectF(0, height - border, width, height); + RectF left = new RectF(0, 0, border, height); + RectF right = new RectF(width - border, 0, width, height); + fillStripes(canvas, paint, top, true, offset, cycle, blueWidth); + fillStripes(canvas, paint, bottom, true, offset, cycle, blueWidth); + fillStripes(canvas, paint, left, false, offset, cycle, blueWidth); + fillStripes(canvas, paint, right, false, offset, cycle, blueWidth); + } + + private static void fillStripes(Canvas canvas, Paint paint, RectF area, boolean horizontal, + int offset, int cycle, int blueWidth) { + if (horizontal) { + int h = Math.max(1, Math.round(area.height())); + for (float x = area.left; x < area.right; ) { + int pos = (int) (x + area.top + offset); + int color = stripeColor(pos, cycle, blueWidth); + float next = Math.min(area.right, x + 1f); + paint.setColor(color); + canvas.drawRect(x, area.top, next, area.top + h, paint); + x = next; + } + } else { + int w = Math.max(1, Math.round(area.width())); + for (float y = area.top; y < area.bottom; ) { + int pos = (int) (area.left + y + offset); + int color = stripeColor(pos, cycle, blueWidth); + float next = Math.min(area.bottom, y + 1f); + paint.setColor(color); + canvas.drawRect(area.left, y, area.left + w, next, paint); + y = next; + } + } + } + + private static int stripeColor(int pos, int cycle, int blueWidth) { + int m = pos % cycle; + return m < blueWidth ? Color.rgb(30, 144, 255) : Color.WHITE; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/camera/CameraCastCapture.java b/app/src/main/java/com/foxx/androidcast/sender/camera/CameraCastCapture.java new file mode 100644 index 0000000..8d845a5 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/camera/CameraCastCapture.java @@ -0,0 +1,171 @@ +package com.foxx.androidcast.sender.camera; + +/********************************************************************* + * CameraCastCapture.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CameraCastCapture + * Contributors: + * - Anton Afanasyeu (3 commits, 167 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 0cea27cf579edb987b0ea25fd6198cc86daf4b86adf48d8080cfb3f141c9613d +**********************************************************************/ +import android.content.Context; +import android.graphics.SurfaceTexture; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraCaptureSession; +import android.hardware.camera2.CameraCharacteristics; +import android.hardware.camera2.CameraDevice; +import android.hardware.camera2.CameraManager; +import android.hardware.camera2.CaptureRequest; +import android.hardware.camera2.params.StreamConfigurationMap; +import android.os.Handler; +import android.os.HandlerThread; +import android.util.Log; +import android.util.Size; +import android.view.Surface; + +import java.util.Collections; + +/** Camera2 preview into the video encoder input {@link Surface}. */ +public final class CameraCastCapture { + private static final String TAG = "CameraCastCapture"; + + private final Context appContext; + private HandlerThread thread; + private Handler handler; + private CameraDevice camera; + private CameraCaptureSession session; + private String cameraId; + + public CameraCastCapture(Context context) { + appContext = context.getApplicationContext(); + } + + public void start(Surface encoderSurface, int targetWidth, int targetHeight, boolean useFrontCamera) + throws CameraAccessException { + stop(); + thread = new HandlerThread("CameraCast"); + thread.start(); + handler = new Handler(thread.getLooper()); + CameraManager mgr = appContext.getSystemService(CameraManager.class); + cameraId = chooseCameraId(mgr, useFrontCamera); + if (cameraId == null) { + throw new CameraAccessException(CameraAccessException.CAMERA_ERROR, + useFrontCamera ? "No front camera available" : "No back camera available"); + } + Size preview = choosePreviewSize(mgr, cameraId, targetWidth, targetHeight); + Log.i(TAG, "Opening camera " + cameraId + " preview " + preview.getWidth() + "x" + preview.getHeight()); + mgr.openCamera(cameraId, new CameraDevice.StateCallback() { + @Override + public void onOpened(CameraDevice device) { + camera = device; + try { + createSession(device, encoderSurface, preview); + } catch (CameraAccessException e) { + Log.e(TAG, "Session failed", e); + stop(); + } + } + + @Override + public void onDisconnected(CameraDevice device) { + device.close(); + camera = null; + } + + @Override + public void onError(CameraDevice device, int error) { + Log.e(TAG, "Camera error " + error); + device.close(); + camera = null; + } + }, handler); + } + + private void createSession(CameraDevice device, Surface encoderSurface, Size preview) + throws CameraAccessException { + CaptureRequest.Builder builder = device.createCaptureRequest(CameraDevice.TEMPLATE_RECORD); + builder.addTarget(encoderSurface); + device.createCaptureSession(Collections.singletonList(encoderSurface), + new CameraCaptureSession.StateCallback() { + @Override + public void onConfigured(CameraCaptureSession captureSession) { + session = captureSession; + try { + builder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO); + captureSession.setRepeatingRequest(builder.build(), null, handler); + Log.i(TAG, "Camera preview running"); + } catch (CameraAccessException e) { + Log.e(TAG, "Repeating request failed", e); + } + } + + @Override + public void onConfigureFailed(CameraCaptureSession captureSession) { + Log.e(TAG, "Camera session configure failed"); + } + }, handler); + } + + private static String chooseCameraId(CameraManager mgr, boolean useFrontCamera) throws CameraAccessException { + int want = useFrontCamera + ? CameraCharacteristics.LENS_FACING_FRONT + : CameraCharacteristics.LENS_FACING_BACK; + for (String id : mgr.getCameraIdList()) { + CameraCharacteristics chars = mgr.getCameraCharacteristics(id); + Integer facing = chars.get(CameraCharacteristics.LENS_FACING); + if (facing != null && facing == want) { + return id; + } + } + String[] ids = mgr.getCameraIdList(); + return ids.length > 0 ? ids[0] : null; + } + + private static Size choosePreviewSize(CameraManager mgr, String id, int targetW, int targetH) + throws CameraAccessException { + CameraCharacteristics chars = mgr.getCameraCharacteristics(id); + StreamConfigurationMap map = chars.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); + if (map == null) { + return new Size(targetW, targetH); + } + Size[] sizes = map.getOutputSizes(SurfaceTexture.class); + if (sizes == null || sizes.length == 0) { + return new Size(targetW, targetH); + } + Size best = sizes[0]; + long bestScore = Long.MAX_VALUE; + for (Size s : sizes) { + long score = Math.abs((long) s.getWidth() * s.getHeight() - (long) targetW * targetH); + if (score < bestScore) { + bestScore = score; + best = s; + } + } + return best; + } + + public void stop() { + if (session != null) { + try { + session.close(); + } catch (Exception ignored) { + } + session = null; + } + if (camera != null) { + try { + camera.close(); + } catch (Exception ignored) { + } + camera = null; + } + if (thread != null) { + thread.quitSafely(); + thread = null; + } + handler = null; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/settings/AppSettingsJson.java b/app/src/main/java/com/foxx/androidcast/settings/AppSettingsJson.java new file mode 100644 index 0000000..f9b1fca --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/settings/AppSettingsJson.java @@ -0,0 +1,45 @@ +package com.foxx.androidcast.settings; + +/********************************************************************* + * AppSettingsJson.java + * Created at: Wed 20 May 2026 14:31:55 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class AppSettingsJson + * Contributors: + * - Anton Afanasyeu (2 commits, 39 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 571859bdee05d4143b75e04c77a692cbdef6100f713817daf719d0961324a3f2 +**********************************************************************/ +import android.content.Context; + +import org.json.JSONObject; + +import com.foxx.androidcast.util.IoUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.nio.charset.StandardCharsets; + +/** Reads app-private {@code files/settings.json}. */ +public final class AppSettingsJson { + public static final String SETTINGS_FILE = "settings.json"; + + private AppSettingsJson() {} + + public static JSONObject readRoot(Context context) { + File f = new File(context.getApplicationContext().getFilesDir(), SETTINGS_FILE); + if (!f.exists()) { + return new JSONObject(); + } + try (FileInputStream fis = new FileInputStream(f)) { + return new JSONObject(new String(IoUtils.readAllBytes(fis), StandardCharsets.UTF_8)); + } catch (Throwable ignored) { + return new JSONObject(); + } + } + + public static JSONObject section(Context context, String name) { + return readRoot(context).optJSONObject(name); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sfu/SfuRelayGate.java b/app/src/main/java/com/foxx/androidcast/sfu/SfuRelayGate.java new file mode 100644 index 0000000..08923f7 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sfu/SfuRelayGate.java @@ -0,0 +1,18 @@ +package com.foxx.androidcast.sfu; + +import com.foxx.androidcast.CastConfig; + +/** + * Hidden gate for SFU / WebRTC relay experiments (post-alpha). + * Not exposed in release settings while {@link CastConfig#ALPHA_FEATURE_FREEZE} is on. + */ +public final class SfuRelayGate { + /** Compile-time preview; must stay false until owner spec + BE SFU is ready. */ + public static final boolean PREVIEW_ENABLED = false; + + private SfuRelayGate() {} + + public static boolean isAvailable() { + return PREVIEW_ENABLED && !CastConfig.ALPHA_FEATURE_FREEZE; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/stats/GraphSessionUploader.java b/app/src/main/java/com/foxx/androidcast/stats/GraphSessionUploader.java new file mode 100644 index 0000000..21e09f1 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/stats/GraphSessionUploader.java @@ -0,0 +1,106 @@ +package com.foxx.androidcast.stats; + +import android.content.Context; +import android.os.Build; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.BuildConfig; +import com.foxx.androidcast.DeviceInfo; +import com.foxx.androidcast.crash.CrashSettingsStore; +import com.foxx.androidcast.crash.CrashUploadClient; +import com.foxx.androidcast.network.BackendEndpoints; + +import org.json.JSONObject; + +import java.util.Locale; +import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** POST anonymous session aggregates to the graphs ingest API ({@code graph_upload.php}). */ +public final class GraphSessionUploader { + private static final ExecutorService EXEC = Executors.newSingleThreadExecutor(r -> { + Thread t = new Thread(r, "graph-session-upload"); + t.setDaemon(true); + return t; + }); + + private GraphSessionUploader() {} + + public static void uploadAsync(Context context, JSONObject sessionRoot) { + if (context == null || sessionRoot == null || !AppPreferences.isGrabSessionStats(context)) { + return; + } + final Context app = context.getApplicationContext(); + EXEC.execute(() -> upload(app, sessionRoot)); + } + + static boolean upload(Context context, JSONObject sessionRoot) { + try { + JSONObject payload = toGraphPayload(context, sessionRoot); + if (payload == null) { + return false; + } + String url = BackendEndpoints.graphUploadUrlFromCrashesUrl( + CrashSettingsStore.load(context).uploadUrl); + return CrashUploadClient.upload(url, payload); + } catch (Exception ignored) { + return false; + } + } + + static JSONObject toGraphPayload(Context context, JSONObject root) throws Exception { + long started = root.optLong("started_at_epoch_ms", 0L); + long ended = root.optLong("ended_at_epoch_ms", 0L); + if (started <= 0 || ended <= 0 || ended < started) { + return null; + } + String direction = root.optString("direction", "send"); + String ingestDir = "recv".equalsIgnoreCase(direction) ? "receiver" : "sender"; + String transport = root.optString("transport", "wifi").toLowerCase(Locale.US); + if (transport.isEmpty()) { + transport = "wifi"; + } + + JSONObject payload = new JSONObject(); + payload.put("schema_version", 1); + payload.put("ingest_kind", "graph_session"); + payload.put("session_id", sessionId(started, direction)); + payload.put("device_id", DeviceInfo.getDeviceUuid(context)); + payload.put("app_version", BuildConfig.VERSION_NAME); + payload.put("sdk_int", Build.VERSION.SDK_INT); + payload.put("started_at_epoch_ms", started); + payload.put("ended_at_epoch_ms", ended); + payload.put("duration_s", Math.max(0, (int) ((ended - started) / 1000L))); + payload.put("direction", ingestDir); + payload.put("transport", transport); + payload.put("install_source", "direct"); + payload.put("ntp_source", AppPreferences.isDevBackendNtpSyncEnabled(context) ? "backend" : "device"); + + if (root.has("avg_video_bitrate_kbps")) { + payload.put("avg_kbps", Math.max(0, (int) Math.round(root.optDouble("avg_video_bitrate_kbps", 0)))); + } + if (root.has("avg_loss_ratio")) { + payload.put("packet_loss_pct", Math.max(0.0, root.optDouble("avg_loss_ratio", 0) * 100.0)); + } + + JSONObject globals = root.optJSONObject("globals"); + String reason = globals != null ? globals.optString("reason", "") : ""; + payload.put("completed", reason.isEmpty() || !"crash".equalsIgnoreCase(reason)); + + JSONObject meta = new JSONObject(); + meta.put("capture_mode", root.optString("capture_mode", "")); + meta.put("video_codec", root.optString("video_codec", "")); + meta.put("role", root.optString("role", "")); + if (root.has("avg_encode_fps")) { + meta.put("avg_encode_fps", root.optDouble("avg_encode_fps", 0)); + } + payload.put("meta", meta); + return payload; + } + + private static String sessionId(long startedMs, String direction) { + String seed = startedMs + ":" + direction + ":" + UUID.randomUUID(); + return "mob-" + Integer.toHexString(seed.hashCode()) + "-" + startedMs; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/stats/SessionEventJournal.java b/app/src/main/java/com/foxx/androidcast/stats/SessionEventJournal.java new file mode 100644 index 0000000..dce81b9 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/stats/SessionEventJournal.java @@ -0,0 +1,89 @@ +package com.foxx.androidcast.stats; + +/********************************************************************* + * SessionEventJournal.java + * Created at: Tue 19 May 2026 19:43:06 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * Contributors: + * - Anton Afanasyeu (2 commits, 85 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 19a61174daac64926280ac88abb6511c710478a3354bcb479a0bede0017d4232 +**********************************************************************/ +import org.json.JSONArray; +import org.json.JSONObject; + +/** + * Per-session event log ({@code send} or {@code recv} array only) with ~1 Hz {@code general} rollups. + */ +final class SessionEventJournal { + private static final long GENERAL_INTERVAL_MS = 1000L; + private static final int MAX_ENTRIES = 100_000; + + private final long sessionStartMs; + private final JSONArray events = new JSONArray(); + private long generalAccumulator; + private long lastGeneralFlushMs; + + SessionEventJournal(long sessionStartMs) { + this.sessionStartMs = sessionStartMs; + lastGeneralFlushMs = sessionStartMs; + } + + synchronized void record(String type, int size) { + if (type == null || size <= 0) { + return; + } + if (events.length() >= MAX_ENTRIES) { + return; + } + try { + JSONObject e = new JSONObject(); + e.put("ts", System.currentTimeMillis() - sessionStartMs); + e.put("type", type); + e.put("size", size); + events.put(e); + } catch (Exception ignored) { + } + } + + synchronized void addGeneralBytes(int wireBytes) { + if (wireBytes > 0) { + generalAccumulator += wireBytes; + } + } + + synchronized void flushGeneralIfDue() { + long now = System.currentTimeMillis(); + if (now - lastGeneralFlushMs < GENERAL_INTERVAL_MS) { + return; + } + flushGeneral(now); + } + + synchronized void flushGeneralFinal() { + flushGeneral(System.currentTimeMillis()); + } + + private void flushGeneral(long now) { + if (events.length() >= MAX_ENTRIES) { + generalAccumulator = 0; + lastGeneralFlushMs = now; + return; + } + try { + JSONObject e = new JSONObject(); + e.put("ts", now - sessionStartMs); + e.put("type", SessionStatsEventMapper.GENERAL); + e.put("size", generalAccumulator); + events.put(e); + } catch (Exception ignored) { + } + generalAccumulator = 0; + lastGeneralFlushMs = now; + } + + synchronized JSONArray copyEvents() { + return events; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/stats/SessionStatsContext.java b/app/src/main/java/com/foxx/androidcast/stats/SessionStatsContext.java new file mode 100644 index 0000000..876aa09 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/stats/SessionStatsContext.java @@ -0,0 +1,85 @@ +package com.foxx.androidcast.stats; + +/********************************************************************* + * SessionStatsContext.java + * Created at: Tue 19 May 2026 19:43:06 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SessionStatsContext + * Contributors: + * - Anton Afanasyeu (3 commits, 81 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 9d291f1bb62281400283aa0db81ccc3f63f918740285af85d2ce31d2e3b22ab9 +**********************************************************************/ +import android.content.Context; + +import java.util.concurrent.atomic.AtomicReference; + +/** Active session stats recorder for transport/pump hooks without threading references everywhere. */ +public final class SessionStatsContext { + private static final AtomicReference ACTIVE = new AtomicReference<>(); + + private SessionStatsContext() {} + + public static void bind(SessionStatsRecorder recorder) { + ACTIVE.set(recorder); + } + + public static void unbind(SessionStatsRecorder recorder) { + ACTIVE.compareAndSet(recorder, null); + } + + public static SessionStatsRecorder get() { + return ACTIVE.get(); + } + + public static void recordOutboundMessage(byte type, boolean keyFrame, int payloadBytes) { + SessionStatsRecorder r = ACTIVE.get(); + if (r != null) { + r.recordOutboundMessage(type, keyFrame, payloadBytes); + } + } + + public static void recordInboundMessage(byte type, boolean keyFrame, int payloadBytes) { + SessionStatsRecorder r = ACTIVE.get(); + if (r != null) { + r.recordInboundMessage(type, keyFrame, payloadBytes); + } + } + + public static void onDatagramSent(int wireBytes) { + SessionStatsRecorder r = ACTIVE.get(); + if (r != null) { + r.onDatagramSent(wireBytes); + } + } + + public static void onDatagramReceived(int wireBytes) { + SessionStatsRecorder r = ACTIVE.get(); + if (r != null) { + r.onDatagramReceived(wireBytes); + } + } + + public static void flushGeneralIfDue() { + SessionStatsRecorder r = ACTIVE.get(); + if (r != null) { + r.flushGeneralIfDue(); + } + } + + /** + * Best-effort: persist the active session when the JVM is about to die from an uncaught exception. + * Native crashes (SIGSEGV) are not covered. + */ + public static void flushActiveOnUncaughtException(Context context) { + SessionStatsRecorder r = ACTIVE.get(); + if (r == null) { + return; + } + try { + r.finish(context.getApplicationContext(), "crash"); + } catch (Throwable ignored) { + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/stats/SessionStatsEventMapper.java b/app/src/main/java/com/foxx/androidcast/stats/SessionStatsEventMapper.java new file mode 100644 index 0000000..1d92b29 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/stats/SessionStatsEventMapper.java @@ -0,0 +1,55 @@ +package com.foxx.androidcast.stats; + +/********************************************************************* + * SessionStatsEventMapper.java + * Created at: Tue 19 May 2026 19:43:06 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SessionStatsEventMapper + * Contributors: + * - Anton Afanasyeu (2 commits, 51 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 68ccd134a6f5d7b70bf0aeae86a303a50fb5e3666e427c658fb338b55e75881c +**********************************************************************/ +import com.foxx.androidcast.network.CastProtocol; + +/** Maps cast protocol message types to session journal event types. */ +public final class SessionStatsEventMapper { + public static final String KF = "kf"; + public static final String VIDEO = "video"; + public static final String AUDIO = "audio"; + public static final String META = "meta"; + public static final String SERVICE = "service"; + public static final String UNKNOWN = "unknown"; + public static final String GENERAL = "general"; + + private SessionStatsEventMapper() {} + + /** Returns journal type for an app-layer message, or null if it should not be logged. */ + public static String eventTypeForMessage(byte type, boolean keyFrame) { + switch (type) { + case CastProtocol.MSG_VIDEO_FRAME: + return keyFrame ? KF : VIDEO; + case CastProtocol.MSG_AUDIO_FRAME: + return AUDIO; + case CastProtocol.MSG_STREAM_CONFIG: + case CastProtocol.MSG_AUDIO_CONFIG: + case CastProtocol.MSG_NETWORK_STATS: + case CastProtocol.MSG_NETWORK_CONTROL: + return META; + case CastProtocol.MSG_HELLO: + case CastProtocol.MSG_AUTH: + case CastProtocol.MSG_AUTH_OK: + case CastProtocol.MSG_AUTH_FAIL: + case CastProtocol.MSG_CAST_SETTINGS: + case CastProtocol.MSG_RECEIVER_CAST_SETTINGS: + case CastProtocol.MSG_CODEC_CAPS: + case CastProtocol.MSG_CODEC_SELECTED: + case CastProtocol.MSG_GOODBYE: + case CastProtocol.MSG_AUDIO_CONSENT: + return SERVICE; + default: + return UNKNOWN; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/stats/SessionStatsRecorder.java b/app/src/main/java/com/foxx/androidcast/stats/SessionStatsRecorder.java new file mode 100644 index 0000000..2535e7c --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/stats/SessionStatsRecorder.java @@ -0,0 +1,370 @@ +package com.foxx.androidcast.stats; + +/********************************************************************* + * SessionStatsRecorder.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SessionStatsRecorder + * Contributors: + * - Anton Afanasyeu (7 commits, 365 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 d65a1d78c0668552fc76ad9d3fa0e16ef1e8fb74940dc1a8cbd5a0f37bfca413 +**********************************************************************/ +import android.content.Context; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.network.control.NetworkStatsSnapshot; +import com.foxx.androidcast.network.transport.StreamProtectionMode; +import com.foxx.androidcast.network.transport.TransportLossStats; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Collects anonymous per-session aggregates; persisted via {@link SessionStatsStore}. + */ +public final class SessionStatsRecorder { + private final long startedMs = System.currentTimeMillis(); + /** {@code send} or {@code recv}. */ + private final String direction; + private final String role; + private final String transport; + private final SessionEventJournal journal; + private String videoCodec = ""; + private String audioCodec = "AAC"; + private String captureMode = ""; + private String resolution = ""; + private int clientCount = 1; + private int disruptCount; + private int idleTimeouts; + private int networkSamples; + + private long sumRttMs; + private long sumLossRatioMicro; // loss * 1e6 + private long sumVideoBitrateKbps; + private long sumAudioBitrateKbps; + private long sumEncodeFpsMicro; + private long sumDecodeFpsMicro; + private int bitrateSamples; + private int fpsSamples; + + private final TransportLossStats lossTotals = new TransportLossStats(); + private final JSONArray samples = new JSONArray(); + private long lastSampleMs; + + /** Ensures each recorder persists at most once (normal end vs crash hook). */ + private final AtomicBoolean persisted = new AtomicBoolean(false); + + /** @param direction {@code send} or {@code recv}. */ + public SessionStatsRecorder(String direction, String transport) { + this.direction = "recv".equals(direction) ? "recv" : "send"; + this.role = "recv".equals(this.direction) ? "receiver" : "sender"; + this.transport = transport != null ? transport : "unknown"; + this.journal = new SessionEventJournal(startedMs); + } + + public String getDirection() { + return direction; + } + + public boolean isSendDirection() { + return "send".equals(direction); + } + + public void recordOutboundMessage(byte type, boolean keyFrame, int payloadBytes) { + if (!isSendDirection() || payloadBytes <= 0) { + return; + } + String eventType = SessionStatsEventMapper.eventTypeForMessage(type, keyFrame); + if (eventType != null) { + journal.record(eventType, payloadBytes); + } + } + + public void recordInboundMessage(byte type, boolean keyFrame, int payloadBytes) { + if (isSendDirection() || payloadBytes <= 0) { + return; + } + String eventType = SessionStatsEventMapper.eventTypeForMessage(type, keyFrame); + if (eventType != null) { + journal.record(eventType, payloadBytes); + } + } + + public void onDatagramSent(int wireBytes) { + if (isSendDirection()) { + journal.addGeneralBytes(wireBytes); + } + } + + public void onDatagramReceived(int wireBytes) { + if (!isSendDirection()) { + journal.addGeneralBytes(wireBytes); + } + } + + public void flushGeneralIfDue() { + journal.flushGeneralIfDue(); + } + + public void setClientCount(int count) { + if (count > 0) { + clientCount = count; + } + } + + public void setCodecs(String videoMime, String audioMime) { + if (videoMime != null) { + videoCodec = videoMime; + } + if (audioMime != null) { + audioCodec = audioMime; + } + } + + public void setCaptureMode(String mode) { + captureMode = mode != null ? mode : ""; + } + + public void setResolution(int w, int h) { + if (w > 0 && h > 0) { + resolution = w + "x" + h; + } + } + + public void noteDisrupt(String reason) { + disruptCount++; + } + + public void noteIdleTimeout() { + idleTimeouts++; + disruptCount++; + } + + public void sampleNetwork(NetworkStatsSnapshot local, NetworkStatsSnapshot peer) { + flushGeneralIfDue(); + networkSamples++; + NetworkStatsSnapshot s = local != null ? local : peer; + if (s == null) { + return; + } + appendTimeSample(s); + if (s.rttMs > 0) { + sumRttMs += s.rttMs; + } + if (s.lossRatio > 0) { + sumLossRatioMicro += (long) (s.lossRatio * 1_000_000); + } + if (s.sendBitrateKbps > 0) { + sumVideoBitrateKbps += s.sendBitrateKbps; + bitrateSamples++; + } else if (s.recvBitrateKbps > 0) { + sumVideoBitrateKbps += s.recvBitrateKbps; + bitrateSamples++; + } + if (s.encodeFps > 0) { + sumEncodeFpsMicro += (long) (s.encodeFps * 1000); + fpsSamples++; + } + if (s.targetBitrateKbps > 0) { + sumAudioBitrateKbps += Math.min(s.targetBitrateKbps, 256); + } + } + + /** Final transport/app loss snapshot for this session (not accumulated over time). */ + public void mergeLoss(TransportLossStats loss) { + if (loss == null) { + return; + } + synchronized (lossTotals) { + lossTotals.datagramsSent = loss.datagramsSent; + lossTotals.datagramsReceived = loss.datagramsReceived; + lossTotals.datagramsInvalid = loss.datagramsInvalid; + lossTotals.fragmentsReceived = loss.fragmentsReceived; + lossTotals.fragmentsDuplicate = loss.fragmentsDuplicate; + lossTotals.reassemblyCompleted = loss.reassemblyCompleted; + lossTotals.reassemblyIncomplete = loss.reassemblyIncomplete; + lossTotals.reassemblySuperseded = loss.reassemblySuperseded; + lossTotals.wirePacketsDropped = loss.wirePacketsDropped; + lossTotals.malformedPackets = loss.malformedPackets; + lossTotals.sendDroppedVideoP = loss.sendDroppedVideoP; + lossTotals.sendDroppedAudio = loss.sendDroppedAudio; + lossTotals.recvVideoSkippedAwaitingKey = loss.recvVideoSkippedAwaitingKey; + lossTotals.recvVideoDecodeErrors = loss.recvVideoDecodeErrors; + lossTotals.recvAudioDecodeErrors = loss.recvAudioDecodeErrors; + lossTotals.recvAudioQueueDrops = loss.recvAudioQueueDrops; + lossTotals.recvDamagedVideoFrames = loss.recvDamagedVideoFrames; + lossTotals.protectionMode = loss.protectionMode; + lossTotals.fecPacketsEncoded = loss.fecPacketsEncoded; + lossTotals.fecPacketsDecoded = loss.fecPacketsDecoded; + lossTotals.fecDecodeFailures = loss.fecDecodeFailures; + lossTotals.nackRequestsSent = loss.nackRequestsSent; + lossTotals.nackRequestsReceived = loss.nackRequestsReceived; + lossTotals.nackRetransmits = loss.nackRetransmits; + lossTotals.nackCacheMisses = loss.nackCacheMisses; + } + } + + private void appendTimeSample(NetworkStatsSnapshot s) { + long now = System.currentTimeMillis(); + if (now - lastSampleMs < 2000L) { + return; + } + lastSampleMs = now; + try { + JSONObject pt = new JSONObject(); + pt.put("t_ms", now - startedMs); + if (s.rttMs > 0) { + pt.put("rtt_ms", s.rttMs); + } + if (s.lossRatio > 0) { + pt.put("loss_ratio", s.lossRatio); + } + int videoKbps = s.sendBitrateKbps > 0 ? s.sendBitrateKbps : s.recvBitrateKbps; + if (videoKbps > 0) { + pt.put("video_bitrate_kbps", videoKbps); + } + if (s.encodeFps > 0) { + pt.put("encode_fps", s.encodeFps); + } + if (s.targetBitrateKbps > 0) { + pt.put("target_bitrate_kbps", s.targetBitrateKbps); + } + if (s.congestionLevel > 0) { + pt.put("congestion_level", s.congestionLevel); + } + samples.put(pt); + } catch (Exception ignored) { + } + } + + public void mergeSettings(CastSettings settings) { + if (settings == null) { + return; + } + captureMode = settings.getCaptureMode() != null ? settings.getCaptureMode().name() : captureMode; + if (settings.getNegotiatedVideoMime() != null) { + videoCodec = settings.getNegotiatedVideoMime(); + } + } + + /** Normal cast end: persist session JSON to disk (synchronous). */ + public void finish(Context context) { + finish(context, null); + } + + /** + * Persist session JSON. {@code reason} non-null is recorded under {@code globals.reason} + * (e.g. {@code crash} from an uncaught exception hook). Pass {@code null} for a normal session end. + */ + public void finish(Context context, String reason) { + SessionStatsContext.unbind(this); + if (!AppPreferences.isGrabSessionStats(context)) { + return; + } + if (!persisted.compareAndSet(false, true)) { + return; + } + journal.flushGeneralFinal(); + long endedMs = System.currentTimeMillis(); + try { + JSONObject root = buildSessionJson(endedMs, reason); + SessionStatsStore.saveSession(context, startedMs, direction, root); + GraphSessionUploader.uploadAsync(context, root); + } catch (Exception ignored) { + } + } + + JSONObject buildSessionJson(long endedMs, String reason) throws Exception { + JSONObject root = new JSONObject(); + root.put("schema_version", 2); + root.put("direction", direction); + root.put("started_at_epoch_ms", startedMs); + root.put("ended_at_epoch_ms", endedMs); + root.put("duration_ms", endedMs - startedMs); + root.put("role", role); + root.put("transport", transport); + root.put("client_count", clientCount); + root.put("disrupt_count", disruptCount); + root.put("idle_timeout_count", idleTimeouts); + root.put("video_codec", videoCodec); + root.put("audio_codec", audioCodec); + root.put("capture_mode", captureMode); + root.put("resolution", resolution); + root.put("network_samples", networkSamples); + + JSONArray journalEvents = journal.copyEvents(); + if (journalEvents.length() > 0) { + root.put(direction, journalEvents); + } + + if (networkSamples > 0) { + root.put("avg_rtt_ms", sumRttMs / Math.max(1, networkSamples)); + root.put("avg_loss_ratio", sumLossRatioMicro / (1_000_000.0 * Math.max(1, networkSamples))); + } + if (bitrateSamples > 0) { + root.put("avg_video_bitrate_kbps", sumVideoBitrateKbps / bitrateSamples); + } + if (fpsSamples > 0) { + root.put("avg_encode_fps", sumEncodeFpsMicro / (1000.0 * fpsSamples)); + } + + JSONObject protection = new JSONObject(); + StreamProtectionMode protMode = lossTotals.protectionMode != null + ? lossTotals.protectionMode : StreamProtectionMode.NONE; + protection.put("mode", protMode.name()); + protection.put("fec_enabled", protMode.usesFec()); + protection.put("nack_enabled", protMode.usesNack()); + protection.put("fec_packets_encoded", lossTotals.fecPacketsEncoded); + protection.put("fec_packets_decoded", lossTotals.fecPacketsDecoded); + protection.put("fec_decode_failures", lossTotals.fecDecodeFailures); + protection.put("nack_requests_sent", lossTotals.nackRequestsSent); + protection.put("nack_requests_received", lossTotals.nackRequestsReceived); + protection.put("nack_retransmits", lossTotals.nackRetransmits); + protection.put("fec_stub_packets", lossTotals.fecPacketsStub); + protection.put("nack_stub_requests", lossTotals.nackRequestsStub); + root.put("stream_protection", protection); + + JSONObject udp = new JSONObject(); + synchronized (lossTotals) { + udp.put("datagrams_tx", lossTotals.datagramsSent); + udp.put("datagrams_rx", lossTotals.datagramsReceived); + udp.put("datagrams_invalid", lossTotals.datagramsInvalid); + udp.put("fragments_rx", lossTotals.fragmentsReceived); + udp.put("fragments_duplicate", lossTotals.fragmentsDuplicate); + udp.put("reassembly_ok", lossTotals.reassemblyCompleted); + udp.put("reassembly_lost", lossTotals.reassemblyIncomplete + lossTotals.reassemblySuperseded); + udp.put("wire_dropped", lossTotals.wirePacketsDropped); + udp.put("malformed", lossTotals.malformedPackets); + udp.put("send_dropped_video_p", lossTotals.sendDroppedVideoP); + udp.put("send_dropped_audio", lossTotals.sendDroppedAudio); + udp.put("recv_video_skipped_awaiting_key", lossTotals.recvVideoSkippedAwaitingKey); + udp.put("recv_video_decode_errors", lossTotals.recvVideoDecodeErrors); + udp.put("recv_audio_decode_errors", lossTotals.recvAudioDecodeErrors); + udp.put("recv_audio_queue_drops", lossTotals.recvAudioQueueDrops); + udp.put("recv_damaged_video_frames", lossTotals.recvDamagedVideoFrames); + udp.put("fec_packets_encoded", lossTotals.fecPacketsEncoded); + udp.put("fec_packets_decoded", lossTotals.fecPacketsDecoded); + udp.put("fec_decode_failures", lossTotals.fecDecodeFailures); + udp.put("nack_requests_sent", lossTotals.nackRequestsSent); + udp.put("nack_requests_received", lossTotals.nackRequestsReceived); + udp.put("nack_retransmits", lossTotals.nackRetransmits); + udp.put("nack_cache_misses", lossTotals.nackCacheMisses); + } + root.put("udp", udp); + if (samples.length() > 0) { + root.put("samples", samples); + } + + if (reason != null && !reason.isEmpty()) { + JSONObject globals = new JSONObject(); + globals.put("reason", reason); + root.put("globals", globals); + } + return root; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/stats/SessionStatsStore.java b/app/src/main/java/com/foxx/androidcast/stats/SessionStatsStore.java new file mode 100644 index 0000000..2acbb43 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/stats/SessionStatsStore.java @@ -0,0 +1,121 @@ +package com.foxx.androidcast.stats; + +/********************************************************************* + * SessionStatsStore.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SessionStatsStore + * Contributors: + * - Anton Afanasyeu (3 commits, 117 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 3f5f4cba05d083cd4387620a0e0a54d00452dc208640c084a125abf60d0ad353 +**********************************************************************/ +import android.content.Context; + +import com.foxx.androidcast.CastConfig; + +import org.json.JSONObject; + +import java.io.File; +import java.io.FileOutputStream; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +/** Rotating flat JSON session logs in app-private storage. */ +public final class SessionStatsStore { + private static final String DIR_NAME = "session_stats"; + /** Legacy captures before schema v2. */ + private static final String PREFIX_LEGACY = "session_"; + public static final String PREFIX_SEND = "session_send_"; + public static final String PREFIX_RECV = "session_recv_"; + private static final String SUFFIX = ".json"; + + private SessionStatsStore() {} + + public static File statsDir(Context context) { + return new File(context.getApplicationContext().getFilesDir(), DIR_NAME); + } + + private static boolean isSessionJson(String name) { + if (!name.endsWith(SUFFIX)) { + return false; + } + return name.startsWith(PREFIX_LEGACY) + || name.startsWith(PREFIX_SEND) + || name.startsWith(PREFIX_RECV); + } + + /** Session JSON files, newest first (by filename / start time). */ + public static List listSessionFiles(Context context) { + File dir = statsDir(context); + if (!dir.exists()) { + return Collections.emptyList(); + } + File[] files = dir.listFiles((d, name) -> isSessionJson(name)); + if (files == null || files.length == 0) { + return Collections.emptyList(); + } + List list = new ArrayList<>(); + Collections.addAll(list, files); + Collections.sort(list, (a, b) -> b.getName().compareTo(a.getName())); + return list; + } + + /** Keep at most {@link CastConfig#SESSION_STATS_MAX_FILES} - 1 files before a new session. */ + public static void pruneOnAppStart(Context context) { + pruneDirectory(statsDir(context), CastConfig.SESSION_STATS_MAX_FILES); + } + + /** Deletes oldest session JSON files until count is below {@code maxFiles}. */ + static void pruneDirectory(File dir, int maxFiles) { + if (dir == null || !dir.exists()) { + return; + } + File[] files = dir.listFiles((d, name) -> isSessionJson(name)); + if (files == null || files.length == 0) { + return; + } + List list = new ArrayList<>(); + Collections.addAll(list, files); + Collections.sort(list, Comparator.comparing(File::getName)); + while (list.size() >= maxFiles) { + File oldest = list.remove(0); + if (!oldest.delete()) { + break; + } + } + } + + public static void saveSession(Context context, long startedMs, String direction, JSONObject json) + throws Exception { + File dir = statsDir(context); + if (!dir.exists() && !dir.mkdirs()) { + throw new IllegalStateException("Cannot create session_stats dir"); + } + String prefix = prefixForDirection(direction); + String name = prefix + formatTimestamp(startedMs) + SUFFIX; + File out = new File(dir, name); + byte[] bytes = json.toString(2).getBytes(StandardCharsets.UTF_8); + try (FileOutputStream fos = new FileOutputStream(out)) { + fos.write(bytes); + } + } + + static String prefixForDirection(String direction) { + if ("recv".equals(direction)) { + return PREFIX_RECV; + } + return PREFIX_SEND; + } + + private static String formatTimestamp(long epochMs) { + return new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date(epochMs)); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/stats/ui/ChartTickHelper.java b/app/src/main/java/com/foxx/androidcast/stats/ui/ChartTickHelper.java new file mode 100644 index 0000000..3117b86 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/stats/ui/ChartTickHelper.java @@ -0,0 +1,89 @@ +package com.foxx.androidcast.stats.ui; + +/********************************************************************* + * ChartTickHelper.java + * Created at: Tue 19 May 2026 19:43:06 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * Contributors: + * - Anton Afanasyeu (2 commits, 85 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 f53b085b914a3ffd3aeaf98331f60e838dae2ff7428627d0bbb7e2788c5b3836 +**********************************************************************/ +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +/** Nice axis ticks for session charts. */ +final class ChartTickHelper { + private ChartTickHelper() {} + + static final class Tick { + final double value; + final String label; + + Tick(double value, String label) { + this.value = value; + this.label = label; + } + } + + static List linear(double min, double max, int maxTicks) { + List out = new ArrayList<>(); + if (!Double.isFinite(min) || !Double.isFinite(max) || max <= min) { + return out; + } + double step = niceStep(max - min, maxTicks); + double start = Math.ceil(min / step) * step; + for (double v = start; v <= max + step * 0.001; v += step) { + out.add(new Tick(v, formatValue(v, step))); + } + return out; + } + + static List timeMs(long minMs, long maxMs, int maxTicks) { + List out = new ArrayList<>(); + if (maxMs <= minMs) { + return out; + } + double range = maxMs - minMs; + double step = niceStep(range, maxTicks); + double start = Math.ceil(minMs / step) * step; + for (double v = start; v <= maxMs + step * 0.001; v += step) { + long ms = Math.round(v); + out.add(new Tick(ms, formatTimeMs(ms))); + } + return out; + } + + private static double niceStep(double range, int maxTicks) { + double raw = range / Math.max(2, maxTicks); + if (raw <= 0) { + return 1; + } + double mag = Math.pow(10, Math.floor(Math.log10(raw))); + double norm = raw / mag; + double nice = norm <= 1 ? 1 : norm <= 2 ? 2 : norm <= 5 ? 5 : 10; + return nice * mag; + } + + private static String formatValue(double v, double step) { + if (step >= 1) { + return String.format(Locale.US, "%.0f", v); + } + if (step >= 0.1) { + return String.format(Locale.US, "%.1f", v); + } + return String.format(Locale.US, "%.2f", v); + } + + private static String formatTimeMs(long ms) { + if (ms >= 60_000) { + return String.format(Locale.US, "%.1fm", ms / 60_000.0); + } + if (ms >= 1000) { + return String.format(Locale.US, "%.1fs", ms / 1000.0); + } + return ms + "ms"; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/stats/ui/SessionBarChartView.java b/app/src/main/java/com/foxx/androidcast/stats/ui/SessionBarChartView.java new file mode 100644 index 0000000..796b17d --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/stats/ui/SessionBarChartView.java @@ -0,0 +1,121 @@ +package com.foxx.androidcast.stats.ui; + +/********************************************************************* + * SessionBarChartView.java + * Created at: Tue 19 May 2026 19:43:06 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SessionBarChartView + * Contributors: + * - Anton Afanasyeu (2 commits, 117 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 1c4f6cdf1b341bd492b386a2d7ce51da0bcf76a4c8c52843d7fc1eeb8c75abde +**********************************************************************/ +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.view.View; + +import androidx.annotation.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +/** Horizontal bar chart for UDP / protection counter summaries. */ +public class SessionBarChartView extends View { + private static final class Bar { + final String label; + final long value; + final int color; + + Bar(String label, long value, int color) { + this.label = label; + this.value = value; + this.color = color; + } + } + + private final Paint barPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint labelPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final List bars = new ArrayList<>(); + + public SessionBarChartView(Context context) { + super(context); + init(); + } + + public SessionBarChartView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + init(); + } + + private void init() { + textPaint.setColor(0xFFEEEEEE); + textPaint.setTextSize(24f); + labelPaint.setColor(0xFFAAAAAA); + labelPaint.setTextSize(22f); + } + + public void setSession(@Nullable SessionRecord session) { + bars.clear(); + if (session != null) { + SessionRecord.UdpStats u = session.udp; + addBar("UDP tx", u.datagramsTx, 0xFF64B5F6); + addBar("UDP rx", u.datagramsRx, 0xFF42A5F5); + addBar("Reasm OK", u.reassemblyOk, 0xFF81C784); + addBar("Reasm lost", u.reassemblyLost, 0xFFFF8A65); + addBar("Wire drop", u.wireDropped, 0xFFE57373); + addBar("Vid dec err", u.recvVideoDecodeErrors, 0xFFFF5252); + SessionRecord.ProtectionStats p = session.protection; + addBar("FEC enc", p.fecEncoded, 0xFFBA68C8); + addBar("FEC dec", p.fecDecoded, 0xFFAB47BC); + addBar("NACK rtx", p.nackRetransmits, 0xFFFFD54F); + } + requestLayout(); + invalidate(); + } + + private void addBar(String label, long value, int color) { + if (value > 0) { + bars.add(new Bar(label, value, color)); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int h = bars.isEmpty() ? 80 : Math.max(120, bars.size() * 36 + 24); + setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), h); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (bars.isEmpty()) { + labelPaint.setTextSize(26f); + canvas.drawText("No counter data", 24f, 48f, labelPaint); + return; + } + long max = 1L; + for (Bar b : bars) { + max = Math.max(max, b.value); + } + float rowH = 32f; + float y = 12f; + float labelW = 140f; + float barLeft = labelW + 16f; + float barMaxW = getWidth() - barLeft - 80f; + for (Bar b : bars) { + labelPaint.setColor(0xFFAAAAAA); + canvas.drawText(b.label, 8f, y + 22f, labelPaint); + float bw = barMaxW * (b.value / (float) max); + barPaint.setColor(b.color); + canvas.drawRect(barLeft, y + 4f, barLeft + bw, y + 28f, barPaint); + textPaint.setColor(0xFFEEEEEE); + canvas.drawText(String.format(Locale.US, "%d", b.value), barLeft + bw + 8f, y + 22f, textPaint); + y += rowH; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/stats/ui/SessionLineChartView.java b/app/src/main/java/com/foxx/androidcast/stats/ui/SessionLineChartView.java new file mode 100644 index 0000000..e1c4dbb --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/stats/ui/SessionLineChartView.java @@ -0,0 +1,492 @@ +package com.foxx.androidcast.stats.ui; + +/********************************************************************* + * SessionLineChartView.java + * Created at: Tue 19 May 2026 19:43:06 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SessionLineChartView + * Contributors: + * - Anton Afanasyeu (2 commits, 488 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 1bd2a4d05ae795d17ebc64081ad74db589b56866cb6798a9d6d1347698d4e479 +**********************************************************************/ +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.Typeface; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.ScaleGestureDetector; +import android.view.View; + +import androidx.annotation.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +/** + * Multi-session line chart with zoom, grid, legend, and hover marker + tooltip. + */ +public class SessionLineChartView extends View { + public enum Metric { + BITRATE("Video bitrate (kbps)"), + LOSS("Packet loss (%)"), + ENCODE_FPS("Encode FPS"); + + final String axisLabel; + + Metric(String axisLabel) { + this.axisLabel = axisLabel; + } + } + + private static final int[] SESSION_COLORS = { + 0xFF64B5F6, 0xFFFF8A65, 0xFF81C784, 0xFFFFD54F, 0xFFBA68C8, 0xFF4DD0E1 + }; + + private static final float PAD_LEFT = 72f; + private static final float PAD_RIGHT = 16f; + private static final float PAD_TOP = 16f; + private static final float PAD_BOTTOM = 48f; + + private final Paint gridPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint axisPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint linePaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint legendBgPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint legendBorderPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint swatchPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint markerFill = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint markerStroke = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint tooltipBg = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint tooltipFg = new Paint(Paint.ANTI_ALIAS_FLAG); + + private final List sessions = new ArrayList<>(); + private Metric metric = Metric.BITRATE; + private final ScaleGestureDetector scaleDetector; + + private double viewMinT; + private double viewMaxT = 1; + private double viewMinY; + private double viewMaxY = 1; + + private float hoverX = -1; + private float hoverY = -1; + private int hoverSessionIndex = -1; + private SessionRecord.SamplePoint hoverPoint; + private float hoverPlotX; + private float hoverPlotY; + + public SessionLineChartView(Context context) { + super(context); + scaleDetector = new ScaleGestureDetector(context, new ScaleListener()); + initPaints(); + } + + public SessionLineChartView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + scaleDetector = new ScaleGestureDetector(context, new ScaleListener()); + initPaints(); + } + + private void initPaints() { + gridPaint.setColor(0xFF3A3A3A); + gridPaint.setStrokeWidth(1f); + axisPaint.setColor(0xFFAAAAAA); + axisPaint.setStrokeWidth(2f); + linePaint.setStyle(Paint.Style.STROKE); + linePaint.setStrokeWidth(3f); + textPaint.setColor(0xFFBBBBBB); + textPaint.setTextSize(22f); + legendBgPaint.setColor(0xB8000000); + legendBorderPaint.setColor(0xFF888888); + legendBorderPaint.setStyle(Paint.Style.STROKE); + legendBorderPaint.setStrokeWidth(1f); + swatchPaint.setStyle(Paint.Style.FILL); + markerFill.setStyle(Paint.Style.FILL); + markerStroke.setStyle(Paint.Style.STROKE); + markerStroke.setColor(0xFFFFFFFF); + markerStroke.setStrokeWidth(2f); + tooltipBg.setColor(0xE0000000); + tooltipFg.setColor(0xFFFFFFFF); + tooltipFg.setTextSize(24f); + } + + public void setSessions(@Nullable List records, Metric metric) { + sessions.clear(); + if (records != null) { + sessions.addAll(records); + } + this.metric = metric != null ? metric : Metric.BITRATE; + resetView(); + clearHover(); + invalidate(); + } + + private void resetView() { + viewMinT = 0; + viewMaxT = Math.max(1, dataMaxTimeMs()); + double[] y = dataYRange(); + viewMinY = y[0]; + viewMaxY = y[1]; + } + + private long dataMaxTimeMs() { + long max = 1; + for (SessionRecord doc : sessions) { + for (SessionRecord.SamplePoint p : doc.samples) { + max = Math.max(max, p.tMs); + } + max = Math.max(max, doc.durationMs); + } + return max; + } + + private double[] dataYRange() { + double min = Double.POSITIVE_INFINITY; + double max = Double.NEGATIVE_INFINITY; + for (SessionRecord doc : sessions) { + for (SessionRecord.SamplePoint p : doc.samples) { + double v = metricValue(p); + if (Double.isFinite(v)) { + min = Math.min(min, v); + max = Math.max(max, v); + } + } + } + if (!Double.isFinite(min)) { + return new double[] {0, 1}; + } + if (max <= min) { + max = min + 1; + } + double pad = (max - min) * 0.06; + return new double[] {min - pad, max + pad}; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + scaleDetector.onTouchEvent(event); + int action = event.getActionMasked(); + if (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE) { + hoverX = event.getX(); + hoverY = event.getY(); + updateHoverHit(); + invalidate(); + return true; + } + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { + clearHover(); + return true; + } + return super.onTouchEvent(event); + } + + @Override + public boolean onGenericMotionEvent(MotionEvent event) { + if ((event.getSource() & android.view.InputDevice.SOURCE_CLASS_POINTER) != 0 + && event.getAction() == MotionEvent.ACTION_SCROLL) { + float factor = event.getAxisValue(MotionEvent.AXIS_VSCROLL) > 0 ? 0.85f : 1.18f; + zoomAt(event.getX(), event.getY(), factor); + invalidate(); + return true; + } + return super.onGenericMotionEvent(event); + } + + private void zoomAt(float mx, float my, float factor) { + float plotW = plotWidth(); + float plotH = plotHeight(); + if (plotW <= 0 || plotH <= 0) { + return; + } + if (mx >= PAD_LEFT && mx <= PAD_LEFT + plotW && my >= PAD_TOP && my <= PAD_TOP + plotH) { + double relX = (mx - PAD_LEFT) / plotW; + double relY = 1.0 - (my - PAD_TOP) / plotH; + zoomTime(viewMinT + relX * (viewMaxT - viewMinT), factor); + zoomY(viewMinY + relY * (viewMaxY - viewMinY), factor); + } else { + zoomTime((viewMinT + viewMaxT) / 2, factor); + zoomY((viewMinY + viewMaxY) / 2, factor); + } + } + + private void zoomTime(double anchor, float factor) { + double span = viewMaxT - viewMinT; + if (span <= 0) { + return; + } + double newSpan = Math.max(50, span * factor); + viewMinT = anchor - (anchor - viewMinT) * (newSpan / span); + viewMaxT = viewMinT + newSpan; + } + + private void zoomY(double anchor, float factor) { + double span = viewMaxY - viewMinY; + if (span <= 0) { + return; + } + double newSpan = Math.max(1, span * factor); + viewMinY = anchor - (anchor - viewMinY) * (newSpan / span); + viewMaxY = viewMinY + newSpan; + } + + private void clearHover() { + hoverX = -1; + hoverY = -1; + hoverSessionIndex = -1; + hoverPoint = null; + invalidate(); + } + + private void updateHoverHit() { + hoverSessionIndex = -1; + hoverPoint = null; + float plotW = plotWidth(); + float plotH = plotHeight(); + if (plotW <= 0 || plotH <= 0 || sessions.isEmpty()) { + return; + } + if (hoverX < PAD_LEFT || hoverX > PAD_LEFT + plotW + || hoverY < PAD_TOP || hoverY > PAD_TOP + plotH) { + return; + } + double best = 48; + for (int si = 0; si < sessions.size(); si++) { + for (SessionRecord.SamplePoint p : sessions.get(si).samples) { + if (p.tMs < viewMinT || p.tMs > viewMaxT) { + continue; + } + double v = metricValue(p); + if (v < viewMinY || v > viewMaxY) { + continue; + } + float x = toScreenX(p.tMs); + float y = toScreenY(v); + double d = Math.hypot(hoverX - x, hoverY - y); + if (d < best) { + best = d; + hoverSessionIndex = si; + hoverPoint = p; + hoverPlotX = x; + hoverPlotY = y; + } + } + } + } + + private float plotWidth() { + return Math.max(0, getWidth() - PAD_LEFT - PAD_RIGHT); + } + + private float plotHeight() { + return Math.max(0, getHeight() - PAD_TOP - PAD_BOTTOM); + } + + private float toScreenX(double tMs) { + float plotW = plotWidth(); + double span = viewMaxT - viewMinT; + if (span <= 0) { + return PAD_LEFT; + } + return PAD_LEFT + (float) (((tMs - viewMinT) / span) * plotW); + } + + private float toScreenY(double v) { + float plotH = plotHeight(); + double span = viewMaxY - viewMinY; + if (span <= 0) { + return PAD_TOP + plotH; + } + return PAD_TOP + plotH - (float) (((v - viewMinY) / span) * plotH); + } + + private double metricValue(SessionRecord.SamplePoint p) { + switch (metric) { + case LOSS: + return p.lossRatio * 100.0; + case ENCODE_FPS: + return p.encodeFps; + case BITRATE: + default: + return p.videoBitrateKbps > 0 ? p.videoBitrateKbps : p.targetBitrateKbps; + } + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + canvas.drawColor(0xFF121212); + if (sessions.isEmpty() || !hasPlottableData()) { + textPaint.setTextSize(28f); + canvas.drawText(sessions.isEmpty() ? "Select session(s)" : "No time-series samples", + PAD_LEFT, PAD_TOP + 32f, textPaint); + return; + } + + float plotW = plotWidth(); + float plotH = plotHeight(); + if (plotW <= 1 || plotH <= 1) { + return; + } + + List xTicks = ChartTickHelper.timeMs( + (long) viewMinT, (long) viewMaxT, 7); + List yTicks = ChartTickHelper.linear(viewMinY, viewMaxY, 5); + + for (ChartTickHelper.Tick t : xTicks) { + float x = toScreenX(t.value); + canvas.drawLine(x, PAD_TOP, x, PAD_TOP + plotH, gridPaint); + } + for (ChartTickHelper.Tick t : yTicks) { + float y = toScreenY(t.value); + canvas.drawLine(PAD_LEFT, y, PAD_LEFT + plotW, y, gridPaint); + } + + canvas.drawLine(PAD_LEFT, PAD_TOP + plotH, PAD_LEFT + plotW, PAD_TOP + plotH, axisPaint); + canvas.drawLine(PAD_LEFT, PAD_TOP, PAD_LEFT, PAD_TOP + plotH, axisPaint); + + textPaint.setTextSize(20f); + textPaint.setColor(0xFFAAAAAA); + for (ChartTickHelper.Tick t : xTicks) { + float x = toScreenX(t.value); + canvas.drawText(t.label, x - 20f, PAD_TOP + plotH + 32f, textPaint); + } + for (ChartTickHelper.Tick t : yTicks) { + float y = toScreenY(t.value); + canvas.drawText(t.label, 4f, y + 6f, textPaint); + } + + for (int si = 0; si < sessions.size(); si++) { + SessionRecord doc = sessions.get(si); + if (doc.samples.size() < 2) { + continue; + } + linePaint.setColor(SESSION_COLORS[si % SESSION_COLORS.length]); + drawSessionLine(canvas, doc); + } + + drawLegend(canvas, plotW); + + if (hoverPoint != null && hoverSessionIndex >= 0) { + int color = SESSION_COLORS[hoverSessionIndex % SESSION_COLORS.length]; + markerFill.setColor(color); + canvas.drawCircle(hoverPlotX, hoverPlotY, 8f, markerFill); + canvas.drawCircle(hoverPlotX, hoverPlotY, 8f, markerStroke); + drawHoverPopup(canvas, color); + } + } + + private boolean hasPlottableData() { + for (SessionRecord doc : sessions) { + if (doc.samples.size() >= 2) { + return true; + } + } + return false; + } + + private void drawSessionLine(Canvas canvas, SessionRecord doc) { + Path path = new Path(); + boolean first = true; + for (SessionRecord.SamplePoint p : doc.samples) { + if (p.tMs < viewMinT || p.tMs > viewMaxT) { + continue; + } + double v = metricValue(p); + if (v < viewMinY || v > viewMaxY) { + continue; + } + float x = toScreenX(p.tMs); + float y = toScreenY(v); + if (first) { + path.moveTo(x, y); + first = false; + } else { + path.lineTo(x, y); + } + } + canvas.drawPath(path, linePaint); + } + + private void drawLegend(Canvas canvas, float plotW) { + int rows = 0; + for (SessionRecord doc : sessions) { + if (doc.samples.size() >= 2) { + rows++; + } + } + if (rows == 0) { + return; + } + float legendW = 280f; + float rowH = 28f; + float legendH = rows * rowH + 16f; + float x0 = PAD_LEFT + plotW - legendW - 8f; + float y0 = PAD_TOP + 8f; + canvas.drawRoundRect(x0, y0, x0 + legendW, y0 + legendH, 8f, 8f, legendBgPaint); + canvas.drawRoundRect(x0, y0, x0 + legendW, y0 + legendH, 8f, 8f, legendBorderPaint); + + int row = 0; + for (int si = 0; si < sessions.size(); si++) { + SessionRecord doc = sessions.get(si); + if (doc.samples.size() < 2) { + continue; + } + int color = SESSION_COLORS[si % SESSION_COLORS.length]; + float ry = y0 + 8f + row * rowH; + swatchPaint.setColor(color); + canvas.drawRoundRect(x0 + 10f, ry, x0 + 28f, ry + 16f, 3f, 3f, swatchPaint); + legendBorderPaint.setStyle(Paint.Style.STROKE); + canvas.drawRoundRect(x0 + 10f, ry, x0 + 28f, ry + 16f, 3f, 3f, legendBorderPaint); + textPaint.setColor(0xFFFFFFFF); + textPaint.setTextSize(20f); + textPaint.setTypeface(si == hoverSessionIndex ? Typeface.DEFAULT_BOLD : Typeface.DEFAULT); + String name = doc.fileName; + if (name.length() > 32) { + name = "…" + name.substring(name.length() - 31); + } + canvas.drawText(name, x0 + 36f, ry + 14f, textPaint); + row++; + } + textPaint.setTypeface(Typeface.DEFAULT); + } + + private void drawHoverPopup(Canvas canvas, int accentColor) { + String text = String.format(Locale.US, + "t=%d ms bitrate=%.0f kbps loss=%.2f%% fps=%.1f", + hoverPoint.tMs, + hoverPoint.videoBitrateKbps, + hoverPoint.lossRatio * 100.0, + hoverPoint.encodeFps); + float tw = tooltipFg.measureText(text) + 24f; + float th = 36f; + float px = hoverPlotX + 14f; + float py = hoverPlotY - th - 16f; + if (px + tw > PAD_LEFT + plotWidth()) { + px = hoverPlotX - tw - 14f; + } + if (py < PAD_TOP) { + py = hoverPlotY + 14f; + } + tooltipBg.setColor(0xE0000000); + canvas.drawRoundRect(px, py, px + tw, py + th, 8f, 8f, tooltipBg); + markerStroke.setColor(accentColor); + canvas.drawRoundRect(px, py, px + tw, py + th, 8f, 8f, markerStroke); + markerStroke.setColor(0xFFFFFFFF); + canvas.drawText(text, px + 12f, py + 24f, tooltipFg); + } + + private final class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { + @Override + public boolean onScale(ScaleGestureDetector detector) { + float factor = 1f / detector.getScaleFactor(); + zoomAt(detector.getFocusX(), detector.getFocusY(), factor); + invalidate(); + return true; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/stats/ui/SessionRecord.java b/app/src/main/java/com/foxx/androidcast/stats/ui/SessionRecord.java new file mode 100644 index 0000000..656c7d4 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/stats/ui/SessionRecord.java @@ -0,0 +1,239 @@ +package com.foxx.androidcast.stats.ui; + +/********************************************************************* + * SessionRecord.java + * Created at: Tue 19 May 2026 19:43:06 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SessionRecord + * Contributors: + * - Anton Afanasyeu (2 commits, 235 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 851bf289ce0cfb533f555e8101cf087211cae6d9f65f3b76130cb025556afaa0 +**********************************************************************/ +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** Parsed session JSON for the in-app statistics analyzer. */ +public final class SessionRecord { + public final String fileName; + public final int schemaVersion; + public final long startedAtEpochMs; + public final long endedAtEpochMs; + public final long durationMs; + /** {@code send} or {@code recv}; inferred from filename when absent. */ + public final String direction; + public final String role; + public final String transport; + public final int clientCount; + public final int disruptCount; + public final int idleTimeoutCount; + public final String videoCodec; + public final String audioCodec; + public final String captureMode; + public final String resolution; + public final int networkSamples; + public final long avgRttMs; + public final double avgLossRatio; + public final long avgVideoBitrateKbps; + public final double avgEncodeFps; + public final ProtectionStats protection; + public final UdpStats udp; + public final List samples; + + public SessionRecord(String fileName, JSONObject root) { + this.fileName = fileName; + schemaVersion = root.optInt("schema_version", 0); + startedAtEpochMs = root.optLong("started_at_epoch_ms", 0L); + endedAtEpochMs = root.optLong("ended_at_epoch_ms", 0L); + durationMs = root.optLong("duration_ms", 0L); + direction = inferDirection(fileName, root); + role = root.optString("role", direction.equals("recv") ? "receiver" : "sender"); + transport = root.optString("transport", "?"); + clientCount = root.optInt("client_count", 1); + disruptCount = root.optInt("disrupt_count", 0); + idleTimeoutCount = root.optInt("idle_timeout_count", 0); + videoCodec = root.optString("video_codec", ""); + audioCodec = root.optString("audio_codec", ""); + captureMode = root.optString("capture_mode", ""); + resolution = root.optString("resolution", ""); + networkSamples = root.optInt("network_samples", 0); + avgRttMs = root.optLong("avg_rtt_ms", 0L); + avgLossRatio = root.optDouble("avg_loss_ratio", 0.0); + avgVideoBitrateKbps = root.optLong("avg_video_bitrate_kbps", 0L); + avgEncodeFps = root.optDouble("avg_encode_fps", 0.0); + protection = ProtectionStats.fromJson(root.optJSONObject("stream_protection")); + udp = UdpStats.fromJson(root.optJSONObject("udp")); + samples = SamplePoint.parseArray(root.optJSONArray("samples")); + } + + public boolean hasTimeSeries() { + return samples.size() >= 2; + } + + public String listSubtitle() { + long min = durationMs / 60_000L; + long sec = (durationMs / 1000L) % 60L; + return direction + " · " + transport + " · " + min + "m " + sec + "s"; + } + + private static String inferDirection(String fileName, JSONObject root) { + String d = root.optString("direction", ""); + if ("send".equals(d) || "recv".equals(d)) { + return d; + } + if (fileName != null) { + if (fileName.startsWith("session_send_")) { + return "send"; + } + if (fileName.startsWith("session_recv_")) { + return "recv"; + } + } + String role = root.optString("role", ""); + return "receiver".equals(role) ? "recv" : "send"; + } + + public static final class SamplePoint { + public final long tMs; + public final double videoBitrateKbps; + public final int rttMs; + public final double lossRatio; + public final double encodeFps; + public final int targetBitrateKbps; + public final int congestionLevel; + + public SamplePoint(long tMs, double videoBitrateKbps, int rttMs, double lossRatio, + double encodeFps, int targetBitrateKbps, int congestionLevel) { + this.tMs = tMs; + this.videoBitrateKbps = videoBitrateKbps; + this.rttMs = rttMs; + this.lossRatio = lossRatio; + this.encodeFps = encodeFps; + this.targetBitrateKbps = targetBitrateKbps; + this.congestionLevel = congestionLevel; + } + + static SamplePoint fromJson(JSONObject o) { + return new SamplePoint( + o.optLong("t_ms", 0L), + o.optDouble("video_bitrate_kbps", 0.0), + o.optInt("rtt_ms", 0), + o.optDouble("loss_ratio", 0.0), + o.optDouble("encode_fps", 0.0), + o.optInt("target_bitrate_kbps", 0), + o.optInt("congestion_level", 0)); + } + + static List parseArray(org.json.JSONArray arr) { + if (arr == null || arr.length() == 0) { + return Collections.emptyList(); + } + List out = new ArrayList<>(arr.length()); + for (int i = 0; i < arr.length(); i++) { + JSONObject o = arr.optJSONObject(i); + if (o != null) { + out.add(fromJson(o)); + } + } + return out; + } + } + + public static final class ProtectionStats { + public final String mode; + public final boolean fecEnabled; + public final boolean nackEnabled; + public final long fecEncoded; + public final long fecDecoded; + public final long fecDecodeFailures; + public final long nackSent; + public final long nackReceived; + public final long nackRetransmits; + + ProtectionStats(String mode, boolean fecEnabled, boolean nackEnabled, long fecEncoded, + long fecDecoded, long fecDecodeFailures, long nackSent, long nackReceived, + long nackRetransmits) { + this.mode = mode != null ? mode : "NONE"; + this.fecEnabled = fecEnabled; + this.nackEnabled = nackEnabled; + this.fecEncoded = fecEncoded; + this.fecDecoded = fecDecoded; + this.fecDecodeFailures = fecDecodeFailures; + this.nackSent = nackSent; + this.nackReceived = nackReceived; + this.nackRetransmits = nackRetransmits; + } + + static ProtectionStats fromJson(JSONObject o) { + if (o == null) { + return new ProtectionStats("NONE", false, false, 0, 0, 0, 0, 0, 0); + } + return new ProtectionStats( + o.optString("mode", "NONE"), + o.optBoolean("fec_enabled", false), + o.optBoolean("nack_enabled", false), + o.optLong("fec_packets_encoded", 0L), + o.optLong("fec_packets_decoded", 0L), + o.optLong("fec_decode_failures", 0L), + o.optLong("nack_requests_sent", 0L), + o.optLong("nack_requests_received", 0L), + o.optLong("nack_retransmits", 0L)); + } + } + + public static final class UdpStats { + public final long datagramsTx; + public final long datagramsRx; + public final long datagramsInvalid; + public final long fragmentsRx; + public final long fragmentsDuplicate; + public final long reassemblyOk; + public final long reassemblyLost; + public final long wireDropped; + public final long malformed; + public final long sendDroppedVideoP; + public final long recvVideoDecodeErrors; + public final long recvDamagedVideoFrames; + + UdpStats(long datagramsTx, long datagramsRx, long datagramsInvalid, long fragmentsRx, + long fragmentsDuplicate, long reassemblyOk, long reassemblyLost, long wireDropped, + long malformed, long sendDroppedVideoP, long recvVideoDecodeErrors, + long recvDamagedVideoFrames) { + this.datagramsTx = datagramsTx; + this.datagramsRx = datagramsRx; + this.datagramsInvalid = datagramsInvalid; + this.fragmentsRx = fragmentsRx; + this.fragmentsDuplicate = fragmentsDuplicate; + this.reassemblyOk = reassemblyOk; + this.reassemblyLost = reassemblyLost; + this.wireDropped = wireDropped; + this.malformed = malformed; + this.sendDroppedVideoP = sendDroppedVideoP; + this.recvVideoDecodeErrors = recvVideoDecodeErrors; + this.recvDamagedVideoFrames = recvDamagedVideoFrames; + } + + static UdpStats fromJson(JSONObject o) { + if (o == null) { + return new UdpStats(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + } + return new UdpStats( + o.optLong("datagrams_tx", 0L), + o.optLong("datagrams_rx", 0L), + o.optLong("datagrams_invalid", 0L), + o.optLong("fragments_rx", 0L), + o.optLong("fragments_duplicate", 0L), + o.optLong("reassembly_ok", 0L), + o.optLong("reassembly_lost", 0L), + o.optLong("wire_dropped", 0L), + o.optLong("malformed", 0L), + o.optLong("send_dropped_video_p", 0L), + o.optLong("recv_video_decode_errors", 0L), + o.optLong("recv_damaged_video_frames", 0L)); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/stats/ui/SessionStatsAnalyzerActivity.java b/app/src/main/java/com/foxx/androidcast/stats/ui/SessionStatsAnalyzerActivity.java new file mode 100644 index 0000000..79a20ef --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/stats/ui/SessionStatsAnalyzerActivity.java @@ -0,0 +1,193 @@ +package com.foxx.androidcast.stats.ui; + +/********************************************************************* + * SessionStatsAnalyzerActivity.java + * Created at: Tue 19 May 2026 19:43:06 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SessionStatsAnalyzerActivity + * Contributors: + * - Anton Afanasyeu (2 commits, 189 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 cd3ef931583d3213d5aaba08bbc5859ceaba1c5f0bc10c1fff11d4d65b65aed4 +**********************************************************************/ +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.view.View; +import android.widget.RadioGroup; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.FileProvider; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.CastLocaleHelper; +import com.foxx.androidcast.CastThemeHelper; +import com.foxx.androidcast.R; +import com.foxx.androidcast.stats.SessionStatsStore; +import com.foxx.androidcast.util.CastBackgroundExecutor; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +/** In-app viewer for saved session_send_* / session_recv_* cast statistics. */ +public class SessionStatsAnalyzerActivity extends AppCompatActivity + implements SessionStatsListAdapter.Listener { + private SessionLineChartView lineChart; + private SessionBarChartView barChart; + private TextView summaryText; + private TextView emptyText; + private View detailPanel; + private SessionRecord primarySelection; + private SessionLineChartView.Metric chartMetric = SessionLineChartView.Metric.BITRATE; + private List chartSessions = new ArrayList<>(); + + @Override + protected void attachBaseContext(android.content.Context newBase) { + super.attachBaseContext(CastLocaleHelper.attach(newBase)); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + CastThemeHelper.applyTheme(this); + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_session_stats_analyzer); + setTitle(R.string.session_stats_title); + + if (getSupportActionBar() != null) { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + + emptyText = findViewById(R.id.text_session_stats_empty); + detailPanel = findViewById(R.id.panel_session_detail); + summaryText = findViewById(R.id.text_session_summary); + lineChart = findViewById(R.id.chart_session_lines); + barChart = findViewById(R.id.chart_session_bars); + RecyclerView list = findViewById(R.id.list_sessions); + + SessionStatsListAdapter adapter = new SessionStatsListAdapter(this); + list.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)); + list.setAdapter(adapter); + + setupMetricRadios(); + findViewById(R.id.btn_share_session).setOnClickListener(v -> shareSelected()); + findViewById(R.id.btn_refresh_sessions).setOnClickListener(v -> reloadSessions(adapter)); + + TextView hint = findViewById(R.id.text_chart_interaction_hint); + if (hint != null) { + hint.setText(R.string.session_stats_chart_hint); + } + + if (!AppPreferences.isGrabSessionStats(this)) { + Toast.makeText(this, R.string.session_stats_disabled_hint, Toast.LENGTH_LONG).show(); + } + reloadSessions(adapter); + } + + @Override + public boolean onSupportNavigateUp() { + finish(); + return true; + } + + private void setupMetricRadios() { + RadioGroup group = findViewById(R.id.radio_group_metric); + if (group == null) { + return; + } + group.setOnCheckedChangeListener((g, id) -> { + if (id == R.id.radio_metric_loss) { + chartMetric = SessionLineChartView.Metric.LOSS; + } else if (id == R.id.radio_metric_fps) { + chartMetric = SessionLineChartView.Metric.ENCODE_FPS; + } else { + chartMetric = SessionLineChartView.Metric.BITRATE; + } + refreshChart(); + }); + } + + private void reloadSessions(SessionStatsListAdapter adapter) { + emptyText.setVisibility(View.VISIBLE); + detailPanel.setVisibility(View.GONE); + CastBackgroundExecutor.execute(() -> { + List loaded = new ArrayList<>(); + List files = SessionStatsStore.listSessionFiles(this); + for (File f : files) { + try { + loaded.add(SessionStatsParser.load(f)); + } catch (Exception ignored) { + } + } + runOnUiThread(() -> { + adapter.setItems(loaded); + boolean has = !loaded.isEmpty(); + emptyText.setVisibility(has ? View.GONE : View.VISIBLE); + emptyText.setText(has ? "" : getString(R.string.session_stats_empty)); + detailPanel.setVisibility(has ? View.VISIBLE : View.GONE); + }); + }); + } + + @Override + public void onSelectionChanged(List selected) { + chartSessions = selected != null ? selected : new ArrayList<>(); + primarySelection = chartSessions.isEmpty() ? null : chartSessions.get(0); + refreshChart(); + if (primarySelection != null) { + summaryText.setText(buildSummary(primarySelection)); + barChart.setSession(primarySelection); + } + } + + private void refreshChart() { + lineChart.setSessions(chartSessions, chartMetric); + } + + private String buildSummary(SessionRecord r) { + StringBuilder sb = new StringBuilder(); + sb.append(r.role).append(" · ").append(r.transport).append('\n'); + sb.append(String.format(Locale.US, "Duration: %d ms\n", r.durationMs)); + if (!r.videoCodec.isEmpty()) { + sb.append("Video: ").append(r.videoCodec).append('\n'); + } + if (!r.resolution.isEmpty()) { + sb.append("Resolution: ").append(r.resolution).append('\n'); + } + sb.append(String.format(Locale.US, "Disrupts: %d idle timeouts: %d\n", + r.disruptCount, r.idleTimeoutCount)); + if (r.networkSamples > 0) { + sb.append(String.format(Locale.US, "Avg RTT: %d ms loss: %.3f bitrate: %d kbps fps: %.1f\n", + r.avgRttMs, r.avgLossRatio, r.avgVideoBitrateKbps, r.avgEncodeFps)); + } + SessionRecord.ProtectionStats p = r.protection; + sb.append(String.format(Locale.US, "Protection: %s (FEC=%s NACK=%s)\n", + p.mode, p.fecEnabled, p.nackEnabled)); + sb.append(String.format(Locale.US, "Samples in chart: %d", r.samples.size())); + return sb.toString().trim(); + } + + private void shareSelected() { + if (primarySelection == null) { + return; + } + File dir = SessionStatsStore.statsDir(this); + File file = new File(dir, primarySelection.fileName); + if (!file.isFile()) { + Toast.makeText(this, R.string.session_stats_share_failed, Toast.LENGTH_SHORT).show(); + return; + } + Uri uri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", file); + Intent send = new Intent(Intent.ACTION_SEND); + send.setType("application/json"); + send.putExtra(Intent.EXTRA_STREAM, uri); + send.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + startActivity(Intent.createChooser(send, getString(R.string.session_stats_share))); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/stats/ui/SessionStatsListAdapter.java b/app/src/main/java/com/foxx/androidcast/stats/ui/SessionStatsListAdapter.java new file mode 100644 index 0000000..70702cf --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/stats/ui/SessionStatsListAdapter.java @@ -0,0 +1,116 @@ +package com.foxx.androidcast.stats.ui; + +/********************************************************************* + * SessionStatsListAdapter.java + * Created at: Tue 19 May 2026 19:43:06 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * interface Listener + * Contributors: + * - Anton Afanasyeu (2 commits, 112 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 01cfd98fe664b1517cd3a8c05259594d0a6772f2482e042eeeff356b2be353f2 +**********************************************************************/ +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.foxx.androidcast.R; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +final class SessionStatsListAdapter extends RecyclerView.Adapter { + interface Listener { + void onSelectionChanged(List selected); + } + + private final List items = new ArrayList<>(); + private final Set selectedPositions = new HashSet<>(); + private final Listener listener; + + SessionStatsListAdapter(Listener listener) { + this.listener = listener; + } + + void setItems(List records) { + items.clear(); + selectedPositions.clear(); + if (records != null) { + items.addAll(records); + for (int i = 0; i < items.size(); i++) { + selectedPositions.add(i); + } + } + notifyDataSetChanged(); + notifySelection(); + } + + List getSelected() { + List out = new ArrayList<>(); + for (int i : selectedPositions) { + if (i >= 0 && i < items.size()) { + out.add(items.get(i)); + } + } + return out; + } + + @NonNull + @Override + public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.item_session_stats, parent, false); + return new Holder(v); + } + + @Override + public void onBindViewHolder(@NonNull Holder holder, int position) { + SessionRecord r = items.get(position); + holder.title.setText(r.fileName); + holder.subtitle.setText(r.listSubtitle()); + boolean selected = selectedPositions.contains(position); + holder.itemView.setAlpha(selected ? 1f : 0.45f); + holder.itemView.setOnClickListener(v -> { + int pos = holder.getBindingAdapterPosition(); + if (pos == RecyclerView.NO_POSITION) { + return; + } + if (selectedPositions.contains(pos)) { + selectedPositions.remove(pos); + } else { + selectedPositions.add(pos); + } + notifyItemChanged(pos); + notifySelection(); + }); + } + + private void notifySelection() { + if (listener != null) { + listener.onSelectionChanged(getSelected()); + } + } + + @Override + public int getItemCount() { + return items.size(); + } + + static final class Holder extends RecyclerView.ViewHolder { + final TextView title; + final TextView subtitle; + + Holder(@NonNull View itemView) { + super(itemView); + title = itemView.findViewById(R.id.text_session_title); + subtitle = itemView.findViewById(R.id.text_session_subtitle); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/stats/ui/SessionStatsParser.java b/app/src/main/java/com/foxx/androidcast/stats/ui/SessionStatsParser.java new file mode 100644 index 0000000..1fe3552 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/stats/ui/SessionStatsParser.java @@ -0,0 +1,33 @@ +package com.foxx.androidcast.stats.ui; + +/********************************************************************* + * SessionStatsParser.java + * Created at: Tue 19 May 2026 19:43:06 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SessionStatsParser + * Contributors: + * - Anton Afanasyeu (2 commits, 29 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 0ce567cbbef716b35d3edd48e828089da7b4fffe0ca762e9b18f9dc7e7360fab +**********************************************************************/ +import org.json.JSONObject; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; + +/** Loads {@link SessionRecord} from on-device session JSON files. */ +public final class SessionStatsParser { + private SessionStatsParser() {} + + public static SessionRecord load(File file) throws Exception { + if (file == null || !file.isFile()) { + throw new IllegalArgumentException("Not a file"); + } + byte[] bytes = Files.readAllBytes(file.toPath()); + String text = new String(bytes, StandardCharsets.UTF_8); + JSONObject root = new JSONObject(text); + return new SessionRecord(file.getName(), root); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ui/AspectRatioFrameLayout.java b/app/src/main/java/com/foxx/androidcast/ui/AspectRatioFrameLayout.java new file mode 100644 index 0000000..ab22a6f --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ui/AspectRatioFrameLayout.java @@ -0,0 +1,89 @@ +package com.foxx.androidcast.ui; + +/********************************************************************* + * AspectRatioFrameLayout.java + * Created at: Fri 15 May 2026 16:49:02 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class AspectRatioFrameLayout + * Contributors: + * - Anton Afanasyeu (3 commits, 85 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 aff69d975c86ce78d354f5c93fdbc7fc120ef82bed50f71c89f9ac9c4837a9d0 +**********************************************************************/ +import android.content.Context; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +/** + * Centers a child and sizes it to fit inside the parent while preserving video aspect ratio. + */ +public class AspectRatioFrameLayout extends FrameLayout { + private float aspectRatio; + + public AspectRatioFrameLayout(Context context) { + super(context); + } + + public AspectRatioFrameLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public void setAspectRatio(int videoWidth, int videoHeight) { + if (videoWidth <= 0 || videoHeight <= 0) { + aspectRatio = 0f; + } else { + aspectRatio = (float) videoWidth / videoHeight; + } + requestLayout(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int parentW = MeasureSpec.getSize(widthMeasureSpec); + int parentH = MeasureSpec.getSize(heightMeasureSpec); + if (getChildCount() == 0) { + setMeasuredDimension(parentW, parentH); + return; + } + if (aspectRatio <= 0f) { + int fullW = MeasureSpec.makeMeasureSpec(parentW, MeasureSpec.EXACTLY); + int fullH = MeasureSpec.makeMeasureSpec(parentH, MeasureSpec.EXACTLY); + measureChild(getChildAt(0), fullW, fullH); + setMeasuredDimension(parentW, parentH); + return; + } + int childW; + int childH; + float parentRatio = (float) parentW / parentH; + if (parentRatio > aspectRatio) { + childH = parentH; + childW = Math.round(childH * aspectRatio); + } else { + childW = parentW; + childH = Math.round(childW / aspectRatio); + } + int wSpec = MeasureSpec.makeMeasureSpec(childW, MeasureSpec.EXACTLY); + int hSpec = MeasureSpec.makeMeasureSpec(childH, MeasureSpec.EXACTLY); + measureChild(getChildAt(0), wSpec, hSpec); + setMeasuredDimension(parentW, parentH); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + if (getChildCount() == 0) { + return; + } + if (aspectRatio <= 0f) { + getChildAt(0).layout(left, top, right, bottom); + return; + } + int parentW = right - left; + int parentH = bottom - top; + int childW = getChildAt(0).getMeasuredWidth(); + int childH = getChildAt(0).getMeasuredHeight(); + int childLeft = left + (parentW - childW) / 2; + int childTop = top + (parentH - childH) / 2; + getChildAt(0).layout(childLeft, childTop, childLeft + childW, childTop + childH); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ui/PlaybackTextureTransform.java b/app/src/main/java/com/foxx/androidcast/ui/PlaybackTextureTransform.java new file mode 100644 index 0000000..800a9da --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ui/PlaybackTextureTransform.java @@ -0,0 +1,52 @@ +package com.foxx.androidcast.ui; + +/********************************************************************* + * PlaybackTextureTransform.java + * Created at: Sat 16 May 2026 18:50:36 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class PlaybackTextureTransform + * Contributors: + * - Anton Afanasyeu (2 commits, 48 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 aacbd51ce31e50fcb30b9707ea24f855192575b317348689c2773e176ed3aaec +**********************************************************************/ +import android.graphics.Matrix; +import android.view.TextureView; + +/** + * Letterboxes decoded video in a {@link TextureView}. + * Uses view-space scale around center (same approach as ExoPlayer), not pixel {@link Matrix#setRectToRect}. + */ +public final class PlaybackTextureTransform { + private PlaybackTextureTransform() {} + + public static void applyFitCenter(TextureView view, int videoWidth, int videoHeight) { + if (view == null || videoWidth <= 0 || videoHeight <= 0) { + return; + } + int viewW = view.getWidth(); + int viewH = view.getHeight(); + if (viewW <= 0 || viewH <= 0) { + return; + } + float videoAspect = (float) videoWidth / videoHeight; + float viewAspect = (float) viewW / viewH; + float scaleX = 1f; + float scaleY = 1f; + if (videoAspect > viewAspect) { + scaleY = viewAspect / videoAspect; + } else { + scaleX = videoAspect / viewAspect; + } + Matrix matrix = new Matrix(); + matrix.setScale(scaleX, scaleY, viewW / 2f, viewH / 2f); + view.setTransform(matrix); + } + + public static void clearTransform(TextureView view) { + if (view != null) { + view.setTransform(new Matrix()); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ui/SettingsEnumSpinner.java b/app/src/main/java/com/foxx/androidcast/ui/SettingsEnumSpinner.java new file mode 100644 index 0000000..f5e65ed --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ui/SettingsEnumSpinner.java @@ -0,0 +1,125 @@ +package com.foxx.androidcast.ui; + +/********************************************************************* + * SettingsEnumSpinner.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SettingsEnumSpinner + * Contributors: + * - Anton Afanasyeu (3 commits, 121 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 ac91f40ce7f3db13225aadbea9f25900e0d7037eddd67d4fe3af81d43d06d5eb +**********************************************************************/ +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.foxx.androidcast.R; + +import java.util.ArrayList; +import java.util.List; + +/** Spinner with optional disabled rows (future codecs). */ +public final class SettingsEnumSpinner { + private SettingsEnumSpinner() {} + + public static void bind(Spinner spinner, T[] values, String[] labels, boolean[] selectable, + T current, java.util.function.Consumer onSelect) { + bind(spinner, values, labels, null, selectable, current, onSelect); + } + + public static void bind(Spinner spinner, T[] values, String[] labels, int[] priorityScores, + boolean[] selectable, T current, java.util.function.Consumer onSelect) { + spinner.setTag(R.id.tag_spinner_enum, values); + spinner.setTag(R.id.tag_spinner_selectable, selectable); + SettingsStringArrayAdapter adapter = priorityScores != null + ? new ScoredDisabledAdapter(spinner.getContext(), labels, priorityScores, selectable) + : new DisabledAdapter(spinner.getContext(), labels, selectable); + spinner.setBackgroundResource(R.drawable.bg_settings_spinner); + spinner.setAdapter(adapter); + spinner.setPopupBackgroundResource(R.drawable.bg_settings_spinner_popup); + final int[] selectedIndex = {0}; + for (int i = 0; i < values.length; i++) { + if (values[i].equals(current) && selectable[i]) { + selectedIndex[0] = i; + break; + } + } + spinner.setSelection(selectedIndex[0]); + setAdapterSelectedPosition(adapter, selectedIndex[0]); + SettingsStringArrayAdapter.wireSelectionRefresh(spinner, adapter); + spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + if (position < 0 || position >= values.length) { + return; + } + if (!selectable[position]) { + spinner.setSelection(selectedIndex[0]); + return; + } + selectedIndex[0] = position; + setAdapterSelectedPosition(adapter, position); + onSelect.accept(values[position]); + } + + @Override + public void onNothingSelected(AdapterView parent) {} + }); + } + + private static void setAdapterSelectedPosition(SettingsStringArrayAdapter adapter, int position) { + adapter.setSelectedPosition(position); + } + + @SuppressWarnings("unchecked") + public static > T read(Spinner spinner, T fallback) { + Object tag = spinner.getTag(R.id.tag_spinner_enum); + Object selTag = spinner.getTag(R.id.tag_spinner_selectable); + if (!(tag instanceof Enum[]) || !(selTag instanceof boolean[])) { + return fallback; + } + Enum[] values = (Enum[]) tag; + boolean[] selectable = (boolean[]) selTag; + int pos = spinner.getSelectedItemPosition(); + if (pos >= 0 && pos < values.length && selectable[pos]) { + return (T) values[pos]; + } + return fallback; + } + + private static final class DisabledAdapter extends SettingsStringArrayAdapter { + private final boolean[] selectable; + + DisabledAdapter(Context context, String[] labels, boolean[] selectable) { + super(context, labels); + this.selectable = selectable; + } + + @Override + public boolean isEnabled(int position) { + return position >= 0 && position < selectable.length && selectable[position]; + } + } + + private static final class ScoredDisabledAdapter extends SettingsScoredArrayAdapter { + private final boolean[] selectable; + + ScoredDisabledAdapter(Context context, String[] labels, int[] scores, boolean[] selectable) { + super(context, labels, scores); + this.selectable = selectable; + } + + @Override + public boolean isEnabled(int position) { + return position >= 0 && position < selectable.length && selectable[position]; + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ui/SettingsScoredArrayAdapter.java b/app/src/main/java/com/foxx/androidcast/ui/SettingsScoredArrayAdapter.java new file mode 100644 index 0000000..fd298c0 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ui/SettingsScoredArrayAdapter.java @@ -0,0 +1,81 @@ +package com.foxx.androidcast.ui; + +/********************************************************************* + * SettingsScoredArrayAdapter.java + * Created at: Mon 18 May 2026 22:19:39 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SettingsScoredArrayAdapter + * Contributors: + * - Anton Afanasyeu (2 commits, 77 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 fc7006cce093f741045f7b963b6373343de66a7be565ba0e64bff5eca7abd7be +**********************************************************************/ +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.foxx.androidcast.R; + +/** Settings spinner row with label left and optional priority score right-aligned. */ +public class SettingsScoredArrayAdapter extends SettingsStringArrayAdapter { + /** Hide score column when negative. */ + public static final int NO_SCORE = -1; + + private final int[] scores; + + public SettingsScoredArrayAdapter(Context context, String[] labels, int[] scores) { + super(context, labels, R.layout.spinner_dropdown_item_scored); + this.scores = scores != null ? scores : new int[labels.length]; + } + + @Override + @NonNull + public View getView(int position, View convertView, @NonNull ViewGroup parent) { + View row = convertView; + if (!isScoredRow(row)) { + row = LayoutInflater.from(getContext()).inflate(R.layout.spinner_item_scored, parent, false); + } + bindRow(row, position); + row.setAlpha(isEnabled(position) ? 1f : 0.45f); + return row; + } + + @Override + public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { + View row = convertView; + if (!isScoredRow(row)) { + row = LayoutInflater.from(getContext()) + .inflate(R.layout.spinner_dropdown_item_scored, parent, false); + } + bindRow(row, position); + SettingsSpinnerDropdownStyle.apply(row, position == selectedPosition, isEnabled(position)); + return row; + } + + private void bindRow(View row, int position) { + TextView label = row.findViewById(R.id.spinner_item_label); + TextView score = row.findViewById(R.id.spinner_item_score); + if (label != null) { + label.setText(getItem(position)); + } + if (score != null) { + int value = position >= 0 && position < scores.length ? scores[position] : NO_SCORE; + if (value >= 0) { + score.setVisibility(View.VISIBLE); + score.setText(String.valueOf(value)); + } else { + score.setVisibility(View.GONE); + } + } + } + + private static boolean isScoredRow(View row) { + return row != null && row.findViewById(R.id.spinner_item_label) != null; + } + +} diff --git a/app/src/main/java/com/foxx/androidcast/ui/SettingsSpinnerDropdownStyle.java b/app/src/main/java/com/foxx/androidcast/ui/SettingsSpinnerDropdownStyle.java new file mode 100644 index 0000000..5d9642b --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ui/SettingsSpinnerDropdownStyle.java @@ -0,0 +1,73 @@ +package com.foxx.androidcast.ui; + +/********************************************************************* + * SettingsSpinnerDropdownStyle.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SettingsSpinnerDropdownStyle + * Contributors: + * - Anton Afanasyeu (2 commits, 69 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 895262399af56553532cacac04bef4b10715604ec0521f3d3bda2e1102ea8f33 +**********************************************************************/ +import android.graphics.Color; +import android.graphics.Typeface; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.TextView; + +import androidx.core.content.ContextCompat; +import androidx.core.graphics.ColorUtils; + +import com.foxx.androidcast.R; + +/** Dropdown row styling for global settings spinners. */ +public final class SettingsSpinnerDropdownStyle { + private SettingsSpinnerDropdownStyle() {} + + public static void apply(View row, boolean selected, boolean enabled) { + if (row == null) { + return; + } + TextView tv = row.findViewById(R.id.spinner_dropdown_text); + if (tv == null && row instanceof TextView) { + tv = (TextView) row; + } + if (tv == null) { + return; + } + FrameLayout root = row.findViewById(R.id.spinner_dropdown_item_root); + if (root != null) { + root.setBackgroundResource(selected + ? R.drawable.bg_settings_spinner_item_selected + : R.drawable.bg_settings_spinner_item); + root.setAlpha(enabled ? 1f : 0.45f); + } + int textColor = ContextCompat.getColor(tv.getContext(), R.color.settings_spinner_text); + tv.setTextColor(textColor); + tv.setAlpha(enabled ? 1f : 0.45f); + tv.setTypeface(null, selected ? Typeface.BOLD : Typeface.NORMAL); + int shadowColor = ContextCompat.getColor(tv.getContext(), R.color.settings_spinner_text_shadow); + tv.setShadowLayer(selected ? 0f : 3f, 0f, 2f, shadowColor); + tv.getPaint().setUnderlineText(false); + if (selected) { + int underline = contrastUnderlineColor(textColor); + tv.setBackgroundResource(underlineBarDrawable(underline)); + } else { + tv.setBackgroundResource(0); + } + } + + private static int contrastUnderlineColor(int textColor) { + double lum = ColorUtils.calculateLuminance(textColor); + return lum > 0.55 ? Color.BLACK : Color.WHITE; + } + + private static int underlineBarDrawable(int color) { + if (color == Color.BLACK) { + return R.drawable.bg_spinner_item_underline_dark; + } + return R.drawable.bg_spinner_item_underline_light; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ui/SettingsStringArrayAdapter.java b/app/src/main/java/com/foxx/androidcast/ui/SettingsStringArrayAdapter.java new file mode 100644 index 0000000..b7b53f7 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ui/SettingsStringArrayAdapter.java @@ -0,0 +1,84 @@ +package com.foxx.androidcast.ui; + +/********************************************************************* + * SettingsStringArrayAdapter.java + * Created at: Sun 17 May 2026 22:49:49 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class SettingsStringArrayAdapter + * Contributors: + * - Anton Afanasyeu (4 commits, 80 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 d38f982e34eb051df0f9748ee95bfa1a58e5ab45bf65b9a48573b64b23e2e1fb +**********************************************************************/ +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.annotation.LayoutRes; +import androidx.annotation.NonNull; + +import com.foxx.androidcast.R; + +/** Settings spinner adapter: plain row when closed, styled card rows in the dropdown. */ +public class SettingsStringArrayAdapter extends ArrayAdapter { + private final int dropdownLayout; + protected int selectedPosition; + + public SettingsStringArrayAdapter(Context context, String[] labels) { + this(context, labels, R.layout.spinner_dropdown_item_settings); + } + + protected SettingsStringArrayAdapter(Context context, String[] labels, @LayoutRes int dropdownLayout) { + super(context, R.layout.spinner_item_settings, labels); + this.dropdownLayout = dropdownLayout; + } + + public void setSelectedPosition(int position) { + selectedPosition = position; + } + + public static void wireSelectionRefresh(Spinner spinner, SettingsStringArrayAdapter adapter) { + spinner.setOnTouchListener((v, event) -> { + if (event.getAction() == android.view.MotionEvent.ACTION_UP) { + adapter.setSelectedPosition(spinner.getSelectedItemPosition()); + adapter.notifyDataSetChanged(); + } + return false; + }); + } + + @Override + @NonNull + public View getView(int position, View convertView, @NonNull ViewGroup parent) { + // Spinner may recycle dropdown rows (FrameLayout) into the closed row — never cast blindly. + TextView tv; + if (convertView instanceof TextView) { + tv = (TextView) convertView; + } else { + tv = (TextView) LayoutInflater.from(getContext()) + .inflate(R.layout.spinner_item_settings, parent, false); + } + tv.setText(getItem(position)); + tv.setAlpha(isEnabled(position) ? 1f : 0.45f); + return tv; + } + + @Override + public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { + View row = convertView; + if (row == null) { + row = LayoutInflater.from(getContext()).inflate(dropdownLayout, parent, false); + } + TextView tv = row.findViewById(R.id.spinner_dropdown_text); + if (tv != null) { + tv.setText(getItem(position)); + } + SettingsSpinnerDropdownStyle.apply(row, position == selectedPosition, isEnabled(position)); + return row; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/ui/ZoomPanContainer.java b/app/src/main/java/com/foxx/androidcast/ui/ZoomPanContainer.java new file mode 100644 index 0000000..8b39d96 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/ui/ZoomPanContainer.java @@ -0,0 +1,145 @@ +package com.foxx.androidcast.ui; + +/********************************************************************* + * ZoomPanContainer.java + * Created at: Sat 16 May 2026 13:35:48 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class ZoomPanContainer + * Contributors: + * - Anton Afanasyeu (2 commits, 141 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 3523d1adb91e9e2aec52eb364dbdf270f96518c07dcc3f421787da5c3ebb9b3d +**********************************************************************/ +import android.content.Context; +import android.util.AttributeSet; +import android.view.GestureDetector; +import android.view.MotionEvent; +import android.view.ScaleGestureDetector; +import android.widget.FrameLayout; + +/** + * Pinch-zoom (5% steps) and two-finger pan over video content. + * Reports zoom deviation from 100% via {@link OnZoomChangedListener}. + */ +public class ZoomPanContainer extends FrameLayout { + public interface OnZoomChangedListener { + void onZoomPercentChanged(int zoomPercent); + } + + private static final float STEP = 0.05f; + private static final float MIN_SCALE = 0.50f; + private static final float MAX_SCALE = 3.00f; + + private float scale = 1f; + private float panX; + private float panY; + private OnZoomChangedListener zoomListener; + + private final ScaleGestureDetector scaleDetector; + private final GestureDetector panDetector; + private float lastSpan = -1f; + + public ZoomPanContainer(Context context) { + this(context, null); + } + + public ZoomPanContainer(Context context, AttributeSet attrs) { + super(context, attrs); + scaleDetector = new ScaleGestureDetector(context, new ScaleListener()); + panDetector = new GestureDetector(context, new PanListener()); + } + + public void setOnZoomChangedListener(OnZoomChangedListener listener) { + this.zoomListener = listener; + } + + public void resetTransform() { + scale = 1f; + panX = 0f; + panY = 0f; + applyTransform(); + notifyZoom(); + } + + public int getZoomPercent() { + return Math.round((scale - 1f) * 100f); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + boolean scaled = scaleDetector.onTouchEvent(event); + boolean panned = panDetector.onTouchEvent(event); + if (event.getActionMasked() == MotionEvent.ACTION_UP + || event.getActionMasked() == MotionEvent.ACTION_CANCEL) { + lastSpan = -1f; + } + return scaled || panned || super.onTouchEvent(event); + } + + private final class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { + @Override + public boolean onScale(ScaleGestureDetector detector) { + float span = detector.getCurrentSpan(); + if (lastSpan < 0) { + lastSpan = span; + return true; + } + float ratio = span / lastSpan; + lastSpan = span; + if (ratio > 1.02f) { + applyStep(1f + STEP); + } else if (ratio < 0.98f) { + applyStep(1f - STEP); + } + return true; + } + } + + private void applyStep(float factor) { + float target = scale * factor; + target = Math.max(MIN_SCALE, Math.min(MAX_SCALE, target)); + int quantized = Math.round(target * 20f); + scale = quantized / 20f; + applyTransform(); + notifyZoom(); + } + + private final class PanListener extends GestureDetector.SimpleOnGestureListener { + @Override + public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { + if (e1 == null || e2 == null || e2.getPointerCount() < 2) { + return false; + } + panX -= distanceX; + panY -= distanceY; + applyTransform(); + return true; + } + } + + private void applyTransform() { + if (getChildCount() == 0) { + return; + } + android.view.View child = getChildAt(0); + child.setPivotX(child.getWidth() / 2f); + child.setPivotY(child.getHeight() / 2f); + child.setScaleX(scale); + child.setScaleY(scale); + child.setTranslationX(panX); + child.setTranslationY(panY); + } + + private void notifyZoom() { + if (zoomListener != null) { + zoomListener.onZoomPercentChanged(getZoomPercent()); + } + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + applyTransform(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/util/CastBackgroundExecutor.java b/app/src/main/java/com/foxx/androidcast/util/CastBackgroundExecutor.java new file mode 100644 index 0000000..7a9e78a --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/util/CastBackgroundExecutor.java @@ -0,0 +1,38 @@ +package com.foxx.androidcast.util; + +/********************************************************************* + * CastBackgroundExecutor.java + * Created at: Sun 17 May 2026 15:45:19 +0200 + * Updated at: Wed 20 May 2026 15:17:13 +0200 by Anton Afanasyeu + * Commit: 5d8e82d2e60a21fff3138d2a394ee4e8b4c6dcb8 + * class CastBackgroundExecutor + * Contributors: + * - Anton Afanasyeu (2 commits, 34 lines) + * - Cursor Agent (project assistant) + * Digest: SHA256 caa7524841be0925f61bfb5624995b82946819e74e66a4930ef8d529ac16f28c +**********************************************************************/ +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; + +/** Shared daemon executor for short background tasks (consent, session stats I/O). */ +public final class CastBackgroundExecutor { + private static final AtomicInteger SEQ = new AtomicInteger(); + private static final ExecutorService EXEC = Executors.newSingleThreadExecutor(new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + Thread t = new Thread(r, "CastBackground-" + SEQ.incrementAndGet()); + t.setDaemon(true); + return t; + } + }); + + private CastBackgroundExecutor() {} + + public static void execute(Runnable task) { + if (task != null) { + EXEC.execute(task); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/util/IoUtils.java b/app/src/main/java/com/foxx/androidcast/util/IoUtils.java new file mode 100644 index 0000000..734d1d7 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/util/IoUtils.java @@ -0,0 +1,36 @@ +package com.foxx.androidcast.util; + +/********************************************************************* + * IoUtils.java + * Created at: Wed 20 May 2026 12:00:00 +0200 + * Contributors: + * - Cursor Agent (project assistant) + **********************************************************************/ +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** Stream/file reads compatible with minSdk 29 (no {@code InputStream.readAllBytes()}). */ +public final class IoUtils { + private static final int BUF_SIZE = 8192; + + private IoUtils() {} + + public static byte[] readAllBytes(InputStream in) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] buf = new byte[BUF_SIZE]; + int n; + while ((n = in.read(buf)) != -1) { + out.write(buf, 0, n); + } + return out.toByteArray(); + } + + public static byte[] readAllBytes(File file) throws IOException { + try (FileInputStream fis = new FileInputStream(file)) { + return readAllBytes(fis); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/vpn/AndroidCastVpnService.java b/app/src/main/java/com/foxx/androidcast/vpn/AndroidCastVpnService.java new file mode 100644 index 0000000..3d16e36 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/vpn/AndroidCastVpnService.java @@ -0,0 +1,187 @@ +package com.foxx.androidcast.vpn; + +import android.app.Service; +import android.content.Intent; +import android.net.VpnService; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IBinder; +import android.os.RemoteCallbackList; +import android.os.RemoteException; +import android.util.Log; + +import com.foxx.androidcast.IVpnOperationCallback; +import com.foxx.androidcast.IVpnService; +import com.foxx.androidcast.IVpnStateCallback; + +/** + * Standalone VPN process ({@code com.foxx.androidcast:vpn}) — AIDL control plane for WireGuard. + */ +public final class AndroidCastVpnService extends Service { + private static final String TAG = "AndroidCastVpn"; + /** Debug/lab: record synthetic VPN-process crash (see scripts/simulate-vpn-crashes.sh). */ + public static final String ACTION_SIMULATE_CRASH = "com.foxx.androidcast.vpn.SIMULATE_CRASH"; + public static final String EXTRA_SIM_SEQ = "sim_seq"; + + private final RemoteCallbackList stateCallbacks = new RemoteCallbackList<>(); + private final Object stateLock = new Object(); + private volatile int state = VpnState.DOWN; + private volatile String stateDetail = ""; + + private HandlerThread workerThread; + private Handler worker; + + private final IVpnService.Stub binder = new IVpnService.Stub() { + @Override + public void registerStateCallback(IVpnStateCallback callback) { + if (callback != null) { + stateCallbacks.register(callback); + } + } + + @Override + public void unregisterStateCallback(IVpnStateCallback callback) { + if (callback != null) { + stateCallbacks.unregister(callback); + } + } + + @Override + public int getState() { + return state; + } + + @Override + public String getStateDetail() { + synchronized (stateLock) { + return stateDetail != null ? stateDetail : ""; + } + } + + @Override + public boolean isVpnPermissionGranted() { + return VpnService.prepare(AndroidCastVpnService.this) == null; + } + + @Override + public void applyWireGuardConfig(String wgQuickConfig, IVpnOperationCallback callback) { + ensureWorker(); + setState(VpnState.CONNECTING, "applying wireguard config"); + worker.post(() -> { + boolean ok = WireGuardVpnEngine.apply(getApplicationContext(), wgQuickConfig); + if (ok) { + setState(VpnState.UP, "wireguard tunnel up"); + notifyOperation(callback, true, null); + } else { + setState(VpnState.ERROR, "wireguard apply failed"); + notifyOperation(callback, false, "apply failed or VPN permission missing"); + } + }); + } + + @Override + public void tearDown(IVpnOperationCallback callback) { + ensureWorker(); + worker.post(() -> { + WireGuardVpnEngine.tearDown(getApplicationContext()); + setState(VpnState.DOWN, "tunnel down"); + notifyOperation(callback, true, null); + }); + } + + @Override + public void simulateCrashForTest(int sequence, IVpnOperationCallback callback) { + ensureWorker(); + worker.post(() -> { + boolean ok = VpnCrashSimulator.recordSimulatedCrash(getApplicationContext(), sequence); + if (ok) { + notifyOperation(callback, true, null); + } else { + notifyOperation(callback, false, "simulate only in debug builds"); + } + }); + } + }; + + @Override + public void onCreate() { + super.onCreate(); + Log.i(TAG, "VPN process service created"); + } + + @Override + public IBinder onBind(Intent intent) { + return binder; + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (intent != null && ACTION_SIMULATE_CRASH.equals(intent.getAction())) { + int seq = intent.getIntExtra(EXTRA_SIM_SEQ, 0); + ensureWorker(); + worker.post(() -> { + VpnCrashSimulator.recordSimulatedCrash(getApplicationContext(), seq); + stopSelf(startId); + }); + return START_NOT_STICKY; + } + return START_STICKY; + } + + @Override + public void onDestroy() { + if (workerThread != null) { + workerThread.quitSafely(); + workerThread = null; + worker = null; + } + WireGuardVpnEngine.tearDown(getApplicationContext()); + super.onDestroy(); + } + + private void ensureWorker() { + if (worker != null) { + return; + } + workerThread = new HandlerThread("androidcast-vpn-worker"); + workerThread.start(); + worker = new Handler(workerThread.getLooper()); + } + + private void setState(int newState, String detail) { + synchronized (stateLock) { + state = newState; + stateDetail = detail != null ? detail : ""; + } + broadcastState(newState, stateDetail); + } + + private void broadcastState(int newState, String detail) { + int n = stateCallbacks.beginBroadcast(); + try { + for (int i = 0; i < n; i++) { + try { + stateCallbacks.getBroadcastItem(i).onStateChanged(newState, detail); + } catch (RemoteException ignored) { + } + } + } finally { + stateCallbacks.finishBroadcast(); + } + } + + private static void notifyOperation(IVpnOperationCallback callback, boolean ok, String reason) { + if (callback == null) { + return; + } + try { + if (ok) { + callback.onSuccess(); + } else { + callback.onFailure(reason != null ? reason : "error"); + } + } catch (RemoteException e) { + Log.w(TAG, "operation callback died: " + e.getMessage()); + } + } +} diff --git a/app/src/main/java/com/foxx/androidcast/vpn/RemoteAccessVpnService.java b/app/src/main/java/com/foxx/androidcast/vpn/RemoteAccessVpnService.java new file mode 100644 index 0000000..de85694 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/vpn/RemoteAccessVpnService.java @@ -0,0 +1,120 @@ +package com.foxx.androidcast.vpn; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ServiceInfo; +import android.net.VpnService; +import android.os.Build; +import android.os.ParcelFileDescriptor; +import android.util.Log; + +import com.foxx.androidcast.CastTrayNotifier; +import com.foxx.androidcast.remoteaccess.WireGuardQuickConfig; + +import java.net.InetAddress; + +/** TUN fallback when GoBackend cannot start — runs in :vpn process only. */ +public final class RemoteAccessVpnService extends VpnService { + private static final String TAG = "RemoteAccessVPN"; + public static final String ACTION_UP = "com.foxx.androidcast.vpn.VPN_UP"; + public static final String ACTION_DOWN = "com.foxx.androidcast.vpn.VPN_DOWN"; + public static final String EXTRA_WG_CONFIG = "wg_config"; + + private ParcelFileDescriptor tun; + + public static boolean startWithConfig(Context context, String wgConfig) { + Intent prep = VpnService.prepare(context); + if (prep != null) { + Log.w(TAG, "VPN permission not granted"); + return false; + } + Intent i = new Intent(context, RemoteAccessVpnService.class); + i.setAction(ACTION_UP); + i.putExtra(EXTRA_WG_CONFIG, wgConfig); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(i); + } else { + context.startService(i); + } + return true; + } + + public static void stop(Context context) { + Intent i = new Intent(context, RemoteAccessVpnService.class); + i.setAction(ACTION_DOWN); + context.startService(i); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + String action = intent != null ? intent.getAction() : null; + if (ACTION_DOWN.equals(action)) { + tearDown(); + stopForeground(STOP_FOREGROUND_REMOVE); + stopSelf(); + CastTrayNotifier.refresh(this); + return START_NOT_STICKY; + } + if (ACTION_UP.equals(action)) { + String cfg = intent.getStringExtra(EXTRA_WG_CONFIG); + int fgsType = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q + ? ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE + : 0; + CastTrayNotifier.startForeground(this, fgsType); + CastTrayNotifier.ensureTrayService(this); + establishTun(cfg); + return START_STICKY; + } + return START_NOT_STICKY; + } + + private void establishTun(String wgConfig) { + tearDown(); + try { + String address = WireGuardQuickConfig.parseAddress(wgConfig); + Builder b = new Builder(); + b.setSession("AndroidCast RA"); + if (address != null) { + String[] parts = address.split("/"); + b.addAddress(InetAddress.getByName(parts[0]), + parts.length > 1 ? Integer.parseInt(parts[1]) : 32); + } + for (String app : WireGuardQuickConfig.parseIncludedApplications(wgConfig)) { + try { + b.addAllowedApplication(app); + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, "IncludedApplications skip unknown package: " + app); + } + } + for (String route : WireGuardQuickConfig.parseAllowedRoutes(wgConfig)) { + String[] rp = route.split("/"); + if (rp.length >= 2) { + b.addRoute(rp[0], Integer.parseInt(rp[1])); + } + } + b.setMtu(1280); + tun = b.establish(); + Log.i(TAG, "VPN interface established"); + CastTrayNotifier.refresh(this); + } catch (Exception e) { + Log.e(TAG, "VPN establish failed", e); + } + } + + private void tearDown() { + if (tun != null) { + try { + tun.close(); + } catch (Exception ignored) { + } + tun = null; + } + } + + @Override + public void onDestroy() { + tearDown(); + super.onDestroy(); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/vpn/VpnCrashSimulator.java b/app/src/main/java/com/foxx/androidcast/vpn/VpnCrashSimulator.java new file mode 100644 index 0000000..529ca00 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/vpn/VpnCrashSimulator.java @@ -0,0 +1,40 @@ +package com.foxx.androidcast.vpn; + +import android.content.Context; + +import com.foxx.androidcast.BuildConfig; +import com.foxx.androidcast.crash.CrashReporter; +import com.foxx.androidcast.crash.CrashWatcherService; + +/** + * Records synthetic Java crashes from the VPN process for lab validation (debug builds only). + * Does not kill the process — exercises persist + watcher upload path. + */ +public final class VpnCrashSimulator { + private VpnCrashSimulator() {} + + public static boolean recordSimulatedCrash(Context context, int sequence) { + if (!BuildConfig.DEBUG) { + return false; + } + RuntimeException ex = new RuntimeException( + "VpnCrashSimulation seq=" + sequence + " proc=" + CrashReporter.currentProcessName()); + ex.setStackTrace(buildStack(sequence)); + CrashReporter.recordJavaCrash(context, Thread.currentThread(), ex); + CrashWatcherService.requestImmediateSweep(context.getApplicationContext(), true); + return true; + } + + private static StackTraceElement[] buildStack(int sequence) { + return new StackTraceElement[]{ + new StackTraceElement("com.foxx.androidcast.vpn.WireGuardVpnEngine", "apply", + "WireGuardVpnEngine.java", 40 + (sequence % 5)), + new StackTraceElement("com.foxx.androidcast.vpn.AndroidCastVpnService$1", "applyWireGuardConfig", + "AndroidCastVpnService.java", 60), + new StackTraceElement("com.foxx.androidcast.vpn.AndroidCastVpnService", "onStartCommand", + "AndroidCastVpnService.java", 95 + (sequence % 3)), + new StackTraceElement("android.app.ActivityThread", "handleServiceArgs", + "ActivityThread.java", 5001), + }; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/vpn/VpnServiceClient.java b/app/src/main/java/com/foxx/androidcast/vpn/VpnServiceClient.java new file mode 100644 index 0000000..c2f4149 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/vpn/VpnServiceClient.java @@ -0,0 +1,283 @@ +package com.foxx.androidcast.vpn; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.RemoteException; +import android.util.Log; + +import com.foxx.androidcast.IVpnOperationCallback; +import com.foxx.androidcast.IVpnService; +import com.foxx.androidcast.IVpnStateCallback; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * Main-process client for {@link AndroidCastVpnService} ({@code com.foxx.androidcast:vpn}). + */ +public final class VpnServiceClient { + private static final String TAG = "VpnServiceClient"; + private static final long BIND_TIMEOUT_MS = 8_000L; + + private static volatile VpnServiceClient instance; + + private final Context appContext; + private final Handler main = new Handler(Looper.getMainLooper()); + private final Object bindLock = new Object(); + private final List pending = new ArrayList<>(); + + private IVpnService service; + private boolean binding; + private CountDownLatch bindLatch; + + public interface StateListener { + void onStateChanged(int state, String detail); + } + + public interface OperationListener { + void onSuccess(); + + void onFailure(String reason); + } + + private VpnServiceClient(Context context) { + appContext = context.getApplicationContext(); + } + + public static VpnServiceClient get(Context context) { + if (instance == null) { + synchronized (VpnServiceClient.class) { + if (instance == null) { + instance = new VpnServiceClient(context); + } + } + } + return instance; + } + + private final ServiceConnection connection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder binder) { + synchronized (bindLock) { + service = IVpnService.Stub.asInterface(binder); + binding = false; + if (bindLatch != null) { + bindLatch.countDown(); + } + } + flushPending(); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + synchronized (bindLock) { + service = null; + binding = false; + } + } + }; + + public boolean isVpnPermissionGranted() { + if (!ensureBoundSync()) { + return false; + } + try { + return service.isVpnPermissionGranted(); + } catch (RemoteException e) { + Log.w(TAG, "isVpnPermissionGranted: " + e.getMessage()); + return false; + } + } + + public int getState() { + if (!ensureBoundSync()) { + return VpnState.DOWN; + } + try { + return service.getState(); + } catch (RemoteException e) { + return VpnState.DOWN; + } + } + + /** Non-blocking peek for diagnostics — never waits on :vpn process bind. */ + public int getStateIfBound() { + IVpnService s = service; + if (s == null) { + return VpnState.DOWN; + } + try { + return s.getState(); + } catch (RemoteException e) { + return VpnState.DOWN; + } + } + + public String getStateDetailIfBound() { + IVpnService s = service; + if (s == null) { + return ""; + } + try { + String detail = s.getStateDetail(); + return detail != null ? detail : ""; + } catch (RemoteException e) { + return ""; + } + } + + public boolean isBound() { + return service != null; + } + + public String getStateDetail() { + if (!ensureBoundSync()) { + return ""; + } + try { + String detail = service.getStateDetail(); + return detail != null ? detail : ""; + } catch (RemoteException e) { + return ""; + } + } + + public void registerStateListener(StateListener listener) { + runWithService(s -> { + IVpnStateCallback cb = new IVpnStateCallback.Stub() { + @Override + public void onStateChanged(int state, String detail) { + main.post(() -> listener.onStateChanged(state, detail)); + } + }; + s.registerStateCallback(cb); + }); + } + + public void applyWireGuardConfig(String wgQuickConfig, OperationListener listener) { + runWithService(s -> { + try { + s.applyWireGuardConfig(wgQuickConfig, wrapOperation(listener)); + } catch (RemoteException e) { + deliverOperation(listener, false, e.getMessage()); + } + }); + } + + public void tearDown(OperationListener listener) { + runWithService(s -> { + try { + s.tearDown(wrapOperation(listener)); + } catch (RemoteException e) { + deliverOperation(listener, false, e.getMessage()); + } + }); + } + + public void tearDown() { + tearDown(null); + } + + private IVpnOperationCallback wrapOperation(OperationListener listener) { + return new IVpnOperationCallback.Stub() { + @Override + public void onSuccess() { + deliverOperation(listener, true, null); + } + + @Override + public void onFailure(String reason) { + deliverOperation(listener, false, reason); + } + }; + } + + private void deliverOperation(OperationListener listener, boolean ok, String reason) { + if (listener == null) { + return; + } + main.post(() -> { + if (ok) { + listener.onSuccess(); + } else { + listener.onFailure(reason != null ? reason : "error"); + } + }); + } + + private interface ServiceTask { + void run(IVpnService s) throws RemoteException; + } + + private void runWithService(ServiceTask task) { + IVpnService s = service; + if (s != null) { + try { + task.run(s); + } catch (RemoteException e) { + Log.w(TAG, "remote call failed: " + e.getMessage()); + } + return; + } + synchronized (bindLock) { + pending.add(() -> runWithService(task)); + } + ensureBoundAsync(); + } + + private void flushPending() { + List copy; + synchronized (bindLock) { + copy = new ArrayList<>(pending); + pending.clear(); + } + for (Runnable r : copy) { + r.run(); + } + } + + private void ensureBoundAsync() { + synchronized (bindLock) { + if (service != null || binding) { + return; + } + binding = true; + Intent i = new Intent(appContext, AndroidCastVpnService.class); + appContext.startService(i); + appContext.bindService(i, connection, Context.BIND_AUTO_CREATE); + } + } + + private boolean ensureBoundSync() { + if (service != null) { + return true; + } + synchronized (bindLock) { + if (service != null) { + return true; + } + bindLatch = new CountDownLatch(1); + ensureBoundAsync(); + try { + if (!bindLatch.await(BIND_TIMEOUT_MS, TimeUnit.MILLISECONDS)) { + Log.w(TAG, "VPN service bind timeout"); + return false; + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return false; + } finally { + bindLatch = null; + } + } + return service != null; + } +} diff --git a/app/src/main/java/com/foxx/androidcast/vpn/VpnState.java b/app/src/main/java/com/foxx/androidcast/vpn/VpnState.java new file mode 100644 index 0000000..e14cb10 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/vpn/VpnState.java @@ -0,0 +1,11 @@ +package com.foxx.androidcast.vpn; + +/** VPN state codes shared across AIDL ({@link com.foxx.androidcast.IVpnService}). */ +public final class VpnState { + public static final int DOWN = 0; + public static final int CONNECTING = 1; + public static final int UP = 2; + public static final int ERROR = 3; + + private VpnState() {} +} diff --git a/app/src/main/java/com/foxx/androidcast/vpn/WireGuardVpnEngine.java b/app/src/main/java/com/foxx/androidcast/vpn/WireGuardVpnEngine.java new file mode 100644 index 0000000..4c2099e --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/vpn/WireGuardVpnEngine.java @@ -0,0 +1,58 @@ +package com.foxx.androidcast.vpn; + +import android.content.Context; +import android.util.Log; + +import com.wireguard.android.backend.GoBackend; +import com.wireguard.android.backend.Tunnel; +import com.wireguard.config.Config; + +import java.io.ByteArrayInputStream; +import java.nio.charset.StandardCharsets; + +/** WireGuard tunnel control inside the :vpn process only. */ +final class WireGuardVpnEngine { + private static final String TAG = "WireGuardVpnEngine"; + private static final Tunnel ANDROID_CAST_TUNNEL = new Tunnel() { + @Override + public String getName() { + return "androidcast-ra"; + } + + @Override + public void onStateChange(State newState) { + Log.d(TAG, "tunnel state " + newState); + } + }; + + private WireGuardVpnEngine() {} + + static boolean apply(Context context, String wgQuickConfig) { + if (wgQuickConfig == null || wgQuickConfig.trim().isEmpty()) { + return false; + } + try { + Config config; + try (ByteArrayInputStream in = new ByteArrayInputStream( + wgQuickConfig.getBytes(StandardCharsets.UTF_8))) { + config = Config.parse(in); + } + GoBackend backend = new GoBackend(context); + backend.setState(ANDROID_CAST_TUNNEL, Tunnel.State.UP, config); + Log.i(TAG, "wireguard UP via GoBackend"); + return true; + } catch (Throwable t) { + Log.w(TAG, "GoBackend failed, TUN fallback: " + t.getMessage()); + return RemoteAccessVpnService.startWithConfig(context, wgQuickConfig); + } + } + + static void tearDown(Context context) { + RemoteAccessVpnService.stop(context); + try { + GoBackend backend = new GoBackend(context); + backend.setState(ANDROID_CAST_TUNNEL, Tunnel.State.DOWN, null); + } catch (Throwable ignored) { + } + } +} diff --git a/app/src/main/res/anim/robot_dance.xml b/app/src/main/res/anim/robot_dance.xml new file mode 100644 index 0000000..961182e --- /dev/null +++ b/app/src/main/res/anim/robot_dance.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/app/src/main/res/color/device_item_text.xml b/app/src/main/res/color/device_item_text.xml new file mode 100644 index 0000000..5baa79c --- /dev/null +++ b/app/src/main/res/color/device_item_text.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/src/main/res/color/settings_spinner_text.xml b/app/src/main/res/color/settings_spinner_text.xml new file mode 100644 index 0000000..8386006 --- /dev/null +++ b/app/src/main/res/color/settings_spinner_text.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/src/main/res/drawable-nodpi/calibration_chart_reference.png b/app/src/main/res/drawable-nodpi/calibration_chart_reference.png new file mode 100644 index 0000000..6d0fa7b Binary files /dev/null and b/app/src/main/res/drawable-nodpi/calibration_chart_reference.png differ diff --git a/app/src/main/res/drawable/bg_settings_drawer_handle.xml b/app/src/main/res/drawable/bg_settings_drawer_handle.xml new file mode 100644 index 0000000..5c4c516 --- /dev/null +++ b/app/src/main/res/drawable/bg_settings_drawer_handle.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/app/src/main/res/drawable/bg_settings_section_header.xml b/app/src/main/res/drawable/bg_settings_section_header.xml new file mode 100644 index 0000000..f7ad3d5 --- /dev/null +++ b/app/src/main/res/drawable/bg_settings_section_header.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_settings_spinner.xml b/app/src/main/res/drawable/bg_settings_spinner.xml new file mode 100644 index 0000000..cab0619 --- /dev/null +++ b/app/src/main/res/drawable/bg_settings_spinner.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/drawable/bg_settings_spinner_item.xml b/app/src/main/res/drawable/bg_settings_spinner_item.xml new file mode 100644 index 0000000..bd5607b --- /dev/null +++ b/app/src/main/res/drawable/bg_settings_spinner_item.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_settings_spinner_item_selected.xml b/app/src/main/res/drawable/bg_settings_spinner_item_selected.xml new file mode 100644 index 0000000..1464fbc --- /dev/null +++ b/app/src/main/res/drawable/bg_settings_spinner_item_selected.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_settings_spinner_popup.xml b/app/src/main/res/drawable/bg_settings_spinner_popup.xml new file mode 100644 index 0000000..a6a8843 --- /dev/null +++ b/app/src/main/res/drawable/bg_settings_spinner_popup.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/app/src/main/res/drawable/bg_spinner_item_underline_dark.xml b/app/src/main/res/drawable/bg_spinner_item_underline_dark.xml new file mode 100644 index 0000000..26177a3 --- /dev/null +++ b/app/src/main/res/drawable/bg_spinner_item_underline_dark.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/bg_spinner_item_underline_light.xml b/app/src/main/res/drawable/bg_spinner_item_underline_light.xml new file mode 100644 index 0000000..93c0a03 --- /dev/null +++ b/app/src/main/res/drawable/bg_spinner_item_underline_light.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/device_item_background.xml b/app/src/main/res/drawable/device_item_background.xml new file mode 100644 index 0000000..ec3de96 --- /dev/null +++ b/app/src/main/res/drawable/device_item_background.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app/src/main/res/drawable/device_item_live_border.xml b/app/src/main/res/drawable/device_item_live_border.xml new file mode 100644 index 0000000..3e8cd03 --- /dev/null +++ b/app/src/main/res/drawable/device_item_live_border.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_android_robot.xml b/app/src/main/res/drawable/ic_android_robot.xml new file mode 100644 index 0000000..fea980d --- /dev/null +++ b/app/src/main/res/drawable/ic_android_robot.xml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..413a7f4 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_notification.xml b/app/src/main/res/drawable/ic_notification.xml new file mode 100644 index 0000000..56e7c0a --- /dev/null +++ b/app/src/main/res/drawable/ic_notification.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_picture_in_picture.xml b/app/src/main/res/drawable/ic_picture_in_picture.xml new file mode 100644 index 0000000..3720eaa --- /dev/null +++ b/app/src/main/res/drawable/ic_picture_in_picture.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/settings_app_info_divider.xml b/app/src/main/res/drawable/settings_app_info_divider.xml new file mode 100644 index 0000000..9542d46 --- /dev/null +++ b/app/src/main/res/drawable/settings_app_info_divider.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/layout-land/activity_sender.xml b/app/src/main/res/layout-land/activity_sender.xml new file mode 100644 index 0000000..6fd74bd --- /dev/null +++ b/app/src/main/res/layout-land/activity_sender.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + +