diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 00000000..83945620 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,26 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "${default}", + "C:/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0/ucrt", + "C:/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0/shared", + "C:/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0/um", + "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.44.35207/include", + "${workspaceFolder}/**" + ], + "defines": [ + "_DEBUG", + "UNICODE", + "_UNICODE" + ], + "windowsSdkVersion": "10.0.19041.0", + "compilerPath": "cl.exe", + "cStandard": "c17", + "cppStandard": "c++17", + "intelliSenseMode": "windows-msvc-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..aef098f1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,80 @@ +{ + "C_Cpp.intelliSenseEngine": "default", + "C_Cpp.default.compilerPath": "cl.exe", + "cmake.debugConfig": { + "cwd": "${workspaceFolder}" + }, + "files.associations": { + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "cctype": "cpp", + "charconv": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "exception": "cpp", + "expected": "cpp", + "format": "cpp", + "forward_list": "cpp", + "fstream": "cpp", + "functional": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "ios": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "iterator": "cpp", + "limits": "cpp", + "list": "cpp", + "locale": "cpp", + "map": "cpp", + "memory": "cpp", + "mutex": "cpp", + "new": "cpp", + "optional": "cpp", + "ostream": "cpp", + "ratio": "cpp", + "set": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "string": "cpp", + "system_error": "cpp", + "thread": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "typeinfo": "cpp", + "unordered_map": "cpp", + "utility": "cpp", + "vector": "cpp", + "xfacet": "cpp", + "xhash": "cpp", + "xiosbase": "cpp", + "xlocale": "cpp", + "xlocbuf": "cpp", + "xlocinfo": "cpp", + "xlocmes": "cpp", + "xlocmon": "cpp", + "xlocnum": "cpp", + "xloctime": "cpp", + "xmemory": "cpp", + "xstring": "cpp", + "xtr1common": "cpp", + "xtree": "cpp", + "xutility": "cpp", + "algorithm": "cpp" + } +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 610c27d4..01960c10 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,8 @@ cmake_minimum_required(VERSION 3.18) project(cis5650_stream_compaction_test LANGUAGES CUDA CXX) +enable_testing() + set_property(GLOBAL PROPERTY USE_FOLDERS ON) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) @@ -42,5 +44,6 @@ source_group(Headers FILES ${headers}) source_group(Sources FILES ${sources}) add_executable(${CMAKE_PROJECT_NAME} ${sources} ${headers}) +add_test(NAME AllTests COMMAND ${CMAKE_PROJECT_NAME}) target_link_libraries(${CMAKE_PROJECT_NAME} stream_compaction) set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${CMAKE_PROJECT_NAME}) diff --git a/README.md b/README.md index 0e38ddb1..4101e752 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,371 @@ CUDA Stream Compaction **University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 2** -* (TODO) YOUR NAME HERE - * (TODO) [LinkedIn](), [personal website](), [twitter](), etc. -* Tested on: (TODO) Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab) +* Saahil Gupta + * [LinkedIn](https://www.linkedin.com/in/saahil-g), [personal website](https://www.saahil-gupta.com) +* Tested on: Windows 11 10.0.26100, AMD Ryzen 9 7940HS @ 4.0GHz 32GB, RTX 4060 Laptop GPU 8GB -### (TODO: Your README) +## Table of Contents -Include analysis, etc. (Remember, this is public, so don't put -anything here that you don't want to share with the world.) +- [Overview](#overview) +- [Implementation and Performance Analysis](#implementation-and-performance-analysis) + - [CPU](#basic-cpu-implementation) + - [Scan](#scan) + - [Stream Compaction](#stream-compaction) + - [GPU Naive](#gpu-naive) + - [Scan](#scan-1) + - [GPU Work Efficient](#gpu-work-efficiency) + - [Scan](#scan-2) + - [Stream Compaction](#stream-compaction-1) + - [GPU Thread Efficient](#gpu-thread-efficient) + - [Scan](#scan-3) + - [Stream Compaction](#stream-compaction-2) + - [GPU Thrust](#gpu-thrust) + - [Scan](#scan-4) + - [Stream Compaction](#stream-compaction-3) +- [Potential Future Optimizations](#potential-future-optimizations) + - [Global Memory Coalescing](#global-memory-coalescing) + - [Shared Memory](#shared-memory) + - [Block Based Division](#block-based-division) + + +## Overview +This project implements and benchmarks multiple algorithms for **stream compaction** and **scan** on both the CPU and GPU. Stream compaction is the process of removing unwanted elements from an array(*in our case, removing zeroes from an array of integers*) while maintaining the order of remaining elements, and scan computes prefix sums of an array. + +This project contains the following versions of `scan` and `compact`: + +- **CPU**: iterative scan and stream compaction using standard sequential methods +- **GPU Naive**: a straightforward parallel implementation using simple GPU scan kernels +- **GPU Work-Efficient**: an optimized parallel algorithm that reduces redundant work +- **GPU Thread-Efficient**: further optimizes GPU execution by minimizing idle threads through striding +- **GPU Thrust**: leverages NVIDIA’s Thrust library for highly optimized scan and compaction routines + + +## Implementation and Performance Analysis + +Performance data was collected for each implementation. CPU timings were measured with `std::chrono`, and GPU timings with `cudaEvents`. + +The profiler is implemented in Rust and can be found in `profiling/`. It writes to a cache in `profiling/profile_output/`. *Note that this cache is overwritten on each run and should not be used for multi-configuration results; it only reflects the latest profiling session.* + +To run the profiler locally across all configurations, execute `runtests.bat`. This script collects data and generates plot images for each configuration in `img/`. + +The graphs below show runtime (ms) against input data size. Data size is plotted on a logscale, where each position corresponds to $2^x$. The y-axis typically ranges from 0–300 ms, but is scaled up for configurations with longer runtimes. + +## Basic CPU Implementation + +The CPU implementations can be found in `src/cpu.cu`. + +1. `StreamCompaction::CPU::scan` +Implements a standard prefix-sum (scan) algorithm, starting at the beginning of the array and accumulating values iteratively: +```py +scan(data) -> out: + out[0] = 0; + for i in 1..n do + out[i] = out[i-1] + data[i-1] +``` + +2. `StreamCompaction::CPU::compactWithoutScan` +Performs stream compaction without using scan, by iteratively appending nonzero values to an output array: +```py +compactWithoutScan(data) -> out, len: + c = 0 + for i in 0..n do + if data[i] != 0 then + out[c] = data[i] + c += 1 + + len = c +``` + +3. `StreamCompaction::CPU::compactWithScan` +Implements stream compaction using the scan function, resembling the parallel algorithm used for the GPU implementation: +```py +compactWithScan(data) -> out, len: + flags = [0; n] + scanout = [0; n] + + for i in 0..n do + flags[i] = if data[i] == 0 then 0 else 1 + + scanout = scan(flags) + + for i in 0..n do + if flags[i] == 1 then + out[scanout[i]] = data[i] + + len = scanout[n-1] + flags[n-1] +``` + +### Scan + +
+ + ![cpu_scan_256_block_size](img/scan_256_cpu.png) +
+ +### Stream Compaction + +
+ + ![cpu_stream_compaction_256_block_size](img/stream_compaction_256_cpu.png) +
+ + +## GPU Naive + +The GPU Naive implementations can be found in `src/naive.cu`. + +1. `StreamCompaction::Naive::scan` +Implements scan by precomputing sum for a window size `k` for every index `i > k`, where `k` doubles every iteration. + +![gpu_naive_img](img/figure-39-2.jpg) + +*Naive stream compaction was omitted, since the only difference would be a call to the naive scan function (naive vs work efficient).* + +### Scan + +
+ +![naive_scan_256_block_size](img/scan_256_naive.png) +Block Size 256 + + + + + + + +
+ + 128 + + + 512 + + + 1024 +
+ +
+ + + + +## GPU Work Efficiency + +The GPU Work Efficient implementations can be found in `src/efficient.cu`. + +1. `StreamCompaction::Efficient::scan` +Implements scan using two phases: an **up-sweep** (reduction/sum) followed by a **down-sweep** (reconstruction of the prefix sum array). For a detailed explanation of this algorithm, see [GPU Gems 3, Chapter 39](https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch39.html). + +2. `StreamCompaction::Efficient::compact` +Implements stream compaction by parallelizing the CPU algorithm above, converting the map and scatter parts into kernels, and making use of work-efficient scan. + +
+ +![work_efficient_scan_256_block_size](img/scan_256_work_efficient.png) +Block Size 256 + + + + + + + +
+ + 128 + + + 512 + + + 1024 +
+ +
+ +### Stream Compaction + +
+ +![work_efficient_compact_256_block_size](img/stream_compaction_256_work_efficient.png) +Block Size 256 + + + + + + + +
+ 128 + + + 512 + + + 1024 +
+ +
+ + + + + + + + + + +## GPU Thread Efficient + +The GPU Thread Efficient implementations can be found in `src/thread_efficient.cu`. + +These implementations use the same algorithms as `StreamCompaction::Efficient`, but apply **striding** to minimize idle threads. + +- In the **up-sweep**, the stride doubles each iteration. +- In the **down-sweep**, the stride halves each iteration. +- The thread index for a given stride is calculated as `tid = (tid * stride) + (stride - 1);` + +### Scan + +
+ +![thread_efficient_scan_256_block_size](img/scan_256_thread_efficient.png) +Block Size 256 + + + + + + + +
+ + 128 + + + 512 + + + 1024 +
+ +
+ +### Stream Compaction + +
+ +![thread_efficient_compact_256_block_size](img/stream_compaction_256_thread_efficient.png) +Block Size 256 + + + + + + + +
+ 128 + + + 512 + + + 1024 +
+ +
+ + + + + + +## GPU Thrust + +The GPU Thrust implementations can be found in `src/thrust.cu`. + +1. `StreamCompaction::Thrust::scan` +Implements scan using `thrust::exclusive_scan` + +2. `StreamCompaction::Thrust::compact` +Implements stream compaction using `thrust::remove_if` + +Both of these functions have significantly improved speed by using `thrust::device_vector` instead of manual calls to `cudaMalloc` and `cudaFree` + +
+ +![thrust_scan_256_block_size](img/scan_256_thrust.png) +Block Size 256 + + + + + + + +
+ + 128 + + + 512 + + + 1024 +
+ +
+ +### Stream Compaction + +
+ +![thrust_compact_256_block_size](img/stream_compaction_256_thrust.png) +Block Size 256 + + + + + + + +
+ 128 + + + 512 + + + 1024 +
+ +
+ + +## Potential Future Optimizations + +The thrust implementation for `scan` and `compact` is highly optimized and well maintained by Nvidia, and considered to be the gold standard for runtime on algorithms. The data collected shows a lot of room for further optimization and reducing runtime to ~10ms, even on extremely large input data sizes. There are plenty of future optimizations we can add to keep up with thrust. + +### Global Memory Coalescing + +In the current thread-efficient `scan`, striding reduces idle threads but increases the spacing between reads and writes, where now for a stride of `k`, each read/write is spaced out by `k` cells. This results in poor cache utilization and uncoalesced global memory accesses. + +For the up-sweep portion, values cannot be discarded. But since we can easily precompute the number of times an index will be acted upon, a possible improvement is to remap our indices so that they sort in descending order of number of kernel operations applied to it. This would result in every kernel having one-to-one memory coalescing for writes. For reads, while not perfect, would still be near and far more cache friendly than an unoptimized version. Down-sweep could likely benefit from a similar remapping. The array could be reorganized using a single remap kernel call. + +This optimization is straightforward for pow-2 array sizes, but less so for arbitrary array sizes. Currently we pad our data array to the next power of two, but this could break down if combined with the [block based division optimization](#block-based-division) + + +### Shared Memory + +The thrust implementation for both `scan` and `compact` both use a heavy amount of shared memory as a block-local cache for global memory. Implementing this would likely show a noticeable change across increasing block size. It's also possible within this to reduce the number of bank conflicts by changing the memory access pattern. More details on the exact implementation can be found [here](https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch39.html). + + +### Block Based Division + +Our current `scan` algorithm requires array lengths to be powers of two, forcing us to pad our input to the next power of two and potentially double memory usage. A more scalable approach would be block-based division, where we allocate blocks to work on pow-2 sections of the array, and then run a second-pass kernel that will work on its finished outputs. The important distinction here is that the number of blocks we can spawn is free to be any integer, so at most the number of threads and memory bytes we waste is `BLOCK_SIZE - 1`. \ No newline at end of file diff --git a/img/scan_1024_cpu.png b/img/scan_1024_cpu.png new file mode 100644 index 00000000..8059902b Binary files /dev/null and b/img/scan_1024_cpu.png differ diff --git a/img/scan_1024_naive.png b/img/scan_1024_naive.png new file mode 100644 index 00000000..728cab1a Binary files /dev/null and b/img/scan_1024_naive.png differ diff --git a/img/scan_1024_thread_efficient.png b/img/scan_1024_thread_efficient.png new file mode 100644 index 00000000..f8a008e5 Binary files /dev/null and b/img/scan_1024_thread_efficient.png differ diff --git a/img/scan_1024_thrust.png b/img/scan_1024_thrust.png new file mode 100644 index 00000000..da9ae2ae Binary files /dev/null and b/img/scan_1024_thrust.png differ diff --git a/img/scan_1024_work_efficient.png b/img/scan_1024_work_efficient.png new file mode 100644 index 00000000..12ba35b2 Binary files /dev/null and b/img/scan_1024_work_efficient.png differ diff --git a/img/scan_128_cpu.png b/img/scan_128_cpu.png new file mode 100644 index 00000000..b6ced395 Binary files /dev/null and b/img/scan_128_cpu.png differ diff --git a/img/scan_128_naive.png b/img/scan_128_naive.png new file mode 100644 index 00000000..8a0045fb Binary files /dev/null and b/img/scan_128_naive.png differ diff --git a/img/scan_128_thread_efficient.png b/img/scan_128_thread_efficient.png new file mode 100644 index 00000000..1e527948 Binary files /dev/null and b/img/scan_128_thread_efficient.png differ diff --git a/img/scan_128_thrust.png b/img/scan_128_thrust.png new file mode 100644 index 00000000..ac0713f1 Binary files /dev/null and b/img/scan_128_thrust.png differ diff --git a/img/scan_128_work_efficient.png b/img/scan_128_work_efficient.png new file mode 100644 index 00000000..7661d591 Binary files /dev/null and b/img/scan_128_work_efficient.png differ diff --git a/img/scan_256_cpu.png b/img/scan_256_cpu.png new file mode 100644 index 00000000..07cc4e2d Binary files /dev/null and b/img/scan_256_cpu.png differ diff --git a/img/scan_256_naive.png b/img/scan_256_naive.png new file mode 100644 index 00000000..c6277558 Binary files /dev/null and b/img/scan_256_naive.png differ diff --git a/img/scan_256_thread_efficient.png b/img/scan_256_thread_efficient.png new file mode 100644 index 00000000..8ef44984 Binary files /dev/null and b/img/scan_256_thread_efficient.png differ diff --git a/img/scan_256_thrust.png b/img/scan_256_thrust.png new file mode 100644 index 00000000..344890f6 Binary files /dev/null and b/img/scan_256_thrust.png differ diff --git a/img/scan_256_work_efficient.png b/img/scan_256_work_efficient.png new file mode 100644 index 00000000..00643c0c Binary files /dev/null and b/img/scan_256_work_efficient.png differ diff --git a/img/scan_512_cpu.png b/img/scan_512_cpu.png new file mode 100644 index 00000000..49762527 Binary files /dev/null and b/img/scan_512_cpu.png differ diff --git a/img/scan_512_naive.png b/img/scan_512_naive.png new file mode 100644 index 00000000..591060c8 Binary files /dev/null and b/img/scan_512_naive.png differ diff --git a/img/scan_512_thread_efficient.png b/img/scan_512_thread_efficient.png new file mode 100644 index 00000000..d622b552 Binary files /dev/null and b/img/scan_512_thread_efficient.png differ diff --git a/img/scan_512_thrust.png b/img/scan_512_thrust.png new file mode 100644 index 00000000..7b6e4d4b Binary files /dev/null and b/img/scan_512_thrust.png differ diff --git a/img/scan_512_work_efficient.png b/img/scan_512_work_efficient.png new file mode 100644 index 00000000..0c0e8ce6 Binary files /dev/null and b/img/scan_512_work_efficient.png differ diff --git a/img/stream_compaction_1024_cpu.png b/img/stream_compaction_1024_cpu.png new file mode 100644 index 00000000..f8c07808 Binary files /dev/null and b/img/stream_compaction_1024_cpu.png differ diff --git a/img/stream_compaction_1024_naive.png b/img/stream_compaction_1024_naive.png new file mode 100644 index 00000000..f5f651ee Binary files /dev/null and b/img/stream_compaction_1024_naive.png differ diff --git a/img/stream_compaction_1024_thread_efficient.png b/img/stream_compaction_1024_thread_efficient.png new file mode 100644 index 00000000..cb859e1d Binary files /dev/null and b/img/stream_compaction_1024_thread_efficient.png differ diff --git a/img/stream_compaction_1024_thrust.png b/img/stream_compaction_1024_thrust.png new file mode 100644 index 00000000..a01dfc13 Binary files /dev/null and b/img/stream_compaction_1024_thrust.png differ diff --git a/img/stream_compaction_1024_work_efficient.png b/img/stream_compaction_1024_work_efficient.png new file mode 100644 index 00000000..83e93ff7 Binary files /dev/null and b/img/stream_compaction_1024_work_efficient.png differ diff --git a/img/stream_compaction_128_cpu.png b/img/stream_compaction_128_cpu.png new file mode 100644 index 00000000..81965c93 Binary files /dev/null and b/img/stream_compaction_128_cpu.png differ diff --git a/img/stream_compaction_128_naive.png b/img/stream_compaction_128_naive.png new file mode 100644 index 00000000..fa878dbb Binary files /dev/null and b/img/stream_compaction_128_naive.png differ diff --git a/img/stream_compaction_128_thread_efficient.png b/img/stream_compaction_128_thread_efficient.png new file mode 100644 index 00000000..78fd2743 Binary files /dev/null and b/img/stream_compaction_128_thread_efficient.png differ diff --git a/img/stream_compaction_128_thrust.png b/img/stream_compaction_128_thrust.png new file mode 100644 index 00000000..49727e29 Binary files /dev/null and b/img/stream_compaction_128_thrust.png differ diff --git a/img/stream_compaction_128_work_efficient.png b/img/stream_compaction_128_work_efficient.png new file mode 100644 index 00000000..0c6f2def Binary files /dev/null and b/img/stream_compaction_128_work_efficient.png differ diff --git a/img/stream_compaction_256_cpu.png b/img/stream_compaction_256_cpu.png new file mode 100644 index 00000000..956cc2c4 Binary files /dev/null and b/img/stream_compaction_256_cpu.png differ diff --git a/img/stream_compaction_256_naive.png b/img/stream_compaction_256_naive.png new file mode 100644 index 00000000..01a8b113 Binary files /dev/null and b/img/stream_compaction_256_naive.png differ diff --git a/img/stream_compaction_256_thread_efficient.png b/img/stream_compaction_256_thread_efficient.png new file mode 100644 index 00000000..8602df87 Binary files /dev/null and b/img/stream_compaction_256_thread_efficient.png differ diff --git a/img/stream_compaction_256_thrust.png b/img/stream_compaction_256_thrust.png new file mode 100644 index 00000000..7584442b Binary files /dev/null and b/img/stream_compaction_256_thrust.png differ diff --git a/img/stream_compaction_256_work_efficient.png b/img/stream_compaction_256_work_efficient.png new file mode 100644 index 00000000..e2b0c3a9 Binary files /dev/null and b/img/stream_compaction_256_work_efficient.png differ diff --git a/img/stream_compaction_512_cpu.png b/img/stream_compaction_512_cpu.png new file mode 100644 index 00000000..eac8cf82 Binary files /dev/null and b/img/stream_compaction_512_cpu.png differ diff --git a/img/stream_compaction_512_naive.png b/img/stream_compaction_512_naive.png new file mode 100644 index 00000000..1f1e51ca Binary files /dev/null and b/img/stream_compaction_512_naive.png differ diff --git a/img/stream_compaction_512_thread_efficient.png b/img/stream_compaction_512_thread_efficient.png new file mode 100644 index 00000000..6e1d0f07 Binary files /dev/null and b/img/stream_compaction_512_thread_efficient.png differ diff --git a/img/stream_compaction_512_thrust.png b/img/stream_compaction_512_thrust.png new file mode 100644 index 00000000..9f5ff2eb Binary files /dev/null and b/img/stream_compaction_512_thrust.png differ diff --git a/img/stream_compaction_512_work_efficient.png b/img/stream_compaction_512_work_efficient.png new file mode 100644 index 00000000..2948ab02 Binary files /dev/null and b/img/stream_compaction_512_work_efficient.png differ diff --git a/profiling/Cargo.lock b/profiling/Cargo.lock new file mode 100644 index 00000000..03658719 --- /dev/null +++ b/profiling/Cargo.lock @@ -0,0 +1,4649 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ab_glyph" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e074464580a518d16a7126262fffaaa47af89d4099d4cb403f8ed938ba12ee7d" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" + +[[package]] +name = "accesskit" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3d3b8f9bae46a948369bc4a03e815d4ed6d616bd00de4051133a5019dc31c5a" + +[[package]] +name = "accesskit_atspi_common" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c5dd55e6e94949498698daf4d48fb5659e824d7abec0d394089656ceaf99d4f" +dependencies = [ + "accesskit", + "accesskit_consumer", + "atspi-common", + "serde", + "thiserror", + "zvariant", +] + +[[package]] +name = "accesskit_consumer" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f47983a1084940ba9a39c077a8c63e55c619388be5476ac04c804cfbd1e63459" +dependencies = [ + "accesskit", + "hashbrown 0.15.5", + "immutable-chunkmap", +] + +[[package]] +name = "accesskit_macos" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7329821f3bd1101e03a7d2e03bd339e3ac0dc64c70b4c9f9ae1949e3ba8dece1" +dependencies = [ + "accesskit", + "accesskit_consumer", + "hashbrown 0.15.5", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "accesskit_unix" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcee751cc20d88678c33edaf9c07e8b693cd02819fe89053776f5313492273f5" +dependencies = [ + "accesskit", + "accesskit_atspi_common", + "async-channel", + "async-executor", + "async-task", + "atspi", + "futures-lite", + "futures-util", + "serde", + "zbus", +] + +[[package]] +name = "accesskit_windows" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24fcd5d23d70670992b823e735e859374d694a3d12bfd8dd32bd3bd8bedb5d81" +dependencies = [ + "accesskit", + "accesskit_consumer", + "hashbrown 0.15.5", + "paste", + "static_assertions", + "windows 0.58.0", + "windows-core 0.58.0", +] + +[[package]] +name = "accesskit_winit" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6a48dad5530b6deb9fc7a52cc6c3bf72cdd9eb8157ac9d32d69f2427a5e879" +dependencies = [ + "accesskit", + "accesskit_macos", + "accesskit_unix", + "accesskit_windows", + "raw-window-handle", + "winit", +] + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.3", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-activity" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" +dependencies = [ + "android-properties", + "bitflags 2.9.4", + "cc", + "cesu8", + "jni", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys 0.6.0+11769913", + "num_enum", + "thiserror", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "arboard" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" +dependencies = [ + "clipboard-win", + "log", + "objc2 0.6.2", + "objc2-app-kit 0.3.1", + "objc2-foundation 0.3.1", + "parking_lot", + "percent-encoding", + "windows-sys 0.60.2", + "x11rb", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-fs" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" +dependencies = [ + "async-lock", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 1.1.2", + "slab", + "windows-sys 0.61.0", +] + +[[package]] +name = "async-lock" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix 1.1.2", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-signal" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.1.2", + "signal-hook-registry", + "slab", + "windows-sys 0.61.0", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "atspi" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be534b16650e35237bb1ed189ba2aab86ce65e88cc84c66f4935ba38575cecbf" +dependencies = [ + "atspi-common", + "atspi-connection", + "atspi-proxies", +] + +[[package]] +name = "atspi-common" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1909ed2dc01d0a17505d89311d192518507e8a056a48148e3598fef5e7bb6ba7" +dependencies = [ + "enumflags2", + "serde", + "static_assertions", + "zbus", + "zbus-lockstep", + "zbus-lockstep-macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "atspi-connection" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "430c5960624a4baaa511c9c0fcc2218e3b58f5dbcc47e6190cafee344b873333" +dependencies = [ + "atspi-common", + "atspi-proxies", + "futures-lite", + "zbus", +] + +[[package]] +name = "atspi-proxies" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e6c5de3e524cf967569722446bcd458d5032348554d9a17d7d72b041ab7496" +dependencies = [ + "atspi-common", + "serde", + "zbus", + "zvariant", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bit_field" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "bytemuck" +version = "1.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.9.4", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop", + "rustix 0.38.44", + "wayland-backend 0.3.11", + "wayland-client 0.31.11", +] + +[[package]] +name = "cc" +version = "1.2.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "clipboard-win" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +dependencies = [ + "error-code", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types", + "foreign-types 0.3.2", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types", + "foreign-types 0.5.0", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cursor-icon" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" + +[[package]] +name = "dbus" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190b6255e8ab55a7b568df5a883e9497edc3e4821c06396612048b430e5ad1e9" +dependencies = [ + "libc", + "libdbus-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.2", +] + +[[package]] +name = "display-info" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ba4b5ddb26d674c9cd40b7a747e42658ffe1289843615b838532f660e0e3dd0" +dependencies = [ + "anyhow", + "core-graphics 0.23.2", + "fxhash", + "widestring", + "windows 0.52.0", + "xcb", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "document-features" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +dependencies = [ + "litrs", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" + +[[package]] +name = "ecolor" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d72e9c39f6e11a2e922d04a34ec5e7ef522ea3f5a1acfca7a19d16ad5fe50f5" +dependencies = [ + "bytemuck", + "emath", +] + +[[package]] +name = "eframe" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2f2d9e7ea2d11ec9e98a8683b6eb99f9d7d0448394ef6e0d6d91bd4eb817220" +dependencies = [ + "ahash", + "bytemuck", + "document-features", + "egui", + "egui-wgpu", + "egui-winit", + "egui_glow", + "glow 0.16.0", + "glutin", + "glutin-winit", + "image 0.25.8", + "js-sys", + "log", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "parking_lot", + "percent-encoding", + "profiling 1.0.17", + "raw-window-handle", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-time", + "winapi", + "windows-sys 0.59.0", + "winit", +] + +[[package]] +name = "egui" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252d52224d35be1535d7fd1d6139ce071fb42c9097773e79f7665604f5596b5e" +dependencies = [ + "accesskit", + "ahash", + "emath", + "epaint", + "log", + "nohash-hasher", + "profiling 1.0.17", +] + +[[package]] +name = "egui-wgpu" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c1e821d2d8921ef6ce98b258c7e24d9d6aab2ca1f9cdf374eca997e7f67f59" +dependencies = [ + "ahash", + "bytemuck", + "document-features", + "egui", + "epaint", + "log", + "profiling 1.0.17", + "thiserror", + "type-map", + "web-time", + "wgpu", + "winit", +] + +[[package]] +name = "egui-winit" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e84c2919cd9f3a38a91e8f84ac6a245c19251fd95226ed9fae61d5ea564fce3" +dependencies = [ + "accesskit_winit", + "ahash", + "arboard", + "egui", + "log", + "profiling 1.0.17", + "raw-window-handle", + "smithay-clipboard", + "web-time", + "webbrowser", + "winit", +] + +[[package]] +name = "egui_glow" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf6264cc7608e3e69a7d57a6175f438275f1b3889c1a551b418277721c95e6" +dependencies = [ + "ahash", + "bytemuck", + "egui", + "glow 0.16.0", + "log", + "memoffset 0.9.1", + "profiling 1.0.17", + "wasm-bindgen", + "web-sys", + "winit", +] + +[[package]] +name = "egui_plot" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c226cae80a6ee10c4d3aaf9e33bd9e9b2f1c0116b6036bdc2a1cfc9d2d0dcc10" +dependencies = [ + "ahash", + "egui", + "emath", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "emath" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4fe73c1207b864ee40aa0b0c038d6092af1030744678c60188a05c28553515d" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "epaint" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5666f8d25236293c966fbb3635eac18b04ad1914e3bab55bc7d44b9980cafcac" +dependencies = [ + "ab_glyph", + "ahash", + "bytemuck", + "ecolor", + "emath", + "epaint_default_fonts", + "log", + "nohash-hasher", + "parking_lot", + "profiling 1.0.17", +] + +[[package]] +name = "epaint_default_fonts" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66f6ddac3e6ac6fd4c3d48bb8b1943472f8da0f43a4303bcd8a18aa594401c80" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.0", +] + +[[package]] +name = "error-code" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "exr" +version = "1.73.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" + +[[package]] +name = "flate2" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc257fdb4038301ce4b9cd1b3b51704509692bb3ff716a410cbd07925d9dae55" +dependencies = [ + "rustix 1.1.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.7+wasi-0.2.4", +] + +[[package]] +name = "gif" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glow" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glow" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" +dependencies = [ + "bitflags 2.9.4", + "cfg_aliases 0.2.1", + "cgl", + "dispatch2", + "glutin_egl_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "libloading", + "objc2 0.6.2", + "objc2-app-kit 0.3.1", + "objc2-core-foundation", + "objc2-foundation 0.3.1", + "once_cell", + "raw-window-handle", + "wayland-sys 0.31.7", + "windows-sys 0.52.0", + "x11-dl", +] + +[[package]] +name = "glutin-winit" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" +dependencies = [ + "cfg_aliases 0.2.1", + "glutin", + "raw-window-handle", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2" +dependencies = [ + "gl_generator", + "windows-sys 0.52.0", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.9.4", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.9.4", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" +dependencies = [ + "bitflags 2.9.4", + "gpu-descriptor-types", + "hashbrown 0.15.5", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.9.4", +] + +[[package]] +name = "half" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif", + "jpeg-decoder", + "num-traits", + "png 0.17.16", + "qoi", + "tiff", +] + +[[package]] +name = "image" +version = "0.25.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", + "png 0.18.0", +] + +[[package]] +name = "immutable-chunkmap" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3e98b1520e49e252237edc238a39869da9f3241f2ec19dc788c1d24694d1e4" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "indexmap" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +dependencies = [ + "equivalent", + "hashbrown 0.16.0", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "libc", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.3", + "libc", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" +dependencies = [ + "rayon", +] + +[[package]] +name = "js-sys" +version = "0.3.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "lebe" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" + +[[package]] +name = "libc" +version = "0.2.175" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" + +[[package]] +name = "libdbus-sys" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cbe856efeb50e4681f010e9aaa2bf0a644e10139e54cde10fc83a307c23bd9f" +dependencies = [ + "cc", + "pkg-config", +] + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link 0.2.0", +] + +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags 2.9.4", + "libc", + "redox_syscall 0.5.17", +] + +[[package]] +name = "libwayshot" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "896d0e594158b7f5188034836a6c4886492078352c39760786e54f1b796caaea" +dependencies = [ + "image 0.24.9", + "log", + "memmap2 0.7.1", + "nix 0.26.4", + "thiserror", + "wayland-client 0.30.2", + "wayland-protocols 0.30.1", + "wayland-protocols-wlr 0.1.0", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "litrs" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "memmap2" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49388d20533534cd19360ad3d6a7dadc885944aa802ba3995040c5ec11288c6" +dependencies = [ + "libc", +] + +[[package]] +name = "memmap2" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.9.4", + "block", + "core-graphics-types", + "foreign-types 0.5.0", + "log", + "objc", + "paste", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "moxcms" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd32fa8935aeadb8a8a6b6b351e40225570a37c43de67690383d87ef170cd08" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "naga" +version = "23.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.9.4", + "cfg_aliases 0.1.1", + "codespan-reporting", + "hexf-parse", + "indexmap", + "log", + "rustc-hash 1.1.0", + "spirv", + "termcolor", + "thiserror", + "unicode-xid", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.9.4", + "jni-sys", + "log", + "ndk-sys 0.6.0+11769913", + "num_enum", + "raw-window-handle", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", + "pin-utils", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "cfg_aliases 0.2.1", + "libc", + "memoffset 0.9.1", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "561f357ba7f3a2a61563a186a163d0a3a5247e1089524a3981d49adb775078bc" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.9.4", + "block2", + "libc", + "objc2 0.5.2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation 0.2.2", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.1", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.9.4", + "block2", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.9.4", + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +dependencies = [ + "bitflags 2.9.4", + "dispatch2", + "objc2 0.6.2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" +dependencies = [ + "bitflags 2.9.4", + "dispatch2", + "objc2 0.6.2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-contacts", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.9.4", + "block2", + "dispatch", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.9.4", + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.9.4", + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.9.4", + "block2", + "objc2 0.5.2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation 0.2.2", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.9.4", + "block2", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "orbclient" +version = "0.3.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" +dependencies = [ + "libredox", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.17", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "png" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" +dependencies = [ + "bitflags 2.9.4", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.5.2", + "pin-project-lite", + "rustix 1.1.2", + "windows-sys 0.61.0", +] + +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "0.1.0" +dependencies = [ + "eframe", + "egui", + "egui_plot", + "regex", + "screenshots", + "tokio", +] + +[[package]] +name = "profiling" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" + +[[package]] +name = "pxfm" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83f9b339b02259ada5c0f4a389b7fb472f933aa17ce176fd2ad98f28bb401fde" +dependencies = [ + "num-traits", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-xml" +version = "0.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1" +dependencies = [ + "memchr", +] + +[[package]] +name = "quick-xml" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quick-xml" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "rayon" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +dependencies = [ + "bitflags 2.9.4", +] + +[[package]] +name = "regex" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" + +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.9.4", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags 2.9.4", + "errno", + "libc", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.0", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "screenshots" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "038df8746dbf7d8b70715d638470db956794e0f3d08608e4197f4053c2da1620" +dependencies = [ + "anyhow", + "core-graphics 0.22.3", + "dbus", + "display-info", + "fxhash", + "image 0.24.9", + "libwayshot", + "percent-encoding", + "widestring", + "windows 0.51.1", + "xcb", +] + +[[package]] +name = "sctk-adwaita" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" +dependencies = [ + "ab_glyph", + "log", + "memmap2 0.9.8", + "smithay-client-toolkit", + "tiny-skia", +] + +[[package]] +name = "serde" +version = "1.0.226" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.226" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.226" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.9.4", + "calloop", + "calloop-wayland-source", + "cursor-icon", + "libc", + "log", + "memmap2 0.9.8", + "rustix 0.38.44", + "thiserror", + "wayland-backend 0.3.11", + "wayland-client 0.31.11", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols 0.32.9", + "wayland-protocols-wlr 0.3.9", + "wayland-scanner 0.31.7", + "xkeysym", +] + +[[package]] +name = "smithay-clipboard" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc8216eec463674a0e90f29e0ae41a4db573ec5b56b1c6c1c71615d249b6d846" +dependencies = [ + "libc", + "smithay-client-toolkit", + "wayland-backend 0.3.11", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.9.4", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tempfile" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix 1.1.2", + "windows-sys 0.61.0", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.47.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +dependencies = [ + "backtrace", + "bytes", + "io-uring", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "slab", + "socket2", + "tokio-macros", + "windows-sys 0.59.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "toml_datetime" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.23.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3effe7c0e86fdff4f69cdd2ccc1b96f933e24811c5441d44904e8683e27184b" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" +dependencies = [ + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + +[[package]] +name = "type-map" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" +dependencies = [ + "rustc-hash 2.1.1", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset 0.9.1", + "tempfile", + "winapi", +] + +[[package]] +name = "unicode-ident" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0b221ff421256839509adbb55998214a70d829d3a28c69b4a6672e9d2a42f67" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wayland-backend" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b48e27457e8da3b2260ac60d0a94512f5cba36448679f3747c0865b7893ed8" +dependencies = [ + "cc", + "downcast-rs", + "io-lifetimes", + "nix 0.26.4", + "scoped-tls", + "smallvec", + "wayland-sys 0.30.1", +] + +[[package]] +name = "wayland-backend" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" +dependencies = [ + "cc", + "downcast-rs", + "rustix 1.1.2", + "scoped-tls", + "smallvec", + "wayland-sys 0.31.7", +] + +[[package]] +name = "wayland-client" +version = "0.30.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "489c9654770f674fc7e266b3c579f4053d7551df0ceb392f153adb1f9ed06ac8" +dependencies = [ + "bitflags 1.3.2", + "nix 0.26.4", + "wayland-backend 0.1.2", + "wayland-scanner 0.30.1", +] + +[[package]] +name = "wayland-client" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" +dependencies = [ + "bitflags 2.9.4", + "rustix 1.1.2", + "wayland-backend 0.3.11", + "wayland-scanner 0.31.7", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.9.4", + "cursor-icon", + "wayland-backend 0.3.11", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29" +dependencies = [ + "rustix 1.1.2", + "wayland-client 0.31.11", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b28101e5ca94f70461a6c2d610f76d85ad223d042dd76585ab23d3422dd9b4d" +dependencies = [ + "bitflags 1.3.2", + "wayland-backend 0.1.2", + "wayland-client 0.30.2", + "wayland-scanner 0.30.1", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" +dependencies = [ + "bitflags 2.9.4", + "wayland-backend 0.3.11", + "wayland-client 0.31.11", + "wayland-scanner 0.31.7", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" +dependencies = [ + "bitflags 2.9.4", + "wayland-backend 0.3.11", + "wayland-client 0.31.11", + "wayland-protocols 0.32.9", + "wayland-scanner 0.31.7", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fce991093320e4a6a525876e6b629ab24da25f9baef0c2e0080ad173ec89588a" +dependencies = [ + "bitflags 1.3.2", + "wayland-backend 0.1.2", + "wayland-client 0.30.2", + "wayland-protocols 0.30.1", + "wayland-scanner 0.30.1", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" +dependencies = [ + "bitflags 2.9.4", + "wayland-backend 0.3.11", + "wayland-client 0.31.11", + "wayland-protocols 0.32.9", + "wayland-scanner 0.31.7", +] + +[[package]] +name = "wayland-scanner" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9b873b257fbc32ec909c0eb80dea312076a67014e65e245f5eb69a6b8ab330e" +dependencies = [ + "proc-macro2", + "quick-xml 0.28.2", + "quote", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" +dependencies = [ + "proc-macro2", + "quick-xml 0.37.5", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b2a02ac608e07132978689a6f9bf4214949c85998c247abadd4f4129b1aa06" +dependencies = [ + "dlib", + "log", + "pkg-config", +] + +[[package]] +name = "wayland-sys" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbe734895e869dc429d78c4b433f8d17d95f8d05317440b4fad5ab2d33e596dc" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webbrowser" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf4f3c0ba838e82b4e5ccc4157003fb8c324ee24c058470ffb82820becbde98" +dependencies = [ + "core-foundation 0.10.1", + "jni", + "log", + "ndk-context", + "objc2 0.6.2", + "objc2-foundation 0.3.1", + "url", + "web-sys", +] + +[[package]] +name = "weezl" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" + +[[package]] +name = "wgpu" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80f70000db37c469ea9d67defdc13024ddf9a5f1b89cb2941b812ad7cde1735a" +dependencies = [ + "arrayvec", + "cfg_aliases 0.1.1", + "document-features", + "js-sys", + "log", + "parking_lot", + "profiling 1.0.17", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d63c3c478de8e7e01786479919c8769f62a22eec16788d8c2ac77ce2c132778a" +dependencies = [ + "arrayvec", + "bit-vec", + "bitflags 2.9.4", + "cfg_aliases 0.1.1", + "document-features", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot", + "profiling 1.0.17", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-hal" +version = "23.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89364b8a0b211adc7b16aeaf1bd5ad4a919c1154b44c9ce27838213ba05fd821" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bitflags 2.9.4", + "bytemuck", + "cfg_aliases 0.1.1", + "core-graphics-types", + "glow 0.14.2", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-descriptor", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga", + "ndk-sys 0.5.0+25.2.9519653", + "objc", + "once_cell", + "parking_lot", + "profiling 1.0.17", + "raw-window-handle", + "renderdoc-sys", + "rustc-hash 1.1.0", + "smallvec", + "thiserror", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "windows 0.58.0", +] + +[[package]] +name = "wgpu-types" +version = "23.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610f6ff27778148c31093f3b03abc4840f9636d58d597ca2f5977433acfe0068" +dependencies = [ + "bitflags 2.9.4", + "js-sys", + "web-sys", +] + +[[package]] +name = "widestring" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" +dependencies = [ + "windows-core 0.51.1", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", +] + +[[package]] +name = "windows-sys" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +dependencies = [ + "windows-link 0.2.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +dependencies = [ + "windows-link 0.1.3", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "winit" +version = "0.30.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.9.4", + "block2", + "bytemuck", + "calloop", + "cfg_aliases 0.2.1", + "concurrent-queue", + "core-foundation 0.9.4", + "core-graphics 0.23.2", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2 0.9.8", + "ndk", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix 0.38.44", + "sctk-adwaita", + "smithay-client-toolkit", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend 0.3.11", + "wayland-client 0.31.11", + "wayland-protocols 0.32.9", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix 1.1.2", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + +[[package]] +name = "xcb" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f07c123b796139bfe0603e654eaf08e132e52387ba95b252c78bad3640ba37ea" +dependencies = [ + "bitflags 1.3.2", + "libc", + "quick-xml 0.30.0", +] + +[[package]] +name = "xcursor" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" + +[[package]] +name = "xdg-home" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.9.4", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zbus" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix 0.29.0", + "ordered-stream", + "rand", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "windows-sys 0.52.0", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus-lockstep" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca2c5dceb099bddaade154055c926bb8ae507a18756ba1d8963fd7b51d8ed1d" +dependencies = [ + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus-lockstep-macros" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709ab20fc57cb22af85be7b360239563209258430bccf38d8b979c5a2ae3ecce" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "zbus-lockstep", + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + +[[package]] +name = "zbus_xml" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3f374552b954f6abb4bd6ce979e6c9b38fb9d0cd7cc68a7d796e70c9f3a233" +dependencies = [ + "quick-xml 0.30.0", + "serde", + "static_assertions", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zvariant" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" +dependencies = [ + "endi", + "enumflags2", + "serde", + "static_assertions", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/profiling/Cargo.toml b/profiling/Cargo.toml new file mode 100644 index 00000000..3b9edb10 --- /dev/null +++ b/profiling/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "profiling" +version = "0.1.0" +edition = "2024" + +[dependencies] +regex = "1.11.2" +tokio = { version = "1.47.1", features = ["full"] } +eframe = "0.30.0" +egui = "0.30.0" +egui_plot = "0.30.0" +screenshots = "0.8.10" diff --git a/profiling/profile_output/output_1024.txt b/profiling/profile_output/output_1024.txt new file mode 100644 index 00000000..b7d57f77 --- /dev/null +++ b/profiling/profile_output/output_1024.txt @@ -0,0 +1,23 @@ +0.0005 0.0002 0.0003 0.245952 0.816224 0.429056 0.939008 0.218112 0.402432 0.503456 5 +0.0002 0.0002 0.0004 0.244736 0.20672 0.326656 0.257216 0.31744 0.070656 0.07296 6 +0.0003 0.0002 0.0005 0.036864 0.722752 0.693248 0.212992 0.330752 0.063744 0.090528 7 +0.0003 0.0004 0.0008 0.145408 0.191552 0.375808 0.5376 0.37376 0.162816 0.082976 8 +0.0004 0.0006 0.0013 0.152576 0.22528 0.3832 0.596992 0.408576 0.067584 0.09856 9 +0.0007 0.0009 0.0023 0.166912 0.252 0.411904 0.268416 0.423936 0.043264 0.098848 10 +0.0013 0.0017 0.0044 0.166912 0.279552 0.418816 0.24064 0.412928 0.071488 0.117312 11 +0.0024 0.0031 0.0089 0.356352 0.257024 0.45568 0.290816 0.391168 0.071456 0.076736 12 +0.0048 0.006 0.0169 0.242816 0.388064 0.49888 0.304128 0.544768 0.07168 0.085248 13 +0.0101 0.0123 0.036 0.21504 0.314368 0.50384 0.320512 0.50592 0.050176 0.213088 14 +0.021 0.0243 0.072 0.231392 0.341248 0.49696 0.326784 0.586752 0.047488 0.059808 15 +0.044 0.0479 0.1441 0.271456 0.40288 0.561536 0.38896 0.520192 0.07328 0.085152 16 +0.0954 0.1054 0.2828 0.508128 0.479008 0.593568 0.373024 0.535552 0.071296 0.086944 17 +0.1707 0.1904 0.5665 0.646048 0.504992 0.645216 0.442912 1.24211 0.450656 0.084064 18 +0.324 0.3776 1.1549 0.433248 1.09722 1.61789 0.752544 1.0456 0.590976 0.637376 19 +0.7348 0.8332 2.1928 0.506816 0.751072 2.70826 1.18086 1.72749 0.57104 0.763008 20 +1.3189 1.5012 4.6312 0.780288 1.7352 3.36211 1.23443 1.9497 0.713088 0.873632 21 +2.8936 3.2183 9.372 1.84077 2.52378 5.45946 1.34221 3.00954 1.09146 1.02429 22 +5.2427 7.1382 18.7083 7.22323 5.10957 10.3253 1.70106 4.61414 1.39792 1.22931 23 +11.5357 12.1131 41.9739 15.2966 13.421 23.3836 6.37939 11.646 1.81907 1.66675 24 +21.888 25.3366 73.3758 35.9116 29.2944 43.9062 13.6247 26.5503 2.87072 2.65846 25 +45.1539 51.3146 150.334 75.869 59.5889 84.4989 24.2153 41.3861 3.70899 3.78586 26 +99.058 97.8879 327.924 248.854 132.003 194.196 63.4566 101.67 8.68 7.54525 27 diff --git a/profiling/profile_output/output_128.txt b/profiling/profile_output/output_128.txt new file mode 100644 index 00000000..c0354a68 --- /dev/null +++ b/profiling/profile_output/output_128.txt @@ -0,0 +1,23 @@ +0.0005 0.0001 0.0002 0.233472 0.425984 1.1735 0.76288 0.3584 0.180256 0.188384 5 +0.0002 0.0001 0.0004 0.123904 0.223232 0.41472 0.172032 0.44544 0.183296 0.0944 6 +0.0003 0.0002 0.0006 0.132096 0.200704 0.433152 0.247808 0.400384 0.069632 0.19088 7 +0.0003 0.0003 0.0009 0.228352 0.208896 0.397312 0.20992 0.422912 0.069632 0.209408 8 +0.0004 0.0007 0.0014 0.175104 0.241664 0.463872 0.270336 0.759808 0.068608 0.114688 9 +0.0007 0.001 0.0023 0.192512 0.241664 0.441344 0.278528 0.432128 0.067584 0.112512 10 +0.0013 0.0017 0.0045 0.26112 0.274432 0.487424 0.320512 0.439296 0.047104 0.066016 11 +0.0026 0.0033 0.0089 0.207872 0.277504 0.524288 0.421888 0.572416 0.053248 0.066816 12 +0.0062 0.0074 0.0206 0.319488 0.30208 0.51712 0.331776 0.51712 0.053248 0.091392 13 +0.0102 0.0123 0.0363 0.27136 0.367616 0.663552 1.44384 1.25235 0.059392 0.203072 14 +0.0204 0.0245 0.1011 0.289408 1.13133 1.37126 1.13517 0.884736 0.181408 0.193632 15 +0.0413 0.0481 0.1405 0.548288 1.3737 0.744704 0.50352 1.27693 0.187584 0.23008 16 +0.1144 0.0955 0.3018 0.349152 1.08915 1.33267 0.5224 1.53293 0.124768 0.17968 17 +0.21 0.189 0.5649 0.674624 1.30147 1.51104 1.19715 1.66502 0.653024 0.18016 18 +0.3683 0.3785 1.1294 0.441472 1.38941 2.21782 1.36899 1.40493 0.577344 0.879488 19 +0.6573 0.7574 2.2033 0.482528 0.813792 2.5799 0.661248 1.40288 0.961504 0.883424 20 +1.3294 1.5078 5.2708 0.624416 0.92848 3.47318 1.33802 1.83808 0.780256 1.38554 21 +2.9587 3.4739 10.312 2.23898 1.86406 4.42122 0.860608 2.44019 1.06819 1.07549 22 +6.137 6.2717 20.3025 7.36554 3.52803 8.39674 1.68531 4.73293 1.44182 1.55219 23 +10.8125 12.2702 37.725 15.8134 9.95981 19.6012 6.12042 11.3797 1.96582 1.85142 24 +36.4534 25.5632 75.6302 38.2452 20.7322 34.8129 12.4831 22.1112 2.39245 2.27962 25 +43.7532 51.0376 151.915 80.7644 38.8354 66.9206 23.8904 41.2324 3.70278 4.24662 26 +88.4648 103.424 300.162 197.246 93.9461 178.328 63.6429 101.983 8.72115 8.48195 27 diff --git a/profiling/profile_output/output_256.txt b/profiling/profile_output/output_256.txt new file mode 100644 index 00000000..d5b36440 --- /dev/null +++ b/profiling/profile_output/output_256.txt @@ -0,0 +1,23 @@ +0.0003 0.0002 0.0002 0.223232 0.367616 0.329728 0.367616 0.449536 0.196608 0.475232 5 +0.0004 0.0002 0.0004 0.032768 0.164864 0.21504 0.155648 0.21104 0.077824 0.073696 6 +0.0002 0.0003 0.0005 0.03584 0.256032 0.310464 0.20992 0.347168 0.095264 0.09792 7 +0.0003 0.0005 0.0008 0.143456 0.195648 0.366592 0.197632 0.318464 0.043008 0.06336 8 +0.0004 0.0007 0.0014 0.149696 0.26112 0.338944 0.208896 0.438432 0.263168 0.064128 9 +0.0007 0.001 0.0023 0.175104 0.230528 0.391168 0.23232 0.432128 0.06656 0.099712 10 +0.0013 0.0017 0.0046 0.182272 0.24576 0.507904 0.267328 0.380928 0.044032 0.080928 11 +0.0028 0.0031 0.0088 0.185344 0.310016 0.410624 0.285664 0.4456 0.07072 0.061792 12 +0.0049 0.0063 0.0172 0.259072 0.303104 0.463872 0.338912 0.903168 0.072704 0.213056 13 +0.0099 0.0125 0.0362 0.217088 0.39936 0.446464 0.320512 0.559104 0.072704 0.082464 14 +0.021 0.0241 0.0697 0.428192 0.420928 0.590016 0.467872 0.492544 0.069728 0.060928 15 +0.0455 0.0477 0.1437 0.306848 0.355904 0.495072 0.526208 0.53248 0.076672 0.086496 16 +0.0851 0.1058 0.2842 0.505024 0.393728 0.536928 0.425632 1.11309 0.069824 0.082368 17 +0.1677 0.1896 0.5536 0.517376 0.54944 0.601856 0.907456 1.26669 0.55632 0.145248 18 +0.3244 0.3829 1.1298 0.70336 1.26205 1.82787 1.13603 1.62406 0.59632 0.777312 19 +0.671 0.7513 2.1905 0.428736 1.16352 2.65114 1.25149 1.21555 0.717568 0.758016 20 +1.2975 1.5008 4.5205 0.540864 1.58806 2.67482 1.5256 1.4809 0.71312 0.824736 21 +2.7884 3.436 13.7247 1.70285 1.45082 4.38976 0.858592 2.68595 1.01568 0.897792 22 +6.8758 9.1022 25.1608 7.40624 3.43379 8.87306 1.74784 5.08416 1.12061 1.18506 23 +10.0648 13.6955 39.3777 18.012 10.4106 20.7133 6.80627 12.588 1.72288 2.05635 24 +22.3922 26.2364 73.9668 38.0129 20.5091 36.1767 15.6049 26.4612 2.64237 2.71354 25 +45.2179 51.4821 171.235 79.8517 38.7872 68.3388 23.8949 40.5371 3.87162 3.61843 26 +90.7208 102.994 312.202 194.268 93.0321 157.982 62.8555 101.85 8.31571 8.32672 27 diff --git a/profiling/profile_output/output_512.txt b/profiling/profile_output/output_512.txt new file mode 100644 index 00000000..bdc46738 --- /dev/null +++ b/profiling/profile_output/output_512.txt @@ -0,0 +1,23 @@ +0.0004 0.0001 0.0002 0.22016 0.3072 0.331776 0.359424 0.312416 0.205824 0.19984 5 +0.0003 0.0001 0.0003 0.075776 0.444416 0.529408 0.151392 0.244864 0.04608 0.086848 6 +0.0003 0.0002 0.0005 0.03584 0.252928 0.242688 0.233472 0.436224 0.04512 0.077408 7 +0.0003 0.0003 0.0007 0.037888 0.252928 0.25088 0.29184 0.283648 0.044032 0.071584 8 +0.0004 0.0005 0.0012 0.060416 0.21504 0.271424 0.344064 0.41984 0.050176 0.092832 9 +0.0009 0.0009 0.0024 0.254976 0.231424 0.425984 0.231424 0.43008 0.06656 0.062432 10 +0.0012 0.0018 0.0045 0.18944 0.267264 0.388096 0.239616 0.502784 0.043168 0.13696 11 +0.0024 0.0031 0.0089 0.189632 0.310272 0.493568 0.2816 0.417792 0.07168 0.060224 12 +0.0058 0.0072 0.0203 0.287744 0.443488 0.518144 0.346112 0.4864 0.049152 0.066624 13 +0.0102 0.0119 0.0358 0.214016 0.384 0.466944 0.380992 0.546816 0.162944 0.2328 14 +0.0213 0.0234 0.0669 0.253792 0.328992 0.517344 0.366752 0.467136 0.163168 0.063328 15 +0.0415 0.0467 0.1477 0.2824 0.465216 1.00918 0.942464 0.544768 0.092096 0.085664 16 +0.0822 0.1032 0.2873 0.317792 0.531104 0.63952 0.491296 0.556288 0.070752 0.086144 17 +0.1689 0.1911 0.721 0.345216 0.47008 0.753408 0.91104 0.577696 0.460032 0.086144 18 +0.3235 0.3926 1.26 0.379008 0.586144 2.6033 0.545312 1.09677 0.569344 0.582624 19 +0.909 0.7761 2.2393 0.599008 0.681632 2.39667 1.26461 1.83398 0.560032 0.767648 20 +1.3357 1.4973 4.6518 0.579168 1.10352 3.03546 1.39405 2.21286 0.689568 0.80496 21 +2.6684 3.2042 8.9287 1.78768 1.56051 4.35786 0.70016 2.22416 0.915424 1.24339 22 +5.8583 6.1116 19.9304 7.53414 3.5775 9.18176 1.81386 5.24186 1.4361 1.4369 23 +14.7105 15.8012 46.92 18.0369 10.6086 20.8224 6.81651 13.5549 1.9408 2.07581 24 +24.1122 29.1648 77.912 37.817 22.1797 46.73 15.5863 26.2862 2.94787 2.7257 25 +57.05 51.8548 151.372 78.8305 43.6843 69.1372 24.1053 40.702 3.75661 3.8473 26 +90.6699 100.396 301.732 189.717 100.246 162.05 62.8661 102.346 8.67526 8.05635 27 diff --git a/profiling/src/main.rs b/profiling/src/main.rs new file mode 100644 index 00000000..2e20bcdc --- /dev/null +++ b/profiling/src/main.rs @@ -0,0 +1,333 @@ +use std::{array, fs::{File, OpenOptions}, io::{self, BufRead}, sync::{Arc, RwLock}, thread}; + +use eframe::*; +use egui::*; +use egui_plot::*; +use regex::Regex; +use screenshots::Screen; +use tokio::{ + io::AsyncBufReadExt +}; +use std::io::Write; + +const BLOCK_SIZES: [u32; 4] = [128, 256, 512, 1024]; +const RESET_ALL: bool = false; + +const BUFFER_COUNT: usize = 10; + +const BUFFER_TITLES : [&str; BUFFER_COUNT] = [ + "CPU Scan", + "CPU Compaction without Scan", + "CPU Compaction with Scan", + "GPU Scan Naive", + "GPU Scan Work Efficient", + "GPU Stream Compaction Work Efficient", + "GPU Scan Thread Efficient", + "GPU Stream Compaction Thread Efficient", + "GPU Scan Thrust", + "GPU Stream Compaction Thrust", +]; + +const CONFIG_CPU: [bool; BUFFER_COUNT] = [ + true, + true, + true, + false, + false, + false, + false, + false, + false, + false, +]; + +const CONFIG_NAIVE: [bool; BUFFER_COUNT] = [ + true, + true, + true, + true, + false, + false, + false, + false, + false, + false, +]; + +const CONFIG_WORK_EFFICIENT: [bool; BUFFER_COUNT] = [ + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, +]; + +const CONFIG_THREAD_EFFICIENT: [bool; BUFFER_COUNT] = [ + true, + true, + true, + true, + true, + true, + true, + true, + false, + false, +]; + +const CONFIG_THRUST: [bool; BUFFER_COUNT] = [true; 10]; + +const EXTENSION : &str = env!("EXTENSION"); + +fn main() -> Result<(), eframe::Error> { + let options = NativeOptions { + viewport: ViewportBuilder::default().with_fullscreen(true), + ..Default::default() + }; + + for i in BLOCK_SIZES { + if RESET_ALL { + File::create(format!("profile_output/output_{}.txt", i)).unwrap(); + } + if let Err(x) = + eframe::run_native(&format!("Project 2: Stream Compaction Profiler [Block Size: {i}]"), options.clone(), + Box::new(|_| Ok(Box::new(App::new(i)))) + ) + { + return Err(x); + } + } + + Ok(()) +} + +pub struct App { + current: Tab, + buffers: [Arc>>; BUFFER_COUNT], + block_size: u32, + frame: u32 +} + +impl App { + pub fn new(block_size: u32) -> Self { + let plots = get_plots(block_size); + + Self { current: Tab::Scan, + buffers: plots, + block_size, + frame: 0 + } + } +} + +fn get_plots(block_size: u32) -> [Arc>>; BUFFER_COUNT] { + let buffers: [_; BUFFER_COUNT] = array::from_fn(|_| Arc::new(RwLock::new(Vec::<(f32, u32)>::new()))); + + let buffers_clone: [_; BUFFER_COUNT] = array::from_fn(|i| buffers[i].clone()); + + thread::spawn(move || { + let rt = tokio::runtime::Runtime::new().unwrap(); + + let file = File::open(format!("profile_output/output_{}.txt", block_size)).expect("Unable to open output file"); + let reader = io::BufReader::new(file); + + let mut prefetch_data: Vec<([f32; BUFFER_COUNT], u32)> = Vec::new(); + + for line in reader.lines() { + let line = line.unwrap(); + let mut elems = line.split_whitespace(); + + let mut values = [0.0; BUFFER_COUNT]; + + for i in 0..BUFFER_COUNT { + values[i] = elems.next().unwrap().parse().unwrap(); + } + + let size: u32 = elems.next().unwrap().parse().unwrap(); + prefetch_data.push((values, size)); + } + + for i in 5..=27 { + let size = 1 << i; + + let prefetch = prefetch_data.iter().find(|x| x.1 == i); + + if let Some(x) = prefetch { + for i in 0..(BUFFER_COUNT) { + buffers_clone[i].write().unwrap().push((x.0[i], x.1)); + } + continue; + } + + let buffers_move : [_; BUFFER_COUNT] = array::from_fn(|i| buffers_clone[i].clone()); + + rt.block_on(async move { + let mut file = OpenOptions::new(); + let mut file = file.write(true) // open for writing + .append(true) // append to the end instead of overwriting + .create(true) // create if it doesn’t exist + .open(format!("profile_output/output_{}.txt", block_size)).expect("Unable to open output file"); + + let value = run_tests(size, block_size).await; + for c in 0..(BUFFER_COUNT) { + buffers_move[c].write().unwrap().push((value[c], i)); + write!(file, "{} ", value[c]).unwrap(); + } + writeln!(file, "{}", i).unwrap(); + }); + } + }); + + buffers +} + + + + +#[derive(PartialEq)] +enum Tab { + Scan, + StreamCompaction, +} + +const COLORS: [Color32; 6] = [Color32::RED, Color32::BLUE, Color32::GREEN, Color32::ORANGE, Color32::WHITE, Color32::YELLOW]; + + +impl eframe::App for App { + fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + self.frame += 1; + egui::TopBottomPanel::top("tab_bar").show(ctx, |ui| { + ui.add_space(2.0); // top padding + ui.horizontal_wrapped(|ui| { + ui.selectable_value(&mut self.current, Tab::Scan, "Scan"); + ui.selectable_value(&mut self.current, Tab::StreamCompaction, "StreamCompaction"); + + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if ui.button("Screenshot").clicked() || self.frame == 10 { + let screen = Screen::from_point(0, 0).unwrap(); + let image = screen.capture().unwrap(); + let tab = match self.current { + Tab::Scan => "scan", + Tab::StreamCompaction => "stream_compaction" + }; + let file_name = format!("../img/{}_{}_{}.png", tab, self.block_size, EXTENSION); + image.save(file_name).unwrap(); + + if let Tab::Scan = self.current { + self.frame = 0; + self.current = Tab::StreamCompaction; + } + else { + ctx.send_viewport_cmd(egui::ViewportCommand::Close); + } + } + + if ui.button("Reset").clicked() { + File::create(format!("profile_output/output_{}.txt", self.block_size)).unwrap(); + } + }); + }); + ui.add_space(2.0); // top padding + }); + + let buffers: [std::sync::RwLockReadGuard<'_, Vec<(f32, u32)>>; BUFFER_COUNT] = array::from_fn(|i| self.buffers[i].read().unwrap()); + + egui::CentralPanel::default().show(ctx, |ui| { + egui_plot::Plot::new("Plot") + .allow_drag(false) + .allow_zoom(false) + .auto_bounds(Vec2b { + x: true, y: true + }) + .include_x(0.0) + .include_y(0.0) + .include_y(300.0) + .include_x(27.0) + // .include_x(0.0) + // .include_x(500_00.0) + // .include_y(0.0) + // .include_y(600.0) + .y_axis_label("Algorithm Runtime (ms)") + .x_axis_label("Array Size (1 << x)") + .legend(Legend::default().position(Corner::LeftTop)) + .show(ui, |plot_ui| { + let identifier = match self.current { + Tab::Scan => |x: &str| x.contains("Scan") && !x.contains("Compaction"), + Tab::StreamCompaction => |x: &str| x.contains("Compaction") + }; + + let my_config = match EXTENSION { + "cpu" => CONFIG_CPU, + "naive" => CONFIG_NAIVE, + "work_efficient" => CONFIG_WORK_EFFICIENT, + "thread_efficient" => CONFIG_THREAD_EFFICIENT, + "thrust" => CONFIG_THRUST, + _ => panic!("ERROR: Incorrect Config detected") + }; + + buffers.iter() + .enumerate() + .filter(|(i, _)| identifier(BUFFER_TITLES[*i]) && my_config[*i]) + .enumerate() + .for_each(|(c, (i, buf))| { + plot_ui.line( + Line::new(buf.iter().map(|(ms, size)|{ + [*size as f64, *ms as f64] + }).collect::>()).color(COLORS[c]).name(BUFFER_TITLES[i]) + ); + }); + }); + }); + + ctx.request_repaint(); + } +} + +async fn run_tests(size: u32, block_size: u32) -> [f32; BUFFER_COUNT] { + let mut cuda = tokio::process::Command::new("../build/bin/Release/cis5650_stream_compaction_test.exe") + .current_dir("../") + .arg("-size") + .arg(size.to_string()) + .arg("-blocksize") + .arg(block_size.to_string()) + .stdout(std::process::Stdio::piped()) + .spawn() + .expect("Failed to start process"); + + let stdout = cuda.stdout.take().expect("No stdout captured"); + let mut reader = tokio::io::BufReader::new(stdout).lines(); + + let mut values = [0.0_f32; BUFFER_COUNT]; + + // Spawn task to print stdout + while let Ok(Some(line)) = reader.next_line().await { + if line.starts_with("ERROR") { + println!("{}", line); + } + + let re = Regex::new(r"^([^:]+):.*?([0-9.]+)ms").unwrap(); + if let Some(caps) = re.captures(&line) { + let mut found = false; + for (i, title) in BUFFER_TITLES.iter().enumerate() { + if caps[1] == **title { + values[i] = caps[2].parse().unwrap(); + found = true; + break; + } + } + + if !found { + println!("{} not found in title", &caps[1]); + } + } else { + println!("{} not captured", line); + } + } + + return values; +} diff --git a/profiling/target/.rustc_info.json b/profiling/target/.rustc_info.json new file mode 100644 index 00000000..d1f2e197 --- /dev/null +++ b/profiling/target/.rustc_info.json @@ -0,0 +1 @@ +{"rustc_fingerprint":8052755092028536186,"outputs":{"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.87.0 (17067e9ac 2025-05-09)\nbinary: rustc\ncommit-hash: 17067e9ac6d7ecb70e50f92c1944e545188d2359\ncommit-date: 2025-05-09\nhost: x86_64-pc-windows-msvc\nrelease: 1.87.0\nLLVM version: 20.1.1\n","stderr":""},"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___.exe\nlib___.rlib\n___.dll\n___.dll\n___.lib\n___.dll\nC:\\Users\\saahi\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\npacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"msvc\"\ntarget_family=\"windows\"\ntarget_feature=\"cmpxchg16b\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_feature=\"sse3\"\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"windows\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"pc\"\nwindows\n","stderr":""}},"successes":{}} \ No newline at end of file diff --git a/profiling/target/CACHEDIR.TAG b/profiling/target/CACHEDIR.TAG new file mode 100644 index 00000000..20d7c319 --- /dev/null +++ b/profiling/target/CACHEDIR.TAG @@ -0,0 +1,3 @@ +Signature: 8a477f597d28d172789f06886806bc55 +# This file is a cache directory tag created by cargo. +# For information about cache directory tags see https://bford.info/cachedir/ diff --git a/runtests.bat b/runtests.bat new file mode 100644 index 00000000..ac3a08d8 --- /dev/null +++ b/runtests.bat @@ -0,0 +1,118 @@ +@echo off + + + + + + +@REM CPU Config + +del /q "profiling\profile_output\*" + +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 128 +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 256 +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 512 +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 1024 + +cd profiling +set EXTENSION=cpu + +cargo r +cd .. + +@REM End CPU Config + + + + + +@REM Naive Config + +del /q "profiling\profile_output\*" + +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 128 +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 256 +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 512 +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 1024 + +cd profiling +set EXTENSION=naive + +cargo r +cd .. + +@REM End Naive Config + + + + + + +@REM Work Efficient Config + +del /q "profiling\profile_output\*" + +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 128 +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 256 +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 512 +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 1024 + +cd profiling +set EXTENSION=work_efficient + +cargo r +cd .. + +@REM End Work Efficient Config + + + + + + + +@REM Thread Efficient Config + +del /q "profiling\profile_output\*" + +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 128 +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 256 +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 512 +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 1024 + +cd profiling +set EXTENSION=thread_efficient + +cargo r +cd .. + +@REM End Thread Efficient Config + + + + + + + + + + + + + +@REM Thrust Config + +del /q "profiling\profile_output\*" + +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 128 +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 256 +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 512 +build\bin\Release\cis5650_stream_compaction_test.exe -blocksize 1024 + +cd profiling +set EXTENSION=thrust + +cargo r +cd .. + +@REM End Thrust Config \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 3d5c8820..ce052a8a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,144 +11,402 @@ #include #include #include +#include #include "testing_helpers.hpp" +#include +#include +#include +#include + +#define FILE_WRITE 1 + +const int NUM_TESTS = 8; + +int SIZE = 1 << 27; // feel free to change the size of array +bool tests[NUM_TESTS] = {true, true, true, true, true, true, true}; +int blockSize = 128; + +bool testing = false; + +void test_gpu_scan_naive() { + std::vector read(SIZE, 0); + std::vector h_write(SIZE, 0); + std::vector d_write(SIZE, 0); + + genArray(SIZE - 1, read.data(), 50); + read[SIZE - 1] = 0; + zeroArray(SIZE, h_write.data()); + zeroArray(SIZE, d_write.data()); + + StreamCompaction::CPU::scan(SIZE, h_write.data(), read.data()); + // printElapsedTime("CPU Scan: ", StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + + StreamCompaction::Naive::scan(SIZE, d_write.data(), read.data()); + // printElapsedTime("GPU Scan Naive: ", StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + + assert(h_write == d_write); + printf("%s passed\n", __func__); +} + +void test_gpu_scan_work_efficient() { + std::vector read(SIZE, 0); + std::vector h_write(SIZE, 0); + std::vector d_write(SIZE, 0); + + genArray(SIZE - 1, read.data(), 50); + read[SIZE - 1] = 0; + zeroArray(SIZE, h_write.data()); + zeroArray(SIZE, d_write.data()); + + StreamCompaction::CPU::scan(SIZE, h_write.data(), read.data()); + // printElapsedTime("CPU Scan: ", StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + + StreamCompaction::Efficient::scan(SIZE, d_write.data(), read.data()); + // printElapsedTime("GPU Scan Work Efficient: ", StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + + assert(h_write == d_write); + printf("%s passed\n", __func__); +} + + +void test_gpu_stream_compaction_work_efficient() { + std::vector read(SIZE, 0); + std::vector h_write(SIZE, 0); + std::vector d_write(SIZE, 0); + + genArray(SIZE - 1, read.data(), 50); + read[SIZE - 1] = 0; + zeroArray(SIZE, h_write.data()); + zeroArray(SIZE, d_write.data()); + + StreamCompaction::CPU::compactWithScan(SIZE, h_write.data(), read.data()); + // printElapsedTime("CPU Compaction: ", StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + + StreamCompaction::Efficient::compact(SIZE, d_write.data(), read.data()); + // printElapsedTime("GPU Compaction Work Efficient: ", StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + + assert(h_write == d_write); + printf("%s passed\n", __func__); +} + + +void test_gpu_scan_thrust() { + std::vector read(SIZE, 0); + std::vector h_write(SIZE, 0); + std::vector d_write(SIZE, 0); + + genArray(SIZE - 1, read.data(), 50); + read[SIZE - 1] = 0; + zeroArray(SIZE, h_write.data()); + zeroArray(SIZE, d_write.data()); + + StreamCompaction::CPU::scan(SIZE, h_write.data(), read.data()); + // printElapsedTime("CPU Scan: ", StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + + StreamCompaction::Thrust::scan(SIZE, d_write.data(), read.data()); + // printElapsedTime("GPU Thrust Scan: ", StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + + assert(h_write == d_write); + printf("%s passed\n", __func__); +} + +void test_cpu_stream_compaction() { + std::vector read(SIZE, 0); + std::vector a_write(SIZE, 0); + std::vector b_write(SIZE, 0); + + genArray(SIZE - 1, read.data(), 50); + read[SIZE - 1] = 0; + zeroArray(SIZE, a_write.data()); + zeroArray(SIZE, b_write.data()); + + StreamCompaction::CPU::compactWithScan(SIZE, a_write.data(), read.data()); + // printElapsedTime("CPU Compaction with Scan: ", StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + + StreamCompaction::CPU::compactWithoutScan(SIZE, b_write.data(), read.data()); + // printElapsedTime("CPU Compaction without Scan: ", StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + + assert(a_write == b_write); + printf("%s passed\n", __func__); +} + + +void test_gpu_stream_compaction_thrust() { + std::vector read(SIZE, 0); + std::vector a_write(SIZE, 0); + std::vector b_write(SIZE, 0); + + genArray(SIZE - 1, read.data(), 50); + read[SIZE - 1] = 0; + zeroArray(SIZE, a_write.data()); + zeroArray(SIZE, b_write.data()); + + StreamCompaction::CPU::compactWithScan(SIZE, a_write.data(), read.data()); + // printElapsedTime("CPU Compaction with Scan: ", StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + + StreamCompaction::Thrust::compact(SIZE, b_write.data(), read.data()); + // printElapsedTime("CPU Compaction without Scan: ", StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + + assert(a_write == b_write); + printf("%s passed\n", __func__); +} + +void test_gpu_scan_thread_efficient() { + std::vector read(SIZE, 0); + std::vector h_write(SIZE, 0); + std::vector d_write(SIZE, 0); + + // genArray(SIZE - 1, read.data(), 50); + onesArray(SIZE - 1, read.data()); + read[SIZE - 1] = 0; + zeroArray(SIZE, h_write.data()); + zeroArray(SIZE, d_write.data()); + + StreamCompaction::CPU::scan(SIZE, h_write.data(), read.data()); + + StreamCompaction::ThreadEfficient::scan(SIZE, d_write.data(), read.data()); + + assert(h_write == d_write); + printf("%s passed\n", __func__); +} + + +void test_gpu_stream_compaction_thread_efficient() { + std::vector read(SIZE, 0); + std::vector h_write(SIZE, 0); + std::vector d_write(SIZE, 0); + + // genArray(SIZE - 1, read.data(), 50); + onesArray(SIZE - 1, read.data()); + read[SIZE - 1] = 0; + zeroArray(SIZE, h_write.data()); + zeroArray(SIZE, d_write.data()); + + StreamCompaction::CPU::compactWithoutScan(SIZE, h_write.data(), read.data()); + + StreamCompaction::ThreadEfficient::compact(SIZE, d_write.data(), read.data()); + assert(h_write == d_write); + printf("%s passed\n", __func__); +} + + + +void process_command_line_args(int argc, char* argv[]) { + for ( int arg = 1; arg < argc; arg += 2 ) { + std::string flag( argv[arg] ); + + if ( arg + 1 == argc ) { + printf("ERROR: No argument provided for flag %s\n", flag); + std::cout.flush(); + } + + std::string value( argv[arg+1] ); + + if ( flag == "-tests" ) { + testing = true; + for(int i = 0; i < NUM_TESTS; i++) { + tests[i] = false; + } + if ( value == "CPU_STREAM_COMPACT" ) { + tests[0] = true; + } + else if ( value == "GPU_SCAN_NAIVE" ) { + tests[1] = true; + } + else if ( value == "GPU_SCAN_EFFICIENT" ) { + tests[2] = true; + } + else if ( value == "GPU_STREAM_COMPACT_EFFICIENT" ) { + tests[3] = true; + } + else if ( value == "GPU_SCAN_THRUST" ) { + tests[4] = true; + } + else if ( value == "GPU_STREAM_COMPACT_THRUST" ) { + tests[5] = true; + } + else if ( value == "GPU_SCAN_THREAD_EFFICIENT" ) { + tests[6] = true; + } + else if ( value == "GPU_STREAM_COMPACT_THREAD_EFFICIENT" ) { + tests[7] = true; + } + else if ( value == "ALL" ) { + for(int i = 0; i < NUM_TESTS; i++) { + tests[i] = true; + } + } + else { + printf("ERROR: incorrect parameter for flag -tests (CPU_STREAM_COMPACT, GPU_SCAN_NAIVE, GPU_SCAN_EFFICIENT, GPU_STREAM_COMPACT_EFFICIENT, GPU_SCAN_THRUST, GPU_STREAM_COMPACT_THRUST, GPU_SCAN_THREAD_EFFICIENT, GPU_STREAM_COMPACT_THREAD_EFFICIENT, ALL)\n"); + std::cout.flush(); + exit(1); + } + } + else if ( flag == "-size" ) { + try { + SIZE = std::stoi(value); + } catch (...) { + printf("ERROR: incorrect value type for flag -size, requires integer\n"); + std::cout.flush(); + exit(1); + } + } + else if ( flag == "-blocksize" ) { + try { + blockSize = std::stoi(value); + } catch (...) { + printf("ERROR: incorrect value type for flag -blocksize, requires integer\n"); + std::cout.flush(); + exit(1); + } + } + else { + printf("ERROR: no known flag %s\n", flag); + std::cout.flush(); + exit(1); + } + } +} + + + + -const int SIZE = 1 << 8; // feel free to change the size of array -const int NPOT = SIZE - 3; // Non-Power-Of-Two -int *a = new int[SIZE]; -int *b = new int[SIZE]; -int *c = new int[SIZE]; int main(int argc, char* argv[]) { - // Scan tests - - printf("\n"); - printf("****************\n"); - printf("** SCAN TESTS **\n"); - printf("****************\n"); - - genArray(SIZE - 1, a, 50); // Leave a 0 at the end to test that edge case - a[SIZE - 1] = 0; - printArray(SIZE, a, true); - - // initialize b using StreamCompaction::CPU::scan you implement - // We use b for further comparison. Make sure your StreamCompaction::CPU::scan is correct. - // At first all cases passed because b && c are all zeroes. - zeroArray(SIZE, b); - printDesc("cpu scan, power-of-two"); - StreamCompaction::CPU::scan(SIZE, b, a); - printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(SIZE, b, true); - - zeroArray(SIZE, c); - printDesc("cpu scan, non-power-of-two"); - StreamCompaction::CPU::scan(NPOT, c, a); - printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(NPOT, c, true); - printCmpResult(NPOT, b, c); - - zeroArray(SIZE, c); - printDesc("naive scan, power-of-two"); - StreamCompaction::Naive::scan(SIZE, c, a); - printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); - printCmpResult(SIZE, b, c); - - /* For bug-finding only: Array of 1s to help find bugs in stream compaction or scan - onesArray(SIZE, c); - printDesc("1s array for finding bugs"); - StreamCompaction::Naive::scan(SIZE, c, a); - printArray(SIZE, c, true); */ - - zeroArray(SIZE, c); - printDesc("naive scan, non-power-of-two"); - StreamCompaction::Naive::scan(NPOT, c, a); - printElapsedTime(StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); - printCmpResult(NPOT, b, c); - - zeroArray(SIZE, c); - printDesc("work-efficient scan, power-of-two"); - StreamCompaction::Efficient::scan(SIZE, c, a); - printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); - printCmpResult(SIZE, b, c); - - zeroArray(SIZE, c); - printDesc("work-efficient scan, non-power-of-two"); - StreamCompaction::Efficient::scan(NPOT, c, a); - printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(NPOT, c, true); - printCmpResult(NPOT, b, c); - - zeroArray(SIZE, c); - printDesc("thrust scan, power-of-two"); - StreamCompaction::Thrust::scan(SIZE, c, a); - printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(SIZE, c, true); - printCmpResult(SIZE, b, c); - - zeroArray(SIZE, c); - printDesc("thrust scan, non-power-of-two"); - StreamCompaction::Thrust::scan(NPOT, c, a); - printElapsedTime(StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(NPOT, c, true); - printCmpResult(NPOT, b, c); - - printf("\n"); - printf("*****************************\n"); - printf("** STREAM COMPACTION TESTS **\n"); - printf("*****************************\n"); - - // Compaction tests - - genArray(SIZE - 1, a, 4); // Leave a 0 at the end to test that edge case - a[SIZE - 1] = 0; - printArray(SIZE, a, true); - - int count, expectedCount, expectedNPOT; - - // initialize b using StreamCompaction::CPU::compactWithoutScan you implement - // We use b for further comparison. Make sure your StreamCompaction::CPU::compactWithoutScan is correct. - zeroArray(SIZE, b); - printDesc("cpu compact without scan, power-of-two"); - count = StreamCompaction::CPU::compactWithoutScan(SIZE, b, a); - printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - expectedCount = count; - printArray(count, b, true); - printCmpLenResult(count, expectedCount, b, b); - - zeroArray(SIZE, c); - printDesc("cpu compact without scan, non-power-of-two"); - count = StreamCompaction::CPU::compactWithoutScan(NPOT, c, a); - printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - expectedNPOT = count; - printArray(count, c, true); - printCmpLenResult(count, expectedNPOT, b, c); - - zeroArray(SIZE, c); - printDesc("cpu compact with scan"); - count = StreamCompaction::CPU::compactWithScan(SIZE, c, a); - printElapsedTime(StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); - printArray(count, c, true); - printCmpLenResult(count, expectedCount, b, c); - - zeroArray(SIZE, c); - printDesc("work-efficient compact, power-of-two"); - count = StreamCompaction::Efficient::compact(SIZE, c, a); - printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(count, c, true); - printCmpLenResult(count, expectedCount, b, c); - - zeroArray(SIZE, c); - printDesc("work-efficient compact, non-power-of-two"); - count = StreamCompaction::Efficient::compact(NPOT, c, a); - printElapsedTime(StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(CUDA Measured)"); - //printArray(count, c, true); - printCmpLenResult(count, expectedNPOT, b, c); - - system("pause"); // stop Win32 console from closing on exit - delete[] a; - delete[] b; - delete[] c; + for(int i = 0; i < NUM_TESTS; i++) { + tests[i] = true; + } + + process_command_line_args(argc, argv); + + if (testing) { + if (tests[0]) test_cpu_stream_compaction(); + if (tests[1]) test_gpu_scan_naive(); + if (tests[2]) test_gpu_scan_work_efficient(); + if (tests[3]) test_gpu_stream_compaction_work_efficient(); + if (tests[4]) test_gpu_scan_thrust(); + if (tests[5]) test_gpu_stream_compaction_thrust(); + if (tests[6]) test_gpu_scan_thread_efficient(); + if (tests[7]) test_gpu_stream_compaction_thread_efficient(); + } + else { // profiling + #if FILE_WRITE + std::stringstream ss; + ss << "profiling/profile_output/output_" << blockSize << ".txt"; + std::string path{ss.str()}; + printf("Beginning File Write to %s\n", path.c_str()); + + std::ofstream out_file(path); + + for(int i = 5; i <= 27; i++) { + SIZE = 1 << i; + #endif + + std::vector read(SIZE, 0); + std::vector write(SIZE, 0); + + genArray(SIZE - 1, read.data(), 50); + read[SIZE - 1] = 0; + + const int num_values = 10; + float values[num_values]; + + // CPU Scan + zeroArray(SIZE, write.data()); + StreamCompaction::CPU::scan(SIZE, write.data(), read.data()); + #if !FILE_WRITE + printElapsedTime("CPU Scan: ", StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + #endif + values[0] = StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(); + + // CPU Compaction without Scan + zeroArray(SIZE, write.data()); + StreamCompaction::CPU::compactWithoutScan(SIZE, write.data(), read.data()); + #if !FILE_WRITE + printElapsedTime("CPU Compaction without Scan: ", StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + #endif + values[1] = StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(); + + // CPU Compaction with Scan + zeroArray(SIZE, write.data()); + StreamCompaction::CPU::compactWithScan(SIZE, write.data(), read.data()); + #if !FILE_WRITE + printElapsedTime("CPU Compaction with Scan: ", StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + #endif + values[2] = StreamCompaction::CPU::timer().getCpuElapsedTimeForPreviousOperation(); + + // GPU Scan Naive + zeroArray(SIZE, write.data()); + StreamCompaction::Naive::scan(SIZE, write.data(), read.data()); + #if !FILE_WRITE + printElapsedTime("GPU Scan Naive: ", StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + #endif + values[3] = StreamCompaction::Naive::timer().getGpuElapsedTimeForPreviousOperation(); + + // GPU Scan Work Efficient + zeroArray(SIZE, write.data()); + StreamCompaction::Efficient::scan(SIZE, write.data(), read.data()); + #if !FILE_WRITE + printElapsedTime("GPU Scan Work Efficient: ", StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + #endif + values[4] = StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(); + + // GPU Stream Compaction Work Efficient + zeroArray(SIZE, write.data()); + StreamCompaction::Efficient::compact(SIZE, write.data(), read.data()); + #if !FILE_WRITE + printElapsedTime("GPU Stream Compaction Work Efficient: ", StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + #endif + values[5] = StreamCompaction::Efficient::timer().getGpuElapsedTimeForPreviousOperation(); + + // GPU Scan Thread Efficient + zeroArray(SIZE, write.data()); + StreamCompaction::ThreadEfficient::scan(SIZE, write.data(), read.data()); + #if !FILE_WRITE + printElapsedTime("GPU Scan Thread Efficient: ", StreamCompaction::ThreadEfficient::timer().getGpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + #endif + values[6] = StreamCompaction::ThreadEfficient::timer().getGpuElapsedTimeForPreviousOperation(); + + // GPU Stream Compaction Thread Efficient + zeroArray(SIZE, write.data()); + StreamCompaction::ThreadEfficient::compact(SIZE, write.data(), read.data()); + #if !FILE_WRITE + printElapsedTime("GPU Stream Compaction Thread Efficient: ", StreamCompaction::ThreadEfficient::timer().getGpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + #endif + values[7] = StreamCompaction::ThreadEfficient::timer().getGpuElapsedTimeForPreviousOperation(); + + // GPU Scan Thrust + zeroArray(SIZE, write.data()); + StreamCompaction::Thrust::scan(SIZE, write.data(), read.data()); + #if !FILE_WRITE + printElapsedTime("GPU Scan Thrust: ", StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + #endif + values[8] = StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(); + + // GPU Stream Compaction Thrust + zeroArray(SIZE, write.data()); + StreamCompaction::Thrust::compact(SIZE, write.data(), read.data()); + #if !FILE_WRITE + printElapsedTime("GPU Stream Compaction Thrust: ", StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(), "(std::chrono Measured)"); + #endif + values[9] = StreamCompaction::Thrust::timer().getGpuElapsedTimeForPreviousOperation(); + + #if FILE_WRITE + for (int i = 0; i < num_values; i++) { + out_file << values[i] << " "; + } + + out_file << i << std::endl; + } + + out_file.close(); + + + #if FILE_WRITE + printf("Finished File Write to %s\n", path.c_str()); + #endif + + #endif + } } diff --git a/src/testing_helpers.hpp b/src/testing_helpers.hpp index 025e94aa..bdcc4ac1 100644 --- a/src/testing_helpers.hpp +++ b/src/testing_helpers.hpp @@ -70,7 +70,7 @@ void printArray(int n, int *a, bool abridged = false) { } template -void printElapsedTime(T time, std::string note = "") +void printElapsedTime(std::string title, T time, std::string note = "") { - std::cout << " elapsed time: " << time << "ms " << note << std::endl; + std::cout << title << " elapsed time: " << time << "ms " << note << std::endl; } diff --git a/stream_compaction/CMakeLists.txt b/stream_compaction/CMakeLists.txt index 19511caa..30fab382 100644 --- a/stream_compaction/CMakeLists.txt +++ b/stream_compaction/CMakeLists.txt @@ -4,6 +4,7 @@ set(headers "naive.h" "efficient.h" "thrust.h" + "thread_efficient.h" ) set(sources @@ -12,6 +13,7 @@ set(sources "naive.cu" "efficient.cu" "thrust.cu" + "thread_efficient.cu" ) list(SORT headers) diff --git a/stream_compaction/common.cu b/stream_compaction/common.cu index 2ed6d630..18846010 100644 --- a/stream_compaction/common.cu +++ b/stream_compaction/common.cu @@ -23,7 +23,13 @@ namespace StreamCompaction { * which map to 0 will be removed, and elements which map to 1 will be kept. */ __global__ void kernMapToBoolean(int n, int *bools, const int *idata) { - // TODO + CALCULATE_TID_AUTO; + + if ( tid >= n ) { + return; + } + + bools[tid] = (idata[tid] == 0) ? 0 : 1; } /** @@ -32,7 +38,13 @@ namespace StreamCompaction { */ __global__ void kernScatter(int n, int *odata, const int *idata, const int *bools, const int *indices) { - // TODO + CALCULATE_TID_AUTO; + + if ( tid >= n ) { + return; + } + + odata[indices[tid]] = bools[tid] == 1 ? idata[tid] : odata[indices[tid]]; } } diff --git a/stream_compaction/common.h b/stream_compaction/common.h index d2c1fed9..bc880753 100644 --- a/stream_compaction/common.h +++ b/stream_compaction/common.h @@ -13,6 +13,19 @@ #define FILENAME (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__) #define checkCUDAError(msg) checkCUDAErrorFn(msg, FILENAME, __LINE__) +#define CALCULATE_TID(tid) int tid = threadIdx.x + (blockIdx.x * blockDim.x) + +#define CALCULATE_TID_AUTO CALCULATE_TID(tid) + +extern int blockSize; +#define BLOCK_SIZE blockSize + +#define CALCULATE_BLOCK_THREAD_SIZE(n, block_size, blocks_per_grid, threads_per_block) \ +int threads_per_block = block_size; \ +int blocks_per_grid = (n + threads_per_block - 1) / threads_per_block + +#define CALCULATE_BLOCK_THREAD_SIZE_AUTO(n, BLOCK_SIZE) CALCULATE_BLOCK_THREAD_SIZE(n, BLOCK_SIZE, blocksPerGrid, threadsPerBlock) + /** * Check for CUDA errors; print and exit if there was a problem. */ diff --git a/stream_compaction/cpu.cu b/stream_compaction/cpu.cu index 719fa115..cd8d0487 100644 --- a/stream_compaction/cpu.cu +++ b/stream_compaction/cpu.cu @@ -2,6 +2,7 @@ #include "cpu.h" #include "common.h" +#include namespace StreamCompaction { namespace CPU { @@ -17,10 +18,13 @@ namespace StreamCompaction { * For performance analysis, this is supposed to be a simple for loop. * (Optional) For better understanding before starting moving to GPU, you can simulate your GPU scan in this function first. */ - void scan(int n, int *odata, const int *idata) { - timer().startCpuTimer(); - // TODO - timer().endCpuTimer(); + void scan(int n, int *odata, const int *idata, bool timer_enabled) { + if (timer_enabled) { timer().startCpuTimer(); } + odata[0] = 0; + for (int i = 1; i < n; i++) { + odata[i] = odata[i-1] + idata[i-1]; + } + if (timer_enabled) { timer().endCpuTimer(); } } /** @@ -30,9 +34,17 @@ namespace StreamCompaction { */ int compactWithoutScan(int n, int *odata, const int *idata) { timer().startCpuTimer(); - // TODO + int odata_curr = 0; + + for (int i = 0; i < n; i++) { + if ( idata[i] != 0 ) { + odata[odata_curr] = idata[i]; + odata_curr++; + } + } + timer().endCpuTimer(); - return -1; + return odata_curr; } /** @@ -41,10 +53,25 @@ namespace StreamCompaction { * @returns the number of elements remaining after compaction. */ int compactWithScan(int n, int *odata, const int *idata) { + std::vector flags(n, 0); + std::vector scanout(n, 0); + timer().startCpuTimer(); - // TODO + + for (int i = 0; i < n; i++) { + flags[i] = ( idata[i] == 0 ) ? 0 : 1; + } + + scan(n, scanout.data(), flags.data(), false); + + for (int i = 0; i < n; i++) { + if (flags[i] == 1) { + odata[scanout[i]] = idata[i]; + } + } + timer().endCpuTimer(); - return -1; + return scanout[n-1] + flags[n-1]; } } } diff --git a/stream_compaction/cpu.h b/stream_compaction/cpu.h index 873c0476..e276e711 100644 --- a/stream_compaction/cpu.h +++ b/stream_compaction/cpu.h @@ -6,7 +6,7 @@ namespace StreamCompaction { namespace CPU { StreamCompaction::Common::PerformanceTimer& timer(); - void scan(int n, int *odata, const int *idata); + void scan(int n, int *odata, const int *idata, bool timer_enabled = true); int compactWithoutScan(int n, int *odata, const int *idata); diff --git a/stream_compaction/efficient.cu b/stream_compaction/efficient.cu index 2db346ee..660c16e8 100644 --- a/stream_compaction/efficient.cu +++ b/stream_compaction/efficient.cu @@ -2,6 +2,7 @@ #include #include "common.h" #include "efficient.h" +#include namespace StreamCompaction { namespace Efficient { @@ -12,13 +13,68 @@ namespace StreamCompaction { return timer; } + __global__ void Reduce(int n, int* data, int k) { + CALCULATE_TID_AUTO; + + if ( tid >= n || (tid + 1) % (2 * k) != 0 ) { + return; + } + + data[tid] = data[tid] + data[tid - k]; + } + + __global__ void DownSweep(int n, int* data, int k) { + CALCULATE_TID_AUTO; + tid = 2*tid + 1; + + k = n / (2 << k); + + if ( tid >= n || (tid + 1) % (2 * k) != 0 ) { + return; + } + + int temp = data[tid]; + data[tid] = data[tid] + data[tid - k]; + data[tid - k] = temp; + } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ - void scan(int n, int *odata, const int *idata) { - timer().startGpuTimer(); - // TODO - timer().endGpuTimer(); + void scan(int n, int *odata, const int *idata, bool timer_enabled) { + int og_n = n; + n = 1 << ilog2ceil(n); + + int* data; + cudaMalloc((void**)&data, n * sizeof(int)); + cudaMemset(data, 0, n * sizeof(int)); + cudaMemcpy(data, idata, og_n * sizeof(int), cudaMemcpyHostToDevice); + + if (timer_enabled) timer().startGpuTimer(); + + int num_iterations = ilog2ceil(n); + + CALCULATE_BLOCK_THREAD_SIZE_AUTO(n, BLOCK_SIZE); + + // up sweep + for(int i = 0; i < num_iterations; i++) { + Reduce<<>>(n, data, 1 << i); + } + + // down sweep + cudaMemset(data + (n-1), 0, sizeof(int)); + CALCULATE_BLOCK_THREAD_SIZE(n/2, BLOCK_SIZE, blocksPerGrid_new, threadsPerBlock_new); + for (int k = 0; k < num_iterations; k++) { + DownSweep<<>>(n, data, k); + } + + cudaDeviceSynchronize(); + + if (timer_enabled) timer().endGpuTimer(); + + cudaMemcpy(odata, data, og_n * sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(data); } /** @@ -31,10 +87,43 @@ namespace StreamCompaction { * @returns The number of elements remaining after compaction. */ int compact(int n, int *odata, const int *idata) { + int *read, *flags, *scanout, *write; + cudaMalloc((void**)&read, n * sizeof(int)); + cudaMalloc((void**)&flags, n * sizeof(int)); + cudaMalloc((void**)&scanout, n * sizeof(int)); + + cudaMemcpy(read, idata, n * sizeof(int), cudaMemcpyHostToDevice); + timer().startGpuTimer(); - // TODO + + CALCULATE_BLOCK_THREAD_SIZE_AUTO(n, BLOCK_SIZE); + + StreamCompaction::Common::kernMapToBoolean<<>>(n, flags, read); + + scan(n, scanout, flags, false); + + int scanout_end = 0; + int flags_end = 0; + cudaMemcpy(&scanout_end, scanout + (n-1), sizeof(int), cudaMemcpyDeviceToHost); + cudaMemcpy(&flags_end, flags + (n-1), sizeof(int), cudaMemcpyDeviceToHost); + + int len = scanout_end + flags_end + 1; + + cudaMalloc((void**)&write, len * sizeof(int)); + + StreamCompaction::Common::kernScatter<<>>(n, write, read, flags, scanout); + cudaDeviceSynchronize(); + timer().endGpuTimer(); - return -1; + + cudaMemcpy(odata, write, len * sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(read); + cudaFree(flags); + cudaFree(scanout); + cudaFree(write); + + return len; } } } diff --git a/stream_compaction/efficient.h b/stream_compaction/efficient.h index 803cb4fe..2bd8668d 100644 --- a/stream_compaction/efficient.h +++ b/stream_compaction/efficient.h @@ -6,7 +6,7 @@ namespace StreamCompaction { namespace Efficient { StreamCompaction::Common::PerformanceTimer& timer(); - void scan(int n, int *odata, const int *idata); + void scan(int n, int *odata, const int *idata, bool timer_enabled = true); int compact(int n, int *odata, const int *idata); } diff --git a/stream_compaction/naive.cu b/stream_compaction/naive.cu index 43088769..ade0848a 100644 --- a/stream_compaction/naive.cu +++ b/stream_compaction/naive.cu @@ -2,6 +2,7 @@ #include #include "common.h" #include "naive.h" +#include namespace StreamCompaction { namespace Naive { @@ -13,13 +14,82 @@ namespace StreamCompaction { } // TODO: __global__ + + __global__ void ScanIteration(int n, int* read, int* write, int k) { + CALCULATE_TID_AUTO; + + if ( tid >= n ) { + return; + } + + if ( tid < k ) { + write[tid] = read[tid]; + return; + } + + write[tid] = read[tid] + read[tid - k]; + } + + __global__ void InclusiveToExclusiveShift(int n, int* read, int* write) { + CALCULATE_TID_AUTO; + + if ( tid >= n ) { + return; + } + + if ( tid == 0 ) { + write[tid] = 0; + return; + } + + write[tid] = read[tid - 1]; + } + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + int* d_a; + int* d_b; + + cudaMalloc((void**)&d_a, n * sizeof(int)); + cudaMalloc((void**)&d_b, n * sizeof(int)); + + checkCUDAError("Naive::Scan cudaMalloc failed"); + + cudaMemcpy(d_a, idata, n * sizeof(int), cudaMemcpyHostToDevice); + + checkCUDAError("Naive::Scan cudaMemcpy failed"); + timer().startGpuTimer(); - // TODO + + int num_iterations = ilog2ceil(n); + + CALCULATE_BLOCK_THREAD_SIZE_AUTO(n, BLOCK_SIZE); + + for (int i = 0; i < num_iterations; i++) { + int* d_read = i % 2 == 0 ? d_a : d_b; + int* d_write = i % 2 == 0 ? d_b : d_a; + + int k = 1 << i; + + ScanIteration<<>>(n, d_read, d_write, k); + checkCUDAError("Naive::Scan ScanIteration failed"); + } + int* d_read = num_iterations % 2 == 0 ? d_a : d_b; + int* d_write = num_iterations % 2 == 0 ? d_b : d_a; + + InclusiveToExclusiveShift<<>>(n, d_read, d_write); + + cudaDeviceSynchronize(); + timer().endGpuTimer(); + + cudaMemcpy(odata, d_write, n * sizeof(int), cudaMemcpyDeviceToHost); + checkCUDAError("Naive::Scan cudaMemcpy failed"); + + cudaFree(d_a); + cudaFree(d_b); } } } diff --git a/stream_compaction/thread_efficient.cu b/stream_compaction/thread_efficient.cu new file mode 100644 index 00000000..9a0ed1bc --- /dev/null +++ b/stream_compaction/thread_efficient.cu @@ -0,0 +1,159 @@ +#include "thread_efficient.h" + +#include +#include +#include "common.h" +#include + +namespace StreamCompaction { + namespace ThreadEfficient { + using StreamCompaction::Common::PerformanceTimer; + PerformanceTimer& timer() + { + static PerformanceTimer timer; + return timer; + } + + + __global__ void Reduce(int n, int thread_mult, int* data, int k) { + CALCULATE_TID_AUTO; + tid = (tid * thread_mult) + (thread_mult - 1); + + if ( tid >= n || tid < k) { + return; + } + + data[tid] = data[tid] + data[tid - k]; + } + + __global__ void DownSweep(int n, int thread_mult, int* data, int k) { + CALCULATE_TID_AUTO; + tid = (tid * thread_mult) + (thread_mult - 1); + tid = 2*tid + 1; + + if ( tid >= n || tid < k) { + return; + } + + int temp = data[tid]; + data[tid] = data[tid] + data[tid - k]; + data[tid - k] = temp; + } + + void scan(int n, int *odata, const int *idata, bool timer_enabled) { + int og_n = n; + n = 1 << ilog2ceil(n); + + int* data; + cudaMalloc((void**)&data, n * sizeof(int)); + cudaMemset(data, 0, n * sizeof(int)); + cudaMemcpy(data, idata, og_n * sizeof(int), cudaMemcpyHostToDevice); + + if (timer_enabled) timer().startGpuTimer(); + + int num_iterations = ilog2ceil(n); + + // up sweep + for(int i = 0; i < num_iterations; i++) { + int thread_mult = 1 << (i+1); + // int thread_mult = 1; + + CALCULATE_BLOCK_THREAD_SIZE_AUTO((n + thread_mult - 1) / thread_mult, BLOCK_SIZE); + // printf("KERNEL: %d, %d\n", blocksPerGrid, threadsPerBlock); + Reduce<<>>(n, thread_mult, data, 1 << i); + } + + num_iterations++; + + // down sweep + cudaMemset(data + (n-1), 0, sizeof(int)); + for (int k = 0; k < num_iterations; k++) { + int thread_mult = (n / (1 << k)); + // int thread_mult = 1; + + CALCULATE_BLOCK_THREAD_SIZE((n + thread_mult - 1) / (thread_mult), BLOCK_SIZE, blocksPerGrid_new, threadsPerBlock_new); + DownSweep<<>>(n, thread_mult, data, n / (1 << k)); + } + + if (timer_enabled) timer().endGpuTimer(); + + cudaMemcpy(odata, data, og_n * sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(data); + } + + int compact(int n, int *odata, const int *idata) { + int *read, *flags, *scanout, *write; + cudaMalloc((void**)&read, n * sizeof(int)); + cudaMalloc((void**)&flags, n * sizeof(int)); + + cudaMemcpy(read, idata, n * sizeof(int), cudaMemcpyHostToDevice); + + // { + int s_n = n; + int og_n = s_n; + s_n = 1 << ilog2ceil(s_n); + + cudaMalloc((void**)&scanout, s_n * sizeof(int)); + int* data = scanout; + cudaMemset(data, 0, s_n * sizeof(int)); + // } + + timer().startGpuTimer(); + + CALCULATE_BLOCK_THREAD_SIZE_AUTO(n, BLOCK_SIZE); + StreamCompaction::Common::kernMapToBoolean<<>>(n, flags, read); + // scan(n, scanout, flags, false); + + // { + cudaMemcpy(data, flags, og_n * sizeof(int), cudaMemcpyDeviceToDevice); + + int num_iterations = ilog2ceil(s_n); + + // up sweep + for(int i = 0; i < num_iterations; i++) { + int thread_mult = 1 << (i+1); + // int thread_mult = 1; + + CALCULATE_BLOCK_THREAD_SIZE_AUTO((s_n + thread_mult - 1) / thread_mult, BLOCK_SIZE); + // printf("KERNEL: %d, %d\n", blocksPerGrid, threadsPerBlock); + Reduce<<>>(s_n, thread_mult, data, 1 << i); + } + + num_iterations++; + + // down sweep + cudaMemset(data + (s_n-1), 0, sizeof(int)); + for (int k = 0; k < num_iterations; k++) { + int thread_mult = (s_n / (1 << k)); + // int thread_mult = 1; + + CALCULATE_BLOCK_THREAD_SIZE((s_n + thread_mult - 1) / (thread_mult), BLOCK_SIZE, blocksPerGrid_new, threadsPerBlock_new); + DownSweep<<>>(s_n, thread_mult, data, s_n / (1 << k)); + } + // } + + int scanout_end = 0; + int flags_end = 0; + cudaMemcpy(&scanout_end, scanout + (n-1), sizeof(int), cudaMemcpyDeviceToHost); + cudaMemcpy(&flags_end, flags + (n-1), sizeof(int), cudaMemcpyDeviceToHost); + + int len = scanout_end + flags_end + 1; + + cudaMalloc((void**)&write, len * sizeof(int)); + StreamCompaction::Common::kernScatter<<>>(n, write, read, flags, scanout); + cudaDeviceSynchronize(); + + timer().endGpuTimer(); + + cudaMemcpy(odata, write, len * sizeof(int), cudaMemcpyDeviceToHost); + + cudaFree(read); + cudaFree(flags); + cudaFree(scanout); + cudaFree(write); + + return len; + } + } +} \ No newline at end of file diff --git a/stream_compaction/thread_efficient.h b/stream_compaction/thread_efficient.h new file mode 100644 index 00000000..26a86725 --- /dev/null +++ b/stream_compaction/thread_efficient.h @@ -0,0 +1,13 @@ +#pragma once + +#include "common.h" + +namespace StreamCompaction { + namespace ThreadEfficient { + StreamCompaction::Common::PerformanceTimer& timer(); + + void scan(int n, int *odata, const int *idata, bool timer_enabled = true); + + int compact(int n, int *odata, const int *idata); + } +} \ No newline at end of file diff --git a/stream_compaction/thrust.cu b/stream_compaction/thrust.cu index 1def45e7..7eba1151 100644 --- a/stream_compaction/thrust.cu +++ b/stream_compaction/thrust.cu @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include "common.h" #include "thrust.h" @@ -14,15 +16,48 @@ namespace StreamCompaction { static PerformanceTimer timer; return timer; } + + #define DPTR(x) thrust::device_pointer_cast(x) + /** * Performs prefix-sum (aka scan) on idata, storing the result into odata. */ void scan(int n, int *odata, const int *idata) { + thrust::device_vector dvec_read(n); + thrust::device_vector dvec_write(n); + + cudaMemcpy(dvec_read.data().get(), idata, n * sizeof(int), cudaMemcpyHostToDevice); + + timer().startGpuTimer(); + + thrust::exclusive_scan(dvec_read.begin(), dvec_read.end(), dvec_write.begin()); + cudaDeviceSynchronize(); + + timer().endGpuTimer(); + + cudaMemcpy(odata, dvec_write.data().get(), n * sizeof(int), cudaMemcpyDeviceToHost); + } + + struct is_zero { + __host__ __device__ + bool operator()(int x) const { return x == 0; } + }; + + void compact(int n, int *odata, const int *idata) { + thrust::device_vector dvec(n); + + cudaMemcpy(dvec.data().get(), idata, n * sizeof(int), cudaMemcpyHostToDevice); + timer().startGpuTimer(); - // TODO use `thrust::exclusive_scan` - // example: for device_vectors dv_in and dv_out: - // thrust::exclusive_scan(dv_in.begin(), dv_in.end(), dv_out.begin()); + + auto new_end = thrust::remove_if(dvec.begin(), dvec.end(), is_zero()); + + dvec.erase(new_end, dvec.end()); + cudaDeviceSynchronize(); + timer().endGpuTimer(); + + cudaMemcpy(odata, dvec.data().get(), dvec.size() * sizeof(int), cudaMemcpyDeviceToHost); } } } diff --git a/stream_compaction/thrust.h b/stream_compaction/thrust.h index fe98206b..84fcb38c 100644 --- a/stream_compaction/thrust.h +++ b/stream_compaction/thrust.h @@ -7,5 +7,6 @@ namespace StreamCompaction { StreamCompaction::Common::PerformanceTimer& timer(); void scan(int n, int *odata, const int *idata); + void compact(int n, int *odata, const int *idata); } }