├── .forgejo └── workflows │ ├── audit.yml │ ├── build.yml │ └── release.yml ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── example.png ├── flow.png ├── gui.png ├── noaa19_short.png ├── noaa19_short.wav ├── readme.md └── src ├── amdemod.rs ├── aptsyncer.rs ├── cli.rs ├── decoder.rs ├── errors.rs ├── firfilter.rs ├── main.rs ├── resamplers.rs ├── ui.rs └── utils.rs /.forgejo/workflows/audit.yml: -------------------------------------------------------------------------------- 1 | on: push 2 | jobs: 3 | audit: 4 | runs-on: docker 5 | container: 6 | image: forgejo.zenerdio.de/sebastian/apt-decoder-ci:v0.2.2 7 | steps: 8 | - uses: actions/checkout@v3 9 | - uses: actions/cache@v3 10 | with: 11 | path: | 12 | ~/.cargo/bin/ 13 | ~/.cargo/registry/index/ 14 | ~/.cargo/registry/cache/ 15 | ~/.cargo/git/db/ 16 | target/ 17 | key: audit-apt-decoder 18 | - run: CARGO_HOME=/root/.cargo cargo audit -------------------------------------------------------------------------------- /.forgejo/workflows/build.yml: -------------------------------------------------------------------------------- 1 | on: push 2 | jobs: 3 | build: 4 | runs-on: docker 5 | container: 6 | image: forgejo.zenerdio.de/sebastian/apt-decoder-ci:v0.2.2 7 | steps: 8 | - uses: actions/checkout@v3 9 | - uses: actions/cache@v3 10 | with: 11 | path: | 12 | ~/.cargo/bin/ 13 | ~/.cargo/registry/index/ 14 | ~/.cargo/registry/cache/ 15 | ~/.cargo/git/db/ 16 | target/ 17 | key: build-apt-decoder 18 | restore-keys: audit-apt-decoder 19 | - run: CARGO_HOME=~/.cargo cargo build --release 20 | 21 | build-windows: 22 | runs-on: docker 23 | container: 24 | image: forgejo.zenerdio.de/sebastian/apt-decoder-ci:v0.2.2 25 | needs: build 26 | steps: 27 | - uses: actions/checkout@v3 28 | - uses: actions/cache/restore@v3 29 | with: 30 | path: | 31 | ~/.cargo/bin/ 32 | ~/.cargo/registry/index/ 33 | ~/.cargo/registry/cache/ 34 | ~/.cargo/git/db/ 35 | target/ 36 | key: build-apt-decoder 37 | - run: CARGO_HOME=~/.cargo cargo build --target x86_64-pc-windows-gnu --release 38 | 39 | build-appimage: 40 | runs-on: docker 41 | container: 42 | image: forgejo.zenerdio.de/sebastian/apt-decoder-ci:v0.2.2 43 | needs: build 44 | steps: 45 | - uses: actions/checkout@v3 46 | - uses: actions/cache/restore@v3 47 | with: 48 | path: | 49 | ~/.cargo/bin/ 50 | ~/.cargo/registry/index/ 51 | ~/.cargo/registry/cache/ 52 | ~/.cargo/git/db/ 53 | target/ 54 | key: build-apt-decoder 55 | - run: CARGO_HOME=~/.cargo PATH=$PATH:$CARGO_HOME/bin x build -r --format appimage -------------------------------------------------------------------------------- /.forgejo/workflows/release.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | tags: 'v*' 4 | 5 | jobs: 6 | publish-release: 7 | runs-on: docker 8 | container: 9 | image: forgejo.zenerdio.de/sebastian/apt-decoder-ci:v0.2.2 10 | steps: 11 | - uses: actions/checkout@v3 12 | - uses: actions/cache/restore@v3 13 | with: 14 | path: | 15 | ~/.cargo/bin/ 16 | ~/.cargo/registry/index/ 17 | ~/.cargo/registry/cache/ 18 | ~/.cargo/git/db/ 19 | target/ 20 | key: build-apt-decoder 21 | - run: CARGO_HOME=~/.cargo cargo build --target x86_64-pc-windows-gnu --release 22 | - run: CARGO_HOME=~/.cargo PATH=$PATH:$CARGO_HOME/bin x build -r --format appimage 23 | - run: mkdir -p release 24 | - run: cp target/x/release/linux/x64/apt-decoder.AppImage release/apt-decoder-${{ github.ref_name }}.AppImage 25 | - run: cp target/x86_64-pc-windows-gnu/release/apt-decoder.exe release/ 26 | - run: cd release && zip apt-decoder-win.zip apt-decoder.exe && rm apt-decoder.exe 27 | - uses: actions/forgejo-release@v1 28 | with: 29 | direction: upload 30 | release-dir: release 31 | token: ${{ secrets.FORGEJO_RELEASE }} 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | .vendor 3 | *.AppImage 4 | icon.png 5 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "ab_glyph" 7 | version = "0.2.29" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" 10 | dependencies = [ 11 | "ab_glyph_rasterizer", 12 | "owned_ttf_parser", 13 | ] 14 | 15 | [[package]] 16 | name = "ab_glyph_rasterizer" 17 | version = "0.1.8" 18 | source = "registry+https://github.com/rust-lang/crates.io-index" 19 | checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" 20 | 21 | [[package]] 22 | name = "accesskit" 23 | version = "0.17.1" 24 | source = "registry+https://github.com/rust-lang/crates.io-index" 25 | checksum = "d3d3b8f9bae46a948369bc4a03e815d4ed6d616bd00de4051133a5019dc31c5a" 26 | 27 | [[package]] 28 | name = "accesskit_atspi_common" 29 | version = "0.10.1" 30 | source = "registry+https://github.com/rust-lang/crates.io-index" 31 | checksum = "7c5dd55e6e94949498698daf4d48fb5659e824d7abec0d394089656ceaf99d4f" 32 | dependencies = [ 33 | "accesskit", 34 | "accesskit_consumer", 35 | "atspi-common", 36 | "serde", 37 | "thiserror", 38 | "zvariant", 39 | ] 40 | 41 | [[package]] 42 | name = "accesskit_consumer" 43 | version = "0.26.0" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "f47983a1084940ba9a39c077a8c63e55c619388be5476ac04c804cfbd1e63459" 46 | dependencies = [ 47 | "accesskit", 48 | "hashbrown", 49 | "immutable-chunkmap", 50 | ] 51 | 52 | [[package]] 53 | name = "accesskit_macos" 54 | version = "0.18.1" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "7329821f3bd1101e03a7d2e03bd339e3ac0dc64c70b4c9f9ae1949e3ba8dece1" 57 | dependencies = [ 58 | "accesskit", 59 | "accesskit_consumer", 60 | "hashbrown", 61 | "objc2", 62 | "objc2-app-kit", 63 | "objc2-foundation", 64 | ] 65 | 66 | [[package]] 67 | name = "accesskit_unix" 68 | version = "0.13.1" 69 | source = "registry+https://github.com/rust-lang/crates.io-index" 70 | checksum = "fcee751cc20d88678c33edaf9c07e8b693cd02819fe89053776f5313492273f5" 71 | dependencies = [ 72 | "accesskit", 73 | "accesskit_atspi_common", 74 | "async-channel", 75 | "async-executor", 76 | "async-task", 77 | "atspi", 78 | "futures-lite", 79 | "futures-util", 80 | "serde", 81 | "zbus", 82 | ] 83 | 84 | [[package]] 85 | name = "accesskit_windows" 86 | version = "0.24.1" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | checksum = "24fcd5d23d70670992b823e735e859374d694a3d12bfd8dd32bd3bd8bedb5d81" 89 | dependencies = [ 90 | "accesskit", 91 | "accesskit_consumer", 92 | "hashbrown", 93 | "paste", 94 | "static_assertions", 95 | "windows", 96 | "windows-core", 97 | ] 98 | 99 | [[package]] 100 | name = "accesskit_winit" 101 | version = "0.23.1" 102 | source = "registry+https://github.com/rust-lang/crates.io-index" 103 | checksum = "6a6a48dad5530b6deb9fc7a52cc6c3bf72cdd9eb8157ac9d32d69f2427a5e879" 104 | dependencies = [ 105 | "accesskit", 106 | "accesskit_macos", 107 | "accesskit_unix", 108 | "accesskit_windows", 109 | "raw-window-handle", 110 | "winit", 111 | ] 112 | 113 | [[package]] 114 | name = "adler2" 115 | version = "2.0.0" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 118 | 119 | [[package]] 120 | name = "ahash" 121 | version = "0.8.11" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 124 | dependencies = [ 125 | "cfg-if", 126 | "getrandom", 127 | "once_cell", 128 | "version_check", 129 | "zerocopy", 130 | ] 131 | 132 | [[package]] 133 | name = "android-activity" 134 | version = "0.6.0" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" 137 | dependencies = [ 138 | "android-properties", 139 | "bitflags 2.6.0", 140 | "cc", 141 | "cesu8", 142 | "jni", 143 | "jni-sys", 144 | "libc", 145 | "log", 146 | "ndk", 147 | "ndk-context", 148 | "ndk-sys 0.6.0+11769913", 149 | "num_enum", 150 | "thiserror", 151 | ] 152 | 153 | [[package]] 154 | name = "android-properties" 155 | version = "0.2.2" 156 | source = "registry+https://github.com/rust-lang/crates.io-index" 157 | checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" 158 | 159 | [[package]] 160 | name = "android_system_properties" 161 | version = "0.1.5" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 164 | dependencies = [ 165 | "libc", 166 | ] 167 | 168 | [[package]] 169 | name = "anstream" 170 | version = "0.6.18" 171 | source = "registry+https://github.com/rust-lang/crates.io-index" 172 | checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 173 | dependencies = [ 174 | "anstyle", 175 | "anstyle-parse", 176 | "anstyle-query", 177 | "anstyle-wincon", 178 | "colorchoice", 179 | "is_terminal_polyfill", 180 | "utf8parse", 181 | ] 182 | 183 | [[package]] 184 | name = "anstyle" 185 | version = "1.0.10" 186 | source = "registry+https://github.com/rust-lang/crates.io-index" 187 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 188 | 189 | [[package]] 190 | name = "anstyle-parse" 191 | version = "0.2.6" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 194 | dependencies = [ 195 | "utf8parse", 196 | ] 197 | 198 | [[package]] 199 | name = "anstyle-query" 200 | version = "1.1.2" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 203 | dependencies = [ 204 | "windows-sys 0.59.0", 205 | ] 206 | 207 | [[package]] 208 | name = "anstyle-wincon" 209 | version = "3.0.6" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" 212 | dependencies = [ 213 | "anstyle", 214 | "windows-sys 0.59.0", 215 | ] 216 | 217 | [[package]] 218 | name = "apt-decoder" 219 | version = "1.0.1" 220 | dependencies = [ 221 | "clap", 222 | "eframe", 223 | "hound", 224 | "image 0.24.9", 225 | "indicatif", 226 | "rfd", 227 | "thiserror", 228 | ] 229 | 230 | [[package]] 231 | name = "arboard" 232 | version = "3.4.1" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "df099ccb16cd014ff054ac1bf392c67feeef57164b05c42f037cd40f5d4357f4" 235 | dependencies = [ 236 | "clipboard-win", 237 | "log", 238 | "objc2", 239 | "objc2-app-kit", 240 | "objc2-foundation", 241 | "parking_lot", 242 | "x11rb", 243 | ] 244 | 245 | [[package]] 246 | name = "arrayref" 247 | version = "0.3.9" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" 250 | 251 | [[package]] 252 | name = "arrayvec" 253 | version = "0.7.6" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 256 | 257 | [[package]] 258 | name = "as-raw-xcb-connection" 259 | version = "1.0.1" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" 262 | 263 | [[package]] 264 | name = "ash" 265 | version = "0.38.0+1.3.281" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" 268 | dependencies = [ 269 | "libloading", 270 | ] 271 | 272 | [[package]] 273 | name = "async-broadcast" 274 | version = "0.7.1" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" 277 | dependencies = [ 278 | "event-listener", 279 | "event-listener-strategy", 280 | "futures-core", 281 | "pin-project-lite", 282 | ] 283 | 284 | [[package]] 285 | name = "async-channel" 286 | version = "2.3.1" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" 289 | dependencies = [ 290 | "concurrent-queue", 291 | "event-listener-strategy", 292 | "futures-core", 293 | "pin-project-lite", 294 | ] 295 | 296 | [[package]] 297 | name = "async-executor" 298 | version = "1.13.1" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" 301 | dependencies = [ 302 | "async-task", 303 | "concurrent-queue", 304 | "fastrand", 305 | "futures-lite", 306 | "slab", 307 | ] 308 | 309 | [[package]] 310 | name = "async-fs" 311 | version = "2.1.2" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" 314 | dependencies = [ 315 | "async-lock", 316 | "blocking", 317 | "futures-lite", 318 | ] 319 | 320 | [[package]] 321 | name = "async-io" 322 | version = "2.4.0" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" 325 | dependencies = [ 326 | "async-lock", 327 | "cfg-if", 328 | "concurrent-queue", 329 | "futures-io", 330 | "futures-lite", 331 | "parking", 332 | "polling", 333 | "rustix", 334 | "slab", 335 | "tracing", 336 | "windows-sys 0.59.0", 337 | ] 338 | 339 | [[package]] 340 | name = "async-lock" 341 | version = "3.4.0" 342 | source = "registry+https://github.com/rust-lang/crates.io-index" 343 | checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 344 | dependencies = [ 345 | "event-listener", 346 | "event-listener-strategy", 347 | "pin-project-lite", 348 | ] 349 | 350 | [[package]] 351 | name = "async-process" 352 | version = "2.3.0" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" 355 | dependencies = [ 356 | "async-channel", 357 | "async-io", 358 | "async-lock", 359 | "async-signal", 360 | "async-task", 361 | "blocking", 362 | "cfg-if", 363 | "event-listener", 364 | "futures-lite", 365 | "rustix", 366 | "tracing", 367 | ] 368 | 369 | [[package]] 370 | name = "async-recursion" 371 | version = "1.1.1" 372 | source = "registry+https://github.com/rust-lang/crates.io-index" 373 | checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" 374 | dependencies = [ 375 | "proc-macro2", 376 | "quote", 377 | "syn", 378 | ] 379 | 380 | [[package]] 381 | name = "async-signal" 382 | version = "0.2.10" 383 | source = "registry+https://github.com/rust-lang/crates.io-index" 384 | checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" 385 | dependencies = [ 386 | "async-io", 387 | "async-lock", 388 | "atomic-waker", 389 | "cfg-if", 390 | "futures-core", 391 | "futures-io", 392 | "rustix", 393 | "signal-hook-registry", 394 | "slab", 395 | "windows-sys 0.59.0", 396 | ] 397 | 398 | [[package]] 399 | name = "async-task" 400 | version = "4.7.1" 401 | source = "registry+https://github.com/rust-lang/crates.io-index" 402 | checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" 403 | 404 | [[package]] 405 | name = "async-trait" 406 | version = "0.1.83" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" 409 | dependencies = [ 410 | "proc-macro2", 411 | "quote", 412 | "syn", 413 | ] 414 | 415 | [[package]] 416 | name = "atk-sys" 417 | version = "0.18.2" 418 | source = "registry+https://github.com/rust-lang/crates.io-index" 419 | checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" 420 | dependencies = [ 421 | "glib-sys", 422 | "gobject-sys", 423 | "libc", 424 | "system-deps", 425 | ] 426 | 427 | [[package]] 428 | name = "atomic-waker" 429 | version = "1.1.2" 430 | source = "registry+https://github.com/rust-lang/crates.io-index" 431 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 432 | 433 | [[package]] 434 | name = "atspi" 435 | version = "0.22.0" 436 | source = "registry+https://github.com/rust-lang/crates.io-index" 437 | checksum = "be534b16650e35237bb1ed189ba2aab86ce65e88cc84c66f4935ba38575cecbf" 438 | dependencies = [ 439 | "atspi-common", 440 | "atspi-connection", 441 | "atspi-proxies", 442 | ] 443 | 444 | [[package]] 445 | name = "atspi-common" 446 | version = "0.6.0" 447 | source = "registry+https://github.com/rust-lang/crates.io-index" 448 | checksum = "1909ed2dc01d0a17505d89311d192518507e8a056a48148e3598fef5e7bb6ba7" 449 | dependencies = [ 450 | "enumflags2", 451 | "serde", 452 | "static_assertions", 453 | "zbus", 454 | "zbus-lockstep", 455 | "zbus-lockstep-macros", 456 | "zbus_names", 457 | "zvariant", 458 | ] 459 | 460 | [[package]] 461 | name = "atspi-connection" 462 | version = "0.6.0" 463 | source = "registry+https://github.com/rust-lang/crates.io-index" 464 | checksum = "430c5960624a4baaa511c9c0fcc2218e3b58f5dbcc47e6190cafee344b873333" 465 | dependencies = [ 466 | "atspi-common", 467 | "atspi-proxies", 468 | "futures-lite", 469 | "zbus", 470 | ] 471 | 472 | [[package]] 473 | name = "atspi-proxies" 474 | version = "0.6.0" 475 | source = "registry+https://github.com/rust-lang/crates.io-index" 476 | checksum = "a5e6c5de3e524cf967569722446bcd458d5032348554d9a17d7d72b041ab7496" 477 | dependencies = [ 478 | "atspi-common", 479 | "serde", 480 | "zbus", 481 | "zvariant", 482 | ] 483 | 484 | [[package]] 485 | name = "autocfg" 486 | version = "1.4.0" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 489 | 490 | [[package]] 491 | name = "bit-set" 492 | version = "0.8.0" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" 495 | dependencies = [ 496 | "bit-vec", 497 | ] 498 | 499 | [[package]] 500 | name = "bit-vec" 501 | version = "0.8.0" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" 504 | 505 | [[package]] 506 | name = "bit_field" 507 | version = "0.10.2" 508 | source = "registry+https://github.com/rust-lang/crates.io-index" 509 | checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" 510 | 511 | [[package]] 512 | name = "bitflags" 513 | version = "1.3.2" 514 | source = "registry+https://github.com/rust-lang/crates.io-index" 515 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 516 | 517 | [[package]] 518 | name = "bitflags" 519 | version = "2.6.0" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 522 | 523 | [[package]] 524 | name = "block" 525 | version = "0.1.6" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" 528 | 529 | [[package]] 530 | name = "block-buffer" 531 | version = "0.10.4" 532 | source = "registry+https://github.com/rust-lang/crates.io-index" 533 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 534 | dependencies = [ 535 | "generic-array", 536 | ] 537 | 538 | [[package]] 539 | name = "block2" 540 | version = "0.5.1" 541 | source = "registry+https://github.com/rust-lang/crates.io-index" 542 | checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" 543 | dependencies = [ 544 | "objc2", 545 | ] 546 | 547 | [[package]] 548 | name = "blocking" 549 | version = "1.6.1" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" 552 | dependencies = [ 553 | "async-channel", 554 | "async-task", 555 | "futures-io", 556 | "futures-lite", 557 | "piper", 558 | ] 559 | 560 | [[package]] 561 | name = "bumpalo" 562 | version = "3.16.0" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 565 | 566 | [[package]] 567 | name = "bytemuck" 568 | version = "1.20.0" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" 571 | dependencies = [ 572 | "bytemuck_derive", 573 | ] 574 | 575 | [[package]] 576 | name = "bytemuck_derive" 577 | version = "1.8.0" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" 580 | dependencies = [ 581 | "proc-macro2", 582 | "quote", 583 | "syn", 584 | ] 585 | 586 | [[package]] 587 | name = "byteorder" 588 | version = "1.5.0" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 591 | 592 | [[package]] 593 | name = "byteorder-lite" 594 | version = "0.1.0" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" 597 | 598 | [[package]] 599 | name = "bytes" 600 | version = "1.9.0" 601 | source = "registry+https://github.com/rust-lang/crates.io-index" 602 | checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" 603 | 604 | [[package]] 605 | name = "cairo-sys-rs" 606 | version = "0.18.2" 607 | source = "registry+https://github.com/rust-lang/crates.io-index" 608 | checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" 609 | dependencies = [ 610 | "libc", 611 | "system-deps", 612 | ] 613 | 614 | [[package]] 615 | name = "calloop" 616 | version = "0.13.0" 617 | source = "registry+https://github.com/rust-lang/crates.io-index" 618 | checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" 619 | dependencies = [ 620 | "bitflags 2.6.0", 621 | "log", 622 | "polling", 623 | "rustix", 624 | "slab", 625 | "thiserror", 626 | ] 627 | 628 | [[package]] 629 | name = "calloop-wayland-source" 630 | version = "0.3.0" 631 | source = "registry+https://github.com/rust-lang/crates.io-index" 632 | checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" 633 | dependencies = [ 634 | "calloop", 635 | "rustix", 636 | "wayland-backend", 637 | "wayland-client", 638 | ] 639 | 640 | [[package]] 641 | name = "cc" 642 | version = "1.2.5" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" 645 | dependencies = [ 646 | "jobserver", 647 | "libc", 648 | "shlex", 649 | ] 650 | 651 | [[package]] 652 | name = "cesu8" 653 | version = "1.1.0" 654 | source = "registry+https://github.com/rust-lang/crates.io-index" 655 | checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 656 | 657 | [[package]] 658 | name = "cfg-expr" 659 | version = "0.15.8" 660 | source = "registry+https://github.com/rust-lang/crates.io-index" 661 | checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" 662 | dependencies = [ 663 | "smallvec", 664 | "target-lexicon", 665 | ] 666 | 667 | [[package]] 668 | name = "cfg-if" 669 | version = "1.0.0" 670 | source = "registry+https://github.com/rust-lang/crates.io-index" 671 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 672 | 673 | [[package]] 674 | name = "cfg_aliases" 675 | version = "0.1.1" 676 | source = "registry+https://github.com/rust-lang/crates.io-index" 677 | checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" 678 | 679 | [[package]] 680 | name = "cfg_aliases" 681 | version = "0.2.1" 682 | source = "registry+https://github.com/rust-lang/crates.io-index" 683 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 684 | 685 | [[package]] 686 | name = "cgl" 687 | version = "0.3.2" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" 690 | dependencies = [ 691 | "libc", 692 | ] 693 | 694 | [[package]] 695 | name = "clap" 696 | version = "4.5.23" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" 699 | dependencies = [ 700 | "clap_builder", 701 | ] 702 | 703 | [[package]] 704 | name = "clap_builder" 705 | version = "4.5.23" 706 | source = "registry+https://github.com/rust-lang/crates.io-index" 707 | checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" 708 | dependencies = [ 709 | "anstream", 710 | "anstyle", 711 | "clap_lex", 712 | "strsim", 713 | ] 714 | 715 | [[package]] 716 | name = "clap_lex" 717 | version = "0.7.4" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 720 | 721 | [[package]] 722 | name = "clipboard-win" 723 | version = "5.4.0" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" 726 | dependencies = [ 727 | "error-code", 728 | ] 729 | 730 | [[package]] 731 | name = "codespan-reporting" 732 | version = "0.11.1" 733 | source = "registry+https://github.com/rust-lang/crates.io-index" 734 | checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" 735 | dependencies = [ 736 | "termcolor", 737 | "unicode-width 0.1.14", 738 | ] 739 | 740 | [[package]] 741 | name = "color_quant" 742 | version = "1.1.0" 743 | source = "registry+https://github.com/rust-lang/crates.io-index" 744 | checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" 745 | 746 | [[package]] 747 | name = "colorchoice" 748 | version = "1.0.3" 749 | source = "registry+https://github.com/rust-lang/crates.io-index" 750 | checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 751 | 752 | [[package]] 753 | name = "combine" 754 | version = "4.6.7" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 757 | dependencies = [ 758 | "bytes", 759 | "memchr", 760 | ] 761 | 762 | [[package]] 763 | name = "concurrent-queue" 764 | version = "2.5.0" 765 | source = "registry+https://github.com/rust-lang/crates.io-index" 766 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 767 | dependencies = [ 768 | "crossbeam-utils", 769 | ] 770 | 771 | [[package]] 772 | name = "console" 773 | version = "0.15.10" 774 | source = "registry+https://github.com/rust-lang/crates.io-index" 775 | checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" 776 | dependencies = [ 777 | "encode_unicode", 778 | "libc", 779 | "once_cell", 780 | "unicode-width 0.2.0", 781 | "windows-sys 0.59.0", 782 | ] 783 | 784 | [[package]] 785 | name = "core-foundation" 786 | version = "0.9.4" 787 | source = "registry+https://github.com/rust-lang/crates.io-index" 788 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 789 | dependencies = [ 790 | "core-foundation-sys", 791 | "libc", 792 | ] 793 | 794 | [[package]] 795 | name = "core-foundation" 796 | version = "0.10.0" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" 799 | dependencies = [ 800 | "core-foundation-sys", 801 | "libc", 802 | ] 803 | 804 | [[package]] 805 | name = "core-foundation-sys" 806 | version = "0.8.7" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 809 | 810 | [[package]] 811 | name = "core-graphics" 812 | version = "0.23.2" 813 | source = "registry+https://github.com/rust-lang/crates.io-index" 814 | checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" 815 | dependencies = [ 816 | "bitflags 1.3.2", 817 | "core-foundation 0.9.4", 818 | "core-graphics-types", 819 | "foreign-types", 820 | "libc", 821 | ] 822 | 823 | [[package]] 824 | name = "core-graphics-types" 825 | version = "0.1.3" 826 | source = "registry+https://github.com/rust-lang/crates.io-index" 827 | checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" 828 | dependencies = [ 829 | "bitflags 1.3.2", 830 | "core-foundation 0.9.4", 831 | "libc", 832 | ] 833 | 834 | [[package]] 835 | name = "cpufeatures" 836 | version = "0.2.16" 837 | source = "registry+https://github.com/rust-lang/crates.io-index" 838 | checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" 839 | dependencies = [ 840 | "libc", 841 | ] 842 | 843 | [[package]] 844 | name = "crc32fast" 845 | version = "1.4.2" 846 | source = "registry+https://github.com/rust-lang/crates.io-index" 847 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 848 | dependencies = [ 849 | "cfg-if", 850 | ] 851 | 852 | [[package]] 853 | name = "crossbeam-deque" 854 | version = "0.8.6" 855 | source = "registry+https://github.com/rust-lang/crates.io-index" 856 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 857 | dependencies = [ 858 | "crossbeam-epoch", 859 | "crossbeam-utils", 860 | ] 861 | 862 | [[package]] 863 | name = "crossbeam-epoch" 864 | version = "0.9.18" 865 | source = "registry+https://github.com/rust-lang/crates.io-index" 866 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 867 | dependencies = [ 868 | "crossbeam-utils", 869 | ] 870 | 871 | [[package]] 872 | name = "crossbeam-utils" 873 | version = "0.8.21" 874 | source = "registry+https://github.com/rust-lang/crates.io-index" 875 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 876 | 877 | [[package]] 878 | name = "crunchy" 879 | version = "0.2.2" 880 | source = "registry+https://github.com/rust-lang/crates.io-index" 881 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 882 | 883 | [[package]] 884 | name = "crypto-common" 885 | version = "0.1.6" 886 | source = "registry+https://github.com/rust-lang/crates.io-index" 887 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 888 | dependencies = [ 889 | "generic-array", 890 | "typenum", 891 | ] 892 | 893 | [[package]] 894 | name = "cursor-icon" 895 | version = "1.1.0" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" 898 | 899 | [[package]] 900 | name = "digest" 901 | version = "0.10.7" 902 | source = "registry+https://github.com/rust-lang/crates.io-index" 903 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 904 | dependencies = [ 905 | "block-buffer", 906 | "crypto-common", 907 | ] 908 | 909 | [[package]] 910 | name = "dispatch" 911 | version = "0.2.0" 912 | source = "registry+https://github.com/rust-lang/crates.io-index" 913 | checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" 914 | 915 | [[package]] 916 | name = "displaydoc" 917 | version = "0.2.5" 918 | source = "registry+https://github.com/rust-lang/crates.io-index" 919 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 920 | dependencies = [ 921 | "proc-macro2", 922 | "quote", 923 | "syn", 924 | ] 925 | 926 | [[package]] 927 | name = "dlib" 928 | version = "0.5.2" 929 | source = "registry+https://github.com/rust-lang/crates.io-index" 930 | checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" 931 | dependencies = [ 932 | "libloading", 933 | ] 934 | 935 | [[package]] 936 | name = "document-features" 937 | version = "0.2.10" 938 | source = "registry+https://github.com/rust-lang/crates.io-index" 939 | checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" 940 | dependencies = [ 941 | "litrs", 942 | ] 943 | 944 | [[package]] 945 | name = "downcast-rs" 946 | version = "1.2.1" 947 | source = "registry+https://github.com/rust-lang/crates.io-index" 948 | checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" 949 | 950 | [[package]] 951 | name = "dpi" 952 | version = "0.1.1" 953 | source = "registry+https://github.com/rust-lang/crates.io-index" 954 | checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" 955 | 956 | [[package]] 957 | name = "ecolor" 958 | version = "0.30.0" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | checksum = "7d72e9c39f6e11a2e922d04a34ec5e7ef522ea3f5a1acfca7a19d16ad5fe50f5" 961 | dependencies = [ 962 | "bytemuck", 963 | "emath", 964 | ] 965 | 966 | [[package]] 967 | name = "eframe" 968 | version = "0.30.0" 969 | source = "registry+https://github.com/rust-lang/crates.io-index" 970 | checksum = "b2f2d9e7ea2d11ec9e98a8683b6eb99f9d7d0448394ef6e0d6d91bd4eb817220" 971 | dependencies = [ 972 | "ahash", 973 | "bytemuck", 974 | "document-features", 975 | "egui", 976 | "egui-wgpu", 977 | "egui-winit", 978 | "egui_glow", 979 | "glow 0.16.0", 980 | "glutin", 981 | "glutin-winit", 982 | "image 0.25.5", 983 | "js-sys", 984 | "log", 985 | "objc2", 986 | "objc2-app-kit", 987 | "objc2-foundation", 988 | "parking_lot", 989 | "percent-encoding", 990 | "profiling", 991 | "raw-window-handle", 992 | "static_assertions", 993 | "wasm-bindgen", 994 | "wasm-bindgen-futures", 995 | "web-sys", 996 | "web-time", 997 | "winapi", 998 | "windows-sys 0.59.0", 999 | "winit", 1000 | ] 1001 | 1002 | [[package]] 1003 | name = "egui" 1004 | version = "0.30.0" 1005 | source = "registry+https://github.com/rust-lang/crates.io-index" 1006 | checksum = "252d52224d35be1535d7fd1d6139ce071fb42c9097773e79f7665604f5596b5e" 1007 | dependencies = [ 1008 | "accesskit", 1009 | "ahash", 1010 | "emath", 1011 | "epaint", 1012 | "log", 1013 | "nohash-hasher", 1014 | "profiling", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "egui-wgpu" 1019 | version = "0.30.0" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "26c1e821d2d8921ef6ce98b258c7e24d9d6aab2ca1f9cdf374eca997e7f67f59" 1022 | dependencies = [ 1023 | "ahash", 1024 | "bytemuck", 1025 | "document-features", 1026 | "egui", 1027 | "epaint", 1028 | "log", 1029 | "profiling", 1030 | "thiserror", 1031 | "type-map", 1032 | "web-time", 1033 | "wgpu", 1034 | "winit", 1035 | ] 1036 | 1037 | [[package]] 1038 | name = "egui-winit" 1039 | version = "0.30.0" 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" 1041 | checksum = "1e84c2919cd9f3a38a91e8f84ac6a245c19251fd95226ed9fae61d5ea564fce3" 1042 | dependencies = [ 1043 | "accesskit_winit", 1044 | "ahash", 1045 | "arboard", 1046 | "egui", 1047 | "log", 1048 | "profiling", 1049 | "raw-window-handle", 1050 | "smithay-clipboard", 1051 | "web-time", 1052 | "webbrowser", 1053 | "winit", 1054 | ] 1055 | 1056 | [[package]] 1057 | name = "egui_glow" 1058 | version = "0.30.0" 1059 | source = "registry+https://github.com/rust-lang/crates.io-index" 1060 | checksum = "3eaf6264cc7608e3e69a7d57a6175f438275f1b3889c1a551b418277721c95e6" 1061 | dependencies = [ 1062 | "ahash", 1063 | "bytemuck", 1064 | "egui", 1065 | "glow 0.16.0", 1066 | "log", 1067 | "memoffset", 1068 | "profiling", 1069 | "wasm-bindgen", 1070 | "web-sys", 1071 | "winit", 1072 | ] 1073 | 1074 | [[package]] 1075 | name = "either" 1076 | version = "1.13.0" 1077 | source = "registry+https://github.com/rust-lang/crates.io-index" 1078 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 1079 | 1080 | [[package]] 1081 | name = "emath" 1082 | version = "0.30.0" 1083 | source = "registry+https://github.com/rust-lang/crates.io-index" 1084 | checksum = "c4fe73c1207b864ee40aa0b0c038d6092af1030744678c60188a05c28553515d" 1085 | dependencies = [ 1086 | "bytemuck", 1087 | ] 1088 | 1089 | [[package]] 1090 | name = "encode_unicode" 1091 | version = "1.0.0" 1092 | source = "registry+https://github.com/rust-lang/crates.io-index" 1093 | checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" 1094 | 1095 | [[package]] 1096 | name = "endi" 1097 | version = "1.1.0" 1098 | source = "registry+https://github.com/rust-lang/crates.io-index" 1099 | checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" 1100 | 1101 | [[package]] 1102 | name = "enumflags2" 1103 | version = "0.7.10" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" 1106 | dependencies = [ 1107 | "enumflags2_derive", 1108 | "serde", 1109 | ] 1110 | 1111 | [[package]] 1112 | name = "enumflags2_derive" 1113 | version = "0.7.10" 1114 | source = "registry+https://github.com/rust-lang/crates.io-index" 1115 | checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" 1116 | dependencies = [ 1117 | "proc-macro2", 1118 | "quote", 1119 | "syn", 1120 | ] 1121 | 1122 | [[package]] 1123 | name = "epaint" 1124 | version = "0.30.0" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | checksum = "5666f8d25236293c966fbb3635eac18b04ad1914e3bab55bc7d44b9980cafcac" 1127 | dependencies = [ 1128 | "ab_glyph", 1129 | "ahash", 1130 | "bytemuck", 1131 | "ecolor", 1132 | "emath", 1133 | "epaint_default_fonts", 1134 | "log", 1135 | "nohash-hasher", 1136 | "parking_lot", 1137 | "profiling", 1138 | ] 1139 | 1140 | [[package]] 1141 | name = "epaint_default_fonts" 1142 | version = "0.30.0" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | checksum = "66f6ddac3e6ac6fd4c3d48bb8b1943472f8da0f43a4303bcd8a18aa594401c80" 1145 | 1146 | [[package]] 1147 | name = "equivalent" 1148 | version = "1.0.1" 1149 | source = "registry+https://github.com/rust-lang/crates.io-index" 1150 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 1151 | 1152 | [[package]] 1153 | name = "errno" 1154 | version = "0.3.10" 1155 | source = "registry+https://github.com/rust-lang/crates.io-index" 1156 | checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" 1157 | dependencies = [ 1158 | "libc", 1159 | "windows-sys 0.59.0", 1160 | ] 1161 | 1162 | [[package]] 1163 | name = "error-code" 1164 | version = "3.3.1" 1165 | source = "registry+https://github.com/rust-lang/crates.io-index" 1166 | checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" 1167 | 1168 | [[package]] 1169 | name = "event-listener" 1170 | version = "5.3.1" 1171 | source = "registry+https://github.com/rust-lang/crates.io-index" 1172 | checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" 1173 | dependencies = [ 1174 | "concurrent-queue", 1175 | "parking", 1176 | "pin-project-lite", 1177 | ] 1178 | 1179 | [[package]] 1180 | name = "event-listener-strategy" 1181 | version = "0.5.3" 1182 | source = "registry+https://github.com/rust-lang/crates.io-index" 1183 | checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" 1184 | dependencies = [ 1185 | "event-listener", 1186 | "pin-project-lite", 1187 | ] 1188 | 1189 | [[package]] 1190 | name = "exr" 1191 | version = "1.73.0" 1192 | source = "registry+https://github.com/rust-lang/crates.io-index" 1193 | checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" 1194 | dependencies = [ 1195 | "bit_field", 1196 | "half", 1197 | "lebe", 1198 | "miniz_oxide", 1199 | "rayon-core", 1200 | "smallvec", 1201 | "zune-inflate", 1202 | ] 1203 | 1204 | [[package]] 1205 | name = "fastrand" 1206 | version = "2.3.0" 1207 | source = "registry+https://github.com/rust-lang/crates.io-index" 1208 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 1209 | 1210 | [[package]] 1211 | name = "fdeflate" 1212 | version = "0.3.7" 1213 | source = "registry+https://github.com/rust-lang/crates.io-index" 1214 | checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" 1215 | dependencies = [ 1216 | "simd-adler32", 1217 | ] 1218 | 1219 | [[package]] 1220 | name = "flate2" 1221 | version = "1.0.35" 1222 | source = "registry+https://github.com/rust-lang/crates.io-index" 1223 | checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" 1224 | dependencies = [ 1225 | "crc32fast", 1226 | "miniz_oxide", 1227 | ] 1228 | 1229 | [[package]] 1230 | name = "foldhash" 1231 | version = "0.1.4" 1232 | source = "registry+https://github.com/rust-lang/crates.io-index" 1233 | checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" 1234 | 1235 | [[package]] 1236 | name = "foreign-types" 1237 | version = "0.5.0" 1238 | source = "registry+https://github.com/rust-lang/crates.io-index" 1239 | checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" 1240 | dependencies = [ 1241 | "foreign-types-macros", 1242 | "foreign-types-shared", 1243 | ] 1244 | 1245 | [[package]] 1246 | name = "foreign-types-macros" 1247 | version = "0.2.3" 1248 | source = "registry+https://github.com/rust-lang/crates.io-index" 1249 | checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" 1250 | dependencies = [ 1251 | "proc-macro2", 1252 | "quote", 1253 | "syn", 1254 | ] 1255 | 1256 | [[package]] 1257 | name = "foreign-types-shared" 1258 | version = "0.3.1" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" 1261 | 1262 | [[package]] 1263 | name = "form_urlencoded" 1264 | version = "1.2.1" 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" 1266 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1267 | dependencies = [ 1268 | "percent-encoding", 1269 | ] 1270 | 1271 | [[package]] 1272 | name = "futures-core" 1273 | version = "0.3.31" 1274 | source = "registry+https://github.com/rust-lang/crates.io-index" 1275 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 1276 | 1277 | [[package]] 1278 | name = "futures-io" 1279 | version = "0.3.31" 1280 | source = "registry+https://github.com/rust-lang/crates.io-index" 1281 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 1282 | 1283 | [[package]] 1284 | name = "futures-lite" 1285 | version = "2.5.0" 1286 | source = "registry+https://github.com/rust-lang/crates.io-index" 1287 | checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" 1288 | dependencies = [ 1289 | "fastrand", 1290 | "futures-core", 1291 | "futures-io", 1292 | "parking", 1293 | "pin-project-lite", 1294 | ] 1295 | 1296 | [[package]] 1297 | name = "futures-macro" 1298 | version = "0.3.31" 1299 | source = "registry+https://github.com/rust-lang/crates.io-index" 1300 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 1301 | dependencies = [ 1302 | "proc-macro2", 1303 | "quote", 1304 | "syn", 1305 | ] 1306 | 1307 | [[package]] 1308 | name = "futures-sink" 1309 | version = "0.3.31" 1310 | source = "registry+https://github.com/rust-lang/crates.io-index" 1311 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 1312 | 1313 | [[package]] 1314 | name = "futures-task" 1315 | version = "0.3.31" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 1318 | 1319 | [[package]] 1320 | name = "futures-util" 1321 | version = "0.3.31" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 1324 | dependencies = [ 1325 | "futures-core", 1326 | "futures-io", 1327 | "futures-macro", 1328 | "futures-sink", 1329 | "futures-task", 1330 | "memchr", 1331 | "pin-project-lite", 1332 | "pin-utils", 1333 | "slab", 1334 | ] 1335 | 1336 | [[package]] 1337 | name = "gdk-pixbuf-sys" 1338 | version = "0.18.0" 1339 | source = "registry+https://github.com/rust-lang/crates.io-index" 1340 | checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" 1341 | dependencies = [ 1342 | "gio-sys", 1343 | "glib-sys", 1344 | "gobject-sys", 1345 | "libc", 1346 | "system-deps", 1347 | ] 1348 | 1349 | [[package]] 1350 | name = "gdk-sys" 1351 | version = "0.18.2" 1352 | source = "registry+https://github.com/rust-lang/crates.io-index" 1353 | checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" 1354 | dependencies = [ 1355 | "cairo-sys-rs", 1356 | "gdk-pixbuf-sys", 1357 | "gio-sys", 1358 | "glib-sys", 1359 | "gobject-sys", 1360 | "libc", 1361 | "pango-sys", 1362 | "pkg-config", 1363 | "system-deps", 1364 | ] 1365 | 1366 | [[package]] 1367 | name = "generic-array" 1368 | version = "0.14.7" 1369 | source = "registry+https://github.com/rust-lang/crates.io-index" 1370 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1371 | dependencies = [ 1372 | "typenum", 1373 | "version_check", 1374 | ] 1375 | 1376 | [[package]] 1377 | name = "gethostname" 1378 | version = "0.4.3" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" 1381 | dependencies = [ 1382 | "libc", 1383 | "windows-targets 0.48.5", 1384 | ] 1385 | 1386 | [[package]] 1387 | name = "getrandom" 1388 | version = "0.2.15" 1389 | source = "registry+https://github.com/rust-lang/crates.io-index" 1390 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 1391 | dependencies = [ 1392 | "cfg-if", 1393 | "libc", 1394 | "wasi", 1395 | ] 1396 | 1397 | [[package]] 1398 | name = "gif" 1399 | version = "0.13.1" 1400 | source = "registry+https://github.com/rust-lang/crates.io-index" 1401 | checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" 1402 | dependencies = [ 1403 | "color_quant", 1404 | "weezl", 1405 | ] 1406 | 1407 | [[package]] 1408 | name = "gio-sys" 1409 | version = "0.18.1" 1410 | source = "registry+https://github.com/rust-lang/crates.io-index" 1411 | checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" 1412 | dependencies = [ 1413 | "glib-sys", 1414 | "gobject-sys", 1415 | "libc", 1416 | "system-deps", 1417 | "winapi", 1418 | ] 1419 | 1420 | [[package]] 1421 | name = "gl_generator" 1422 | version = "0.14.0" 1423 | source = "registry+https://github.com/rust-lang/crates.io-index" 1424 | checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" 1425 | dependencies = [ 1426 | "khronos_api", 1427 | "log", 1428 | "xml-rs", 1429 | ] 1430 | 1431 | [[package]] 1432 | name = "glib-sys" 1433 | version = "0.18.1" 1434 | source = "registry+https://github.com/rust-lang/crates.io-index" 1435 | checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" 1436 | dependencies = [ 1437 | "libc", 1438 | "system-deps", 1439 | ] 1440 | 1441 | [[package]] 1442 | name = "glow" 1443 | version = "0.14.2" 1444 | source = "registry+https://github.com/rust-lang/crates.io-index" 1445 | checksum = "d51fa363f025f5c111e03f13eda21162faeacb6911fe8caa0c0349f9cf0c4483" 1446 | dependencies = [ 1447 | "js-sys", 1448 | "slotmap", 1449 | "wasm-bindgen", 1450 | "web-sys", 1451 | ] 1452 | 1453 | [[package]] 1454 | name = "glow" 1455 | version = "0.16.0" 1456 | source = "registry+https://github.com/rust-lang/crates.io-index" 1457 | checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" 1458 | dependencies = [ 1459 | "js-sys", 1460 | "slotmap", 1461 | "wasm-bindgen", 1462 | "web-sys", 1463 | ] 1464 | 1465 | [[package]] 1466 | name = "glutin" 1467 | version = "0.32.1" 1468 | source = "registry+https://github.com/rust-lang/crates.io-index" 1469 | checksum = "ec69412a0bf07ea7607e638b415447857a808846c2b685a43c8aa18bc6d5e499" 1470 | dependencies = [ 1471 | "bitflags 2.6.0", 1472 | "cfg_aliases 0.2.1", 1473 | "cgl", 1474 | "core-foundation 0.9.4", 1475 | "dispatch", 1476 | "glutin_egl_sys", 1477 | "glutin_glx_sys", 1478 | "glutin_wgl_sys", 1479 | "libloading", 1480 | "objc2", 1481 | "objc2-app-kit", 1482 | "objc2-foundation", 1483 | "once_cell", 1484 | "raw-window-handle", 1485 | "wayland-sys", 1486 | "windows-sys 0.52.0", 1487 | "x11-dl", 1488 | ] 1489 | 1490 | [[package]] 1491 | name = "glutin-winit" 1492 | version = "0.5.0" 1493 | source = "registry+https://github.com/rust-lang/crates.io-index" 1494 | checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" 1495 | dependencies = [ 1496 | "cfg_aliases 0.2.1", 1497 | "glutin", 1498 | "raw-window-handle", 1499 | "winit", 1500 | ] 1501 | 1502 | [[package]] 1503 | name = "glutin_egl_sys" 1504 | version = "0.7.0" 1505 | source = "registry+https://github.com/rust-lang/crates.io-index" 1506 | checksum = "cae99fff4d2850dbe6fb8c1fa8e4fead5525bab715beaacfccf3fb994e01c827" 1507 | dependencies = [ 1508 | "gl_generator", 1509 | "windows-sys 0.52.0", 1510 | ] 1511 | 1512 | [[package]] 1513 | name = "glutin_glx_sys" 1514 | version = "0.6.0" 1515 | source = "registry+https://github.com/rust-lang/crates.io-index" 1516 | checksum = "9c2b2d3918e76e18e08796b55eb64e8fe6ec67d5a6b2e2a7e2edce224ad24c63" 1517 | dependencies = [ 1518 | "gl_generator", 1519 | "x11-dl", 1520 | ] 1521 | 1522 | [[package]] 1523 | name = "glutin_wgl_sys" 1524 | version = "0.6.0" 1525 | source = "registry+https://github.com/rust-lang/crates.io-index" 1526 | checksum = "0a4e1951bbd9434a81aa496fe59ccc2235af3820d27b85f9314e279609211e2c" 1527 | dependencies = [ 1528 | "gl_generator", 1529 | ] 1530 | 1531 | [[package]] 1532 | name = "gobject-sys" 1533 | version = "0.18.0" 1534 | source = "registry+https://github.com/rust-lang/crates.io-index" 1535 | checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" 1536 | dependencies = [ 1537 | "glib-sys", 1538 | "libc", 1539 | "system-deps", 1540 | ] 1541 | 1542 | [[package]] 1543 | name = "gpu-alloc" 1544 | version = "0.6.0" 1545 | source = "registry+https://github.com/rust-lang/crates.io-index" 1546 | checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" 1547 | dependencies = [ 1548 | "bitflags 2.6.0", 1549 | "gpu-alloc-types", 1550 | ] 1551 | 1552 | [[package]] 1553 | name = "gpu-alloc-types" 1554 | version = "0.3.0" 1555 | source = "registry+https://github.com/rust-lang/crates.io-index" 1556 | checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" 1557 | dependencies = [ 1558 | "bitflags 2.6.0", 1559 | ] 1560 | 1561 | [[package]] 1562 | name = "gpu-descriptor" 1563 | version = "0.3.1" 1564 | source = "registry+https://github.com/rust-lang/crates.io-index" 1565 | checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" 1566 | dependencies = [ 1567 | "bitflags 2.6.0", 1568 | "gpu-descriptor-types", 1569 | "hashbrown", 1570 | ] 1571 | 1572 | [[package]] 1573 | name = "gpu-descriptor-types" 1574 | version = "0.2.0" 1575 | source = "registry+https://github.com/rust-lang/crates.io-index" 1576 | checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" 1577 | dependencies = [ 1578 | "bitflags 2.6.0", 1579 | ] 1580 | 1581 | [[package]] 1582 | name = "gtk-sys" 1583 | version = "0.18.2" 1584 | source = "registry+https://github.com/rust-lang/crates.io-index" 1585 | checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" 1586 | dependencies = [ 1587 | "atk-sys", 1588 | "cairo-sys-rs", 1589 | "gdk-pixbuf-sys", 1590 | "gdk-sys", 1591 | "gio-sys", 1592 | "glib-sys", 1593 | "gobject-sys", 1594 | "libc", 1595 | "pango-sys", 1596 | "system-deps", 1597 | ] 1598 | 1599 | [[package]] 1600 | name = "half" 1601 | version = "2.4.1" 1602 | source = "registry+https://github.com/rust-lang/crates.io-index" 1603 | checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" 1604 | dependencies = [ 1605 | "cfg-if", 1606 | "crunchy", 1607 | ] 1608 | 1609 | [[package]] 1610 | name = "hashbrown" 1611 | version = "0.15.2" 1612 | source = "registry+https://github.com/rust-lang/crates.io-index" 1613 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 1614 | dependencies = [ 1615 | "foldhash", 1616 | ] 1617 | 1618 | [[package]] 1619 | name = "heck" 1620 | version = "0.5.0" 1621 | source = "registry+https://github.com/rust-lang/crates.io-index" 1622 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 1623 | 1624 | [[package]] 1625 | name = "hermit-abi" 1626 | version = "0.4.0" 1627 | source = "registry+https://github.com/rust-lang/crates.io-index" 1628 | checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" 1629 | 1630 | [[package]] 1631 | name = "hex" 1632 | version = "0.4.3" 1633 | source = "registry+https://github.com/rust-lang/crates.io-index" 1634 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1635 | 1636 | [[package]] 1637 | name = "hexf-parse" 1638 | version = "0.2.1" 1639 | source = "registry+https://github.com/rust-lang/crates.io-index" 1640 | checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" 1641 | 1642 | [[package]] 1643 | name = "home" 1644 | version = "0.5.11" 1645 | source = "registry+https://github.com/rust-lang/crates.io-index" 1646 | checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" 1647 | dependencies = [ 1648 | "windows-sys 0.59.0", 1649 | ] 1650 | 1651 | [[package]] 1652 | name = "hound" 1653 | version = "3.5.1" 1654 | source = "registry+https://github.com/rust-lang/crates.io-index" 1655 | checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" 1656 | 1657 | [[package]] 1658 | name = "icu_collections" 1659 | version = "1.5.0" 1660 | source = "registry+https://github.com/rust-lang/crates.io-index" 1661 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 1662 | dependencies = [ 1663 | "displaydoc", 1664 | "yoke", 1665 | "zerofrom", 1666 | "zerovec", 1667 | ] 1668 | 1669 | [[package]] 1670 | name = "icu_locid" 1671 | version = "1.5.0" 1672 | source = "registry+https://github.com/rust-lang/crates.io-index" 1673 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 1674 | dependencies = [ 1675 | "displaydoc", 1676 | "litemap", 1677 | "tinystr", 1678 | "writeable", 1679 | "zerovec", 1680 | ] 1681 | 1682 | [[package]] 1683 | name = "icu_locid_transform" 1684 | version = "1.5.0" 1685 | source = "registry+https://github.com/rust-lang/crates.io-index" 1686 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 1687 | dependencies = [ 1688 | "displaydoc", 1689 | "icu_locid", 1690 | "icu_locid_transform_data", 1691 | "icu_provider", 1692 | "tinystr", 1693 | "zerovec", 1694 | ] 1695 | 1696 | [[package]] 1697 | name = "icu_locid_transform_data" 1698 | version = "1.5.0" 1699 | source = "registry+https://github.com/rust-lang/crates.io-index" 1700 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 1701 | 1702 | [[package]] 1703 | name = "icu_normalizer" 1704 | version = "1.5.0" 1705 | source = "registry+https://github.com/rust-lang/crates.io-index" 1706 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 1707 | dependencies = [ 1708 | "displaydoc", 1709 | "icu_collections", 1710 | "icu_normalizer_data", 1711 | "icu_properties", 1712 | "icu_provider", 1713 | "smallvec", 1714 | "utf16_iter", 1715 | "utf8_iter", 1716 | "write16", 1717 | "zerovec", 1718 | ] 1719 | 1720 | [[package]] 1721 | name = "icu_normalizer_data" 1722 | version = "1.5.0" 1723 | source = "registry+https://github.com/rust-lang/crates.io-index" 1724 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 1725 | 1726 | [[package]] 1727 | name = "icu_properties" 1728 | version = "1.5.1" 1729 | source = "registry+https://github.com/rust-lang/crates.io-index" 1730 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 1731 | dependencies = [ 1732 | "displaydoc", 1733 | "icu_collections", 1734 | "icu_locid_transform", 1735 | "icu_properties_data", 1736 | "icu_provider", 1737 | "tinystr", 1738 | "zerovec", 1739 | ] 1740 | 1741 | [[package]] 1742 | name = "icu_properties_data" 1743 | version = "1.5.0" 1744 | source = "registry+https://github.com/rust-lang/crates.io-index" 1745 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 1746 | 1747 | [[package]] 1748 | name = "icu_provider" 1749 | version = "1.5.0" 1750 | source = "registry+https://github.com/rust-lang/crates.io-index" 1751 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 1752 | dependencies = [ 1753 | "displaydoc", 1754 | "icu_locid", 1755 | "icu_provider_macros", 1756 | "stable_deref_trait", 1757 | "tinystr", 1758 | "writeable", 1759 | "yoke", 1760 | "zerofrom", 1761 | "zerovec", 1762 | ] 1763 | 1764 | [[package]] 1765 | name = "icu_provider_macros" 1766 | version = "1.5.0" 1767 | source = "registry+https://github.com/rust-lang/crates.io-index" 1768 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 1769 | dependencies = [ 1770 | "proc-macro2", 1771 | "quote", 1772 | "syn", 1773 | ] 1774 | 1775 | [[package]] 1776 | name = "idna" 1777 | version = "1.0.3" 1778 | source = "registry+https://github.com/rust-lang/crates.io-index" 1779 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1780 | dependencies = [ 1781 | "idna_adapter", 1782 | "smallvec", 1783 | "utf8_iter", 1784 | ] 1785 | 1786 | [[package]] 1787 | name = "idna_adapter" 1788 | version = "1.2.0" 1789 | source = "registry+https://github.com/rust-lang/crates.io-index" 1790 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 1791 | dependencies = [ 1792 | "icu_normalizer", 1793 | "icu_properties", 1794 | ] 1795 | 1796 | [[package]] 1797 | name = "image" 1798 | version = "0.24.9" 1799 | source = "registry+https://github.com/rust-lang/crates.io-index" 1800 | checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" 1801 | dependencies = [ 1802 | "bytemuck", 1803 | "byteorder", 1804 | "color_quant", 1805 | "exr", 1806 | "gif", 1807 | "jpeg-decoder", 1808 | "num-traits", 1809 | "png", 1810 | "qoi", 1811 | "tiff", 1812 | ] 1813 | 1814 | [[package]] 1815 | name = "image" 1816 | version = "0.25.5" 1817 | source = "registry+https://github.com/rust-lang/crates.io-index" 1818 | checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" 1819 | dependencies = [ 1820 | "bytemuck", 1821 | "byteorder-lite", 1822 | "num-traits", 1823 | "png", 1824 | ] 1825 | 1826 | [[package]] 1827 | name = "immutable-chunkmap" 1828 | version = "2.0.6" 1829 | source = "registry+https://github.com/rust-lang/crates.io-index" 1830 | checksum = "12f97096f508d54f8f8ab8957862eee2ccd628847b6217af1a335e1c44dee578" 1831 | dependencies = [ 1832 | "arrayvec", 1833 | ] 1834 | 1835 | [[package]] 1836 | name = "indexmap" 1837 | version = "2.7.0" 1838 | source = "registry+https://github.com/rust-lang/crates.io-index" 1839 | checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" 1840 | dependencies = [ 1841 | "equivalent", 1842 | "hashbrown", 1843 | ] 1844 | 1845 | [[package]] 1846 | name = "indicatif" 1847 | version = "0.17.9" 1848 | source = "registry+https://github.com/rust-lang/crates.io-index" 1849 | checksum = "cbf675b85ed934d3c67b5c5469701eec7db22689d0a2139d856e0925fa28b281" 1850 | dependencies = [ 1851 | "console", 1852 | "number_prefix", 1853 | "portable-atomic", 1854 | "unicode-width 0.2.0", 1855 | "web-time", 1856 | ] 1857 | 1858 | [[package]] 1859 | name = "is_terminal_polyfill" 1860 | version = "1.70.1" 1861 | source = "registry+https://github.com/rust-lang/crates.io-index" 1862 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 1863 | 1864 | [[package]] 1865 | name = "jni" 1866 | version = "0.21.1" 1867 | source = "registry+https://github.com/rust-lang/crates.io-index" 1868 | checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" 1869 | dependencies = [ 1870 | "cesu8", 1871 | "cfg-if", 1872 | "combine", 1873 | "jni-sys", 1874 | "log", 1875 | "thiserror", 1876 | "walkdir", 1877 | "windows-sys 0.45.0", 1878 | ] 1879 | 1880 | [[package]] 1881 | name = "jni-sys" 1882 | version = "0.3.0" 1883 | source = "registry+https://github.com/rust-lang/crates.io-index" 1884 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 1885 | 1886 | [[package]] 1887 | name = "jobserver" 1888 | version = "0.1.32" 1889 | source = "registry+https://github.com/rust-lang/crates.io-index" 1890 | checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" 1891 | dependencies = [ 1892 | "libc", 1893 | ] 1894 | 1895 | [[package]] 1896 | name = "jpeg-decoder" 1897 | version = "0.3.1" 1898 | source = "registry+https://github.com/rust-lang/crates.io-index" 1899 | checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" 1900 | dependencies = [ 1901 | "rayon", 1902 | ] 1903 | 1904 | [[package]] 1905 | name = "js-sys" 1906 | version = "0.3.76" 1907 | source = "registry+https://github.com/rust-lang/crates.io-index" 1908 | checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" 1909 | dependencies = [ 1910 | "once_cell", 1911 | "wasm-bindgen", 1912 | ] 1913 | 1914 | [[package]] 1915 | name = "khronos-egl" 1916 | version = "6.0.0" 1917 | source = "registry+https://github.com/rust-lang/crates.io-index" 1918 | checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" 1919 | dependencies = [ 1920 | "libc", 1921 | "libloading", 1922 | "pkg-config", 1923 | ] 1924 | 1925 | [[package]] 1926 | name = "khronos_api" 1927 | version = "3.1.0" 1928 | source = "registry+https://github.com/rust-lang/crates.io-index" 1929 | checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" 1930 | 1931 | [[package]] 1932 | name = "lebe" 1933 | version = "0.5.2" 1934 | source = "registry+https://github.com/rust-lang/crates.io-index" 1935 | checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" 1936 | 1937 | [[package]] 1938 | name = "libc" 1939 | version = "0.2.169" 1940 | source = "registry+https://github.com/rust-lang/crates.io-index" 1941 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 1942 | 1943 | [[package]] 1944 | name = "libloading" 1945 | version = "0.8.6" 1946 | source = "registry+https://github.com/rust-lang/crates.io-index" 1947 | checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 1948 | dependencies = [ 1949 | "cfg-if", 1950 | "windows-targets 0.52.6", 1951 | ] 1952 | 1953 | [[package]] 1954 | name = "libredox" 1955 | version = "0.1.3" 1956 | source = "registry+https://github.com/rust-lang/crates.io-index" 1957 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 1958 | dependencies = [ 1959 | "bitflags 2.6.0", 1960 | "libc", 1961 | "redox_syscall 0.5.8", 1962 | ] 1963 | 1964 | [[package]] 1965 | name = "linux-raw-sys" 1966 | version = "0.4.14" 1967 | source = "registry+https://github.com/rust-lang/crates.io-index" 1968 | checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" 1969 | 1970 | [[package]] 1971 | name = "litemap" 1972 | version = "0.7.4" 1973 | source = "registry+https://github.com/rust-lang/crates.io-index" 1974 | checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" 1975 | 1976 | [[package]] 1977 | name = "litrs" 1978 | version = "0.4.1" 1979 | source = "registry+https://github.com/rust-lang/crates.io-index" 1980 | checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" 1981 | 1982 | [[package]] 1983 | name = "lock_api" 1984 | version = "0.4.12" 1985 | source = "registry+https://github.com/rust-lang/crates.io-index" 1986 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1987 | dependencies = [ 1988 | "autocfg", 1989 | "scopeguard", 1990 | ] 1991 | 1992 | [[package]] 1993 | name = "log" 1994 | version = "0.4.22" 1995 | source = "registry+https://github.com/rust-lang/crates.io-index" 1996 | checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" 1997 | 1998 | [[package]] 1999 | name = "malloc_buf" 2000 | version = "0.0.6" 2001 | source = "registry+https://github.com/rust-lang/crates.io-index" 2002 | checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" 2003 | dependencies = [ 2004 | "libc", 2005 | ] 2006 | 2007 | [[package]] 2008 | name = "memchr" 2009 | version = "2.7.4" 2010 | source = "registry+https://github.com/rust-lang/crates.io-index" 2011 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 2012 | 2013 | [[package]] 2014 | name = "memmap2" 2015 | version = "0.9.5" 2016 | source = "registry+https://github.com/rust-lang/crates.io-index" 2017 | checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" 2018 | dependencies = [ 2019 | "libc", 2020 | ] 2021 | 2022 | [[package]] 2023 | name = "memoffset" 2024 | version = "0.9.1" 2025 | source = "registry+https://github.com/rust-lang/crates.io-index" 2026 | checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" 2027 | dependencies = [ 2028 | "autocfg", 2029 | ] 2030 | 2031 | [[package]] 2032 | name = "metal" 2033 | version = "0.29.0" 2034 | source = "registry+https://github.com/rust-lang/crates.io-index" 2035 | checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" 2036 | dependencies = [ 2037 | "bitflags 2.6.0", 2038 | "block", 2039 | "core-graphics-types", 2040 | "foreign-types", 2041 | "log", 2042 | "objc", 2043 | "paste", 2044 | ] 2045 | 2046 | [[package]] 2047 | name = "miniz_oxide" 2048 | version = "0.8.2" 2049 | source = "registry+https://github.com/rust-lang/crates.io-index" 2050 | checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" 2051 | dependencies = [ 2052 | "adler2", 2053 | "simd-adler32", 2054 | ] 2055 | 2056 | [[package]] 2057 | name = "naga" 2058 | version = "23.1.0" 2059 | source = "registry+https://github.com/rust-lang/crates.io-index" 2060 | checksum = "364f94bc34f61332abebe8cad6f6cd82a5b65cff22c828d05d0968911462ca4f" 2061 | dependencies = [ 2062 | "arrayvec", 2063 | "bit-set", 2064 | "bitflags 2.6.0", 2065 | "cfg_aliases 0.1.1", 2066 | "codespan-reporting", 2067 | "hexf-parse", 2068 | "indexmap", 2069 | "log", 2070 | "rustc-hash", 2071 | "spirv", 2072 | "termcolor", 2073 | "thiserror", 2074 | "unicode-xid", 2075 | ] 2076 | 2077 | [[package]] 2078 | name = "ndk" 2079 | version = "0.9.0" 2080 | source = "registry+https://github.com/rust-lang/crates.io-index" 2081 | checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 2082 | dependencies = [ 2083 | "bitflags 2.6.0", 2084 | "jni-sys", 2085 | "log", 2086 | "ndk-sys 0.6.0+11769913", 2087 | "num_enum", 2088 | "raw-window-handle", 2089 | "thiserror", 2090 | ] 2091 | 2092 | [[package]] 2093 | name = "ndk-context" 2094 | version = "0.1.1" 2095 | source = "registry+https://github.com/rust-lang/crates.io-index" 2096 | checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" 2097 | 2098 | [[package]] 2099 | name = "ndk-sys" 2100 | version = "0.5.0+25.2.9519653" 2101 | source = "registry+https://github.com/rust-lang/crates.io-index" 2102 | checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" 2103 | dependencies = [ 2104 | "jni-sys", 2105 | ] 2106 | 2107 | [[package]] 2108 | name = "ndk-sys" 2109 | version = "0.6.0+11769913" 2110 | source = "registry+https://github.com/rust-lang/crates.io-index" 2111 | checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" 2112 | dependencies = [ 2113 | "jni-sys", 2114 | ] 2115 | 2116 | [[package]] 2117 | name = "nix" 2118 | version = "0.29.0" 2119 | source = "registry+https://github.com/rust-lang/crates.io-index" 2120 | checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" 2121 | dependencies = [ 2122 | "bitflags 2.6.0", 2123 | "cfg-if", 2124 | "cfg_aliases 0.2.1", 2125 | "libc", 2126 | "memoffset", 2127 | ] 2128 | 2129 | [[package]] 2130 | name = "nohash-hasher" 2131 | version = "0.2.0" 2132 | source = "registry+https://github.com/rust-lang/crates.io-index" 2133 | checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" 2134 | 2135 | [[package]] 2136 | name = "num-traits" 2137 | version = "0.2.19" 2138 | source = "registry+https://github.com/rust-lang/crates.io-index" 2139 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 2140 | dependencies = [ 2141 | "autocfg", 2142 | ] 2143 | 2144 | [[package]] 2145 | name = "num_enum" 2146 | version = "0.7.3" 2147 | source = "registry+https://github.com/rust-lang/crates.io-index" 2148 | checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" 2149 | dependencies = [ 2150 | "num_enum_derive", 2151 | ] 2152 | 2153 | [[package]] 2154 | name = "num_enum_derive" 2155 | version = "0.7.3" 2156 | source = "registry+https://github.com/rust-lang/crates.io-index" 2157 | checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" 2158 | dependencies = [ 2159 | "proc-macro-crate", 2160 | "proc-macro2", 2161 | "quote", 2162 | "syn", 2163 | ] 2164 | 2165 | [[package]] 2166 | name = "number_prefix" 2167 | version = "0.4.0" 2168 | source = "registry+https://github.com/rust-lang/crates.io-index" 2169 | checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" 2170 | 2171 | [[package]] 2172 | name = "objc" 2173 | version = "0.2.7" 2174 | source = "registry+https://github.com/rust-lang/crates.io-index" 2175 | checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" 2176 | dependencies = [ 2177 | "malloc_buf", 2178 | ] 2179 | 2180 | [[package]] 2181 | name = "objc-sys" 2182 | version = "0.3.5" 2183 | source = "registry+https://github.com/rust-lang/crates.io-index" 2184 | checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" 2185 | 2186 | [[package]] 2187 | name = "objc2" 2188 | version = "0.5.2" 2189 | source = "registry+https://github.com/rust-lang/crates.io-index" 2190 | checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" 2191 | dependencies = [ 2192 | "objc-sys", 2193 | "objc2-encode", 2194 | ] 2195 | 2196 | [[package]] 2197 | name = "objc2-app-kit" 2198 | version = "0.2.2" 2199 | source = "registry+https://github.com/rust-lang/crates.io-index" 2200 | checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" 2201 | dependencies = [ 2202 | "bitflags 2.6.0", 2203 | "block2", 2204 | "libc", 2205 | "objc2", 2206 | "objc2-core-data", 2207 | "objc2-core-image", 2208 | "objc2-foundation", 2209 | "objc2-quartz-core", 2210 | ] 2211 | 2212 | [[package]] 2213 | name = "objc2-cloud-kit" 2214 | version = "0.2.2" 2215 | source = "registry+https://github.com/rust-lang/crates.io-index" 2216 | checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" 2217 | dependencies = [ 2218 | "bitflags 2.6.0", 2219 | "block2", 2220 | "objc2", 2221 | "objc2-core-location", 2222 | "objc2-foundation", 2223 | ] 2224 | 2225 | [[package]] 2226 | name = "objc2-contacts" 2227 | version = "0.2.2" 2228 | source = "registry+https://github.com/rust-lang/crates.io-index" 2229 | checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" 2230 | dependencies = [ 2231 | "block2", 2232 | "objc2", 2233 | "objc2-foundation", 2234 | ] 2235 | 2236 | [[package]] 2237 | name = "objc2-core-data" 2238 | version = "0.2.2" 2239 | source = "registry+https://github.com/rust-lang/crates.io-index" 2240 | checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" 2241 | dependencies = [ 2242 | "bitflags 2.6.0", 2243 | "block2", 2244 | "objc2", 2245 | "objc2-foundation", 2246 | ] 2247 | 2248 | [[package]] 2249 | name = "objc2-core-image" 2250 | version = "0.2.2" 2251 | source = "registry+https://github.com/rust-lang/crates.io-index" 2252 | checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" 2253 | dependencies = [ 2254 | "block2", 2255 | "objc2", 2256 | "objc2-foundation", 2257 | "objc2-metal", 2258 | ] 2259 | 2260 | [[package]] 2261 | name = "objc2-core-location" 2262 | version = "0.2.2" 2263 | source = "registry+https://github.com/rust-lang/crates.io-index" 2264 | checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" 2265 | dependencies = [ 2266 | "block2", 2267 | "objc2", 2268 | "objc2-contacts", 2269 | "objc2-foundation", 2270 | ] 2271 | 2272 | [[package]] 2273 | name = "objc2-encode" 2274 | version = "4.0.3" 2275 | source = "registry+https://github.com/rust-lang/crates.io-index" 2276 | checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" 2277 | 2278 | [[package]] 2279 | name = "objc2-foundation" 2280 | version = "0.2.2" 2281 | source = "registry+https://github.com/rust-lang/crates.io-index" 2282 | checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 2283 | dependencies = [ 2284 | "bitflags 2.6.0", 2285 | "block2", 2286 | "dispatch", 2287 | "libc", 2288 | "objc2", 2289 | ] 2290 | 2291 | [[package]] 2292 | name = "objc2-link-presentation" 2293 | version = "0.2.2" 2294 | source = "registry+https://github.com/rust-lang/crates.io-index" 2295 | checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" 2296 | dependencies = [ 2297 | "block2", 2298 | "objc2", 2299 | "objc2-app-kit", 2300 | "objc2-foundation", 2301 | ] 2302 | 2303 | [[package]] 2304 | name = "objc2-metal" 2305 | version = "0.2.2" 2306 | source = "registry+https://github.com/rust-lang/crates.io-index" 2307 | checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 2308 | dependencies = [ 2309 | "bitflags 2.6.0", 2310 | "block2", 2311 | "objc2", 2312 | "objc2-foundation", 2313 | ] 2314 | 2315 | [[package]] 2316 | name = "objc2-quartz-core" 2317 | version = "0.2.2" 2318 | source = "registry+https://github.com/rust-lang/crates.io-index" 2319 | checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 2320 | dependencies = [ 2321 | "bitflags 2.6.0", 2322 | "block2", 2323 | "objc2", 2324 | "objc2-foundation", 2325 | "objc2-metal", 2326 | ] 2327 | 2328 | [[package]] 2329 | name = "objc2-symbols" 2330 | version = "0.2.2" 2331 | source = "registry+https://github.com/rust-lang/crates.io-index" 2332 | checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" 2333 | dependencies = [ 2334 | "objc2", 2335 | "objc2-foundation", 2336 | ] 2337 | 2338 | [[package]] 2339 | name = "objc2-ui-kit" 2340 | version = "0.2.2" 2341 | source = "registry+https://github.com/rust-lang/crates.io-index" 2342 | checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" 2343 | dependencies = [ 2344 | "bitflags 2.6.0", 2345 | "block2", 2346 | "objc2", 2347 | "objc2-cloud-kit", 2348 | "objc2-core-data", 2349 | "objc2-core-image", 2350 | "objc2-core-location", 2351 | "objc2-foundation", 2352 | "objc2-link-presentation", 2353 | "objc2-quartz-core", 2354 | "objc2-symbols", 2355 | "objc2-uniform-type-identifiers", 2356 | "objc2-user-notifications", 2357 | ] 2358 | 2359 | [[package]] 2360 | name = "objc2-uniform-type-identifiers" 2361 | version = "0.2.2" 2362 | source = "registry+https://github.com/rust-lang/crates.io-index" 2363 | checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" 2364 | dependencies = [ 2365 | "block2", 2366 | "objc2", 2367 | "objc2-foundation", 2368 | ] 2369 | 2370 | [[package]] 2371 | name = "objc2-user-notifications" 2372 | version = "0.2.2" 2373 | source = "registry+https://github.com/rust-lang/crates.io-index" 2374 | checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" 2375 | dependencies = [ 2376 | "bitflags 2.6.0", 2377 | "block2", 2378 | "objc2", 2379 | "objc2-core-location", 2380 | "objc2-foundation", 2381 | ] 2382 | 2383 | [[package]] 2384 | name = "once_cell" 2385 | version = "1.20.2" 2386 | source = "registry+https://github.com/rust-lang/crates.io-index" 2387 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 2388 | 2389 | [[package]] 2390 | name = "orbclient" 2391 | version = "0.3.48" 2392 | source = "registry+https://github.com/rust-lang/crates.io-index" 2393 | checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" 2394 | dependencies = [ 2395 | "libredox", 2396 | ] 2397 | 2398 | [[package]] 2399 | name = "ordered-stream" 2400 | version = "0.2.0" 2401 | source = "registry+https://github.com/rust-lang/crates.io-index" 2402 | checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" 2403 | dependencies = [ 2404 | "futures-core", 2405 | "pin-project-lite", 2406 | ] 2407 | 2408 | [[package]] 2409 | name = "owned_ttf_parser" 2410 | version = "0.25.0" 2411 | source = "registry+https://github.com/rust-lang/crates.io-index" 2412 | checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" 2413 | dependencies = [ 2414 | "ttf-parser", 2415 | ] 2416 | 2417 | [[package]] 2418 | name = "pango-sys" 2419 | version = "0.18.0" 2420 | source = "registry+https://github.com/rust-lang/crates.io-index" 2421 | checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" 2422 | dependencies = [ 2423 | "glib-sys", 2424 | "gobject-sys", 2425 | "libc", 2426 | "system-deps", 2427 | ] 2428 | 2429 | [[package]] 2430 | name = "parking" 2431 | version = "2.2.1" 2432 | source = "registry+https://github.com/rust-lang/crates.io-index" 2433 | checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 2434 | 2435 | [[package]] 2436 | name = "parking_lot" 2437 | version = "0.12.3" 2438 | source = "registry+https://github.com/rust-lang/crates.io-index" 2439 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 2440 | dependencies = [ 2441 | "lock_api", 2442 | "parking_lot_core", 2443 | ] 2444 | 2445 | [[package]] 2446 | name = "parking_lot_core" 2447 | version = "0.9.10" 2448 | source = "registry+https://github.com/rust-lang/crates.io-index" 2449 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 2450 | dependencies = [ 2451 | "cfg-if", 2452 | "libc", 2453 | "redox_syscall 0.5.8", 2454 | "smallvec", 2455 | "windows-targets 0.52.6", 2456 | ] 2457 | 2458 | [[package]] 2459 | name = "paste" 2460 | version = "1.0.15" 2461 | source = "registry+https://github.com/rust-lang/crates.io-index" 2462 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 2463 | 2464 | [[package]] 2465 | name = "percent-encoding" 2466 | version = "2.3.1" 2467 | source = "registry+https://github.com/rust-lang/crates.io-index" 2468 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 2469 | 2470 | [[package]] 2471 | name = "pin-project" 2472 | version = "1.1.7" 2473 | source = "registry+https://github.com/rust-lang/crates.io-index" 2474 | checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" 2475 | dependencies = [ 2476 | "pin-project-internal", 2477 | ] 2478 | 2479 | [[package]] 2480 | name = "pin-project-internal" 2481 | version = "1.1.7" 2482 | source = "registry+https://github.com/rust-lang/crates.io-index" 2483 | checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" 2484 | dependencies = [ 2485 | "proc-macro2", 2486 | "quote", 2487 | "syn", 2488 | ] 2489 | 2490 | [[package]] 2491 | name = "pin-project-lite" 2492 | version = "0.2.15" 2493 | source = "registry+https://github.com/rust-lang/crates.io-index" 2494 | checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" 2495 | 2496 | [[package]] 2497 | name = "pin-utils" 2498 | version = "0.1.0" 2499 | source = "registry+https://github.com/rust-lang/crates.io-index" 2500 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 2501 | 2502 | [[package]] 2503 | name = "piper" 2504 | version = "0.2.4" 2505 | source = "registry+https://github.com/rust-lang/crates.io-index" 2506 | checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" 2507 | dependencies = [ 2508 | "atomic-waker", 2509 | "fastrand", 2510 | "futures-io", 2511 | ] 2512 | 2513 | [[package]] 2514 | name = "pkg-config" 2515 | version = "0.3.31" 2516 | source = "registry+https://github.com/rust-lang/crates.io-index" 2517 | checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" 2518 | 2519 | [[package]] 2520 | name = "png" 2521 | version = "0.17.16" 2522 | source = "registry+https://github.com/rust-lang/crates.io-index" 2523 | checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" 2524 | dependencies = [ 2525 | "bitflags 1.3.2", 2526 | "crc32fast", 2527 | "fdeflate", 2528 | "flate2", 2529 | "miniz_oxide", 2530 | ] 2531 | 2532 | [[package]] 2533 | name = "polling" 2534 | version = "3.7.4" 2535 | source = "registry+https://github.com/rust-lang/crates.io-index" 2536 | checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" 2537 | dependencies = [ 2538 | "cfg-if", 2539 | "concurrent-queue", 2540 | "hermit-abi", 2541 | "pin-project-lite", 2542 | "rustix", 2543 | "tracing", 2544 | "windows-sys 0.59.0", 2545 | ] 2546 | 2547 | [[package]] 2548 | name = "portable-atomic" 2549 | version = "1.10.0" 2550 | source = "registry+https://github.com/rust-lang/crates.io-index" 2551 | checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6" 2552 | 2553 | [[package]] 2554 | name = "ppv-lite86" 2555 | version = "0.2.20" 2556 | source = "registry+https://github.com/rust-lang/crates.io-index" 2557 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 2558 | dependencies = [ 2559 | "zerocopy", 2560 | ] 2561 | 2562 | [[package]] 2563 | name = "proc-macro-crate" 2564 | version = "3.2.0" 2565 | source = "registry+https://github.com/rust-lang/crates.io-index" 2566 | checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" 2567 | dependencies = [ 2568 | "toml_edit", 2569 | ] 2570 | 2571 | [[package]] 2572 | name = "proc-macro2" 2573 | version = "1.0.92" 2574 | source = "registry+https://github.com/rust-lang/crates.io-index" 2575 | checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" 2576 | dependencies = [ 2577 | "unicode-ident", 2578 | ] 2579 | 2580 | [[package]] 2581 | name = "profiling" 2582 | version = "1.0.16" 2583 | source = "registry+https://github.com/rust-lang/crates.io-index" 2584 | checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" 2585 | 2586 | [[package]] 2587 | name = "qoi" 2588 | version = "0.4.1" 2589 | source = "registry+https://github.com/rust-lang/crates.io-index" 2590 | checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" 2591 | dependencies = [ 2592 | "bytemuck", 2593 | ] 2594 | 2595 | [[package]] 2596 | name = "quick-xml" 2597 | version = "0.30.0" 2598 | source = "registry+https://github.com/rust-lang/crates.io-index" 2599 | checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" 2600 | dependencies = [ 2601 | "memchr", 2602 | "serde", 2603 | ] 2604 | 2605 | [[package]] 2606 | name = "quick-xml" 2607 | version = "0.36.2" 2608 | source = "registry+https://github.com/rust-lang/crates.io-index" 2609 | checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" 2610 | dependencies = [ 2611 | "memchr", 2612 | ] 2613 | 2614 | [[package]] 2615 | name = "quote" 2616 | version = "1.0.37" 2617 | source = "registry+https://github.com/rust-lang/crates.io-index" 2618 | checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" 2619 | dependencies = [ 2620 | "proc-macro2", 2621 | ] 2622 | 2623 | [[package]] 2624 | name = "rand" 2625 | version = "0.8.5" 2626 | source = "registry+https://github.com/rust-lang/crates.io-index" 2627 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 2628 | dependencies = [ 2629 | "libc", 2630 | "rand_chacha", 2631 | "rand_core", 2632 | ] 2633 | 2634 | [[package]] 2635 | name = "rand_chacha" 2636 | version = "0.3.1" 2637 | source = "registry+https://github.com/rust-lang/crates.io-index" 2638 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 2639 | dependencies = [ 2640 | "ppv-lite86", 2641 | "rand_core", 2642 | ] 2643 | 2644 | [[package]] 2645 | name = "rand_core" 2646 | version = "0.6.4" 2647 | source = "registry+https://github.com/rust-lang/crates.io-index" 2648 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2649 | dependencies = [ 2650 | "getrandom", 2651 | ] 2652 | 2653 | [[package]] 2654 | name = "raw-window-handle" 2655 | version = "0.6.2" 2656 | source = "registry+https://github.com/rust-lang/crates.io-index" 2657 | checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" 2658 | 2659 | [[package]] 2660 | name = "rayon" 2661 | version = "1.10.0" 2662 | source = "registry+https://github.com/rust-lang/crates.io-index" 2663 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 2664 | dependencies = [ 2665 | "either", 2666 | "rayon-core", 2667 | ] 2668 | 2669 | [[package]] 2670 | name = "rayon-core" 2671 | version = "1.12.1" 2672 | source = "registry+https://github.com/rust-lang/crates.io-index" 2673 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 2674 | dependencies = [ 2675 | "crossbeam-deque", 2676 | "crossbeam-utils", 2677 | ] 2678 | 2679 | [[package]] 2680 | name = "redox_syscall" 2681 | version = "0.4.1" 2682 | source = "registry+https://github.com/rust-lang/crates.io-index" 2683 | checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" 2684 | dependencies = [ 2685 | "bitflags 1.3.2", 2686 | ] 2687 | 2688 | [[package]] 2689 | name = "redox_syscall" 2690 | version = "0.5.8" 2691 | source = "registry+https://github.com/rust-lang/crates.io-index" 2692 | checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" 2693 | dependencies = [ 2694 | "bitflags 2.6.0", 2695 | ] 2696 | 2697 | [[package]] 2698 | name = "renderdoc-sys" 2699 | version = "1.1.0" 2700 | source = "registry+https://github.com/rust-lang/crates.io-index" 2701 | checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" 2702 | 2703 | [[package]] 2704 | name = "rfd" 2705 | version = "0.15.1" 2706 | source = "registry+https://github.com/rust-lang/crates.io-index" 2707 | checksum = "46f6f80a9b882647d9014673ca9925d30ffc9750f2eed2b4490e189eaebd01e8" 2708 | dependencies = [ 2709 | "block2", 2710 | "glib-sys", 2711 | "gobject-sys", 2712 | "gtk-sys", 2713 | "js-sys", 2714 | "log", 2715 | "objc2", 2716 | "objc2-app-kit", 2717 | "objc2-foundation", 2718 | "raw-window-handle", 2719 | "wasm-bindgen", 2720 | "wasm-bindgen-futures", 2721 | "web-sys", 2722 | "windows-sys 0.48.0", 2723 | ] 2724 | 2725 | [[package]] 2726 | name = "rustc-hash" 2727 | version = "1.1.0" 2728 | source = "registry+https://github.com/rust-lang/crates.io-index" 2729 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 2730 | 2731 | [[package]] 2732 | name = "rustix" 2733 | version = "0.38.42" 2734 | source = "registry+https://github.com/rust-lang/crates.io-index" 2735 | checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" 2736 | dependencies = [ 2737 | "bitflags 2.6.0", 2738 | "errno", 2739 | "libc", 2740 | "linux-raw-sys", 2741 | "windows-sys 0.59.0", 2742 | ] 2743 | 2744 | [[package]] 2745 | name = "same-file" 2746 | version = "1.0.6" 2747 | source = "registry+https://github.com/rust-lang/crates.io-index" 2748 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 2749 | dependencies = [ 2750 | "winapi-util", 2751 | ] 2752 | 2753 | [[package]] 2754 | name = "scoped-tls" 2755 | version = "1.0.1" 2756 | source = "registry+https://github.com/rust-lang/crates.io-index" 2757 | checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 2758 | 2759 | [[package]] 2760 | name = "scopeguard" 2761 | version = "1.2.0" 2762 | source = "registry+https://github.com/rust-lang/crates.io-index" 2763 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 2764 | 2765 | [[package]] 2766 | name = "sctk-adwaita" 2767 | version = "0.10.1" 2768 | source = "registry+https://github.com/rust-lang/crates.io-index" 2769 | checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" 2770 | dependencies = [ 2771 | "ab_glyph", 2772 | "log", 2773 | "memmap2", 2774 | "smithay-client-toolkit", 2775 | "tiny-skia", 2776 | ] 2777 | 2778 | [[package]] 2779 | name = "serde" 2780 | version = "1.0.216" 2781 | source = "registry+https://github.com/rust-lang/crates.io-index" 2782 | checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" 2783 | dependencies = [ 2784 | "serde_derive", 2785 | ] 2786 | 2787 | [[package]] 2788 | name = "serde_derive" 2789 | version = "1.0.216" 2790 | source = "registry+https://github.com/rust-lang/crates.io-index" 2791 | checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" 2792 | dependencies = [ 2793 | "proc-macro2", 2794 | "quote", 2795 | "syn", 2796 | ] 2797 | 2798 | [[package]] 2799 | name = "serde_repr" 2800 | version = "0.1.19" 2801 | source = "registry+https://github.com/rust-lang/crates.io-index" 2802 | checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" 2803 | dependencies = [ 2804 | "proc-macro2", 2805 | "quote", 2806 | "syn", 2807 | ] 2808 | 2809 | [[package]] 2810 | name = "serde_spanned" 2811 | version = "0.6.8" 2812 | source = "registry+https://github.com/rust-lang/crates.io-index" 2813 | checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" 2814 | dependencies = [ 2815 | "serde", 2816 | ] 2817 | 2818 | [[package]] 2819 | name = "sha1" 2820 | version = "0.10.6" 2821 | source = "registry+https://github.com/rust-lang/crates.io-index" 2822 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 2823 | dependencies = [ 2824 | "cfg-if", 2825 | "cpufeatures", 2826 | "digest", 2827 | ] 2828 | 2829 | [[package]] 2830 | name = "shlex" 2831 | version = "1.3.0" 2832 | source = "registry+https://github.com/rust-lang/crates.io-index" 2833 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 2834 | 2835 | [[package]] 2836 | name = "signal-hook-registry" 2837 | version = "1.4.2" 2838 | source = "registry+https://github.com/rust-lang/crates.io-index" 2839 | checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" 2840 | dependencies = [ 2841 | "libc", 2842 | ] 2843 | 2844 | [[package]] 2845 | name = "simd-adler32" 2846 | version = "0.3.7" 2847 | source = "registry+https://github.com/rust-lang/crates.io-index" 2848 | checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 2849 | 2850 | [[package]] 2851 | name = "slab" 2852 | version = "0.4.9" 2853 | source = "registry+https://github.com/rust-lang/crates.io-index" 2854 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 2855 | dependencies = [ 2856 | "autocfg", 2857 | ] 2858 | 2859 | [[package]] 2860 | name = "slotmap" 2861 | version = "1.0.7" 2862 | source = "registry+https://github.com/rust-lang/crates.io-index" 2863 | checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" 2864 | dependencies = [ 2865 | "version_check", 2866 | ] 2867 | 2868 | [[package]] 2869 | name = "smallvec" 2870 | version = "1.13.2" 2871 | source = "registry+https://github.com/rust-lang/crates.io-index" 2872 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 2873 | 2874 | [[package]] 2875 | name = "smithay-client-toolkit" 2876 | version = "0.19.2" 2877 | source = "registry+https://github.com/rust-lang/crates.io-index" 2878 | checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" 2879 | dependencies = [ 2880 | "bitflags 2.6.0", 2881 | "calloop", 2882 | "calloop-wayland-source", 2883 | "cursor-icon", 2884 | "libc", 2885 | "log", 2886 | "memmap2", 2887 | "rustix", 2888 | "thiserror", 2889 | "wayland-backend", 2890 | "wayland-client", 2891 | "wayland-csd-frame", 2892 | "wayland-cursor", 2893 | "wayland-protocols", 2894 | "wayland-protocols-wlr", 2895 | "wayland-scanner", 2896 | "xkeysym", 2897 | ] 2898 | 2899 | [[package]] 2900 | name = "smithay-clipboard" 2901 | version = "0.7.2" 2902 | source = "registry+https://github.com/rust-lang/crates.io-index" 2903 | checksum = "cc8216eec463674a0e90f29e0ae41a4db573ec5b56b1c6c1c71615d249b6d846" 2904 | dependencies = [ 2905 | "libc", 2906 | "smithay-client-toolkit", 2907 | "wayland-backend", 2908 | ] 2909 | 2910 | [[package]] 2911 | name = "smol_str" 2912 | version = "0.2.2" 2913 | source = "registry+https://github.com/rust-lang/crates.io-index" 2914 | checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" 2915 | dependencies = [ 2916 | "serde", 2917 | ] 2918 | 2919 | [[package]] 2920 | name = "spirv" 2921 | version = "0.3.0+sdk-1.3.268.0" 2922 | source = "registry+https://github.com/rust-lang/crates.io-index" 2923 | checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" 2924 | dependencies = [ 2925 | "bitflags 2.6.0", 2926 | ] 2927 | 2928 | [[package]] 2929 | name = "stable_deref_trait" 2930 | version = "1.2.0" 2931 | source = "registry+https://github.com/rust-lang/crates.io-index" 2932 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2933 | 2934 | [[package]] 2935 | name = "static_assertions" 2936 | version = "1.1.0" 2937 | source = "registry+https://github.com/rust-lang/crates.io-index" 2938 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 2939 | 2940 | [[package]] 2941 | name = "strict-num" 2942 | version = "0.1.1" 2943 | source = "registry+https://github.com/rust-lang/crates.io-index" 2944 | checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" 2945 | 2946 | [[package]] 2947 | name = "strsim" 2948 | version = "0.11.1" 2949 | source = "registry+https://github.com/rust-lang/crates.io-index" 2950 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 2951 | 2952 | [[package]] 2953 | name = "syn" 2954 | version = "2.0.90" 2955 | source = "registry+https://github.com/rust-lang/crates.io-index" 2956 | checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" 2957 | dependencies = [ 2958 | "proc-macro2", 2959 | "quote", 2960 | "unicode-ident", 2961 | ] 2962 | 2963 | [[package]] 2964 | name = "synstructure" 2965 | version = "0.13.1" 2966 | source = "registry+https://github.com/rust-lang/crates.io-index" 2967 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 2968 | dependencies = [ 2969 | "proc-macro2", 2970 | "quote", 2971 | "syn", 2972 | ] 2973 | 2974 | [[package]] 2975 | name = "system-deps" 2976 | version = "6.2.2" 2977 | source = "registry+https://github.com/rust-lang/crates.io-index" 2978 | checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" 2979 | dependencies = [ 2980 | "cfg-expr", 2981 | "heck", 2982 | "pkg-config", 2983 | "toml", 2984 | "version-compare", 2985 | ] 2986 | 2987 | [[package]] 2988 | name = "target-lexicon" 2989 | version = "0.12.16" 2990 | source = "registry+https://github.com/rust-lang/crates.io-index" 2991 | checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" 2992 | 2993 | [[package]] 2994 | name = "tempfile" 2995 | version = "3.14.0" 2996 | source = "registry+https://github.com/rust-lang/crates.io-index" 2997 | checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" 2998 | dependencies = [ 2999 | "cfg-if", 3000 | "fastrand", 3001 | "once_cell", 3002 | "rustix", 3003 | "windows-sys 0.59.0", 3004 | ] 3005 | 3006 | [[package]] 3007 | name = "termcolor" 3008 | version = "1.4.1" 3009 | source = "registry+https://github.com/rust-lang/crates.io-index" 3010 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 3011 | dependencies = [ 3012 | "winapi-util", 3013 | ] 3014 | 3015 | [[package]] 3016 | name = "thiserror" 3017 | version = "1.0.69" 3018 | source = "registry+https://github.com/rust-lang/crates.io-index" 3019 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 3020 | dependencies = [ 3021 | "thiserror-impl", 3022 | ] 3023 | 3024 | [[package]] 3025 | name = "thiserror-impl" 3026 | version = "1.0.69" 3027 | source = "registry+https://github.com/rust-lang/crates.io-index" 3028 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 3029 | dependencies = [ 3030 | "proc-macro2", 3031 | "quote", 3032 | "syn", 3033 | ] 3034 | 3035 | [[package]] 3036 | name = "tiff" 3037 | version = "0.9.1" 3038 | source = "registry+https://github.com/rust-lang/crates.io-index" 3039 | checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" 3040 | dependencies = [ 3041 | "flate2", 3042 | "jpeg-decoder", 3043 | "weezl", 3044 | ] 3045 | 3046 | [[package]] 3047 | name = "tiny-skia" 3048 | version = "0.11.4" 3049 | source = "registry+https://github.com/rust-lang/crates.io-index" 3050 | checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" 3051 | dependencies = [ 3052 | "arrayref", 3053 | "arrayvec", 3054 | "bytemuck", 3055 | "cfg-if", 3056 | "log", 3057 | "tiny-skia-path", 3058 | ] 3059 | 3060 | [[package]] 3061 | name = "tiny-skia-path" 3062 | version = "0.11.4" 3063 | source = "registry+https://github.com/rust-lang/crates.io-index" 3064 | checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" 3065 | dependencies = [ 3066 | "arrayref", 3067 | "bytemuck", 3068 | "strict-num", 3069 | ] 3070 | 3071 | [[package]] 3072 | name = "tinystr" 3073 | version = "0.7.6" 3074 | source = "registry+https://github.com/rust-lang/crates.io-index" 3075 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 3076 | dependencies = [ 3077 | "displaydoc", 3078 | "zerovec", 3079 | ] 3080 | 3081 | [[package]] 3082 | name = "toml" 3083 | version = "0.8.19" 3084 | source = "registry+https://github.com/rust-lang/crates.io-index" 3085 | checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" 3086 | dependencies = [ 3087 | "serde", 3088 | "serde_spanned", 3089 | "toml_datetime", 3090 | "toml_edit", 3091 | ] 3092 | 3093 | [[package]] 3094 | name = "toml_datetime" 3095 | version = "0.6.8" 3096 | source = "registry+https://github.com/rust-lang/crates.io-index" 3097 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 3098 | dependencies = [ 3099 | "serde", 3100 | ] 3101 | 3102 | [[package]] 3103 | name = "toml_edit" 3104 | version = "0.22.22" 3105 | source = "registry+https://github.com/rust-lang/crates.io-index" 3106 | checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" 3107 | dependencies = [ 3108 | "indexmap", 3109 | "serde", 3110 | "serde_spanned", 3111 | "toml_datetime", 3112 | "winnow", 3113 | ] 3114 | 3115 | [[package]] 3116 | name = "tracing" 3117 | version = "0.1.41" 3118 | source = "registry+https://github.com/rust-lang/crates.io-index" 3119 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 3120 | dependencies = [ 3121 | "pin-project-lite", 3122 | "tracing-attributes", 3123 | "tracing-core", 3124 | ] 3125 | 3126 | [[package]] 3127 | name = "tracing-attributes" 3128 | version = "0.1.28" 3129 | source = "registry+https://github.com/rust-lang/crates.io-index" 3130 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 3131 | dependencies = [ 3132 | "proc-macro2", 3133 | "quote", 3134 | "syn", 3135 | ] 3136 | 3137 | [[package]] 3138 | name = "tracing-core" 3139 | version = "0.1.33" 3140 | source = "registry+https://github.com/rust-lang/crates.io-index" 3141 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 3142 | dependencies = [ 3143 | "once_cell", 3144 | ] 3145 | 3146 | [[package]] 3147 | name = "ttf-parser" 3148 | version = "0.25.1" 3149 | source = "registry+https://github.com/rust-lang/crates.io-index" 3150 | checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" 3151 | 3152 | [[package]] 3153 | name = "type-map" 3154 | version = "0.5.0" 3155 | source = "registry+https://github.com/rust-lang/crates.io-index" 3156 | checksum = "deb68604048ff8fa93347f02441e4487594adc20bb8a084f9e564d2b827a0a9f" 3157 | dependencies = [ 3158 | "rustc-hash", 3159 | ] 3160 | 3161 | [[package]] 3162 | name = "typenum" 3163 | version = "1.17.0" 3164 | source = "registry+https://github.com/rust-lang/crates.io-index" 3165 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 3166 | 3167 | [[package]] 3168 | name = "uds_windows" 3169 | version = "1.1.0" 3170 | source = "registry+https://github.com/rust-lang/crates.io-index" 3171 | checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" 3172 | dependencies = [ 3173 | "memoffset", 3174 | "tempfile", 3175 | "winapi", 3176 | ] 3177 | 3178 | [[package]] 3179 | name = "unicode-ident" 3180 | version = "1.0.14" 3181 | source = "registry+https://github.com/rust-lang/crates.io-index" 3182 | checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" 3183 | 3184 | [[package]] 3185 | name = "unicode-segmentation" 3186 | version = "1.12.0" 3187 | source = "registry+https://github.com/rust-lang/crates.io-index" 3188 | checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 3189 | 3190 | [[package]] 3191 | name = "unicode-width" 3192 | version = "0.1.14" 3193 | source = "registry+https://github.com/rust-lang/crates.io-index" 3194 | checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 3195 | 3196 | [[package]] 3197 | name = "unicode-width" 3198 | version = "0.2.0" 3199 | source = "registry+https://github.com/rust-lang/crates.io-index" 3200 | checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" 3201 | 3202 | [[package]] 3203 | name = "unicode-xid" 3204 | version = "0.2.6" 3205 | source = "registry+https://github.com/rust-lang/crates.io-index" 3206 | checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 3207 | 3208 | [[package]] 3209 | name = "url" 3210 | version = "2.5.4" 3211 | source = "registry+https://github.com/rust-lang/crates.io-index" 3212 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 3213 | dependencies = [ 3214 | "form_urlencoded", 3215 | "idna", 3216 | "percent-encoding", 3217 | ] 3218 | 3219 | [[package]] 3220 | name = "utf16_iter" 3221 | version = "1.0.5" 3222 | source = "registry+https://github.com/rust-lang/crates.io-index" 3223 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 3224 | 3225 | [[package]] 3226 | name = "utf8_iter" 3227 | version = "1.0.4" 3228 | source = "registry+https://github.com/rust-lang/crates.io-index" 3229 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 3230 | 3231 | [[package]] 3232 | name = "utf8parse" 3233 | version = "0.2.2" 3234 | source = "registry+https://github.com/rust-lang/crates.io-index" 3235 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 3236 | 3237 | [[package]] 3238 | name = "version-compare" 3239 | version = "0.2.0" 3240 | source = "registry+https://github.com/rust-lang/crates.io-index" 3241 | checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 3242 | 3243 | [[package]] 3244 | name = "version_check" 3245 | version = "0.9.5" 3246 | source = "registry+https://github.com/rust-lang/crates.io-index" 3247 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 3248 | 3249 | [[package]] 3250 | name = "walkdir" 3251 | version = "2.5.0" 3252 | source = "registry+https://github.com/rust-lang/crates.io-index" 3253 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 3254 | dependencies = [ 3255 | "same-file", 3256 | "winapi-util", 3257 | ] 3258 | 3259 | [[package]] 3260 | name = "wasi" 3261 | version = "0.11.0+wasi-snapshot-preview1" 3262 | source = "registry+https://github.com/rust-lang/crates.io-index" 3263 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 3264 | 3265 | [[package]] 3266 | name = "wasm-bindgen" 3267 | version = "0.2.99" 3268 | source = "registry+https://github.com/rust-lang/crates.io-index" 3269 | checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" 3270 | dependencies = [ 3271 | "cfg-if", 3272 | "once_cell", 3273 | "wasm-bindgen-macro", 3274 | ] 3275 | 3276 | [[package]] 3277 | name = "wasm-bindgen-backend" 3278 | version = "0.2.99" 3279 | source = "registry+https://github.com/rust-lang/crates.io-index" 3280 | checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" 3281 | dependencies = [ 3282 | "bumpalo", 3283 | "log", 3284 | "proc-macro2", 3285 | "quote", 3286 | "syn", 3287 | "wasm-bindgen-shared", 3288 | ] 3289 | 3290 | [[package]] 3291 | name = "wasm-bindgen-futures" 3292 | version = "0.4.49" 3293 | source = "registry+https://github.com/rust-lang/crates.io-index" 3294 | checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" 3295 | dependencies = [ 3296 | "cfg-if", 3297 | "js-sys", 3298 | "once_cell", 3299 | "wasm-bindgen", 3300 | "web-sys", 3301 | ] 3302 | 3303 | [[package]] 3304 | name = "wasm-bindgen-macro" 3305 | version = "0.2.99" 3306 | source = "registry+https://github.com/rust-lang/crates.io-index" 3307 | checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" 3308 | dependencies = [ 3309 | "quote", 3310 | "wasm-bindgen-macro-support", 3311 | ] 3312 | 3313 | [[package]] 3314 | name = "wasm-bindgen-macro-support" 3315 | version = "0.2.99" 3316 | source = "registry+https://github.com/rust-lang/crates.io-index" 3317 | checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" 3318 | dependencies = [ 3319 | "proc-macro2", 3320 | "quote", 3321 | "syn", 3322 | "wasm-bindgen-backend", 3323 | "wasm-bindgen-shared", 3324 | ] 3325 | 3326 | [[package]] 3327 | name = "wasm-bindgen-shared" 3328 | version = "0.2.99" 3329 | source = "registry+https://github.com/rust-lang/crates.io-index" 3330 | checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" 3331 | 3332 | [[package]] 3333 | name = "wayland-backend" 3334 | version = "0.3.7" 3335 | source = "registry+https://github.com/rust-lang/crates.io-index" 3336 | checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" 3337 | dependencies = [ 3338 | "cc", 3339 | "downcast-rs", 3340 | "rustix", 3341 | "scoped-tls", 3342 | "smallvec", 3343 | "wayland-sys", 3344 | ] 3345 | 3346 | [[package]] 3347 | name = "wayland-client" 3348 | version = "0.31.7" 3349 | source = "registry+https://github.com/rust-lang/crates.io-index" 3350 | checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" 3351 | dependencies = [ 3352 | "bitflags 2.6.0", 3353 | "rustix", 3354 | "wayland-backend", 3355 | "wayland-scanner", 3356 | ] 3357 | 3358 | [[package]] 3359 | name = "wayland-csd-frame" 3360 | version = "0.3.0" 3361 | source = "registry+https://github.com/rust-lang/crates.io-index" 3362 | checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" 3363 | dependencies = [ 3364 | "bitflags 2.6.0", 3365 | "cursor-icon", 3366 | "wayland-backend", 3367 | ] 3368 | 3369 | [[package]] 3370 | name = "wayland-cursor" 3371 | version = "0.31.7" 3372 | source = "registry+https://github.com/rust-lang/crates.io-index" 3373 | checksum = "32b08bc3aafdb0035e7fe0fdf17ba0c09c268732707dca4ae098f60cb28c9e4c" 3374 | dependencies = [ 3375 | "rustix", 3376 | "wayland-client", 3377 | "xcursor", 3378 | ] 3379 | 3380 | [[package]] 3381 | name = "wayland-protocols" 3382 | version = "0.32.5" 3383 | source = "registry+https://github.com/rust-lang/crates.io-index" 3384 | checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" 3385 | dependencies = [ 3386 | "bitflags 2.6.0", 3387 | "wayland-backend", 3388 | "wayland-client", 3389 | "wayland-scanner", 3390 | ] 3391 | 3392 | [[package]] 3393 | name = "wayland-protocols-plasma" 3394 | version = "0.3.5" 3395 | source = "registry+https://github.com/rust-lang/crates.io-index" 3396 | checksum = "9b31cab548ee68c7eb155517f2212049dc151f7cd7910c2b66abfd31c3ee12bd" 3397 | dependencies = [ 3398 | "bitflags 2.6.0", 3399 | "wayland-backend", 3400 | "wayland-client", 3401 | "wayland-protocols", 3402 | "wayland-scanner", 3403 | ] 3404 | 3405 | [[package]] 3406 | name = "wayland-protocols-wlr" 3407 | version = "0.3.5" 3408 | source = "registry+https://github.com/rust-lang/crates.io-index" 3409 | checksum = "782e12f6cd923c3c316130d56205ebab53f55d6666b7faddfad36cecaeeb4022" 3410 | dependencies = [ 3411 | "bitflags 2.6.0", 3412 | "wayland-backend", 3413 | "wayland-client", 3414 | "wayland-protocols", 3415 | "wayland-scanner", 3416 | ] 3417 | 3418 | [[package]] 3419 | name = "wayland-scanner" 3420 | version = "0.31.5" 3421 | source = "registry+https://github.com/rust-lang/crates.io-index" 3422 | checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" 3423 | dependencies = [ 3424 | "proc-macro2", 3425 | "quick-xml 0.36.2", 3426 | "quote", 3427 | ] 3428 | 3429 | [[package]] 3430 | name = "wayland-sys" 3431 | version = "0.31.5" 3432 | source = "registry+https://github.com/rust-lang/crates.io-index" 3433 | checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" 3434 | dependencies = [ 3435 | "dlib", 3436 | "log", 3437 | "once_cell", 3438 | "pkg-config", 3439 | ] 3440 | 3441 | [[package]] 3442 | name = "web-sys" 3443 | version = "0.3.76" 3444 | source = "registry+https://github.com/rust-lang/crates.io-index" 3445 | checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" 3446 | dependencies = [ 3447 | "js-sys", 3448 | "wasm-bindgen", 3449 | ] 3450 | 3451 | [[package]] 3452 | name = "web-time" 3453 | version = "1.1.0" 3454 | source = "registry+https://github.com/rust-lang/crates.io-index" 3455 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 3456 | dependencies = [ 3457 | "js-sys", 3458 | "wasm-bindgen", 3459 | ] 3460 | 3461 | [[package]] 3462 | name = "webbrowser" 3463 | version = "1.0.3" 3464 | source = "registry+https://github.com/rust-lang/crates.io-index" 3465 | checksum = "ea9fe1ebb156110ff855242c1101df158b822487e4957b0556d9ffce9db0f535" 3466 | dependencies = [ 3467 | "block2", 3468 | "core-foundation 0.10.0", 3469 | "home", 3470 | "jni", 3471 | "log", 3472 | "ndk-context", 3473 | "objc2", 3474 | "objc2-foundation", 3475 | "url", 3476 | "web-sys", 3477 | ] 3478 | 3479 | [[package]] 3480 | name = "weezl" 3481 | version = "0.1.8" 3482 | source = "registry+https://github.com/rust-lang/crates.io-index" 3483 | checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" 3484 | 3485 | [[package]] 3486 | name = "wgpu" 3487 | version = "23.0.1" 3488 | source = "registry+https://github.com/rust-lang/crates.io-index" 3489 | checksum = "80f70000db37c469ea9d67defdc13024ddf9a5f1b89cb2941b812ad7cde1735a" 3490 | dependencies = [ 3491 | "arrayvec", 3492 | "cfg_aliases 0.1.1", 3493 | "document-features", 3494 | "js-sys", 3495 | "log", 3496 | "parking_lot", 3497 | "profiling", 3498 | "raw-window-handle", 3499 | "smallvec", 3500 | "static_assertions", 3501 | "wasm-bindgen", 3502 | "wasm-bindgen-futures", 3503 | "web-sys", 3504 | "wgpu-core", 3505 | "wgpu-hal", 3506 | "wgpu-types", 3507 | ] 3508 | 3509 | [[package]] 3510 | name = "wgpu-core" 3511 | version = "23.0.1" 3512 | source = "registry+https://github.com/rust-lang/crates.io-index" 3513 | checksum = "d63c3c478de8e7e01786479919c8769f62a22eec16788d8c2ac77ce2c132778a" 3514 | dependencies = [ 3515 | "arrayvec", 3516 | "bit-vec", 3517 | "bitflags 2.6.0", 3518 | "cfg_aliases 0.1.1", 3519 | "document-features", 3520 | "indexmap", 3521 | "log", 3522 | "naga", 3523 | "once_cell", 3524 | "parking_lot", 3525 | "profiling", 3526 | "raw-window-handle", 3527 | "rustc-hash", 3528 | "smallvec", 3529 | "thiserror", 3530 | "wgpu-hal", 3531 | "wgpu-types", 3532 | ] 3533 | 3534 | [[package]] 3535 | name = "wgpu-hal" 3536 | version = "23.0.1" 3537 | source = "registry+https://github.com/rust-lang/crates.io-index" 3538 | checksum = "89364b8a0b211adc7b16aeaf1bd5ad4a919c1154b44c9ce27838213ba05fd821" 3539 | dependencies = [ 3540 | "android_system_properties", 3541 | "arrayvec", 3542 | "ash", 3543 | "bitflags 2.6.0", 3544 | "bytemuck", 3545 | "cfg_aliases 0.1.1", 3546 | "core-graphics-types", 3547 | "glow 0.14.2", 3548 | "glutin_wgl_sys", 3549 | "gpu-alloc", 3550 | "gpu-descriptor", 3551 | "js-sys", 3552 | "khronos-egl", 3553 | "libc", 3554 | "libloading", 3555 | "log", 3556 | "metal", 3557 | "naga", 3558 | "ndk-sys 0.5.0+25.2.9519653", 3559 | "objc", 3560 | "once_cell", 3561 | "parking_lot", 3562 | "profiling", 3563 | "raw-window-handle", 3564 | "renderdoc-sys", 3565 | "rustc-hash", 3566 | "smallvec", 3567 | "thiserror", 3568 | "wasm-bindgen", 3569 | "web-sys", 3570 | "wgpu-types", 3571 | "windows", 3572 | ] 3573 | 3574 | [[package]] 3575 | name = "wgpu-types" 3576 | version = "23.0.0" 3577 | source = "registry+https://github.com/rust-lang/crates.io-index" 3578 | checksum = "610f6ff27778148c31093f3b03abc4840f9636d58d597ca2f5977433acfe0068" 3579 | dependencies = [ 3580 | "bitflags 2.6.0", 3581 | "js-sys", 3582 | "web-sys", 3583 | ] 3584 | 3585 | [[package]] 3586 | name = "winapi" 3587 | version = "0.3.9" 3588 | source = "registry+https://github.com/rust-lang/crates.io-index" 3589 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 3590 | dependencies = [ 3591 | "winapi-i686-pc-windows-gnu", 3592 | "winapi-x86_64-pc-windows-gnu", 3593 | ] 3594 | 3595 | [[package]] 3596 | name = "winapi-i686-pc-windows-gnu" 3597 | version = "0.4.0" 3598 | source = "registry+https://github.com/rust-lang/crates.io-index" 3599 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 3600 | 3601 | [[package]] 3602 | name = "winapi-util" 3603 | version = "0.1.9" 3604 | source = "registry+https://github.com/rust-lang/crates.io-index" 3605 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 3606 | dependencies = [ 3607 | "windows-sys 0.59.0", 3608 | ] 3609 | 3610 | [[package]] 3611 | name = "winapi-x86_64-pc-windows-gnu" 3612 | version = "0.4.0" 3613 | source = "registry+https://github.com/rust-lang/crates.io-index" 3614 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 3615 | 3616 | [[package]] 3617 | name = "windows" 3618 | version = "0.58.0" 3619 | source = "registry+https://github.com/rust-lang/crates.io-index" 3620 | checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" 3621 | dependencies = [ 3622 | "windows-core", 3623 | "windows-targets 0.52.6", 3624 | ] 3625 | 3626 | [[package]] 3627 | name = "windows-core" 3628 | version = "0.58.0" 3629 | source = "registry+https://github.com/rust-lang/crates.io-index" 3630 | checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" 3631 | dependencies = [ 3632 | "windows-implement", 3633 | "windows-interface", 3634 | "windows-result", 3635 | "windows-strings", 3636 | "windows-targets 0.52.6", 3637 | ] 3638 | 3639 | [[package]] 3640 | name = "windows-implement" 3641 | version = "0.58.0" 3642 | source = "registry+https://github.com/rust-lang/crates.io-index" 3643 | checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" 3644 | dependencies = [ 3645 | "proc-macro2", 3646 | "quote", 3647 | "syn", 3648 | ] 3649 | 3650 | [[package]] 3651 | name = "windows-interface" 3652 | version = "0.58.0" 3653 | source = "registry+https://github.com/rust-lang/crates.io-index" 3654 | checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" 3655 | dependencies = [ 3656 | "proc-macro2", 3657 | "quote", 3658 | "syn", 3659 | ] 3660 | 3661 | [[package]] 3662 | name = "windows-result" 3663 | version = "0.2.0" 3664 | source = "registry+https://github.com/rust-lang/crates.io-index" 3665 | checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" 3666 | dependencies = [ 3667 | "windows-targets 0.52.6", 3668 | ] 3669 | 3670 | [[package]] 3671 | name = "windows-strings" 3672 | version = "0.1.0" 3673 | source = "registry+https://github.com/rust-lang/crates.io-index" 3674 | checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" 3675 | dependencies = [ 3676 | "windows-result", 3677 | "windows-targets 0.52.6", 3678 | ] 3679 | 3680 | [[package]] 3681 | name = "windows-sys" 3682 | version = "0.45.0" 3683 | source = "registry+https://github.com/rust-lang/crates.io-index" 3684 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 3685 | dependencies = [ 3686 | "windows-targets 0.42.2", 3687 | ] 3688 | 3689 | [[package]] 3690 | name = "windows-sys" 3691 | version = "0.48.0" 3692 | source = "registry+https://github.com/rust-lang/crates.io-index" 3693 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 3694 | dependencies = [ 3695 | "windows-targets 0.48.5", 3696 | ] 3697 | 3698 | [[package]] 3699 | name = "windows-sys" 3700 | version = "0.52.0" 3701 | source = "registry+https://github.com/rust-lang/crates.io-index" 3702 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 3703 | dependencies = [ 3704 | "windows-targets 0.52.6", 3705 | ] 3706 | 3707 | [[package]] 3708 | name = "windows-sys" 3709 | version = "0.59.0" 3710 | source = "registry+https://github.com/rust-lang/crates.io-index" 3711 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 3712 | dependencies = [ 3713 | "windows-targets 0.52.6", 3714 | ] 3715 | 3716 | [[package]] 3717 | name = "windows-targets" 3718 | version = "0.42.2" 3719 | source = "registry+https://github.com/rust-lang/crates.io-index" 3720 | checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 3721 | dependencies = [ 3722 | "windows_aarch64_gnullvm 0.42.2", 3723 | "windows_aarch64_msvc 0.42.2", 3724 | "windows_i686_gnu 0.42.2", 3725 | "windows_i686_msvc 0.42.2", 3726 | "windows_x86_64_gnu 0.42.2", 3727 | "windows_x86_64_gnullvm 0.42.2", 3728 | "windows_x86_64_msvc 0.42.2", 3729 | ] 3730 | 3731 | [[package]] 3732 | name = "windows-targets" 3733 | version = "0.48.5" 3734 | source = "registry+https://github.com/rust-lang/crates.io-index" 3735 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 3736 | dependencies = [ 3737 | "windows_aarch64_gnullvm 0.48.5", 3738 | "windows_aarch64_msvc 0.48.5", 3739 | "windows_i686_gnu 0.48.5", 3740 | "windows_i686_msvc 0.48.5", 3741 | "windows_x86_64_gnu 0.48.5", 3742 | "windows_x86_64_gnullvm 0.48.5", 3743 | "windows_x86_64_msvc 0.48.5", 3744 | ] 3745 | 3746 | [[package]] 3747 | name = "windows-targets" 3748 | version = "0.52.6" 3749 | source = "registry+https://github.com/rust-lang/crates.io-index" 3750 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 3751 | dependencies = [ 3752 | "windows_aarch64_gnullvm 0.52.6", 3753 | "windows_aarch64_msvc 0.52.6", 3754 | "windows_i686_gnu 0.52.6", 3755 | "windows_i686_gnullvm", 3756 | "windows_i686_msvc 0.52.6", 3757 | "windows_x86_64_gnu 0.52.6", 3758 | "windows_x86_64_gnullvm 0.52.6", 3759 | "windows_x86_64_msvc 0.52.6", 3760 | ] 3761 | 3762 | [[package]] 3763 | name = "windows_aarch64_gnullvm" 3764 | version = "0.42.2" 3765 | source = "registry+https://github.com/rust-lang/crates.io-index" 3766 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 3767 | 3768 | [[package]] 3769 | name = "windows_aarch64_gnullvm" 3770 | version = "0.48.5" 3771 | source = "registry+https://github.com/rust-lang/crates.io-index" 3772 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 3773 | 3774 | [[package]] 3775 | name = "windows_aarch64_gnullvm" 3776 | version = "0.52.6" 3777 | source = "registry+https://github.com/rust-lang/crates.io-index" 3778 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 3779 | 3780 | [[package]] 3781 | name = "windows_aarch64_msvc" 3782 | version = "0.42.2" 3783 | source = "registry+https://github.com/rust-lang/crates.io-index" 3784 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 3785 | 3786 | [[package]] 3787 | name = "windows_aarch64_msvc" 3788 | version = "0.48.5" 3789 | source = "registry+https://github.com/rust-lang/crates.io-index" 3790 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 3791 | 3792 | [[package]] 3793 | name = "windows_aarch64_msvc" 3794 | version = "0.52.6" 3795 | source = "registry+https://github.com/rust-lang/crates.io-index" 3796 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 3797 | 3798 | [[package]] 3799 | name = "windows_i686_gnu" 3800 | version = "0.42.2" 3801 | source = "registry+https://github.com/rust-lang/crates.io-index" 3802 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 3803 | 3804 | [[package]] 3805 | name = "windows_i686_gnu" 3806 | version = "0.48.5" 3807 | source = "registry+https://github.com/rust-lang/crates.io-index" 3808 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 3809 | 3810 | [[package]] 3811 | name = "windows_i686_gnu" 3812 | version = "0.52.6" 3813 | source = "registry+https://github.com/rust-lang/crates.io-index" 3814 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 3815 | 3816 | [[package]] 3817 | name = "windows_i686_gnullvm" 3818 | version = "0.52.6" 3819 | source = "registry+https://github.com/rust-lang/crates.io-index" 3820 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 3821 | 3822 | [[package]] 3823 | name = "windows_i686_msvc" 3824 | version = "0.42.2" 3825 | source = "registry+https://github.com/rust-lang/crates.io-index" 3826 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 3827 | 3828 | [[package]] 3829 | name = "windows_i686_msvc" 3830 | version = "0.48.5" 3831 | source = "registry+https://github.com/rust-lang/crates.io-index" 3832 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 3833 | 3834 | [[package]] 3835 | name = "windows_i686_msvc" 3836 | version = "0.52.6" 3837 | source = "registry+https://github.com/rust-lang/crates.io-index" 3838 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 3839 | 3840 | [[package]] 3841 | name = "windows_x86_64_gnu" 3842 | version = "0.42.2" 3843 | source = "registry+https://github.com/rust-lang/crates.io-index" 3844 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 3845 | 3846 | [[package]] 3847 | name = "windows_x86_64_gnu" 3848 | version = "0.48.5" 3849 | source = "registry+https://github.com/rust-lang/crates.io-index" 3850 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 3851 | 3852 | [[package]] 3853 | name = "windows_x86_64_gnu" 3854 | version = "0.52.6" 3855 | source = "registry+https://github.com/rust-lang/crates.io-index" 3856 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 3857 | 3858 | [[package]] 3859 | name = "windows_x86_64_gnullvm" 3860 | version = "0.42.2" 3861 | source = "registry+https://github.com/rust-lang/crates.io-index" 3862 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 3863 | 3864 | [[package]] 3865 | name = "windows_x86_64_gnullvm" 3866 | version = "0.48.5" 3867 | source = "registry+https://github.com/rust-lang/crates.io-index" 3868 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 3869 | 3870 | [[package]] 3871 | name = "windows_x86_64_gnullvm" 3872 | version = "0.52.6" 3873 | source = "registry+https://github.com/rust-lang/crates.io-index" 3874 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 3875 | 3876 | [[package]] 3877 | name = "windows_x86_64_msvc" 3878 | version = "0.42.2" 3879 | source = "registry+https://github.com/rust-lang/crates.io-index" 3880 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 3881 | 3882 | [[package]] 3883 | name = "windows_x86_64_msvc" 3884 | version = "0.48.5" 3885 | source = "registry+https://github.com/rust-lang/crates.io-index" 3886 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 3887 | 3888 | [[package]] 3889 | name = "windows_x86_64_msvc" 3890 | version = "0.52.6" 3891 | source = "registry+https://github.com/rust-lang/crates.io-index" 3892 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 3893 | 3894 | [[package]] 3895 | name = "winit" 3896 | version = "0.30.5" 3897 | source = "registry+https://github.com/rust-lang/crates.io-index" 3898 | checksum = "0be9e76a1f1077e04a411f0b989cbd3c93339e1771cb41e71ac4aee95bfd2c67" 3899 | dependencies = [ 3900 | "ahash", 3901 | "android-activity", 3902 | "atomic-waker", 3903 | "bitflags 2.6.0", 3904 | "block2", 3905 | "bytemuck", 3906 | "calloop", 3907 | "cfg_aliases 0.2.1", 3908 | "concurrent-queue", 3909 | "core-foundation 0.9.4", 3910 | "core-graphics", 3911 | "cursor-icon", 3912 | "dpi", 3913 | "js-sys", 3914 | "libc", 3915 | "memmap2", 3916 | "ndk", 3917 | "objc2", 3918 | "objc2-app-kit", 3919 | "objc2-foundation", 3920 | "objc2-ui-kit", 3921 | "orbclient", 3922 | "percent-encoding", 3923 | "pin-project", 3924 | "raw-window-handle", 3925 | "redox_syscall 0.4.1", 3926 | "rustix", 3927 | "sctk-adwaita", 3928 | "smithay-client-toolkit", 3929 | "smol_str", 3930 | "tracing", 3931 | "unicode-segmentation", 3932 | "wasm-bindgen", 3933 | "wasm-bindgen-futures", 3934 | "wayland-backend", 3935 | "wayland-client", 3936 | "wayland-protocols", 3937 | "wayland-protocols-plasma", 3938 | "web-sys", 3939 | "web-time", 3940 | "windows-sys 0.52.0", 3941 | "x11-dl", 3942 | "x11rb", 3943 | "xkbcommon-dl", 3944 | ] 3945 | 3946 | [[package]] 3947 | name = "winnow" 3948 | version = "0.6.20" 3949 | source = "registry+https://github.com/rust-lang/crates.io-index" 3950 | checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" 3951 | dependencies = [ 3952 | "memchr", 3953 | ] 3954 | 3955 | [[package]] 3956 | name = "write16" 3957 | version = "1.0.0" 3958 | source = "registry+https://github.com/rust-lang/crates.io-index" 3959 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 3960 | 3961 | [[package]] 3962 | name = "writeable" 3963 | version = "0.5.5" 3964 | source = "registry+https://github.com/rust-lang/crates.io-index" 3965 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 3966 | 3967 | [[package]] 3968 | name = "x11-dl" 3969 | version = "2.21.0" 3970 | source = "registry+https://github.com/rust-lang/crates.io-index" 3971 | checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" 3972 | dependencies = [ 3973 | "libc", 3974 | "once_cell", 3975 | "pkg-config", 3976 | ] 3977 | 3978 | [[package]] 3979 | name = "x11rb" 3980 | version = "0.13.1" 3981 | source = "registry+https://github.com/rust-lang/crates.io-index" 3982 | checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" 3983 | dependencies = [ 3984 | "as-raw-xcb-connection", 3985 | "gethostname", 3986 | "libc", 3987 | "libloading", 3988 | "once_cell", 3989 | "rustix", 3990 | "x11rb-protocol", 3991 | ] 3992 | 3993 | [[package]] 3994 | name = "x11rb-protocol" 3995 | version = "0.13.1" 3996 | source = "registry+https://github.com/rust-lang/crates.io-index" 3997 | checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" 3998 | 3999 | [[package]] 4000 | name = "xcursor" 4001 | version = "0.3.8" 4002 | source = "registry+https://github.com/rust-lang/crates.io-index" 4003 | checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" 4004 | 4005 | [[package]] 4006 | name = "xdg-home" 4007 | version = "1.3.0" 4008 | source = "registry+https://github.com/rust-lang/crates.io-index" 4009 | checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" 4010 | dependencies = [ 4011 | "libc", 4012 | "windows-sys 0.59.0", 4013 | ] 4014 | 4015 | [[package]] 4016 | name = "xkbcommon-dl" 4017 | version = "0.4.2" 4018 | source = "registry+https://github.com/rust-lang/crates.io-index" 4019 | checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" 4020 | dependencies = [ 4021 | "bitflags 2.6.0", 4022 | "dlib", 4023 | "log", 4024 | "once_cell", 4025 | "xkeysym", 4026 | ] 4027 | 4028 | [[package]] 4029 | name = "xkeysym" 4030 | version = "0.2.1" 4031 | source = "registry+https://github.com/rust-lang/crates.io-index" 4032 | checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" 4033 | 4034 | [[package]] 4035 | name = "xml-rs" 4036 | version = "0.8.24" 4037 | source = "registry+https://github.com/rust-lang/crates.io-index" 4038 | checksum = "ea8b391c9a790b496184c29f7f93b9ed5b16abb306c05415b68bcc16e4d06432" 4039 | 4040 | [[package]] 4041 | name = "yoke" 4042 | version = "0.7.5" 4043 | source = "registry+https://github.com/rust-lang/crates.io-index" 4044 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 4045 | dependencies = [ 4046 | "serde", 4047 | "stable_deref_trait", 4048 | "yoke-derive", 4049 | "zerofrom", 4050 | ] 4051 | 4052 | [[package]] 4053 | name = "yoke-derive" 4054 | version = "0.7.5" 4055 | source = "registry+https://github.com/rust-lang/crates.io-index" 4056 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 4057 | dependencies = [ 4058 | "proc-macro2", 4059 | "quote", 4060 | "syn", 4061 | "synstructure", 4062 | ] 4063 | 4064 | [[package]] 4065 | name = "zbus" 4066 | version = "4.4.0" 4067 | source = "registry+https://github.com/rust-lang/crates.io-index" 4068 | checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" 4069 | dependencies = [ 4070 | "async-broadcast", 4071 | "async-executor", 4072 | "async-fs", 4073 | "async-io", 4074 | "async-lock", 4075 | "async-process", 4076 | "async-recursion", 4077 | "async-task", 4078 | "async-trait", 4079 | "blocking", 4080 | "enumflags2", 4081 | "event-listener", 4082 | "futures-core", 4083 | "futures-sink", 4084 | "futures-util", 4085 | "hex", 4086 | "nix", 4087 | "ordered-stream", 4088 | "rand", 4089 | "serde", 4090 | "serde_repr", 4091 | "sha1", 4092 | "static_assertions", 4093 | "tracing", 4094 | "uds_windows", 4095 | "windows-sys 0.52.0", 4096 | "xdg-home", 4097 | "zbus_macros", 4098 | "zbus_names", 4099 | "zvariant", 4100 | ] 4101 | 4102 | [[package]] 4103 | name = "zbus-lockstep" 4104 | version = "0.4.4" 4105 | source = "registry+https://github.com/rust-lang/crates.io-index" 4106 | checksum = "4ca2c5dceb099bddaade154055c926bb8ae507a18756ba1d8963fd7b51d8ed1d" 4107 | dependencies = [ 4108 | "zbus_xml", 4109 | "zvariant", 4110 | ] 4111 | 4112 | [[package]] 4113 | name = "zbus-lockstep-macros" 4114 | version = "0.4.4" 4115 | source = "registry+https://github.com/rust-lang/crates.io-index" 4116 | checksum = "709ab20fc57cb22af85be7b360239563209258430bccf38d8b979c5a2ae3ecce" 4117 | dependencies = [ 4118 | "proc-macro2", 4119 | "quote", 4120 | "syn", 4121 | "zbus-lockstep", 4122 | "zbus_xml", 4123 | "zvariant", 4124 | ] 4125 | 4126 | [[package]] 4127 | name = "zbus_macros" 4128 | version = "4.4.0" 4129 | source = "registry+https://github.com/rust-lang/crates.io-index" 4130 | checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" 4131 | dependencies = [ 4132 | "proc-macro-crate", 4133 | "proc-macro2", 4134 | "quote", 4135 | "syn", 4136 | "zvariant_utils", 4137 | ] 4138 | 4139 | [[package]] 4140 | name = "zbus_names" 4141 | version = "3.0.0" 4142 | source = "registry+https://github.com/rust-lang/crates.io-index" 4143 | checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" 4144 | dependencies = [ 4145 | "serde", 4146 | "static_assertions", 4147 | "zvariant", 4148 | ] 4149 | 4150 | [[package]] 4151 | name = "zbus_xml" 4152 | version = "4.0.0" 4153 | source = "registry+https://github.com/rust-lang/crates.io-index" 4154 | checksum = "ab3f374552b954f6abb4bd6ce979e6c9b38fb9d0cd7cc68a7d796e70c9f3a233" 4155 | dependencies = [ 4156 | "quick-xml 0.30.0", 4157 | "serde", 4158 | "static_assertions", 4159 | "zbus_names", 4160 | "zvariant", 4161 | ] 4162 | 4163 | [[package]] 4164 | name = "zerocopy" 4165 | version = "0.7.35" 4166 | source = "registry+https://github.com/rust-lang/crates.io-index" 4167 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 4168 | dependencies = [ 4169 | "byteorder", 4170 | "zerocopy-derive", 4171 | ] 4172 | 4173 | [[package]] 4174 | name = "zerocopy-derive" 4175 | version = "0.7.35" 4176 | source = "registry+https://github.com/rust-lang/crates.io-index" 4177 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 4178 | dependencies = [ 4179 | "proc-macro2", 4180 | "quote", 4181 | "syn", 4182 | ] 4183 | 4184 | [[package]] 4185 | name = "zerofrom" 4186 | version = "0.1.5" 4187 | source = "registry+https://github.com/rust-lang/crates.io-index" 4188 | checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" 4189 | dependencies = [ 4190 | "zerofrom-derive", 4191 | ] 4192 | 4193 | [[package]] 4194 | name = "zerofrom-derive" 4195 | version = "0.1.5" 4196 | source = "registry+https://github.com/rust-lang/crates.io-index" 4197 | checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" 4198 | dependencies = [ 4199 | "proc-macro2", 4200 | "quote", 4201 | "syn", 4202 | "synstructure", 4203 | ] 4204 | 4205 | [[package]] 4206 | name = "zerovec" 4207 | version = "0.10.4" 4208 | source = "registry+https://github.com/rust-lang/crates.io-index" 4209 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 4210 | dependencies = [ 4211 | "yoke", 4212 | "zerofrom", 4213 | "zerovec-derive", 4214 | ] 4215 | 4216 | [[package]] 4217 | name = "zerovec-derive" 4218 | version = "0.10.3" 4219 | source = "registry+https://github.com/rust-lang/crates.io-index" 4220 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 4221 | dependencies = [ 4222 | "proc-macro2", 4223 | "quote", 4224 | "syn", 4225 | ] 4226 | 4227 | [[package]] 4228 | name = "zune-inflate" 4229 | version = "0.2.54" 4230 | source = "registry+https://github.com/rust-lang/crates.io-index" 4231 | checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" 4232 | dependencies = [ 4233 | "simd-adler32", 4234 | ] 4235 | 4236 | [[package]] 4237 | name = "zvariant" 4238 | version = "4.2.0" 4239 | source = "registry+https://github.com/rust-lang/crates.io-index" 4240 | checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" 4241 | dependencies = [ 4242 | "endi", 4243 | "enumflags2", 4244 | "serde", 4245 | "static_assertions", 4246 | "zvariant_derive", 4247 | ] 4248 | 4249 | [[package]] 4250 | name = "zvariant_derive" 4251 | version = "4.2.0" 4252 | source = "registry+https://github.com/rust-lang/crates.io-index" 4253 | checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" 4254 | dependencies = [ 4255 | "proc-macro-crate", 4256 | "proc-macro2", 4257 | "quote", 4258 | "syn", 4259 | "zvariant_utils", 4260 | ] 4261 | 4262 | [[package]] 4263 | name = "zvariant_utils" 4264 | version = "2.1.0" 4265 | source = "registry+https://github.com/rust-lang/crates.io-index" 4266 | checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" 4267 | dependencies = [ 4268 | "proc-macro2", 4269 | "quote", 4270 | "syn", 4271 | ] 4272 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "apt-decoder" 3 | version = "1.0.1" 4 | authors = ["Sebastian "] 5 | 6 | [dependencies] 7 | clap = {version = "4.5", features = ["cargo"]} 8 | indicatif = "0.17" 9 | hound = "3.5" 10 | image = "0.24" 11 | eframe = {version = "0.30", optional = true} 12 | rfd = {version = "0.15", default-features = false, features = ["gtk3"]} 13 | thiserror = "1" 14 | 15 | 16 | [features] 17 | # Defines a feature named `webp` that does not enable any other features. 18 | default = ["ui"] 19 | ui = ["eframe"] 20 | -------------------------------------------------------------------------------- /example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LongHairedHacker/apt-decoder/f3e3f0856f2bfc1262832f40ad63add02ae53134/example.png -------------------------------------------------------------------------------- /flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LongHairedHacker/apt-decoder/f3e3f0856f2bfc1262832f40ad63add02ae53134/flow.png -------------------------------------------------------------------------------- /gui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LongHairedHacker/apt-decoder/f3e3f0856f2bfc1262832f40ad63add02ae53134/gui.png -------------------------------------------------------------------------------- /noaa19_short.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LongHairedHacker/apt-decoder/f3e3f0856f2bfc1262832f40ad63add02ae53134/noaa19_short.png -------------------------------------------------------------------------------- /noaa19_short.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LongHairedHacker/apt-decoder/f3e3f0856f2bfc1262832f40ad63add02ae53134/noaa19_short.wav -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | apt-decoder 2 | =========== 3 | A simple tool for decoding the Automatic Picture Transmissions broadcasted 4 | by the **NOAA Weather satellites** to PNG files. 5 | 6 | Existing tools like WxToImg or atp-dect are either not open source or no longer maintained 7 | and unnecessarily complex. 8 | apt-decoder provides a lightweight, simple to use and easy to understand solution. 9 | 10 | ![short sample](noaa19_short.png) 11 | 12 | Releases 13 | -------- 14 | You can download the latest release as a standalone binary, 15 | for linux (appimage) and windows (just a statically linked exe file) under 16 | https://gitea.zenerdio.de/sebastian/apt-decoder/releases 17 | 18 | Building 19 | -------- 20 | 1. Install the development packages for `libgtk3` and `libxcb` for your distro. 21 | E.g. for anything Debian based: 22 | `sudo apt install libgtk-3-dev libxcb-shape0-dev libxcb-xfixes0-dev` 23 | 2. Install the rust compiler and cargo. 24 | E.g. using rustup (Try installing rustup using your package manager, 25 | don't use the stupid `curl | sh` stuff.) 26 | 3. Run `cargo build --release` 27 | 4. The `apt-decoder` binary is in `target/release` 28 | 5. Done 29 | 30 | The default build will build a binary that contains, 31 | both the GUI and the CLI version of the tool. 32 | If you need something more lightweight (with no external dependencies), 33 | it is also possible to build a pure-rust CLI-only version, 34 | using `cargo build --release --no-default-features`. 35 | 36 | Usage 37 | ----- 38 | 1. Save a received and FM-demodulated satellite signal as WAV-file. 39 | The WAV file has to be **mono**, **48kHz** and **32bit float**. 40 | When in doubt you can use audacity to convert your file into this format. 41 | 2. To run `apt-decoder` in GUI mode just execute the binary. 42 | For CLI mode use the `-n` flag: 43 | `apt-decoder -n ` 44 | For testing you can try the example contained in this repo: 45 | `apt-decoder -n noaa19_short.wav noaa19_short.png` 46 | 3. Look at the generated PNG file, adjust the dynamic and contrast with your favorite tool. 47 | 4. Done 48 | 49 | ![gui example](gui.png) 50 | 51 | ![long sample](example.png) 52 | 53 | Theory of Operation 54 | ------------------- 55 | ![flowgraph](flow.png) 56 | 57 | The AM-data from the WAV files is decoded using a simple square law demodulator. 58 | Squaring the input signals yields the square of the original signal 59 | and sideband with the twice the carrier frequency. 60 | 61 | Computing the square root of the signal does not change its frequency spectrum, 62 | but restores the amplitude of the original signal part. 63 | The square root function is usually frowned upon in literature about signal processing, 64 | as it is rather complex to implement on traditional DSP architectures. 65 | In contrast to that ALUs in modern x86 or ARM CPUs can computer the square root efficiently, 66 | so there is no harm in taking a shortcut here. 67 | 68 | A lowpass then gets rid of the higher sideband, leaving only the demodulated original signal. 69 | 70 | Afterwards the signal is sampled down to 4160kHz, 71 | as original signal contains 4160 pixels per line. 72 | For additional efficiency the upsampler inserts zeros into the input signal instead 73 | of actually interpolating the missing samples. 74 | This works because the downsampler following afterwards works by computing the average 75 | over a number of samples and therefore acts as a low pass. 76 | 77 | Finally a line syncer module looks for the **sync A** and **sync B** patterns to add 78 | line sync information to the signal, which can then be written out into a PNG file. 79 | 80 | Questions 81 | --------- 82 | Feel free to write emails to sebastian(a)sebastians-site.de 83 | 84 | Alternatively you can try [twitter](https://twitter.com/l_h_hacker), [mastodon](https://chaos.social/@sebastian) or *sebastian* on *hackint*. 85 | -------------------------------------------------------------------------------- /src/amdemod.rs: -------------------------------------------------------------------------------- 1 | pub struct SquaringAMDemodulator<'a> { 2 | iterator: Box + 'a>, 3 | } 4 | 5 | impl<'a> SquaringAMDemodulator<'a> { 6 | pub fn from(iterator1: I) -> SquaringAMDemodulator<'a> 7 | where 8 | I: Iterator + 'a, 9 | { 10 | SquaringAMDemodulator { 11 | iterator: Box::new(iterator1), 12 | } 13 | } 14 | } 15 | 16 | impl<'a> Iterator for SquaringAMDemodulator<'a> { 17 | type Item = f32; 18 | 19 | fn next(&mut self) -> Option { 20 | match self.iterator.next() { 21 | Some(x) => Some((x * x).sqrt()), 22 | None => None, 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/aptsyncer.rs: -------------------------------------------------------------------------------- 1 | const SYNC_LENGHT: usize = 40; 2 | const SYNCA_SEQ: [bool; 40] = [ 3 | false, false, false, false, true, true, false, false, // Pulse 1 4 | true, true, false, false, // Pulse 2 5 | true, true, false, false, // Pulse 3 6 | true, true, false, false, // Pulse 4 7 | true, true, false, false, // Pulse 5 8 | true, true, false, false, // Pulse 6 9 | true, true, false, false, // Pulse 7 10 | false, false, false, false, false, false, false, false, 11 | ]; 12 | 13 | const SYNCB_SEQ: [bool; 40] = [ 14 | false, false, false, false, true, true, true, false, false, true, true, true, false, false, 15 | true, true, true, false, false, true, true, true, false, false, true, true, true, false, false, 16 | true, true, true, false, false, true, true, true, false, false, false, 17 | ]; 18 | 19 | pub enum SyncedSample { 20 | Sample(f32), 21 | SyncA(f32), 22 | SyncB(f32), 23 | } 24 | 25 | pub struct APTSyncer<'a> { 26 | state: [f32; SYNC_LENGHT], 27 | pos: usize, 28 | nones_read: usize, 29 | avg_level: f32, 30 | iterator: Box + 'a>, 31 | } 32 | 33 | impl<'a> APTSyncer<'a> { 34 | pub fn from(mut iterator: I) -> APTSyncer<'a> 35 | where 36 | I: Iterator + 'a, 37 | { 38 | let mut state = [0.0; SYNC_LENGHT]; 39 | let mut avg_level = 0.5; 40 | for i in 0..SYNC_LENGHT { 41 | match iterator.next() { 42 | Some(x) => { 43 | state[i] = x; 44 | avg_level = 0.25 * x + avg_level * 0.75; 45 | } 46 | None => panic!("Could not retrieve enough samples to prime syncer"), 47 | } 48 | } 49 | 50 | APTSyncer { 51 | state, 52 | pos: 0, 53 | nones_read: 0, 54 | avg_level, 55 | iterator: Box::new(iterator), 56 | } 57 | } 58 | 59 | fn is_marker(&mut self) -> (bool, bool) { 60 | let mut count_a = 0; 61 | let mut count_b = 0; 62 | 63 | for i in 0..SYNC_LENGHT { 64 | let sync_pos = (self.pos + i) % SYNC_LENGHT; 65 | let sample = self.state[sync_pos] / (self.avg_level * 2.0); 66 | if (sample > 0.5 && SYNCA_SEQ[i]) || (sample <= 0.5 && !SYNCA_SEQ[i]) { 67 | count_a += 1; 68 | } 69 | if (sample > 0.5 && SYNCB_SEQ[i]) || (sample <= 0.5 && !SYNCB_SEQ[i]) { 70 | count_b += 1; 71 | } 72 | 73 | /* 74 | if !count_a && !count_b { 75 | break; 76 | } 77 | */ 78 | } 79 | 80 | return (count_a > 35, count_b > 35); 81 | } 82 | } 83 | 84 | impl<'a> Iterator for APTSyncer<'a> { 85 | type Item = SyncedSample; 86 | 87 | fn next(&mut self) -> Option { 88 | let (is_a, is_b) = self.is_marker(); 89 | 90 | let sample = self.state[self.pos]; 91 | match self.iterator.next() { 92 | Some(x) => { 93 | self.state[self.pos] = x; 94 | self.avg_level = 0.25 * x + self.avg_level * 0.75; 95 | } 96 | None => self.nones_read += 1, 97 | }; 98 | 99 | if self.nones_read >= SYNC_LENGHT { 100 | return None; 101 | } 102 | 103 | self.pos = (self.pos + 1) % SYNC_LENGHT; 104 | 105 | if is_a { 106 | return Some(SyncedSample::SyncA(sample)); 107 | } else if is_b { 108 | return Some(SyncedSample::SyncB(sample)); 109 | } else { 110 | return Some(SyncedSample::Sample(sample)); 111 | } 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /src/cli.rs: -------------------------------------------------------------------------------- 1 | use indicatif::{ProgressBar, ProgressStyle}; 2 | 3 | use decoder; 4 | 5 | const STEPS: u64 = 100; 6 | 7 | pub fn decode(input_path: &str, output_path: &str) { 8 | println!("Decoding {} to {}", input_path, output_path); 9 | 10 | let bar = ProgressBar::new(STEPS).with_style( 11 | ProgressStyle::default_bar() 12 | .template("{spinner:.green} [{wide_bar}] {percent}% ({eta})") 13 | .unwrap() 14 | .progress_chars("=> "), 15 | ); 16 | let res = decoder::decode(input_path, output_path, |progress, _| { 17 | bar.set_position((progress * STEPS as f32) as u64); 18 | (true, STEPS as u32) 19 | }); 20 | bar.finish(); 21 | 22 | if let Err(error) = res { 23 | println!("Unable to decode file: {}", error); 24 | } else { 25 | println!("Done!") 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/decoder.rs: -------------------------------------------------------------------------------- 1 | use std::path::Path; 2 | 3 | use amdemod::SquaringAMDemodulator; 4 | use aptsyncer::{APTSyncer, SyncedSample}; 5 | use errors::DecoderError; 6 | use firfilter::FIRFilter; 7 | use resamplers::{Downsampler, Upsampler}; 8 | use utils::float_sample_iterator; 9 | 10 | const LINES_PER_SECOND: u32 = 2; 11 | const PIXELS_PER_LINE: u32 = 2080; 12 | 13 | const LOWPASS_COEFFS: [f32; 63] = [ 14 | -7.383784e-03, 15 | -3.183046e-03, 16 | 2.255039e-03, 17 | 7.461166e-03, 18 | 1.091908e-02, 19 | 1.149109e-02, 20 | 8.769802e-03, 21 | 3.252932e-03, 22 | -3.720606e-03, 23 | -1.027446e-02, 24 | -1.447403e-02, 25 | -1.486427e-02, 26 | -1.092423e-02, 27 | -3.307958e-03, 28 | 6.212477e-03, 29 | 1.511364e-02, 30 | 2.072873e-02, 31 | 2.096037e-02, 32 | 1.492345e-02, 33 | 3.347624e-03, 34 | -1.138407e-02, 35 | -2.560252e-02, 36 | -3.507114e-02, 37 | -3.591225e-02, 38 | -2.553830e-02, 39 | -3.371569e-03, 40 | 2.882645e-02, 41 | 6.711368e-02, 42 | 1.060042e-01, 43 | 1.394643e-01, 44 | 1.620650e-01, 45 | 1.700462e-01, 46 | 1.620650e-01, 47 | 1.394643e-01, 48 | 1.060042e-01, 49 | 6.711368e-02, 50 | 2.882645e-02, 51 | -3.371569e-03, 52 | -2.553830e-02, 53 | -3.591225e-02, 54 | -3.507114e-02, 55 | -2.560252e-02, 56 | -1.138407e-02, 57 | 3.347624e-03, 58 | 1.492345e-02, 59 | 2.096037e-02, 60 | 2.072873e-02, 61 | 1.511364e-02, 62 | 6.212477e-03, 63 | -3.307958e-03, 64 | -1.092423e-02, 65 | -1.486427e-02, 66 | -1.447403e-02, 67 | -1.027446e-02, 68 | -3.720606e-03, 69 | 3.252932e-03, 70 | 8.769802e-03, 71 | 1.149109e-02, 72 | 1.091908e-02, 73 | 7.461166e-03, 74 | 2.255039e-03, 75 | -3.183046e-03, 76 | -7.383784e-03, 77 | ]; 78 | 79 | pub fn decode( 80 | input_file: &str, 81 | output_file: &str, 82 | progress_update: T, 83 | ) -> Result<(), DecoderError> 84 | where 85 | T: Fn(f32, image::RgbaImage) -> (bool, u32), 86 | { 87 | let mut reader = 88 | hound::WavReader::open(input_file).map_err(|err| DecoderError::InputFileError(err))?; 89 | 90 | if reader.spec().channels != 1 { 91 | panic!("Expected a mono file"); 92 | } 93 | 94 | let sample_rate = reader.spec().sample_rate; 95 | if sample_rate != 48000 { 96 | return Err(DecoderError::UnexpectedSamplingRate(sample_rate)); 97 | } 98 | 99 | let sample_count = reader.len(); 100 | let seconds = (sample_count as f32) / (sample_rate as f32); 101 | let lines = (seconds.ceil() as u32) * LINES_PER_SECOND; 102 | 103 | let mut img = image::DynamicImage::ImageLuma8(image::ImageBuffer::new(PIXELS_PER_LINE, lines)); 104 | 105 | let coeffs = &LOWPASS_COEFFS; 106 | 107 | let samples = float_sample_iterator(&mut reader); 108 | 109 | let demod = SquaringAMDemodulator::from(samples); 110 | let filter = FIRFilter::from(demod, coeffs); 111 | let upsampler = Upsampler::from(filter, 13); 112 | let downsampler = Downsampler::from(upsampler, 150); 113 | let syncer = APTSyncer::from(downsampler); 114 | 115 | let mut x = 0; 116 | let mut y = 0; 117 | let mut max_level = 0.0; 118 | let mut has_sync = false; 119 | 120 | let mut progress = 0; 121 | let pixel_count = sample_count * 13 / 150; 122 | let mut update_step = 10; 123 | 124 | let mut previous_sample = 0.0; 125 | 126 | for synced_sample in syncer { 127 | progress += 1; 128 | 129 | let sample = match synced_sample { 130 | SyncedSample::Sample(s) => s, 131 | SyncedSample::SyncA(s) => { 132 | if !has_sync { 133 | max_level = 0.0; 134 | has_sync = true; 135 | } 136 | x = 0; 137 | s 138 | } 139 | SyncedSample::SyncB(s) => { 140 | if x < (PIXELS_PER_LINE / 2) { 141 | let skip_distance = (PIXELS_PER_LINE / 2) - x; 142 | let color = (previous_sample / max_level * 255.0) as u8; 143 | for i in 0..skip_distance { 144 | img.as_mut_luma8() 145 | .unwrap() 146 | .put_pixel(x + i, y, image::Luma([color])); 147 | } 148 | } 149 | if !has_sync { 150 | max_level = 0.0; 151 | has_sync = true; 152 | } 153 | x = PIXELS_PER_LINE / 2; 154 | s 155 | } 156 | }; 157 | 158 | max_level = f32::max(sample, max_level); 159 | let color = (sample / max_level * 255.0) as u8; 160 | 161 | if y < lines { 162 | img.as_mut_luma8() 163 | .unwrap() 164 | .put_pixel(x, y, image::Luma([color])); 165 | } 166 | 167 | x += 1; 168 | if x >= PIXELS_PER_LINE { 169 | x = 0; 170 | y += 1; 171 | } 172 | 173 | previous_sample = sample; 174 | 175 | if progress % (PIXELS_PER_LINE * update_step) == 0 { 176 | let (cont, update_steps) = 177 | progress_update((progress as f32) / (pixel_count as f32), img.to_rgba8()); 178 | if !cont { 179 | return Ok(()); 180 | } 181 | 182 | let line_count = pixel_count / PIXELS_PER_LINE; 183 | update_step = if line_count / update_steps > 4 { 184 | line_count / update_steps 185 | } else { 186 | 4 187 | } 188 | } 189 | } 190 | 191 | progress_update(1.0, img.to_rgba8()); 192 | 193 | img.save_with_format(&Path::new(output_file), image::ImageFormat::Png) 194 | .map_err(|err| DecoderError::OutputFileError(err))?; 195 | 196 | Ok(()) 197 | } 198 | -------------------------------------------------------------------------------- /src/errors.rs: -------------------------------------------------------------------------------- 1 | use hound; 2 | use image; 3 | use thiserror::Error; 4 | 5 | #[derive(Error, Debug)] 6 | pub enum DecoderError { 7 | #[error("Unable to read input file: {0}")] 8 | InputFileError(#[from] hound::Error), 9 | 10 | #[error("Expected a sampling rate of 48000Hz not {0}Hz")] 11 | UnexpectedSamplingRate(u32), 12 | 13 | #[error("Unable to write output file: {0}")] 14 | OutputFileError(#[from] image::ImageError), 15 | } 16 | -------------------------------------------------------------------------------- /src/firfilter.rs: -------------------------------------------------------------------------------- 1 | pub struct FIRFilter<'a> { 2 | coeffs: &'a [f32], 3 | state: Vec, 4 | pos: usize, 5 | iterator: Box + 'a>, 6 | } 7 | 8 | impl<'a> FIRFilter<'a> { 9 | pub fn from(iterator: I, coeffs: &'a [f32]) -> FIRFilter<'a> 10 | where 11 | I: Iterator + 'a, 12 | { 13 | let mut state = Vec::new(); 14 | for _ in 0..coeffs.len() { 15 | state.push(0.0); 16 | } 17 | 18 | FIRFilter { 19 | coeffs, 20 | state, 21 | pos: 0, 22 | iterator: Box::new(iterator), 23 | } 24 | } 25 | } 26 | 27 | impl<'a> Iterator for FIRFilter<'a> { 28 | type Item = f32; 29 | 30 | fn next(&mut self) -> Option { 31 | let cur = match self.iterator.next() { 32 | Some(x) => x, 33 | None => return None, 34 | }; 35 | 36 | self.pos = (self.pos + 1) % self.coeffs.len(); 37 | self.state[self.pos] = cur; 38 | 39 | let mut result = 0.0; 40 | for i in 0..self.coeffs.len() { 41 | let pos = (self.pos + self.coeffs.len() - i) % self.coeffs.len(); 42 | result += self.state[pos] * self.coeffs[i]; 43 | } 44 | 45 | Some(result) 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #![windows_subsystem = "windows"] 2 | 3 | extern crate clap; 4 | extern crate hound; 5 | extern crate image; 6 | extern crate indicatif; 7 | extern crate rfd; 8 | extern crate thiserror; 9 | 10 | #[cfg(feature = "ui")] 11 | extern crate eframe; 12 | 13 | mod amdemod; 14 | mod aptsyncer; 15 | mod cli; 16 | mod decoder; 17 | mod errors; 18 | mod firfilter; 19 | mod resamplers; 20 | mod utils; 21 | 22 | use clap::{arg, command}; 23 | 24 | #[cfg(not(feature = "ui"))] 25 | fn main() { 26 | let matches = command!() 27 | .arg(arg!([wavfile] "Input wav file with 48kHz samplingrate").required(true)) 28 | .arg(arg!([pngfile] "Output png file").default_value("output.png")) 29 | .get_matches(); 30 | 31 | let input_file = matches 32 | .get_one::("wavfile") 33 | .expect("No input file given"); 34 | 35 | let output_file = matches 36 | .get_one::("pngfile") 37 | .expect("No output file given"); 38 | 39 | cli::decode(&input_file, &output_file); 40 | } 41 | 42 | #[cfg(feature = "ui")] 43 | mod ui; 44 | 45 | #[cfg(feature = "ui")] 46 | use ui::DecoderApp; 47 | 48 | #[cfg(feature = "ui")] 49 | fn main() { 50 | let matches = command!() 51 | .arg(arg!([wavfile] "Input wav file with 48kHz samplingrate").default_value("input.wav")) 52 | .arg(arg!([pngfile] "Output png file").default_value("output.png")) 53 | .arg(arg!(-n --nogui "Disable gui and run in command line mode")) 54 | .get_matches(); 55 | 56 | let input_file = matches 57 | .get_one::("wavfile") 58 | .expect("No input file given") 59 | .to_string(); 60 | let output_file = matches 61 | .get_one::("pngfile") 62 | .expect("No output file given") 63 | .to_string(); 64 | 65 | if matches.get_flag("nogui") { 66 | cli::decode(&input_file, &output_file); 67 | } else { 68 | let native_options = eframe::NativeOptions::default(); 69 | 70 | eframe::run_native( 71 | "APT-Decoder", 72 | native_options, 73 | Box::new(move |_cc| Ok(Box::new(DecoderApp::new(&input_file, &output_file)))), 74 | ) 75 | .unwrap(); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/resamplers.rs: -------------------------------------------------------------------------------- 1 | pub struct Upsampler<'a> { 2 | factor: u16, 3 | state: u16, 4 | iterator: Box + 'a>, 5 | } 6 | 7 | impl<'a> Upsampler<'a> { 8 | pub fn from(iterator: I, factor: u16) -> Upsampler<'a> 9 | where 10 | I: Iterator + 'a, 11 | { 12 | Upsampler { 13 | factor: factor, 14 | state: 0, 15 | iterator: Box::new(iterator), 16 | } 17 | } 18 | } 19 | 20 | impl<'a> Iterator for Upsampler<'a> { 21 | type Item = f32; 22 | 23 | fn next(&mut self) -> Option { 24 | let result = if self.state == 0 { 25 | self.iterator.next() 26 | } else { 27 | Some(0.0) 28 | }; 29 | self.state = (self.state + 1) % self.factor; 30 | 31 | return result; 32 | } 33 | } 34 | 35 | pub struct Downsampler<'a> { 36 | factor: u16, 37 | iterator: Box + 'a>, 38 | } 39 | 40 | impl<'a> Downsampler<'a> { 41 | pub fn from(iterator: I, factor: u16) -> Downsampler<'a> 42 | where 43 | I: Iterator + 'a, 44 | { 45 | Downsampler { 46 | factor: factor, 47 | iterator: Box::new(iterator), 48 | } 49 | } 50 | } 51 | 52 | impl<'a> Iterator for Downsampler<'a> { 53 | type Item = f32; 54 | 55 | fn next(&mut self) -> Option { 56 | let mut result = 0.0; 57 | for _ in 0..self.factor { 58 | match self.iterator.next() { 59 | Some(x) => result += x, 60 | None => return None, 61 | } 62 | } 63 | result /= self.factor as f32; 64 | 65 | return Some(result); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/ui.rs: -------------------------------------------------------------------------------- 1 | use std::sync::{Arc, Mutex}; 2 | 3 | use eframe::egui::text_edit::TextEdit; 4 | use eframe::egui::widgets::{Button, ProgressBar}; 5 | use eframe::egui::ColorImage; 6 | use eframe::egui::Visuals; 7 | use eframe::egui::{self, Image}; 8 | use eframe::egui::{Color32, RichText}; 9 | 10 | use decoder; 11 | use errors::DecoderError; 12 | 13 | #[derive(PartialEq)] 14 | enum DecoderRunState { 15 | RUNNING, 16 | CANCELED, 17 | DONE, 18 | } 19 | 20 | struct DecoderJobState { 21 | update_steps: u32, 22 | progress: f32, 23 | texture: Option, 24 | run_state: DecoderRunState, 25 | error: Option, 26 | } 27 | 28 | impl DecoderJobState { 29 | fn is_running(&self) -> bool { 30 | self.run_state == DecoderRunState::RUNNING 31 | } 32 | } 33 | 34 | impl Default for DecoderJobState { 35 | fn default() -> Self { 36 | Self { 37 | update_steps: 10, 38 | progress: 0.0, 39 | texture: None, 40 | run_state: DecoderRunState::DONE, 41 | error: None, 42 | } 43 | } 44 | } 45 | 46 | pub struct DecoderApp { 47 | input_path: String, 48 | output_path: String, 49 | decoding_state: Arc>, 50 | } 51 | 52 | impl DecoderApp { 53 | pub fn new(input_path: &str, output_path: &str) -> Self { 54 | Self { 55 | input_path: input_path.to_owned(), 56 | output_path: output_path.to_owned(), 57 | decoding_state: Arc::new(Mutex::new(DecoderJobState::default())), 58 | } 59 | } 60 | } 61 | 62 | impl eframe::App for DecoderApp { 63 | /// Called each time the UI needs repainting, which may be many times per second. 64 | /// Put your widgets into a `SidePanel`, `TopPanel`, `CentralPanel`, `Window` or `Area`. 65 | fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { 66 | let Self { 67 | input_path, 68 | output_path, 69 | decoding_state, 70 | } = self; 71 | 72 | { 73 | let mut state = decoding_state.lock().unwrap(); 74 | 75 | ctx.input(|input| { 76 | if !input.raw.dropped_files.is_empty() && !state.is_running() { 77 | if let Some(path) = input.raw.dropped_files[0].clone().path { 78 | *input_path = path.display().to_string(); 79 | } 80 | } 81 | }); 82 | 83 | ctx.set_visuals(Visuals::dark()); 84 | egui::CentralPanel::default().show(ctx, |ui| { 85 | ui.heading("APT-Decoder"); 86 | 87 | egui::Grid::new("form_grid").num_columns(3).show(ui, |ui| { 88 | ui.label("Input Wav File:"); 89 | ui.add_sized( 90 | [300.0, 20.0], 91 | TextEdit::singleline(input_path).interactive(!state.is_running()), 92 | ); 93 | 94 | if ui 95 | .add_enabled(!state.is_running(), Button::new("Open")) 96 | .clicked() 97 | { 98 | if let Some(path) = rfd::FileDialog::new().pick_file() { 99 | *input_path = path.display().to_string(); 100 | } 101 | }; 102 | ui.end_row(); 103 | 104 | ui.label("Output PNG File:"); 105 | ui.add_sized( 106 | [300.0, 20.0], 107 | TextEdit::singleline(output_path).interactive(!state.is_running()), 108 | ); 109 | if ui 110 | .add_enabled(!state.is_running(), Button::new("Save")) 111 | .clicked() 112 | { 113 | if let Some(path) = rfd::FileDialog::new().save_file() { 114 | *output_path = path.display().to_string(); 115 | } 116 | }; 117 | ui.end_row(); 118 | }); 119 | 120 | ui.horizontal(|ui| { 121 | if ui 122 | .add_enabled(!state.is_running(), Button::new("Decode")) 123 | .clicked() 124 | { 125 | let ctx = ctx.clone(); 126 | let decoding_state = decoding_state.clone(); 127 | let input_path = input_path.clone(); 128 | let output_path = output_path.clone(); 129 | 130 | state.error = None; 131 | state.run_state = DecoderRunState::RUNNING; 132 | state.texture = None; 133 | 134 | std::thread::spawn(move || { 135 | let decoder_res = 136 | decoder::decode(&input_path, &output_path, |progress, image| { 137 | let mut state = decoding_state.lock().unwrap(); 138 | 139 | state.progress = progress; 140 | 141 | let size = [image.width() as _, image.height() as _]; 142 | let color_img = ColorImage::from_rgba_unmultiplied( 143 | size, 144 | image.as_flat_samples().as_slice(), 145 | ); 146 | 147 | state.texture = Some(ctx.load_texture( 148 | "decoded-image", 149 | color_img, 150 | Default::default(), 151 | )); 152 | 153 | ctx.request_repaint(); 154 | 155 | return (state.is_running(), state.update_steps); 156 | }); 157 | 158 | let mut state = decoding_state.lock().unwrap(); 159 | state.run_state = DecoderRunState::DONE; 160 | state.error = match decoder_res { 161 | Err(err) => Some(err), 162 | _ => None, 163 | }; 164 | 165 | ctx.request_repaint(); 166 | }); 167 | } 168 | if ui 169 | .add_enabled( 170 | state.is_running(), 171 | Button::new(RichText::new("Cancel").color(Color32::RED)), 172 | ) 173 | .clicked() 174 | { 175 | state.run_state = DecoderRunState::CANCELED; 176 | } 177 | }); 178 | 179 | let progressbar = ProgressBar::new(state.progress).show_percentage(); 180 | ui.add(progressbar); 181 | ui.end_row(); 182 | 183 | if let Some(err) = &state.error { 184 | ui.label(RichText::new(err.to_string()).color(Color32::RED)); 185 | }; 186 | 187 | ui.separator(); 188 | 189 | let image_size = ui.available_size(); 190 | state.update_steps = image_size[1] as u32; 191 | 192 | if let Some(texture) = &state.texture { 193 | ui.add(Image::new(texture).shrink_to_fit()); 194 | } 195 | }); 196 | } 197 | } 198 | } 199 | -------------------------------------------------------------------------------- /src/utils.rs: -------------------------------------------------------------------------------- 1 | use std; 2 | 3 | extern crate hound; 4 | 5 | type FileReader = std::io::BufReader; 6 | 7 | pub fn float_sample_iterator<'a>( 8 | reader: &'a mut hound::WavReader, 9 | ) -> Box + 'a> { 10 | match reader.spec().sample_format { 11 | hound::SampleFormat::Float => Box::new(reader.samples::().map(|x| x.unwrap())), 12 | hound::SampleFormat::Int => match reader.spec().bits_per_sample { 13 | 8 => Box::new( 14 | reader 15 | .samples::() 16 | .map(|x| (x.unwrap() as f32) / (i16::max_value() as f32)), 17 | ), 18 | 16 => Box::new( 19 | reader 20 | .samples::() 21 | .map(|x| (x.unwrap() as f32) / (i16::max_value() as f32)), 22 | ), 23 | 32 => Box::new( 24 | reader 25 | .samples::() 26 | .map(|x| (x.unwrap() as f32) / (i32::max_value() as f32)), 27 | ), 28 | _ => panic!("Unsupported sample format"), 29 | }, 30 | } 31 | } 32 | --------------------------------------------------------------------------------