Live location tracking and playback for the game "manhunt"

More tests (#2)

authored by bwc9876.dev and committed by

GitHub 2edc772a 4d771113

+10548 -7983
+1
.gitignore
··· 1 + .direnv/ 1 2 result 2 3 target 3 4 *.jks
+2 -2
.prettierignore
··· 1 1 frontend/dist 2 2 frontend/node_modules 3 3 frontend/package-lock.json 4 - backend/gen 5 - backend/target 4 + manhunt-app/gen 5 + manhunt-app/target 6 6 result 7 7 .prettiercache
+4
.rustfmt.toml
··· 1 + edition = "2024" 2 + reorder_imports = true 3 + # imports_granularity = "Crate" 4 +
+1846 -1235
Cargo.lock
··· 9 9 checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" 10 10 11 11 [[package]] 12 - name = "addr2line" 13 - version = "0.24.2" 14 - source = "registry+https://github.com/rust-lang/crates.io-index" 15 - checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 16 - dependencies = [ 17 - "gimli", 18 - ] 19 - 20 - [[package]] 21 12 name = "adler2" 22 13 version = "2.0.1" 23 14 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 41 32 dependencies = [ 42 33 "cfg-if", 43 34 "cipher", 44 - "cpufeatures", 35 + "cpufeatures 0.2.17", 45 36 ] 46 37 47 38 [[package]] ··· 64 55 source = "registry+https://github.com/rust-lang/crates.io-index" 65 56 checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" 66 57 dependencies = [ 67 - "getrandom 0.2.16", 58 + "getrandom 0.2.17", 68 59 "once_cell", 69 60 "version_check", 70 61 ] 71 62 72 63 [[package]] 73 64 name = "aho-corasick" 74 - version = "1.1.3" 65 + version = "1.1.4" 75 66 source = "registry+https://github.com/rust-lang/crates.io-index" 76 - checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 67 + checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" 77 68 dependencies = [ 78 69 "memchr", 79 70 ] ··· 94 85 ] 95 86 96 87 [[package]] 97 - name = "android-tzdata" 98 - version = "0.1.1" 99 - source = "registry+https://github.com/rust-lang/crates.io-index" 100 - checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 101 - 102 - [[package]] 103 88 name = "android_log-sys" 104 89 version = "0.3.2" 105 90 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 107 92 108 93 [[package]] 109 94 name = "android_logger" 110 - version = "0.15.0" 95 + version = "0.15.1" 111 96 source = "registry+https://github.com/rust-lang/crates.io-index" 112 - checksum = "f6f39be698127218cca460cb624878c9aa4e2b47dba3b277963d2bf00bad263b" 97 + checksum = "dbb4e440d04be07da1f1bf44fb4495ebd58669372fe0cffa6e48595ac5bd88a3" 113 98 dependencies = [ 114 99 "android_log-sys", 115 - "env_filter", 100 + "env_filter 0.1.4", 116 101 "log", 117 102 ] 118 103 ··· 127 112 128 113 [[package]] 129 114 name = "anstream" 130 - version = "0.6.19" 115 + version = "0.6.21" 131 116 source = "registry+https://github.com/rust-lang/crates.io-index" 132 - checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" 117 + checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" 133 118 dependencies = [ 134 119 "anstyle", 135 120 "anstyle-parse", ··· 142 127 143 128 [[package]] 144 129 name = "anstyle" 145 - version = "1.0.11" 130 + version = "1.0.13" 146 131 source = "registry+https://github.com/rust-lang/crates.io-index" 147 - checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" 132 + checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" 148 133 149 134 [[package]] 150 135 name = "anstyle-parse" ··· 157 142 158 143 [[package]] 159 144 name = "anstyle-query" 160 - version = "1.1.3" 145 + version = "1.1.5" 161 146 source = "registry+https://github.com/rust-lang/crates.io-index" 162 - checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" 147 + checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" 163 148 dependencies = [ 164 - "windows-sys 0.59.0", 149 + "windows-sys 0.61.2", 165 150 ] 166 151 167 152 [[package]] 168 153 name = "anstyle-wincon" 169 - version = "3.0.9" 154 + version = "3.0.11" 170 155 source = "registry+https://github.com/rust-lang/crates.io-index" 171 - checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" 156 + checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" 172 157 dependencies = [ 173 158 "anstyle", 174 159 "once_cell_polyfill", 175 - "windows-sys 0.59.0", 160 + "windows-sys 0.61.2", 176 161 ] 177 162 178 163 [[package]] 179 164 name = "anyhow" 180 - version = "1.0.98" 165 + version = "1.0.101" 181 166 source = "registry+https://github.com/rust-lang/crates.io-index" 182 - checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" 167 + checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" 183 168 184 169 [[package]] 185 170 name = "arc-swap" 186 - version = "1.7.1" 171 + version = "1.8.2" 187 172 source = "registry+https://github.com/rust-lang/crates.io-index" 188 - checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" 173 + checksum = "f9f3647c145568cec02c42054e07bdf9a5a698e15b466fb2341bfc393cd24aa5" 174 + dependencies = [ 175 + "rustversion", 176 + ] 189 177 190 178 [[package]] 191 179 name = "arrayvec" ··· 194 182 checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 195 183 196 184 [[package]] 197 - name = "ashpd" 198 - version = "0.11.0" 199 - source = "registry+https://github.com/rust-lang/crates.io-index" 200 - checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df" 201 - dependencies = [ 202 - "enumflags2", 203 - "futures-channel", 204 - "futures-util", 205 - "rand 0.9.1", 206 - "raw-window-handle", 207 - "serde", 208 - "serde_repr", 209 - "tokio", 210 - "url", 211 - "zbus", 212 - ] 213 - 214 - [[package]] 215 185 name = "asn1-rs" 216 186 version = "0.6.2" 217 187 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 235 205 dependencies = [ 236 206 "proc-macro2", 237 207 "quote", 238 - "syn 2.0.104", 208 + "syn 2.0.116", 239 209 "synstructure", 240 210 ] 241 211 ··· 247 217 dependencies = [ 248 218 "proc-macro2", 249 219 "quote", 250 - "syn 2.0.104", 220 + "syn 2.0.116", 251 221 ] 252 222 253 223 [[package]] ··· 256 226 source = "registry+https://github.com/rust-lang/crates.io-index" 257 227 checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" 258 228 dependencies = [ 259 - "event-listener 5.4.0", 229 + "event-listener 5.4.1", 260 230 "event-listener-strategy", 261 231 "futures-core", 262 232 "pin-project-lite", ··· 275 245 276 246 [[package]] 277 247 name = "async-channel" 278 - version = "2.3.1" 248 + version = "2.5.0" 279 249 source = "registry+https://github.com/rust-lang/crates.io-index" 280 - checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" 250 + checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" 281 251 dependencies = [ 282 252 "concurrent-queue", 283 253 "event-listener-strategy", ··· 287 257 288 258 [[package]] 289 259 name = "async-compat" 290 - version = "0.2.4" 260 + version = "0.2.5" 291 261 source = "registry+https://github.com/rust-lang/crates.io-index" 292 - checksum = "7bab94bde396a3f7b4962e396fdad640e241ed797d4d8d77fc8c237d14c58fc0" 262 + checksum = "a1ba85bc55464dcbf728b56d97e119d673f4cf9062be330a9a26f3acf504a590" 293 263 dependencies = [ 294 264 "futures-core", 295 265 "futures-io", ··· 300 270 301 271 [[package]] 302 272 name = "async-executor" 303 - version = "1.13.2" 273 + version = "1.14.0" 304 274 source = "registry+https://github.com/rust-lang/crates.io-index" 305 - checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" 275 + checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" 306 276 dependencies = [ 307 277 "async-task", 308 278 "concurrent-queue", ··· 318 288 source = "registry+https://github.com/rust-lang/crates.io-index" 319 289 checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" 320 290 dependencies = [ 321 - "async-channel 2.3.1", 291 + "async-channel 2.5.0", 322 292 "async-executor", 323 293 "async-io", 324 294 "async-lock", ··· 329 299 330 300 [[package]] 331 301 name = "async-io" 332 - version = "2.4.1" 302 + version = "2.6.0" 333 303 source = "registry+https://github.com/rust-lang/crates.io-index" 334 - checksum = "1237c0ae75a0f3765f58910ff9cdd0a12eeb39ab2f4c7de23262f337f0aacbb3" 304 + checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" 335 305 dependencies = [ 336 - "async-lock", 306 + "autocfg", 337 307 "cfg-if", 338 308 "concurrent-queue", 339 309 "futures-io", ··· 342 312 "polling", 343 313 "rustix", 344 314 "slab", 345 - "tracing", 346 - "windows-sys 0.59.0", 315 + "windows-sys 0.61.2", 347 316 ] 348 317 349 318 [[package]] 350 319 name = "async-lock" 351 - version = "3.4.0" 320 + version = "3.4.2" 352 321 source = "registry+https://github.com/rust-lang/crates.io-index" 353 - checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" 322 + checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" 354 323 dependencies = [ 355 - "event-listener 5.4.0", 324 + "event-listener 5.4.1", 356 325 "event-listener-strategy", 357 326 "pin-project-lite", 358 327 ] 359 328 360 329 [[package]] 361 330 name = "async-process" 362 - version = "2.3.1" 331 + version = "2.5.0" 363 332 source = "registry+https://github.com/rust-lang/crates.io-index" 364 - checksum = "cde3f4e40e6021d7acffc90095cbd6dc54cb593903d1de5832f435eb274b85dc" 333 + checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" 365 334 dependencies = [ 366 - "async-channel 2.3.1", 335 + "async-channel 2.5.0", 367 336 "async-io", 368 337 "async-lock", 369 338 "async-signal", 370 339 "async-task", 371 340 "blocking", 372 341 "cfg-if", 373 - "event-listener 5.4.0", 342 + "event-listener 5.4.1", 374 343 "futures-lite", 375 344 "rustix", 376 - "tracing", 377 345 ] 378 346 379 347 [[package]] ··· 384 352 dependencies = [ 385 353 "proc-macro2", 386 354 "quote", 387 - "syn 2.0.104", 355 + "syn 2.0.116", 388 356 ] 389 357 390 358 [[package]] 391 359 name = "async-signal" 392 - version = "0.2.11" 360 + version = "0.2.13" 393 361 source = "registry+https://github.com/rust-lang/crates.io-index" 394 - checksum = "d7605a4e50d4b06df3898d5a70bf5fde51ed9059b0434b73105193bc27acce0d" 362 + checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" 395 363 dependencies = [ 396 364 "async-io", 397 365 "async-lock", ··· 402 370 "rustix", 403 371 "signal-hook-registry", 404 372 "slab", 405 - "windows-sys 0.59.0", 373 + "windows-sys 0.61.2", 406 374 ] 407 375 408 376 [[package]] 409 377 name = "async-std" 410 - version = "1.13.1" 378 + version = "1.13.2" 411 379 source = "registry+https://github.com/rust-lang/crates.io-index" 412 - checksum = "730294c1c08c2e0f85759590518f6333f0d5a0a766a27d519c1b244c3dfd8a24" 380 + checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" 413 381 dependencies = [ 414 382 "async-channel 1.9.0", 415 383 "async-global-executor", ··· 447 415 "futures-io", 448 416 "rustls 0.21.12", 449 417 "rustls-pemfile", 450 - "webpki-roots 0.22.6", 418 + "webpki-roots", 451 419 ] 452 420 453 421 [[package]] 454 422 name = "async-trait" 455 - version = "0.1.88" 423 + version = "0.1.89" 456 424 source = "registry+https://github.com/rust-lang/crates.io-index" 457 - checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 425 + checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" 458 426 dependencies = [ 459 427 "proc-macro2", 460 428 "quote", 461 - "syn 2.0.104", 429 + "syn 2.0.116", 462 430 ] 463 431 464 432 [[package]] 465 433 name = "async-tungstenite" 466 - version = "0.29.1" 434 + version = "0.32.1" 467 435 source = "registry+https://github.com/rust-lang/crates.io-index" 468 - checksum = "ef0f7efedeac57d9b26170f72965ecfd31473ca52ca7a64e925b0b6f5f079886" 436 + checksum = "8acc405d38be14342132609f06f02acaf825ddccfe76c4824a69281e0458ebd4" 469 437 dependencies = [ 470 438 "async-std", 471 439 "async-tls", ··· 525 493 checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 526 494 527 495 [[package]] 496 + name = "aws-lc-rs" 497 + version = "1.15.4" 498 + source = "registry+https://github.com/rust-lang/crates.io-index" 499 + checksum = "7b7b6141e96a8c160799cc2d5adecd5cbbe5054cb8c7c4af53da0f83bb7ad256" 500 + dependencies = [ 501 + "aws-lc-sys", 502 + "zeroize", 503 + ] 504 + 505 + [[package]] 506 + name = "aws-lc-sys" 507 + version = "0.37.1" 508 + source = "registry+https://github.com/rust-lang/crates.io-index" 509 + checksum = "b092fe214090261288111db7a2b2c2118e5a7f30dc2569f1732c4069a6840549" 510 + dependencies = [ 511 + "cc", 512 + "cmake", 513 + "dunce", 514 + "fs_extra", 515 + ] 516 + 517 + [[package]] 528 518 name = "axum" 529 - version = "0.8.4" 519 + version = "0.8.8" 530 520 source = "registry+https://github.com/rust-lang/crates.io-index" 531 - checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" 521 + checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" 532 522 dependencies = [ 533 523 "axum-core", 534 524 "base64 0.22.1", ··· 540 530 "http-body-util", 541 531 "hyper", 542 532 "hyper-util", 543 - "itoa 1.0.15", 533 + "itoa", 544 534 "matchit", 545 535 "memchr", 546 536 "mime", 547 537 "percent-encoding", 548 538 "pin-project-lite", 549 - "rustversion", 550 - "serde", 539 + "serde_core", 551 540 "serde_json", 552 541 "serde_path_to_error", 553 542 "serde_urlencoded", ··· 563 552 564 553 [[package]] 565 554 name = "axum-core" 566 - version = "0.5.2" 555 + version = "0.5.6" 567 556 source = "registry+https://github.com/rust-lang/crates.io-index" 568 - checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" 557 + checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" 569 558 dependencies = [ 570 559 "bytes", 571 560 "futures-core", ··· 574 563 "http-body-util", 575 564 "mime", 576 565 "pin-project-lite", 577 - "rustversion", 578 566 "sync_wrapper", 579 567 "tower-layer", 580 568 "tower-service", ··· 582 570 ] 583 571 584 572 [[package]] 585 - name = "backtrace" 586 - version = "0.3.75" 587 - source = "registry+https://github.com/rust-lang/crates.io-index" 588 - checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 589 - dependencies = [ 590 - "addr2line", 591 - "cfg-if", 592 - "libc", 593 - "miniz_oxide", 594 - "object", 595 - "rustc-demangle", 596 - "windows-targets 0.52.6", 597 - ] 598 - 599 - [[package]] 600 573 name = "base16ct" 601 574 version = "0.2.0" 602 575 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 616 589 617 590 [[package]] 618 591 name = "base64ct" 619 - version = "1.8.0" 592 + version = "1.8.3" 620 593 source = "registry+https://github.com/rust-lang/crates.io-index" 621 - checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" 622 - 623 - [[package]] 624 - name = "bincode" 625 - version = "1.3.3" 626 - source = "registry+https://github.com/rust-lang/crates.io-index" 627 - checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" 628 - dependencies = [ 629 - "serde", 630 - ] 594 + checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" 631 595 632 596 [[package]] 633 597 name = "bitflags" ··· 637 601 638 602 [[package]] 639 603 name = "bitflags" 640 - version = "2.9.1" 604 + version = "2.11.0" 641 605 source = "registry+https://github.com/rust-lang/crates.io-index" 642 - checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 606 + checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" 643 607 dependencies = [ 644 - "serde", 608 + "serde_core", 645 609 ] 646 610 647 611 [[package]] ··· 676 640 677 641 [[package]] 678 642 name = "block2" 679 - version = "0.5.1" 643 + version = "0.6.2" 680 644 source = "registry+https://github.com/rust-lang/crates.io-index" 681 - checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" 682 - dependencies = [ 683 - "objc2 0.5.2", 684 - ] 685 - 686 - [[package]] 687 - name = "block2" 688 - version = "0.6.1" 689 - source = "registry+https://github.com/rust-lang/crates.io-index" 690 - checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" 645 + checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" 691 646 dependencies = [ 692 - "objc2 0.6.1", 647 + "objc2", 693 648 ] 694 649 695 650 [[package]] 696 651 name = "blocking" 697 - version = "1.6.1" 652 + version = "1.6.2" 698 653 source = "registry+https://github.com/rust-lang/crates.io-index" 699 - checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" 654 + checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" 700 655 dependencies = [ 701 - "async-channel 2.3.1", 656 + "async-channel 2.5.0", 702 657 "async-task", 703 658 "futures-io", 704 659 "futures-lite", ··· 707 662 708 663 [[package]] 709 664 name = "borsh" 710 - version = "1.5.7" 665 + version = "1.6.0" 711 666 source = "registry+https://github.com/rust-lang/crates.io-index" 712 - checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" 667 + checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" 713 668 dependencies = [ 714 669 "borsh-derive", 715 670 "cfg_aliases", ··· 717 672 718 673 [[package]] 719 674 name = "borsh-derive" 720 - version = "1.5.7" 675 + version = "1.6.0" 721 676 source = "registry+https://github.com/rust-lang/crates.io-index" 722 - checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" 677 + checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" 723 678 dependencies = [ 724 679 "once_cell", 725 - "proc-macro-crate 3.3.0", 680 + "proc-macro-crate 3.4.0", 726 681 "proc-macro2", 727 682 "quote", 728 - "syn 2.0.104", 683 + "syn 2.0.116", 729 684 ] 730 685 731 686 [[package]] 732 687 name = "brotli" 733 - version = "7.0.0" 688 + version = "8.0.2" 734 689 source = "registry+https://github.com/rust-lang/crates.io-index" 735 - checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" 690 + checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" 736 691 dependencies = [ 737 692 "alloc-no-stdlib", 738 693 "alloc-stdlib", ··· 741 696 742 697 [[package]] 743 698 name = "brotli-decompressor" 744 - version = "4.0.3" 699 + version = "5.0.0" 745 700 source = "registry+https://github.com/rust-lang/crates.io-index" 746 - checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd" 701 + checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" 747 702 dependencies = [ 748 703 "alloc-no-stdlib", 749 704 "alloc-stdlib", ··· 751 706 752 707 [[package]] 753 708 name = "bumpalo" 754 - version = "3.18.1" 709 + version = "3.19.1" 755 710 source = "registry+https://github.com/rust-lang/crates.io-index" 756 - checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" 711 + checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" 757 712 758 713 [[package]] 759 714 name = "byte-unit" 760 - version = "5.1.6" 715 + version = "5.2.0" 761 716 source = "registry+https://github.com/rust-lang/crates.io-index" 762 - checksum = "e1cd29c3c585209b0cbc7309bfe3ed7efd8c84c21b7af29c8bfae908f8777174" 717 + checksum = "8c6d47a4e2961fb8721bcfc54feae6455f2f64e7054f9bc67e875f0e77f4c58d" 763 718 dependencies = [ 764 719 "rust_decimal", 720 + "schemars 1.2.1", 765 721 "serde", 766 722 "utf8-width", 767 723 ] ··· 772 728 source = "registry+https://github.com/rust-lang/crates.io-index" 773 729 checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" 774 730 dependencies = [ 775 - "bytecheck_derive", 776 - "ptr_meta", 731 + "bytecheck_derive 0.6.12", 732 + "ptr_meta 0.1.4", 733 + "simdutf8", 734 + ] 735 + 736 + [[package]] 737 + name = "bytecheck" 738 + version = "0.8.2" 739 + source = "registry+https://github.com/rust-lang/crates.io-index" 740 + checksum = "0caa33a2c0edca0419d15ac723dff03f1956f7978329b1e3b5fdaaaed9d3ca8b" 741 + dependencies = [ 742 + "bytecheck_derive 0.8.2", 743 + "ptr_meta 0.3.1", 744 + "rancor", 777 745 "simdutf8", 778 746 ] 779 747 ··· 789 757 ] 790 758 791 759 [[package]] 760 + name = "bytecheck_derive" 761 + version = "0.8.2" 762 + source = "registry+https://github.com/rust-lang/crates.io-index" 763 + checksum = "89385e82b5d1821d2219e0b095efa2cc1f246cbf99080f3be46a1a85c0d392d9" 764 + dependencies = [ 765 + "proc-macro2", 766 + "quote", 767 + "syn 2.0.116", 768 + ] 769 + 770 + [[package]] 792 771 name = "bytemuck" 793 - version = "1.23.1" 772 + version = "1.25.0" 794 773 source = "registry+https://github.com/rust-lang/crates.io-index" 795 - checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" 774 + checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" 796 775 797 776 [[package]] 798 777 name = "byteorder" ··· 802 781 803 782 [[package]] 804 783 name = "bytes" 805 - version = "1.10.1" 784 + version = "1.11.1" 806 785 source = "registry+https://github.com/rust-lang/crates.io-index" 807 - checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 786 + checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" 808 787 dependencies = [ 809 788 "serde", 810 789 ] ··· 815 794 source = "registry+https://github.com/rust-lang/crates.io-index" 816 795 checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" 817 796 dependencies = [ 818 - "bitflags 2.9.1", 797 + "bitflags 2.11.0", 819 798 "cairo-sys-rs", 820 799 "glib", 821 800 "libc", ··· 836 815 837 816 [[package]] 838 817 name = "camino" 839 - version = "1.1.10" 818 + version = "1.2.2" 840 819 source = "registry+https://github.com/rust-lang/crates.io-index" 841 - checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" 820 + checksum = "e629a66d692cb9ff1a1c664e41771b3dcaf961985a9774c0eb0bd1b51cf60a48" 842 821 dependencies = [ 843 - "serde", 822 + "serde_core", 844 823 ] 845 824 846 825 [[package]] ··· 863 842 "semver", 864 843 "serde", 865 844 "serde_json", 866 - "thiserror 2.0.12", 845 + "thiserror 2.0.18", 867 846 ] 868 847 869 848 [[package]] 870 849 name = "cargo_toml" 871 - version = "0.22.1" 850 + version = "0.22.3" 872 851 source = "registry+https://github.com/rust-lang/crates.io-index" 873 - checksum = "02260d489095346e5cafd04dea8e8cb54d1d74fcd759022a9b72986ebe9a1257" 852 + checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" 874 853 dependencies = [ 875 854 "serde", 876 - "toml", 855 + "toml 0.9.12+spec-1.1.0", 877 856 ] 878 857 879 858 [[package]] ··· 887 866 888 867 [[package]] 889 868 name = "cc" 890 - version = "1.2.27" 869 + version = "1.2.56" 891 870 source = "registry+https://github.com/rust-lang/crates.io-index" 892 - checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" 871 + checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" 893 872 dependencies = [ 873 + "find-msvc-tools", 874 + "jobserver", 875 + "libc", 894 876 "shlex", 895 877 ] 896 878 ··· 935 917 936 918 [[package]] 937 919 name = "cfg-if" 938 - version = "1.0.1" 920 + version = "1.0.4" 939 921 source = "registry+https://github.com/rust-lang/crates.io-index" 940 - checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" 922 + checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 941 923 942 924 [[package]] 943 925 name = "cfg_aliases" ··· 946 928 checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 947 929 948 930 [[package]] 931 + name = "chacha20" 932 + version = "0.9.1" 933 + source = "registry+https://github.com/rust-lang/crates.io-index" 934 + checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" 935 + dependencies = [ 936 + "cfg-if", 937 + "cipher", 938 + "cpufeatures 0.2.17", 939 + ] 940 + 941 + [[package]] 942 + name = "chacha20" 943 + version = "0.10.0" 944 + source = "registry+https://github.com/rust-lang/crates.io-index" 945 + checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" 946 + dependencies = [ 947 + "cfg-if", 948 + "cpufeatures 0.3.0", 949 + "rand_core 0.10.0", 950 + ] 951 + 952 + [[package]] 953 + name = "chacha20poly1305" 954 + version = "0.10.1" 955 + source = "registry+https://github.com/rust-lang/crates.io-index" 956 + checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" 957 + dependencies = [ 958 + "aead", 959 + "chacha20 0.9.1", 960 + "cipher", 961 + "poly1305", 962 + "zeroize", 963 + ] 964 + 965 + [[package]] 949 966 name = "chrono" 950 - version = "0.4.41" 967 + version = "0.4.43" 951 968 source = "registry+https://github.com/rust-lang/crates.io-index" 952 - checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" 969 + checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" 953 970 dependencies = [ 954 - "android-tzdata", 955 971 "iana-time-zone", 956 972 "js-sys", 957 973 "num-traits", 958 974 "serde", 959 975 "wasm-bindgen", 960 - "windows-link", 976 + "windows-link 0.2.1", 961 977 ] 962 978 963 979 [[package]] ··· 968 984 dependencies = [ 969 985 "crypto-common", 970 986 "inout", 987 + "zeroize", 988 + ] 989 + 990 + [[package]] 991 + name = "clap" 992 + version = "4.5.59" 993 + source = "registry+https://github.com/rust-lang/crates.io-index" 994 + checksum = "c5caf74d17c3aec5495110c34cc3f78644bfa89af6c8993ed4de2790e49b6499" 995 + dependencies = [ 996 + "clap_builder", 997 + "clap_derive", 998 + ] 999 + 1000 + [[package]] 1001 + name = "clap_builder" 1002 + version = "4.5.59" 1003 + source = "registry+https://github.com/rust-lang/crates.io-index" 1004 + checksum = "370daa45065b80218950227371916a1633217ae42b2715b2287b606dcd618e24" 1005 + dependencies = [ 1006 + "anstream", 1007 + "anstyle", 1008 + "clap_lex", 1009 + "strsim", 1010 + ] 1011 + 1012 + [[package]] 1013 + name = "clap_derive" 1014 + version = "4.5.55" 1015 + source = "registry+https://github.com/rust-lang/crates.io-index" 1016 + checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" 1017 + dependencies = [ 1018 + "heck 0.5.0", 1019 + "proc-macro2", 1020 + "quote", 1021 + "syn 2.0.116", 1022 + ] 1023 + 1024 + [[package]] 1025 + name = "clap_lex" 1026 + version = "1.0.0" 1027 + source = "registry+https://github.com/rust-lang/crates.io-index" 1028 + checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" 1029 + 1030 + [[package]] 1031 + name = "cmake" 1032 + version = "0.1.57" 1033 + source = "registry+https://github.com/rust-lang/crates.io-index" 1034 + checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" 1035 + dependencies = [ 1036 + "cc", 971 1037 ] 972 1038 973 1039 [[package]] 974 1040 name = "colog" 975 - version = "1.3.0" 1041 + version = "1.4.0" 976 1042 source = "registry+https://github.com/rust-lang/crates.io-index" 977 - checksum = "2c426b7af8d5e0ad79de6713996632ce31f0d68ba84068fb0d654b396e519df0" 1043 + checksum = "df62599ba6adc9c6c04a54278c8209125343dc4775f57b9d76c9a4287e58f2bd" 978 1044 dependencies = [ 979 1045 "colored", 980 1046 "env_logger", ··· 989 1055 990 1056 [[package]] 991 1057 name = "colored" 992 - version = "2.2.0" 1058 + version = "3.1.1" 993 1059 source = "registry+https://github.com/rust-lang/crates.io-index" 994 - checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" 1060 + checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" 995 1061 dependencies = [ 996 - "lazy_static", 997 - "windows-sys 0.59.0", 1062 + "windows-sys 0.61.2", 998 1063 ] 999 1064 1000 1065 [[package]] ··· 1024 1089 1025 1090 [[package]] 1026 1091 name = "const-str" 1027 - version = "0.6.2" 1092 + version = "1.1.0" 1028 1093 source = "registry+https://github.com/rust-lang/crates.io-index" 1029 - checksum = "9e991226a70654b49d34de5ed064885f0bef0348a8e70018b8ff1ac80aa984a2" 1094 + checksum = "18f12cc9948ed9604230cdddc7c86e270f9401ccbe3c2e98a4378c5e7632212f" 1030 1095 1031 1096 [[package]] 1032 1097 name = "convert_case" ··· 1035 1100 checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 1036 1101 1037 1102 [[package]] 1103 + name = "convert_case" 1104 + version = "0.10.0" 1105 + source = "registry+https://github.com/rust-lang/crates.io-index" 1106 + checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" 1107 + dependencies = [ 1108 + "unicode-segmentation", 1109 + ] 1110 + 1111 + [[package]] 1038 1112 name = "cookie" 1039 1113 version = "0.18.1" 1040 1114 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1076 1150 source = "registry+https://github.com/rust-lang/crates.io-index" 1077 1151 checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" 1078 1152 dependencies = [ 1079 - "bitflags 2.9.1", 1153 + "bitflags 2.11.0", 1080 1154 "core-foundation 0.10.1", 1081 1155 "core-graphics-types", 1082 1156 "foreign-types", ··· 1089 1163 source = "registry+https://github.com/rust-lang/crates.io-index" 1090 1164 checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" 1091 1165 dependencies = [ 1092 - "bitflags 2.9.1", 1166 + "bitflags 2.11.0", 1093 1167 "core-foundation 0.10.1", 1094 1168 "libc", 1095 1169 ] ··· 1104 1178 ] 1105 1179 1106 1180 [[package]] 1181 + name = "cpufeatures" 1182 + version = "0.3.0" 1183 + source = "registry+https://github.com/rust-lang/crates.io-index" 1184 + checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" 1185 + dependencies = [ 1186 + "libc", 1187 + ] 1188 + 1189 + [[package]] 1107 1190 name = "crc" 1108 - version = "3.3.0" 1191 + version = "3.4.0" 1109 1192 source = "registry+https://github.com/rust-lang/crates.io-index" 1110 - checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" 1193 + checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" 1111 1194 dependencies = [ 1112 1195 "crc-catalog", 1113 1196 ] ··· 1120 1203 1121 1204 [[package]] 1122 1205 name = "crc32fast" 1123 - version = "1.4.2" 1206 + version = "1.5.0" 1124 1207 source = "registry+https://github.com/rust-lang/crates.io-index" 1125 - checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 1208 + checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" 1126 1209 dependencies = [ 1127 1210 "cfg-if", 1128 1211 ] ··· 1156 1239 1157 1240 [[package]] 1158 1241 name = "crypto-common" 1159 - version = "0.1.6" 1242 + version = "0.1.7" 1160 1243 source = "registry+https://github.com/rust-lang/crates.io-index" 1161 - checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 1244 + checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" 1162 1245 dependencies = [ 1163 1246 "generic-array", 1164 1247 "rand_core 0.6.4", ··· 1167 1250 1168 1251 [[package]] 1169 1252 name = "cssparser" 1170 - version = "0.27.2" 1253 + version = "0.29.6" 1171 1254 source = "registry+https://github.com/rust-lang/crates.io-index" 1172 - checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" 1255 + checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" 1173 1256 dependencies = [ 1174 1257 "cssparser-macros", 1175 1258 "dtoa-short", 1176 - "itoa 0.4.8", 1259 + "itoa", 1177 1260 "matches", 1178 - "phf 0.8.0", 1261 + "phf 0.10.1", 1179 1262 "proc-macro2", 1180 1263 "quote", 1181 1264 "smallvec", ··· 1189 1272 checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" 1190 1273 dependencies = [ 1191 1274 "quote", 1192 - "syn 2.0.104", 1275 + "syn 2.0.116", 1193 1276 ] 1194 1277 1195 1278 [[package]] ··· 1199 1282 checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" 1200 1283 dependencies = [ 1201 1284 "quote", 1202 - "syn 2.0.104", 1285 + "syn 2.0.116", 1203 1286 ] 1204 1287 1205 1288 [[package]] ··· 1218 1301 checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" 1219 1302 dependencies = [ 1220 1303 "cfg-if", 1221 - "cpufeatures", 1304 + "cpufeatures 0.2.17", 1222 1305 "curve25519-dalek-derive", 1223 1306 "fiat-crypto", 1224 1307 "rustc_version", ··· 1234 1317 dependencies = [ 1235 1318 "proc-macro2", 1236 1319 "quote", 1237 - "syn 2.0.104", 1320 + "syn 2.0.116", 1238 1321 ] 1239 1322 1240 1323 [[package]] 1241 1324 name = "darling" 1242 - version = "0.20.11" 1325 + version = "0.21.3" 1243 1326 source = "registry+https://github.com/rust-lang/crates.io-index" 1244 - checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 1327 + checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" 1245 1328 dependencies = [ 1246 1329 "darling_core", 1247 1330 "darling_macro", ··· 1249 1332 1250 1333 [[package]] 1251 1334 name = "darling_core" 1252 - version = "0.20.11" 1335 + version = "0.21.3" 1253 1336 source = "registry+https://github.com/rust-lang/crates.io-index" 1254 - checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 1337 + checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" 1255 1338 dependencies = [ 1256 1339 "fnv", 1257 1340 "ident_case", 1258 1341 "proc-macro2", 1259 1342 "quote", 1260 1343 "strsim", 1261 - "syn 2.0.104", 1344 + "syn 2.0.116", 1262 1345 ] 1263 1346 1264 1347 [[package]] 1265 1348 name = "darling_macro" 1266 - version = "0.20.11" 1349 + version = "0.21.3" 1267 1350 source = "registry+https://github.com/rust-lang/crates.io-index" 1268 - checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 1351 + checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" 1269 1352 dependencies = [ 1270 1353 "darling_core", 1271 1354 "quote", 1272 - "syn 2.0.104", 1355 + "syn 2.0.116", 1273 1356 ] 1274 1357 1275 1358 [[package]] 1276 1359 name = "data-encoding" 1277 - version = "2.9.0" 1360 + version = "2.10.0" 1278 1361 source = "registry+https://github.com/rust-lang/crates.io-index" 1279 - checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" 1362 + checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" 1280 1363 1281 1364 [[package]] 1282 1365 name = "der" ··· 1305 1388 1306 1389 [[package]] 1307 1390 name = "deranged" 1308 - version = "0.4.0" 1391 + version = "0.5.6" 1309 1392 source = "registry+https://github.com/rust-lang/crates.io-index" 1310 - checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" 1393 + checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" 1311 1394 dependencies = [ 1312 1395 "powerfmt", 1313 - "serde", 1396 + "serde_core", 1314 1397 ] 1315 1398 1316 1399 [[package]] ··· 1319 1402 source = "registry+https://github.com/rust-lang/crates.io-index" 1320 1403 checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" 1321 1404 dependencies = [ 1322 - "convert_case", 1405 + "convert_case 0.4.0", 1323 1406 "proc-macro2", 1324 1407 "quote", 1325 1408 "rustc_version", 1326 - "syn 2.0.104", 1409 + "syn 2.0.116", 1327 1410 ] 1328 1411 1329 1412 [[package]] 1330 1413 name = "derive_more" 1331 - version = "2.0.1" 1414 + version = "2.1.1" 1332 1415 source = "registry+https://github.com/rust-lang/crates.io-index" 1333 - checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" 1416 + checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" 1334 1417 dependencies = [ 1335 1418 "derive_more-impl", 1336 1419 ] 1337 1420 1338 1421 [[package]] 1339 1422 name = "derive_more-impl" 1340 - version = "2.0.1" 1423 + version = "2.1.1" 1341 1424 source = "registry+https://github.com/rust-lang/crates.io-index" 1342 - checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" 1425 + checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" 1343 1426 dependencies = [ 1427 + "convert_case 0.10.0", 1344 1428 "proc-macro2", 1345 1429 "quote", 1346 - "syn 2.0.104", 1430 + "rustc_version", 1431 + "syn 2.0.116", 1347 1432 "unicode-xid", 1348 1433 ] 1349 1434 ··· 1377 1462 "libc", 1378 1463 "option-ext", 1379 1464 "redox_users", 1380 - "windows-sys 0.60.2", 1465 + "windows-sys 0.61.2", 1381 1466 ] 1382 1467 1383 1468 [[package]] ··· 1388 1473 1389 1474 [[package]] 1390 1475 name = "dispatch2" 1391 - version = "0.2.0" 1392 - source = "registry+https://github.com/rust-lang/crates.io-index" 1393 - checksum = "1a0d569e003ff27784e0e14e4a594048698e0c0f0b66cabcb51511be55a7caa0" 1394 - dependencies = [ 1395 - "bitflags 2.9.1", 1396 - "block2 0.6.1", 1397 - "libc", 1398 - "objc2 0.6.1", 1399 - ] 1400 - 1401 - [[package]] 1402 - name = "dispatch2" 1403 1476 version = "0.3.0" 1404 1477 source = "registry+https://github.com/rust-lang/crates.io-index" 1405 1478 checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 1406 1479 dependencies = [ 1407 - "bitflags 2.9.1", 1408 - "objc2 0.6.1", 1480 + "bitflags 2.11.0", 1481 + "block2", 1482 + "libc", 1483 + "objc2", 1409 1484 ] 1410 1485 1411 1486 [[package]] ··· 1416 1491 dependencies = [ 1417 1492 "proc-macro2", 1418 1493 "quote", 1419 - "syn 2.0.104", 1494 + "syn 2.0.116", 1420 1495 ] 1421 1496 1422 1497 [[package]] 1423 1498 name = "dlopen2" 1424 - version = "0.7.0" 1499 + version = "0.8.2" 1425 1500 source = "registry+https://github.com/rust-lang/crates.io-index" 1426 - checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" 1501 + checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4" 1427 1502 dependencies = [ 1428 1503 "dlopen2_derive", 1429 1504 "libc", ··· 1433 1508 1434 1509 [[package]] 1435 1510 name = "dlopen2_derive" 1436 - version = "0.4.1" 1511 + version = "0.4.3" 1437 1512 source = "registry+https://github.com/rust-lang/crates.io-index" 1438 - checksum = "788160fb30de9cdd857af31c6a2675904b16ece8fc2737b2c7127ba368c9d0f4" 1513 + checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f" 1439 1514 dependencies = [ 1440 1515 "proc-macro2", 1441 1516 "quote", 1442 - "syn 2.0.104", 1517 + "syn 2.0.116", 1443 1518 ] 1444 1519 1445 1520 [[package]] 1521 + name = "doctest-file" 1522 + version = "1.0.0" 1523 + source = "registry+https://github.com/rust-lang/crates.io-index" 1524 + checksum = "aac81fa3e28d21450aa4d2ac065992ba96a1d7303efbce51a95f4fd175b67562" 1525 + 1526 + [[package]] 1446 1527 name = "dpi" 1447 1528 version = "0.1.2" 1448 1529 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1452 1533 ] 1453 1534 1454 1535 [[package]] 1536 + name = "dtls" 1537 + version = "0.17.1" 1538 + source = "registry+https://github.com/rust-lang/crates.io-index" 1539 + checksum = "2f016db07b91e9d79cc60a152c163d3f0ce2d4c0173cb3964de3526aab6e07fa" 1540 + dependencies = [ 1541 + "aes", 1542 + "aes-gcm", 1543 + "async-trait", 1544 + "bytecheck 0.8.2", 1545 + "byteorder", 1546 + "cbc", 1547 + "ccm", 1548 + "chacha20poly1305", 1549 + "der-parser", 1550 + "hmac", 1551 + "log", 1552 + "p256", 1553 + "p384", 1554 + "portable-atomic", 1555 + "rand 0.9.2", 1556 + "rand_core 0.6.4", 1557 + "rcgen", 1558 + "ring", 1559 + "rkyv 0.8.15", 1560 + "rustls 0.23.36", 1561 + "sec1", 1562 + "sha1", 1563 + "sha2", 1564 + "thiserror 1.0.69", 1565 + "tokio", 1566 + "webrtc-util", 1567 + "x25519-dalek", 1568 + "x509-parser", 1569 + ] 1570 + 1571 + [[package]] 1455 1572 name = "dtoa" 1456 - version = "1.0.10" 1573 + version = "1.0.11" 1457 1574 source = "registry+https://github.com/rust-lang/crates.io-index" 1458 - checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" 1575 + checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" 1459 1576 1460 1577 [[package]] 1461 1578 name = "dtoa-short" ··· 1474 1591 1475 1592 [[package]] 1476 1593 name = "dyn-clone" 1477 - version = "1.0.19" 1594 + version = "1.0.20" 1478 1595 source = "registry+https://github.com/rust-lang/crates.io-index" 1479 - checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" 1596 + checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" 1480 1597 1481 1598 [[package]] 1482 1599 name = "ecdsa" ··· 1515 1632 1516 1633 [[package]] 1517 1634 name = "embed-resource" 1518 - version = "3.0.4" 1635 + version = "3.0.6" 1519 1636 source = "registry+https://github.com/rust-lang/crates.io-index" 1520 - checksum = "0963f530273dc3022ab2bdc3fcd6d488e850256f2284a82b7413cb9481ee85dd" 1637 + checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" 1521 1638 dependencies = [ 1522 1639 "cc", 1523 1640 "memchr", 1524 1641 "rustc_version", 1525 - "toml", 1642 + "toml 0.9.12+spec-1.1.0", 1526 1643 "vswhom", 1527 1644 "winreg", 1528 1645 ] ··· 1544 1661 1545 1662 [[package]] 1546 1663 name = "endi" 1547 - version = "1.1.0" 1664 + version = "1.1.1" 1548 1665 source = "registry+https://github.com/rust-lang/crates.io-index" 1549 - checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" 1666 + checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" 1550 1667 1551 1668 [[package]] 1552 1669 name = "enumflags2" ··· 1566 1683 dependencies = [ 1567 1684 "proc-macro2", 1568 1685 "quote", 1569 - "syn 2.0.104", 1686 + "syn 2.0.116", 1570 1687 ] 1571 1688 1572 1689 [[package]] 1573 1690 name = "env_filter" 1574 - version = "0.1.3" 1691 + version = "0.1.4" 1575 1692 source = "registry+https://github.com/rust-lang/crates.io-index" 1576 - checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" 1693 + checksum = "1bf3c259d255ca70051b30e2e95b5446cdb8949ac4cd22c0d7fd634d89f568e2" 1694 + dependencies = [ 1695 + "log", 1696 + "regex", 1697 + ] 1698 + 1699 + [[package]] 1700 + name = "env_filter" 1701 + version = "1.0.0" 1702 + source = "registry+https://github.com/rust-lang/crates.io-index" 1703 + checksum = "7a1c3cc8e57274ec99de65301228b537f1e4eedc1b8e0f9411c6caac8ae7308f" 1577 1704 dependencies = [ 1578 1705 "log", 1579 1706 "regex", ··· 1581 1708 1582 1709 [[package]] 1583 1710 name = "env_logger" 1584 - version = "0.11.8" 1711 + version = "0.11.9" 1585 1712 source = "registry+https://github.com/rust-lang/crates.io-index" 1586 - checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" 1713 + checksum = "b2daee4ea451f429a58296525ddf28b45a3b64f1acf6587e2067437bb11e218d" 1587 1714 dependencies = [ 1588 1715 "anstream", 1589 1716 "anstyle", 1590 - "env_filter", 1717 + "env_filter 1.0.0", 1591 1718 "jiff", 1592 1719 "log", 1593 1720 ] ··· 1600 1727 1601 1728 [[package]] 1602 1729 name = "erased-serde" 1603 - version = "0.4.6" 1730 + version = "0.4.9" 1604 1731 source = "registry+https://github.com/rust-lang/crates.io-index" 1605 - checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" 1732 + checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" 1606 1733 dependencies = [ 1607 1734 "serde", 1735 + "serde_core", 1608 1736 "typeid", 1609 1737 ] 1610 1738 1611 1739 [[package]] 1612 1740 name = "errno" 1613 - version = "0.3.13" 1741 + version = "0.3.14" 1614 1742 source = "registry+https://github.com/rust-lang/crates.io-index" 1615 - checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 1743 + checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 1616 1744 dependencies = [ 1617 1745 "libc", 1618 - "windows-sys 0.60.2", 1746 + "windows-sys 0.61.2", 1619 1747 ] 1620 1748 1621 1749 [[package]] ··· 1626 1754 1627 1755 [[package]] 1628 1756 name = "event-listener" 1629 - version = "5.4.0" 1757 + version = "5.4.1" 1630 1758 source = "registry+https://github.com/rust-lang/crates.io-index" 1631 - checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 1759 + checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" 1632 1760 dependencies = [ 1633 1761 "concurrent-queue", 1634 1762 "parking", ··· 1641 1769 source = "registry+https://github.com/rust-lang/crates.io-index" 1642 1770 checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" 1643 1771 dependencies = [ 1644 - "event-listener 5.4.0", 1772 + "event-listener 5.4.1", 1645 1773 "pin-project-lite", 1646 1774 ] 1647 1775 ··· 1696 1824 ] 1697 1825 1698 1826 [[package]] 1827 + name = "find-msvc-tools" 1828 + version = "0.1.9" 1829 + source = "registry+https://github.com/rust-lang/crates.io-index" 1830 + checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" 1831 + 1832 + [[package]] 1699 1833 name = "flate2" 1700 - version = "1.1.2" 1834 + version = "1.1.9" 1701 1835 source = "registry+https://github.com/rust-lang/crates.io-index" 1702 - checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" 1836 + checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" 1703 1837 dependencies = [ 1704 1838 "crc32fast", 1705 1839 "miniz_oxide", ··· 1712 1846 checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1713 1847 1714 1848 [[package]] 1849 + name = "foldhash" 1850 + version = "0.1.5" 1851 + source = "registry+https://github.com/rust-lang/crates.io-index" 1852 + checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 1853 + 1854 + [[package]] 1715 1855 name = "foreign-types" 1716 1856 version = "0.5.0" 1717 1857 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1729 1869 dependencies = [ 1730 1870 "proc-macro2", 1731 1871 "quote", 1732 - "syn 2.0.104", 1872 + "syn 2.0.116", 1733 1873 ] 1734 1874 1735 1875 [[package]] ··· 1740 1880 1741 1881 [[package]] 1742 1882 name = "form_urlencoded" 1743 - version = "1.2.1" 1883 + version = "1.2.2" 1744 1884 source = "registry+https://github.com/rust-lang/crates.io-index" 1745 - checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 1885 + checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 1746 1886 dependencies = [ 1747 1887 "percent-encoding", 1748 1888 ] 1749 1889 1750 1890 [[package]] 1891 + name = "fs_extra" 1892 + version = "1.3.0" 1893 + source = "registry+https://github.com/rust-lang/crates.io-index" 1894 + checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" 1895 + 1896 + [[package]] 1751 1897 name = "funty" 1752 1898 version = "2.0.0" 1753 1899 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 1765 1911 1766 1912 [[package]] 1767 1913 name = "futures" 1768 - version = "0.3.31" 1914 + version = "0.3.32" 1769 1915 source = "registry+https://github.com/rust-lang/crates.io-index" 1770 - checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 1916 + checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" 1771 1917 dependencies = [ 1772 1918 "futures-channel", 1773 1919 "futures-core", ··· 1780 1926 1781 1927 [[package]] 1782 1928 name = "futures-channel" 1783 - version = "0.3.31" 1929 + version = "0.3.32" 1784 1930 source = "registry+https://github.com/rust-lang/crates.io-index" 1785 - checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 1931 + checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" 1786 1932 dependencies = [ 1787 1933 "futures-core", 1788 1934 "futures-sink", ··· 1790 1936 1791 1937 [[package]] 1792 1938 name = "futures-core" 1793 - version = "0.3.31" 1939 + version = "0.3.32" 1794 1940 source = "registry+https://github.com/rust-lang/crates.io-index" 1795 - checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 1941 + checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" 1796 1942 1797 1943 [[package]] 1798 1944 name = "futures-executor" 1799 - version = "0.3.31" 1945 + version = "0.3.32" 1800 1946 source = "registry+https://github.com/rust-lang/crates.io-index" 1801 - checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 1947 + checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" 1802 1948 dependencies = [ 1803 1949 "futures-core", 1804 1950 "futures-task", ··· 1807 1953 1808 1954 [[package]] 1809 1955 name = "futures-io" 1810 - version = "0.3.31" 1956 + version = "0.3.32" 1811 1957 source = "registry+https://github.com/rust-lang/crates.io-index" 1812 - checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 1958 + checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" 1813 1959 1814 1960 [[package]] 1815 1961 name = "futures-lite" 1816 - version = "2.6.0" 1962 + version = "2.6.1" 1817 1963 source = "registry+https://github.com/rust-lang/crates.io-index" 1818 - checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 1964 + checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" 1819 1965 dependencies = [ 1820 1966 "fastrand", 1821 1967 "futures-core", ··· 1826 1972 1827 1973 [[package]] 1828 1974 name = "futures-macro" 1829 - version = "0.3.31" 1975 + version = "0.3.32" 1830 1976 source = "registry+https://github.com/rust-lang/crates.io-index" 1831 - checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 1977 + checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" 1832 1978 dependencies = [ 1833 1979 "proc-macro2", 1834 1980 "quote", 1835 - "syn 2.0.104", 1981 + "syn 2.0.116", 1836 1982 ] 1837 1983 1838 1984 [[package]] 1839 1985 name = "futures-sink" 1840 - version = "0.3.31" 1986 + version = "0.3.32" 1841 1987 source = "registry+https://github.com/rust-lang/crates.io-index" 1842 - checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 1988 + checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" 1843 1989 1844 1990 [[package]] 1845 1991 name = "futures-task" 1846 - version = "0.3.31" 1992 + version = "0.3.32" 1847 1993 source = "registry+https://github.com/rust-lang/crates.io-index" 1848 - checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 1994 + checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" 1849 1995 1850 1996 [[package]] 1851 1997 name = "futures-timer" ··· 1859 2005 1860 2006 [[package]] 1861 2007 name = "futures-util" 1862 - version = "0.3.31" 2008 + version = "0.3.32" 1863 2009 source = "registry+https://github.com/rust-lang/crates.io-index" 1864 - checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 2010 + checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" 1865 2011 dependencies = [ 1866 2012 "futures-channel", 1867 2013 "futures-core", ··· 1871 2017 "futures-task", 1872 2018 "memchr", 1873 2019 "pin-project-lite", 1874 - "pin-utils", 1875 2020 "slab", 1876 2021 ] 1877 2022 ··· 2007 2152 2008 2153 [[package]] 2009 2154 name = "getrandom" 2010 - version = "0.2.16" 2155 + version = "0.2.17" 2011 2156 source = "registry+https://github.com/rust-lang/crates.io-index" 2012 - checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 2157 + checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" 2013 2158 dependencies = [ 2014 2159 "cfg-if", 2015 2160 "js-sys", ··· 2020 2165 2021 2166 [[package]] 2022 2167 name = "getrandom" 2023 - version = "0.3.3" 2168 + version = "0.3.4" 2024 2169 source = "registry+https://github.com/rust-lang/crates.io-index" 2025 - checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 2170 + checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 2026 2171 dependencies = [ 2027 2172 "cfg-if", 2028 2173 "js-sys", 2029 2174 "libc", 2030 2175 "r-efi", 2031 - "wasi 0.14.2+wasi-0.2.4", 2176 + "wasip2", 2032 2177 "wasm-bindgen", 2033 2178 ] 2034 2179 2035 2180 [[package]] 2181 + name = "getrandom" 2182 + version = "0.4.1" 2183 + source = "registry+https://github.com/rust-lang/crates.io-index" 2184 + checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" 2185 + dependencies = [ 2186 + "cfg-if", 2187 + "libc", 2188 + "r-efi", 2189 + "rand_core 0.10.0", 2190 + "wasip2", 2191 + "wasip3", 2192 + ] 2193 + 2194 + [[package]] 2036 2195 name = "ghash" 2037 2196 version = "0.5.1" 2038 2197 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2041 2200 "opaque-debug", 2042 2201 "polyval", 2043 2202 ] 2044 - 2045 - [[package]] 2046 - name = "gimli" 2047 - version = "0.31.1" 2048 - source = "registry+https://github.com/rust-lang/crates.io-index" 2049 - checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 2050 2203 2051 2204 [[package]] 2052 2205 name = "gio" ··· 2086 2239 source = "registry+https://github.com/rust-lang/crates.io-index" 2087 2240 checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" 2088 2241 dependencies = [ 2089 - "bitflags 2.9.1", 2242 + "bitflags 2.11.0", 2090 2243 "futures-channel", 2091 2244 "futures-core", 2092 2245 "futures-executor", ··· 2110 2263 checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" 2111 2264 dependencies = [ 2112 2265 "heck 0.4.1", 2113 - "proc-macro-crate 2.0.0", 2266 + "proc-macro-crate 2.0.2", 2114 2267 "proc-macro-error", 2115 2268 "proc-macro2", 2116 2269 "quote", 2117 - "syn 2.0.104", 2270 + "syn 2.0.116", 2118 2271 ] 2119 2272 2120 2273 [[package]] ··· 2129 2282 2130 2283 [[package]] 2131 2284 name = "glob" 2132 - version = "0.3.2" 2285 + version = "0.3.3" 2133 2286 source = "registry+https://github.com/rust-lang/crates.io-index" 2134 - checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 2287 + checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" 2135 2288 2136 2289 [[package]] 2137 2290 name = "gloo-timers" ··· 2228 2381 "proc-macro-error", 2229 2382 "proc-macro2", 2230 2383 "quote", 2231 - "syn 2.0.104", 2384 + "syn 2.0.116", 2232 2385 ] 2233 2386 2234 2387 [[package]] 2235 2388 name = "h2" 2236 - version = "0.4.10" 2389 + version = "0.4.13" 2237 2390 source = "registry+https://github.com/rust-lang/crates.io-index" 2238 - checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" 2391 + checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" 2239 2392 dependencies = [ 2240 2393 "atomic-waker", 2241 2394 "bytes", ··· 2243 2396 "futures-core", 2244 2397 "futures-sink", 2245 2398 "http", 2246 - "indexmap 2.9.0", 2399 + "indexmap 2.13.0", 2247 2400 "slab", 2248 2401 "tokio", 2249 2402 "tokio-util", ··· 2261 2414 2262 2415 [[package]] 2263 2416 name = "hashbrown" 2264 - version = "0.15.4" 2417 + version = "0.15.5" 2418 + source = "registry+https://github.com/rust-lang/crates.io-index" 2419 + checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 2420 + dependencies = [ 2421 + "foldhash", 2422 + ] 2423 + 2424 + [[package]] 2425 + name = "hashbrown" 2426 + version = "0.16.1" 2265 2427 source = "registry+https://github.com/rust-lang/crates.io-index" 2266 - checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" 2428 + checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" 2267 2429 2268 2430 [[package]] 2269 2431 name = "heck" ··· 2309 2471 2310 2472 [[package]] 2311 2473 name = "html5ever" 2312 - version = "0.26.0" 2474 + version = "0.29.1" 2313 2475 source = "registry+https://github.com/rust-lang/crates.io-index" 2314 - checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" 2476 + checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" 2315 2477 dependencies = [ 2316 2478 "log", 2317 2479 "mac", 2318 2480 "markup5ever", 2319 - "proc-macro2", 2320 - "quote", 2321 - "syn 1.0.109", 2481 + "match_token", 2322 2482 ] 2323 2483 2324 2484 [[package]] 2325 2485 name = "http" 2326 - version = "1.3.1" 2486 + version = "1.4.0" 2327 2487 source = "registry+https://github.com/rust-lang/crates.io-index" 2328 - checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 2488 + checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" 2329 2489 dependencies = [ 2330 2490 "bytes", 2331 - "fnv", 2332 - "itoa 1.0.15", 2491 + "itoa", 2333 2492 ] 2334 2493 2335 2494 [[package]] ··· 2369 2528 2370 2529 [[package]] 2371 2530 name = "hyper" 2372 - version = "1.6.0" 2531 + version = "1.8.1" 2373 2532 source = "registry+https://github.com/rust-lang/crates.io-index" 2374 - checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 2533 + checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" 2375 2534 dependencies = [ 2535 + "atomic-waker", 2376 2536 "bytes", 2377 2537 "futures-channel", 2378 - "futures-util", 2538 + "futures-core", 2379 2539 "h2", 2380 2540 "http", 2381 2541 "http-body", 2382 2542 "httparse", 2383 2543 "httpdate", 2384 - "itoa 1.0.15", 2544 + "itoa", 2385 2545 "pin-project-lite", 2546 + "pin-utils", 2386 2547 "smallvec", 2387 2548 "tokio", 2388 2549 "want", ··· 2397 2558 "http", 2398 2559 "hyper", 2399 2560 "hyper-util", 2400 - "rustls 0.23.28", 2561 + "rustls 0.23.36", 2401 2562 "rustls-pki-types", 2402 2563 "tokio", 2403 2564 "tokio-rustls", 2404 2565 "tower-service", 2405 - "webpki-roots 1.0.1", 2406 2566 ] 2407 2567 2408 2568 [[package]] 2409 2569 name = "hyper-util" 2410 - version = "0.1.14" 2570 + version = "0.1.20" 2411 2571 source = "registry+https://github.com/rust-lang/crates.io-index" 2412 - checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" 2572 + checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" 2413 2573 dependencies = [ 2414 2574 "base64 0.22.1", 2415 2575 "bytes", 2416 2576 "futures-channel", 2417 - "futures-core", 2418 2577 "futures-util", 2419 2578 "http", 2420 2579 "http-body", ··· 2423 2582 "libc", 2424 2583 "percent-encoding", 2425 2584 "pin-project-lite", 2426 - "socket2", 2585 + "socket2 0.6.2", 2427 2586 "system-configuration", 2428 2587 "tokio", 2429 2588 "tower-service", ··· 2433 2592 2434 2593 [[package]] 2435 2594 name = "iana-time-zone" 2436 - version = "0.1.63" 2595 + version = "0.1.65" 2437 2596 source = "registry+https://github.com/rust-lang/crates.io-index" 2438 - checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 2597 + checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" 2439 2598 dependencies = [ 2440 2599 "android_system_properties", 2441 2600 "core-foundation-sys", ··· 2443 2602 "js-sys", 2444 2603 "log", 2445 2604 "wasm-bindgen", 2446 - "windows-core", 2605 + "windows-core 0.62.2", 2447 2606 ] 2448 2607 2449 2608 [[package]] ··· 2457 2616 2458 2617 [[package]] 2459 2618 name = "ico" 2460 - version = "0.4.0" 2619 + version = "0.5.0" 2461 2620 source = "registry+https://github.com/rust-lang/crates.io-index" 2462 - checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" 2621 + checksum = "3e795dff5605e0f04bff85ca41b51a96b83e80b281e96231bcaaf1ac35103371" 2463 2622 dependencies = [ 2464 2623 "byteorder", 2465 2624 "png", ··· 2467 2626 2468 2627 [[package]] 2469 2628 name = "icu_collections" 2470 - version = "2.0.0" 2629 + version = "2.1.1" 2471 2630 source = "registry+https://github.com/rust-lang/crates.io-index" 2472 - checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 2631 + checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" 2473 2632 dependencies = [ 2474 2633 "displaydoc", 2475 2634 "potential_utf", ··· 2480 2639 2481 2640 [[package]] 2482 2641 name = "icu_locale_core" 2483 - version = "2.0.0" 2642 + version = "2.1.1" 2484 2643 source = "registry+https://github.com/rust-lang/crates.io-index" 2485 - checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 2644 + checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" 2486 2645 dependencies = [ 2487 2646 "displaydoc", 2488 2647 "litemap", ··· 2493 2652 2494 2653 [[package]] 2495 2654 name = "icu_normalizer" 2496 - version = "2.0.0" 2655 + version = "2.1.1" 2497 2656 source = "registry+https://github.com/rust-lang/crates.io-index" 2498 - checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 2657 + checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" 2499 2658 dependencies = [ 2500 - "displaydoc", 2501 2659 "icu_collections", 2502 2660 "icu_normalizer_data", 2503 2661 "icu_properties", ··· 2508 2666 2509 2667 [[package]] 2510 2668 name = "icu_normalizer_data" 2511 - version = "2.0.0" 2669 + version = "2.1.1" 2512 2670 source = "registry+https://github.com/rust-lang/crates.io-index" 2513 - checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 2671 + checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" 2514 2672 2515 2673 [[package]] 2516 2674 name = "icu_properties" 2517 - version = "2.0.1" 2675 + version = "2.1.2" 2518 2676 source = "registry+https://github.com/rust-lang/crates.io-index" 2519 - checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 2677 + checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" 2520 2678 dependencies = [ 2521 - "displaydoc", 2522 2679 "icu_collections", 2523 2680 "icu_locale_core", 2524 2681 "icu_properties_data", 2525 2682 "icu_provider", 2526 - "potential_utf", 2527 2683 "zerotrie", 2528 2684 "zerovec", 2529 2685 ] 2530 2686 2531 2687 [[package]] 2532 2688 name = "icu_properties_data" 2533 - version = "2.0.1" 2689 + version = "2.1.2" 2534 2690 source = "registry+https://github.com/rust-lang/crates.io-index" 2535 - checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 2691 + checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" 2536 2692 2537 2693 [[package]] 2538 2694 name = "icu_provider" 2539 - version = "2.0.0" 2695 + version = "2.1.1" 2540 2696 source = "registry+https://github.com/rust-lang/crates.io-index" 2541 - checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 2697 + checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" 2542 2698 dependencies = [ 2543 2699 "displaydoc", 2544 2700 "icu_locale_core", 2545 - "stable_deref_trait", 2546 - "tinystr", 2547 2701 "writeable", 2548 2702 "yoke", 2549 2703 "zerofrom", ··· 2552 2706 ] 2553 2707 2554 2708 [[package]] 2709 + name = "id-arena" 2710 + version = "2.3.0" 2711 + source = "registry+https://github.com/rust-lang/crates.io-index" 2712 + checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" 2713 + 2714 + [[package]] 2555 2715 name = "ident_case" 2556 2716 version = "1.0.1" 2557 2717 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2559 2719 2560 2720 [[package]] 2561 2721 name = "idna" 2562 - version = "1.0.3" 2722 + version = "1.1.0" 2563 2723 source = "registry+https://github.com/rust-lang/crates.io-index" 2564 - checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 2724 + checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 2565 2725 dependencies = [ 2566 2726 "idna_adapter", 2567 2727 "smallvec", ··· 2591 2751 2592 2752 [[package]] 2593 2753 name = "indexmap" 2594 - version = "2.9.0" 2754 + version = "2.13.0" 2595 2755 source = "registry+https://github.com/rust-lang/crates.io-index" 2596 - checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 2756 + checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" 2597 2757 dependencies = [ 2598 2758 "equivalent", 2599 - "hashbrown 0.15.4", 2759 + "hashbrown 0.16.1", 2600 2760 "serde", 2761 + "serde_core", 2601 2762 ] 2602 2763 2603 2764 [[package]] ··· 2621 2782 2622 2783 [[package]] 2623 2784 name = "interceptor" 2624 - version = "0.14.0" 2785 + version = "0.17.1" 2625 2786 source = "registry+https://github.com/rust-lang/crates.io-index" 2626 - checksum = "1ac0781c825d602095113772e389ef0607afcb869ae0e68a590d8e0799cdcef8" 2787 + checksum = "7f73f4fdb971cab2d599cbdc2ccf0c6ea8fb27347b871ed14c65ce2353dbe75b" 2627 2788 dependencies = [ 2628 2789 "async-trait", 2629 2790 "bytes", 2791 + "futures", 2630 2792 "log", 2631 2793 "portable-atomic", 2632 - "rand 0.8.5", 2794 + "rand 0.9.2", 2633 2795 "rtcp", 2634 2796 "rtp", 2635 2797 "thiserror 1.0.69", ··· 2640 2802 ] 2641 2803 2642 2804 [[package]] 2805 + name = "interprocess" 2806 + version = "2.3.1" 2807 + source = "registry+https://github.com/rust-lang/crates.io-index" 2808 + checksum = "53bf2b0e0785c5394a7392f66d7c4fb9c653633c29b27a932280da3cb344c66a" 2809 + dependencies = [ 2810 + "doctest-file", 2811 + "futures-core", 2812 + "libc", 2813 + "recvmsg", 2814 + "tokio", 2815 + "widestring", 2816 + "windows-sys 0.52.0", 2817 + ] 2818 + 2819 + [[package]] 2643 2820 name = "ipnet" 2644 2821 version = "2.11.0" 2645 2822 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2647 2824 2648 2825 [[package]] 2649 2826 name = "iri-string" 2650 - version = "0.7.8" 2827 + version = "0.7.10" 2651 2828 source = "registry+https://github.com/rust-lang/crates.io-index" 2652 - checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 2829 + checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" 2653 2830 dependencies = [ 2654 2831 "memchr", 2655 2832 "serde", ··· 2676 2853 2677 2854 [[package]] 2678 2855 name = "is_terminal_polyfill" 2679 - version = "1.70.1" 2680 - source = "registry+https://github.com/rust-lang/crates.io-index" 2681 - checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 2682 - 2683 - [[package]] 2684 - name = "itoa" 2685 - version = "0.4.8" 2856 + version = "1.70.2" 2686 2857 source = "registry+https://github.com/rust-lang/crates.io-index" 2687 - checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" 2858 + checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" 2688 2859 2689 2860 [[package]] 2690 2861 name = "itoa" 2691 - version = "1.0.15" 2862 + version = "1.0.17" 2692 2863 source = "registry+https://github.com/rust-lang/crates.io-index" 2693 - checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 2864 + checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" 2694 2865 2695 2866 [[package]] 2696 2867 name = "javascriptcore-rs" ··· 2717 2888 2718 2889 [[package]] 2719 2890 name = "jiff" 2720 - version = "0.2.15" 2891 + version = "0.2.20" 2721 2892 source = "registry+https://github.com/rust-lang/crates.io-index" 2722 - checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" 2893 + checksum = "c867c356cc096b33f4981825ab281ecba3db0acefe60329f044c1789d94c6543" 2723 2894 dependencies = [ 2724 2895 "jiff-static", 2725 2896 "log", 2726 2897 "portable-atomic", 2727 2898 "portable-atomic-util", 2728 - "serde", 2899 + "serde_core", 2729 2900 ] 2730 2901 2731 2902 [[package]] 2732 2903 name = "jiff-static" 2733 - version = "0.2.15" 2904 + version = "0.2.20" 2734 2905 source = "registry+https://github.com/rust-lang/crates.io-index" 2735 - checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" 2906 + checksum = "f7946b4325269738f270bb55b3c19ab5c5040525f83fd625259422a9d25d9be5" 2736 2907 dependencies = [ 2737 2908 "proc-macro2", 2738 2909 "quote", 2739 - "syn 2.0.104", 2910 + "syn 2.0.116", 2740 2911 ] 2741 2912 2742 2913 [[package]] ··· 2762 2933 checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 2763 2934 2764 2935 [[package]] 2936 + name = "jobserver" 2937 + version = "0.1.34" 2938 + source = "registry+https://github.com/rust-lang/crates.io-index" 2939 + checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" 2940 + dependencies = [ 2941 + "getrandom 0.3.4", 2942 + "libc", 2943 + ] 2944 + 2945 + [[package]] 2765 2946 name = "js-sys" 2766 - version = "0.3.77" 2947 + version = "0.3.85" 2767 2948 source = "registry+https://github.com/rust-lang/crates.io-index" 2768 - checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 2949 + checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" 2769 2950 dependencies = [ 2770 2951 "once_cell", 2771 2952 "wasm-bindgen", ··· 2799 2980 source = "registry+https://github.com/rust-lang/crates.io-index" 2800 2981 checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" 2801 2982 dependencies = [ 2802 - "bitflags 2.9.1", 2983 + "bitflags 2.11.0", 2803 2984 "serde", 2804 2985 "unicode-segmentation", 2805 2986 ] 2806 2987 2807 2988 [[package]] 2808 2989 name = "kuchikiki" 2809 - version = "0.8.2" 2990 + version = "0.8.8-speedreader" 2810 2991 source = "registry+https://github.com/rust-lang/crates.io-index" 2811 - checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" 2992 + checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" 2812 2993 dependencies = [ 2813 2994 "cssparser", 2814 2995 "html5ever", 2815 - "indexmap 1.9.3", 2816 - "matches", 2996 + "indexmap 2.13.0", 2817 2997 "selectors", 2818 2998 ] 2819 2999 ··· 2833 3013 checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 2834 3014 2835 3015 [[package]] 3016 + name = "leb128fmt" 3017 + version = "0.1.0" 3018 + source = "registry+https://github.com/rust-lang/crates.io-index" 3019 + checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" 3020 + 3021 + [[package]] 2836 3022 name = "libappindicator" 2837 3023 version = "0.9.0" 2838 3024 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 2858 3044 2859 3045 [[package]] 2860 3046 name = "libc" 2861 - version = "0.2.174" 3047 + version = "0.2.182" 2862 3048 source = "registry+https://github.com/rust-lang/crates.io-index" 2863 - checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" 3049 + checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" 2864 3050 2865 3051 [[package]] 2866 3052 name = "libloading" ··· 2874 3060 2875 3061 [[package]] 2876 3062 name = "libredox" 2877 - version = "0.1.3" 3063 + version = "0.1.12" 2878 3064 source = "registry+https://github.com/rust-lang/crates.io-index" 2879 - checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 3065 + checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" 2880 3066 dependencies = [ 2881 - "bitflags 2.9.1", 3067 + "bitflags 2.11.0", 2882 3068 "libc", 2883 3069 ] 2884 3070 2885 3071 [[package]] 2886 3072 name = "linux-raw-sys" 2887 - version = "0.9.4" 3073 + version = "0.11.0" 2888 3074 source = "registry+https://github.com/rust-lang/crates.io-index" 2889 - checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 3075 + checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 2890 3076 2891 3077 [[package]] 2892 3078 name = "litemap" 2893 - version = "0.8.0" 3079 + version = "0.8.1" 2894 3080 source = "registry+https://github.com/rust-lang/crates.io-index" 2895 - checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 3081 + checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" 2896 3082 2897 3083 [[package]] 2898 3084 name = "lock_api" 2899 - version = "0.4.13" 3085 + version = "0.4.14" 2900 3086 source = "registry+https://github.com/rust-lang/crates.io-index" 2901 - checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 3087 + checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 2902 3088 dependencies = [ 2903 - "autocfg", 2904 3089 "scopeguard", 2905 3090 ] 2906 3091 2907 3092 [[package]] 2908 3093 name = "log" 2909 - version = "0.4.27" 3094 + version = "0.4.29" 2910 3095 source = "registry+https://github.com/rust-lang/crates.io-index" 2911 - checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 3096 + checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" 2912 3097 dependencies = [ 2913 3098 "value-bag", 2914 3099 ] ··· 2927 3112 2928 3113 [[package]] 2929 3114 name = "mac-notification-sys" 2930 - version = "0.6.4" 3115 + version = "0.6.9" 2931 3116 source = "registry+https://github.com/rust-lang/crates.io-index" 2932 - checksum = "0b95dfb34071d1592b45622bf93e315e3a72d414b6782aca9a015c12bec367ef" 3117 + checksum = "65fd3f75411f4725061682ed91f131946e912859d0044d39c4ec0aac818d7621" 2933 3118 dependencies = [ 2934 3119 "cc", 2935 - "objc2 0.6.1", 2936 - "objc2-foundation 0.3.1", 3120 + "objc2", 3121 + "objc2-foundation", 2937 3122 "time", 2938 3123 ] 2939 3124 ··· 2969 3154 dependencies = [ 2970 3155 "anyhow", 2971 3156 "chrono", 2972 - "rand 0.9.1", 2973 - "rand_chacha 0.9.0", 3157 + "rand 0.10.0", 3158 + "rand_chacha 0.10.0", 2974 3159 "serde", 2975 3160 "specta", 2976 3161 "tokio", 3162 + "tokio-util", 2977 3163 "uuid", 2978 3164 ] 2979 3165 ··· 2989 3175 "log", 2990 3176 "matchbox_protocol", 2991 3177 "matchbox_signaling", 3178 + "rand 0.10.0", 3179 + "tokio", 3180 + "tokio-util", 3181 + "uuid", 3182 + ] 3183 + 3184 + [[package]] 3185 + name = "manhunt-testing" 3186 + version = "0.1.0" 3187 + dependencies = [ 3188 + "anyhow", 3189 + "clap", 3190 + "interprocess", 3191 + "manhunt-logic", 3192 + "manhunt-transport", 3193 + "serde", 3194 + "serde_json", 2992 3195 "tokio", 2993 3196 ] 2994 3197 ··· 3003 3206 "manhunt-logic", 3004 3207 "matchbox_protocol", 3005 3208 "matchbox_socket", 3006 - "rand 0.9.1", 3209 + "rand 0.10.0", 3007 3210 "reqwest", 3008 3211 "rmp-serde", 3009 3212 "serde", ··· 3014 3217 3015 3218 [[package]] 3016 3219 name = "markup5ever" 3017 - version = "0.11.0" 3220 + version = "0.14.1" 3018 3221 source = "registry+https://github.com/rust-lang/crates.io-index" 3019 - checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" 3222 + checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" 3020 3223 dependencies = [ 3021 3224 "log", 3022 - "phf 0.10.1", 3023 - "phf_codegen 0.10.0", 3225 + "phf 0.11.3", 3226 + "phf_codegen 0.11.3", 3024 3227 "string_cache", 3025 3228 "string_cache_codegen", 3026 3229 "tendril", 3027 3230 ] 3028 3231 3029 3232 [[package]] 3233 + name = "match_token" 3234 + version = "0.1.0" 3235 + source = "registry+https://github.com/rust-lang/crates.io-index" 3236 + checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" 3237 + dependencies = [ 3238 + "proc-macro2", 3239 + "quote", 3240 + "syn 2.0.116", 3241 + ] 3242 + 3243 + [[package]] 3030 3244 name = "matchbox_protocol" 3031 - version = "0.12.0" 3245 + version = "0.14.0" 3032 3246 source = "registry+https://github.com/rust-lang/crates.io-index" 3033 - checksum = "f0cfe43dd6af96da1ea044838f59b8d7438971f85376be464ead11bbd7a01c27" 3247 + checksum = "867e83a984f369eabc682318eec2db410aef1dbb5399cb1890e6659dfa9b7449" 3034 3248 dependencies = [ 3035 3249 "cfg-if", 3036 - "derive_more 2.0.1", 3250 + "derive_more 2.1.1", 3037 3251 "serde", 3038 3252 "serde_json", 3039 3253 "uuid", ··· 3041 3255 3042 3256 [[package]] 3043 3257 name = "matchbox_signaling" 3044 - version = "0.12.0" 3258 + version = "0.14.0" 3045 3259 source = "registry+https://github.com/rust-lang/crates.io-index" 3046 - checksum = "0f30f7e4302e1d80a824503c78b893bf0635ee864a7c0e4394d76b6dd61bab12" 3260 + checksum = "33d8eeb36f21a45699331d121b4c5d2c7fdd342f0216e4c0033787f5c5fc4470" 3047 3261 dependencies = [ 3048 3262 "async-trait", 3049 3263 "axum", ··· 3052 3266 "matchbox_protocol", 3053 3267 "serde", 3054 3268 "serde_json", 3055 - "thiserror 2.0.12", 3269 + "thiserror 2.0.18", 3056 3270 "tokio", 3057 3271 "tokio-stream", 3058 3272 "tower-http", ··· 3062 3276 3063 3277 [[package]] 3064 3278 name = "matchbox_socket" 3065 - version = "0.12.0" 3279 + version = "0.14.0" 3066 3280 source = "registry+https://github.com/rust-lang/crates.io-index" 3067 - checksum = "9c2bc39cd3e655243143ddb40faa4c30c0c415347f6a0985e378806a24593e9e" 3281 + checksum = "11ee21421327e145fab424cadb542bef9f745a8938b9eb8c81d3286e98f18be9" 3068 3282 dependencies = [ 3069 3283 "async-compat", 3070 3284 "async-trait", 3071 3285 "async-tungstenite", 3072 3286 "bytes", 3073 3287 "cfg-if", 3074 - "derive_more 2.0.1", 3288 + "derive_more 2.1.1", 3075 3289 "futures", 3076 3290 "futures-channel", 3077 3291 "futures-timer", ··· 3083 3297 "serde", 3084 3298 "serde-wasm-bindgen", 3085 3299 "serde_json", 3086 - "thiserror 2.0.12", 3300 + "thiserror 2.0.18", 3087 3301 "tokio-util", 3088 3302 "wasm-bindgen", 3089 3303 "wasm-bindgen-futures", ··· 3116 3330 3117 3331 [[package]] 3118 3332 name = "memchr" 3119 - version = "2.7.5" 3333 + version = "2.8.0" 3120 3334 source = "registry+https://github.com/rust-lang/crates.io-index" 3121 - checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 3335 + checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" 3122 3336 3123 3337 [[package]] 3124 3338 name = "memoffset" ··· 3162 3376 3163 3377 [[package]] 3164 3378 name = "mio" 3165 - version = "1.0.4" 3379 + version = "1.1.1" 3166 3380 source = "registry+https://github.com/rust-lang/crates.io-index" 3167 - checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 3381 + checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" 3168 3382 dependencies = [ 3169 3383 "libc", 3170 3384 "wasi 0.11.1+wasi-snapshot-preview1", 3171 - "windows-sys 0.59.0", 3385 + "windows-sys 0.61.2", 3172 3386 ] 3173 3387 3174 3388 [[package]] 3175 3389 name = "muda" 3176 - version = "0.16.1" 3390 + version = "0.17.1" 3177 3391 source = "registry+https://github.com/rust-lang/crates.io-index" 3178 - checksum = "4de14a9b5d569ca68d7c891d613b390cf5ab4f851c77aaa2f9e435555d3d9492" 3392 + checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" 3179 3393 dependencies = [ 3180 3394 "crossbeam-channel", 3181 3395 "dpi", 3182 3396 "gtk", 3183 3397 "keyboard-types", 3184 - "objc2 0.6.1", 3398 + "objc2", 3185 3399 "objc2-app-kit", 3186 3400 "objc2-core-foundation", 3187 - "objc2-foundation 0.3.1", 3401 + "objc2-foundation", 3188 3402 "once_cell", 3189 3403 "png", 3190 3404 "serde", 3191 - "thiserror 2.0.12", 3192 - "windows-sys 0.59.0", 3405 + "thiserror 2.0.18", 3406 + "windows-sys 0.60.2", 3407 + ] 3408 + 3409 + [[package]] 3410 + name = "munge" 3411 + version = "0.4.7" 3412 + source = "registry+https://github.com/rust-lang/crates.io-index" 3413 + checksum = "5e17401f259eba956ca16491461b6e8f72913a0a114e39736ce404410f915a0c" 3414 + dependencies = [ 3415 + "munge_macro", 3416 + ] 3417 + 3418 + [[package]] 3419 + name = "munge_macro" 3420 + version = "0.4.7" 3421 + source = "registry+https://github.com/rust-lang/crates.io-index" 3422 + checksum = "4568f25ccbd45ab5d5603dc34318c1ec56b117531781260002151b8530a9f931" 3423 + dependencies = [ 3424 + "proc-macro2", 3425 + "quote", 3426 + "syn 2.0.116", 3193 3427 ] 3194 3428 3195 3429 [[package]] ··· 3198 3432 source = "registry+https://github.com/rust-lang/crates.io-index" 3199 3433 checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" 3200 3434 dependencies = [ 3201 - "bitflags 2.9.1", 3435 + "bitflags 2.11.0", 3202 3436 "jni-sys", 3203 3437 "log", 3204 3438 "ndk-sys", ··· 3242 3476 ] 3243 3477 3244 3478 [[package]] 3245 - name = "nix" 3246 - version = "0.30.1" 3247 - source = "registry+https://github.com/rust-lang/crates.io-index" 3248 - checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" 3249 - dependencies = [ 3250 - "bitflags 2.9.1", 3251 - "cfg-if", 3252 - "cfg_aliases", 3253 - "libc", 3254 - "memoffset 0.9.1", 3255 - ] 3256 - 3257 - [[package]] 3258 3479 name = "nodrop" 3259 3480 version = "0.1.14" 3260 3481 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 3272 3493 3273 3494 [[package]] 3274 3495 name = "notify-rust" 3275 - version = "4.11.7" 3496 + version = "4.12.0" 3276 3497 source = "registry+https://github.com/rust-lang/crates.io-index" 3277 - checksum = "6442248665a5aa2514e794af3b39661a8e73033b1cc5e59899e1276117ee4400" 3498 + checksum = "21af20a1b50be5ac5861f74af1a863da53a11c38684d9818d82f1c42f7fdc6c2" 3278 3499 dependencies = [ 3279 3500 "futures-lite", 3280 3501 "log", ··· 3296 3517 3297 3518 [[package]] 3298 3519 name = "num-conv" 3299 - version = "0.1.0" 3520 + version = "0.2.0" 3300 3521 source = "registry+https://github.com/rust-lang/crates.io-index" 3301 - checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 3522 + checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" 3302 3523 3303 3524 [[package]] 3304 3525 name = "num-integer" ··· 3320 3541 3321 3542 [[package]] 3322 3543 name = "num_enum" 3323 - version = "0.7.4" 3544 + version = "0.7.5" 3324 3545 source = "registry+https://github.com/rust-lang/crates.io-index" 3325 - checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" 3546 + checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" 3326 3547 dependencies = [ 3327 3548 "num_enum_derive", 3328 3549 "rustversion", ··· 3330 3551 3331 3552 [[package]] 3332 3553 name = "num_enum_derive" 3333 - version = "0.7.4" 3554 + version = "0.7.5" 3334 3555 source = "registry+https://github.com/rust-lang/crates.io-index" 3335 - checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" 3556 + checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" 3336 3557 dependencies = [ 3337 - "proc-macro-crate 3.3.0", 3558 + "proc-macro-crate 3.4.0", 3338 3559 "proc-macro2", 3339 3560 "quote", 3340 - "syn 2.0.104", 3561 + "syn 2.0.116", 3341 3562 ] 3342 3563 3343 3564 [[package]] ··· 3350 3571 ] 3351 3572 3352 3573 [[package]] 3353 - name = "objc-sys" 3354 - version = "0.3.5" 3355 - source = "registry+https://github.com/rust-lang/crates.io-index" 3356 - checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" 3357 - 3358 - [[package]] 3359 3574 name = "objc2" 3360 - version = "0.5.2" 3361 - source = "registry+https://github.com/rust-lang/crates.io-index" 3362 - checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" 3363 - dependencies = [ 3364 - "objc-sys", 3365 - "objc2-encode", 3366 - ] 3367 - 3368 - [[package]] 3369 - name = "objc2" 3370 - version = "0.6.1" 3575 + version = "0.6.3" 3371 3576 source = "registry+https://github.com/rust-lang/crates.io-index" 3372 - checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" 3577 + checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" 3373 3578 dependencies = [ 3374 3579 "objc2-encode", 3375 3580 "objc2-exception-helper", ··· 3377 3582 3378 3583 [[package]] 3379 3584 name = "objc2-app-kit" 3380 - version = "0.3.1" 3585 + version = "0.3.2" 3381 3586 source = "registry+https://github.com/rust-lang/crates.io-index" 3382 - checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" 3587 + checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" 3383 3588 dependencies = [ 3384 - "bitflags 2.9.1", 3385 - "block2 0.6.1", 3589 + "bitflags 2.11.0", 3590 + "block2", 3386 3591 "libc", 3387 - "objc2 0.6.1", 3592 + "objc2", 3388 3593 "objc2-cloud-kit", 3389 3594 "objc2-core-data", 3390 3595 "objc2-core-foundation", 3391 3596 "objc2-core-graphics", 3392 3597 "objc2-core-image", 3393 - "objc2-foundation 0.3.1", 3394 - "objc2-quartz-core 0.3.1", 3598 + "objc2-core-text", 3599 + "objc2-core-video", 3600 + "objc2-foundation", 3601 + "objc2-quartz-core", 3395 3602 ] 3396 3603 3397 3604 [[package]] 3398 3605 name = "objc2-cloud-kit" 3399 - version = "0.3.1" 3606 + version = "0.3.2" 3400 3607 source = "registry+https://github.com/rust-lang/crates.io-index" 3401 - checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" 3608 + checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" 3402 3609 dependencies = [ 3403 - "bitflags 2.9.1", 3404 - "objc2 0.6.1", 3405 - "objc2-foundation 0.3.1", 3610 + "bitflags 2.11.0", 3611 + "objc2", 3612 + "objc2-foundation", 3406 3613 ] 3407 3614 3408 3615 [[package]] 3409 3616 name = "objc2-core-data" 3410 - version = "0.3.1" 3617 + version = "0.3.2" 3411 3618 source = "registry+https://github.com/rust-lang/crates.io-index" 3412 - checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" 3619 + checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" 3413 3620 dependencies = [ 3414 - "bitflags 2.9.1", 3415 - "objc2 0.6.1", 3416 - "objc2-foundation 0.3.1", 3621 + "bitflags 2.11.0", 3622 + "objc2", 3623 + "objc2-foundation", 3417 3624 ] 3418 3625 3419 3626 [[package]] 3420 3627 name = "objc2-core-foundation" 3421 - version = "0.3.1" 3628 + version = "0.3.2" 3422 3629 source = "registry+https://github.com/rust-lang/crates.io-index" 3423 - checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" 3630 + checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" 3424 3631 dependencies = [ 3425 - "bitflags 2.9.1", 3426 - "dispatch2 0.3.0", 3427 - "objc2 0.6.1", 3632 + "bitflags 2.11.0", 3633 + "dispatch2", 3634 + "objc2", 3428 3635 ] 3429 3636 3430 3637 [[package]] 3431 3638 name = "objc2-core-graphics" 3432 - version = "0.3.1" 3639 + version = "0.3.2" 3433 3640 source = "registry+https://github.com/rust-lang/crates.io-index" 3434 - checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" 3641 + checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" 3435 3642 dependencies = [ 3436 - "bitflags 2.9.1", 3437 - "dispatch2 0.3.0", 3438 - "objc2 0.6.1", 3643 + "bitflags 2.11.0", 3644 + "dispatch2", 3645 + "objc2", 3439 3646 "objc2-core-foundation", 3440 3647 "objc2-io-surface", 3441 3648 ] 3442 3649 3443 3650 [[package]] 3444 3651 name = "objc2-core-image" 3445 - version = "0.3.1" 3652 + version = "0.3.2" 3446 3653 source = "registry+https://github.com/rust-lang/crates.io-index" 3447 - checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" 3654 + checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" 3448 3655 dependencies = [ 3449 - "objc2 0.6.1", 3450 - "objc2-foundation 0.3.1", 3656 + "objc2", 3657 + "objc2-foundation", 3658 + ] 3659 + 3660 + [[package]] 3661 + name = "objc2-core-text" 3662 + version = "0.3.2" 3663 + source = "registry+https://github.com/rust-lang/crates.io-index" 3664 + checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" 3665 + dependencies = [ 3666 + "bitflags 2.11.0", 3667 + "objc2", 3668 + "objc2-core-foundation", 3669 + "objc2-core-graphics", 3670 + ] 3671 + 3672 + [[package]] 3673 + name = "objc2-core-video" 3674 + version = "0.3.2" 3675 + source = "registry+https://github.com/rust-lang/crates.io-index" 3676 + checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" 3677 + dependencies = [ 3678 + "bitflags 2.11.0", 3679 + "objc2", 3680 + "objc2-core-foundation", 3681 + "objc2-core-graphics", 3682 + "objc2-io-surface", 3451 3683 ] 3452 3684 3453 3685 [[package]] ··· 3467 3699 3468 3700 [[package]] 3469 3701 name = "objc2-foundation" 3470 - version = "0.2.2" 3702 + version = "0.3.2" 3471 3703 source = "registry+https://github.com/rust-lang/crates.io-index" 3472 - checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" 3704 + checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" 3473 3705 dependencies = [ 3474 - "bitflags 2.9.1", 3475 - "block2 0.5.1", 3476 - "libc", 3477 - "objc2 0.5.2", 3478 - ] 3479 - 3480 - [[package]] 3481 - name = "objc2-foundation" 3482 - version = "0.3.1" 3483 - source = "registry+https://github.com/rust-lang/crates.io-index" 3484 - checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" 3485 - dependencies = [ 3486 - "bitflags 2.9.1", 3487 - "block2 0.6.1", 3706 + "bitflags 2.11.0", 3707 + "block2", 3488 3708 "libc", 3489 - "objc2 0.6.1", 3709 + "objc2", 3490 3710 "objc2-core-foundation", 3491 3711 ] 3492 3712 3493 3713 [[package]] 3494 3714 name = "objc2-io-surface" 3495 - version = "0.3.1" 3715 + version = "0.3.2" 3496 3716 source = "registry+https://github.com/rust-lang/crates.io-index" 3497 - checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" 3717 + checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" 3498 3718 dependencies = [ 3499 - "bitflags 2.9.1", 3500 - "objc2 0.6.1", 3719 + "bitflags 2.11.0", 3720 + "objc2", 3501 3721 "objc2-core-foundation", 3502 3722 ] 3503 3723 3504 3724 [[package]] 3505 - name = "objc2-metal" 3506 - version = "0.2.2" 3725 + name = "objc2-javascript-core" 3726 + version = "0.3.2" 3507 3727 source = "registry+https://github.com/rust-lang/crates.io-index" 3508 - checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" 3728 + checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" 3509 3729 dependencies = [ 3510 - "bitflags 2.9.1", 3511 - "block2 0.5.1", 3512 - "objc2 0.5.2", 3513 - "objc2-foundation 0.2.2", 3730 + "objc2", 3731 + "objc2-core-foundation", 3514 3732 ] 3515 3733 3516 3734 [[package]] 3517 3735 name = "objc2-quartz-core" 3518 - version = "0.2.2" 3736 + version = "0.3.2" 3519 3737 source = "registry+https://github.com/rust-lang/crates.io-index" 3520 - checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" 3738 + checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" 3521 3739 dependencies = [ 3522 - "bitflags 2.9.1", 3523 - "block2 0.5.1", 3524 - "objc2 0.5.2", 3525 - "objc2-foundation 0.2.2", 3526 - "objc2-metal", 3740 + "bitflags 2.11.0", 3741 + "objc2", 3742 + "objc2-core-foundation", 3743 + "objc2-foundation", 3527 3744 ] 3528 3745 3529 3746 [[package]] 3530 - name = "objc2-quartz-core" 3531 - version = "0.3.1" 3747 + name = "objc2-security" 3748 + version = "0.3.2" 3532 3749 source = "registry+https://github.com/rust-lang/crates.io-index" 3533 - checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" 3750 + checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" 3534 3751 dependencies = [ 3535 - "bitflags 2.9.1", 3536 - "objc2 0.6.1", 3537 - "objc2-foundation 0.3.1", 3752 + "bitflags 2.11.0", 3753 + "objc2", 3754 + "objc2-core-foundation", 3538 3755 ] 3539 3756 3540 3757 [[package]] 3541 3758 name = "objc2-ui-kit" 3542 - version = "0.3.1" 3759 + version = "0.3.2" 3543 3760 source = "registry+https://github.com/rust-lang/crates.io-index" 3544 - checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed" 3761 + checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" 3545 3762 dependencies = [ 3546 - "bitflags 2.9.1", 3547 - "objc2 0.6.1", 3763 + "bitflags 2.11.0", 3764 + "objc2", 3548 3765 "objc2-core-foundation", 3549 - "objc2-foundation 0.3.1", 3766 + "objc2-foundation", 3550 3767 ] 3551 3768 3552 3769 [[package]] 3553 3770 name = "objc2-web-kit" 3554 - version = "0.3.1" 3771 + version = "0.3.2" 3555 3772 source = "registry+https://github.com/rust-lang/crates.io-index" 3556 - checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad" 3773 + checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" 3557 3774 dependencies = [ 3558 - "bitflags 2.9.1", 3559 - "block2 0.6.1", 3560 - "objc2 0.6.1", 3775 + "bitflags 2.11.0", 3776 + "block2", 3777 + "objc2", 3561 3778 "objc2-app-kit", 3562 3779 "objc2-core-foundation", 3563 - "objc2-foundation 0.3.1", 3564 - ] 3565 - 3566 - [[package]] 3567 - name = "object" 3568 - version = "0.36.7" 3569 - source = "registry+https://github.com/rust-lang/crates.io-index" 3570 - checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 3571 - dependencies = [ 3572 - "memchr", 3780 + "objc2-foundation", 3781 + "objc2-javascript-core", 3782 + "objc2-security", 3573 3783 ] 3574 3784 3575 3785 [[package]] ··· 3589 3799 3590 3800 [[package]] 3591 3801 name = "once_cell_polyfill" 3592 - version = "1.70.1" 3802 + version = "1.70.2" 3593 3803 source = "registry+https://github.com/rust-lang/crates.io-index" 3594 - checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" 3804 + checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" 3595 3805 3596 3806 [[package]] 3597 3807 name = "opaque-debug" ··· 3601 3811 3602 3812 [[package]] 3603 3813 name = "open" 3604 - version = "5.3.2" 3814 + version = "5.3.3" 3605 3815 source = "registry+https://github.com/rust-lang/crates.io-index" 3606 - checksum = "e2483562e62ea94312f3576a7aca397306df7990b8d89033e18766744377ef95" 3816 + checksum = "43bb73a7fa3799b198970490a51174027ba0d4ec504b03cd08caf513d40024bc" 3607 3817 dependencies = [ 3608 3818 "dunce", 3609 3819 "is-wsl", 3610 3820 "libc", 3611 3821 "pathdiff", 3612 3822 ] 3823 + 3824 + [[package]] 3825 + name = "openssl-probe" 3826 + version = "0.2.1" 3827 + source = "registry+https://github.com/rust-lang/crates.io-index" 3828 + checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" 3613 3829 3614 3830 [[package]] 3615 3831 name = "option-ext" ··· 3684 3900 3685 3901 [[package]] 3686 3902 name = "parking_lot" 3687 - version = "0.12.4" 3903 + version = "0.12.5" 3688 3904 source = "registry+https://github.com/rust-lang/crates.io-index" 3689 - checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 3905 + checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 3690 3906 dependencies = [ 3691 3907 "lock_api", 3692 3908 "parking_lot_core", ··· 3694 3910 3695 3911 [[package]] 3696 3912 name = "parking_lot_core" 3697 - version = "0.9.11" 3913 + version = "0.9.12" 3698 3914 source = "registry+https://github.com/rust-lang/crates.io-index" 3699 - checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 3915 + checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 3700 3916 dependencies = [ 3701 3917 "cfg-if", 3702 3918 "libc", 3703 3919 "redox_syscall", 3704 3920 "smallvec", 3705 - "windows-targets 0.52.6", 3921 + "windows-link 0.2.1", 3706 3922 ] 3707 3923 3708 3924 [[package]] ··· 3719 3935 3720 3936 [[package]] 3721 3937 name = "pem" 3722 - version = "3.0.5" 3938 + version = "3.0.6" 3723 3939 source = "registry+https://github.com/rust-lang/crates.io-index" 3724 - checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" 3940 + checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" 3725 3941 dependencies = [ 3726 3942 "base64 0.22.1", 3727 - "serde", 3943 + "serde_core", 3728 3944 ] 3729 3945 3730 3946 [[package]] ··· 3738 3954 3739 3955 [[package]] 3740 3956 name = "percent-encoding" 3741 - version = "2.3.1" 3957 + version = "2.3.2" 3742 3958 source = "registry+https://github.com/rust-lang/crates.io-index" 3743 - checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 3959 + checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 3744 3960 3745 3961 [[package]] 3746 3962 name = "pharos" ··· 3758 3974 source = "registry+https://github.com/rust-lang/crates.io-index" 3759 3975 checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" 3760 3976 dependencies = [ 3761 - "phf_macros 0.8.0", 3762 3977 "phf_shared 0.8.0", 3763 - "proc-macro-hack", 3764 3978 ] 3765 3979 3766 3980 [[package]] ··· 3769 3983 source = "registry+https://github.com/rust-lang/crates.io-index" 3770 3984 checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" 3771 3985 dependencies = [ 3986 + "phf_macros 0.10.0", 3772 3987 "phf_shared 0.10.0", 3988 + "proc-macro-hack", 3773 3989 ] 3774 3990 3775 3991 [[package]] ··· 3794 4010 3795 4011 [[package]] 3796 4012 name = "phf_codegen" 3797 - version = "0.10.0" 4013 + version = "0.11.3" 3798 4014 source = "registry+https://github.com/rust-lang/crates.io-index" 3799 - checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" 4015 + checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" 3800 4016 dependencies = [ 3801 - "phf_generator 0.10.0", 3802 - "phf_shared 0.10.0", 4017 + "phf_generator 0.11.3", 4018 + "phf_shared 0.11.3", 3803 4019 ] 3804 4020 3805 4021 [[package]] ··· 3834 4050 3835 4051 [[package]] 3836 4052 name = "phf_macros" 3837 - version = "0.8.0" 4053 + version = "0.10.0" 3838 4054 source = "registry+https://github.com/rust-lang/crates.io-index" 3839 - checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" 4055 + checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" 3840 4056 dependencies = [ 3841 - "phf_generator 0.8.0", 3842 - "phf_shared 0.8.0", 4057 + "phf_generator 0.10.0", 4058 + "phf_shared 0.10.0", 3843 4059 "proc-macro-hack", 3844 4060 "proc-macro2", 3845 4061 "quote", ··· 3856 4072 "phf_shared 0.11.3", 3857 4073 "proc-macro2", 3858 4074 "quote", 3859 - "syn 2.0.104", 4075 + "syn 2.0.116", 3860 4076 ] 3861 4077 3862 4078 [[package]] ··· 3883 4099 source = "registry+https://github.com/rust-lang/crates.io-index" 3884 4100 checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" 3885 4101 dependencies = [ 3886 - "siphasher 1.0.1", 4102 + "siphasher 1.0.2", 3887 4103 ] 3888 4104 3889 4105 [[package]] ··· 3927 4143 3928 4144 [[package]] 3929 4145 name = "plist" 3930 - version = "1.7.2" 4146 + version = "1.8.0" 3931 4147 source = "registry+https://github.com/rust-lang/crates.io-index" 3932 - checksum = "3d77244ce2d584cd84f6a15f86195b8c9b2a0dfbfd817c09e0464244091a58ed" 4148 + checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" 3933 4149 dependencies = [ 3934 4150 "base64 0.22.1", 3935 - "indexmap 2.9.0", 3936 - "quick-xml", 4151 + "indexmap 2.13.0", 4152 + "quick-xml 0.38.4", 3937 4153 "serde", 3938 4154 "time", 3939 4155 ] ··· 3953 4169 3954 4170 [[package]] 3955 4171 name = "polling" 3956 - version = "3.8.0" 4172 + version = "3.11.0" 3957 4173 source = "registry+https://github.com/rust-lang/crates.io-index" 3958 - checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" 4174 + checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" 3959 4175 dependencies = [ 3960 4176 "cfg-if", 3961 4177 "concurrent-queue", 3962 4178 "hermit-abi", 3963 4179 "pin-project-lite", 3964 4180 "rustix", 3965 - "tracing", 3966 - "windows-sys 0.59.0", 4181 + "windows-sys 0.61.2", 4182 + ] 4183 + 4184 + [[package]] 4185 + name = "poly1305" 4186 + version = "0.8.0" 4187 + source = "registry+https://github.com/rust-lang/crates.io-index" 4188 + checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" 4189 + dependencies = [ 4190 + "cpufeatures 0.2.17", 4191 + "opaque-debug", 4192 + "universal-hash", 3967 4193 ] 3968 4194 3969 4195 [[package]] ··· 3973 4199 checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" 3974 4200 dependencies = [ 3975 4201 "cfg-if", 3976 - "cpufeatures", 4202 + "cpufeatures 0.2.17", 3977 4203 "opaque-debug", 3978 4204 "universal-hash", 3979 4205 ] 3980 4206 3981 4207 [[package]] 3982 4208 name = "portable-atomic" 3983 - version = "1.11.1" 4209 + version = "1.13.1" 3984 4210 source = "registry+https://github.com/rust-lang/crates.io-index" 3985 - checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" 4211 + checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" 3986 4212 3987 4213 [[package]] 3988 4214 name = "portable-atomic-util" 3989 - version = "0.2.4" 4215 + version = "0.2.5" 3990 4216 source = "registry+https://github.com/rust-lang/crates.io-index" 3991 - checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" 4217 + checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" 3992 4218 dependencies = [ 3993 4219 "portable-atomic", 3994 4220 ] 3995 4221 3996 4222 [[package]] 3997 4223 name = "potential_utf" 3998 - version = "0.1.2" 4224 + version = "0.1.4" 3999 4225 source = "registry+https://github.com/rust-lang/crates.io-index" 4000 - checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 4226 + checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" 4001 4227 dependencies = [ 4002 4228 "zerovec", 4003 4229 ] ··· 4024 4250 checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 4025 4251 4026 4252 [[package]] 4253 + name = "prettyplease" 4254 + version = "0.2.37" 4255 + source = "registry+https://github.com/rust-lang/crates.io-index" 4256 + checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" 4257 + dependencies = [ 4258 + "proc-macro2", 4259 + "syn 2.0.116", 4260 + ] 4261 + 4262 + [[package]] 4027 4263 name = "primeorder" 4028 4264 version = "0.13.6" 4029 4265 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4044 4280 4045 4281 [[package]] 4046 4282 name = "proc-macro-crate" 4047 - version = "2.0.0" 4283 + version = "2.0.2" 4048 4284 source = "registry+https://github.com/rust-lang/crates.io-index" 4049 - checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" 4285 + checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" 4050 4286 dependencies = [ 4051 - "toml_edit 0.20.7", 4287 + "toml_datetime 0.6.3", 4288 + "toml_edit 0.20.2", 4052 4289 ] 4053 4290 4054 4291 [[package]] 4055 4292 name = "proc-macro-crate" 4056 - version = "3.3.0" 4293 + version = "3.4.0" 4057 4294 source = "registry+https://github.com/rust-lang/crates.io-index" 4058 - checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" 4295 + checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" 4059 4296 dependencies = [ 4060 - "toml_edit 0.22.27", 4297 + "toml_edit 0.23.10+spec-1.0.0", 4061 4298 ] 4062 4299 4063 4300 [[package]] ··· 4092 4329 4093 4330 [[package]] 4094 4331 name = "proc-macro2" 4095 - version = "1.0.95" 4332 + version = "1.0.106" 4096 4333 source = "registry+https://github.com/rust-lang/crates.io-index" 4097 - checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 4334 + checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" 4098 4335 dependencies = [ 4099 4336 "unicode-ident", 4100 4337 ] ··· 4105 4342 source = "registry+https://github.com/rust-lang/crates.io-index" 4106 4343 checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" 4107 4344 dependencies = [ 4108 - "ptr_meta_derive", 4345 + "ptr_meta_derive 0.1.4", 4346 + ] 4347 + 4348 + [[package]] 4349 + name = "ptr_meta" 4350 + version = "0.3.1" 4351 + source = "registry+https://github.com/rust-lang/crates.io-index" 4352 + checksum = "0b9a0cf95a1196af61d4f1cbdab967179516d9a4a4312af1f31948f8f6224a79" 4353 + dependencies = [ 4354 + "ptr_meta_derive 0.3.1", 4109 4355 ] 4110 4356 4111 4357 [[package]] ··· 4120 4366 ] 4121 4367 4122 4368 [[package]] 4369 + name = "ptr_meta_derive" 4370 + version = "0.3.1" 4371 + source = "registry+https://github.com/rust-lang/crates.io-index" 4372 + checksum = "7347867d0a7e1208d93b46767be83e2b8f978c3dad35f775ac8d8847551d6fe1" 4373 + dependencies = [ 4374 + "proc-macro2", 4375 + "quote", 4376 + "syn 2.0.116", 4377 + ] 4378 + 4379 + [[package]] 4123 4380 name = "quick-xml" 4124 4381 version = "0.37.5" 4125 4382 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4129 4386 ] 4130 4387 4131 4388 [[package]] 4389 + name = "quick-xml" 4390 + version = "0.38.4" 4391 + source = "registry+https://github.com/rust-lang/crates.io-index" 4392 + checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" 4393 + dependencies = [ 4394 + "memchr", 4395 + ] 4396 + 4397 + [[package]] 4132 4398 name = "quinn" 4133 - version = "0.11.8" 4399 + version = "0.11.9" 4134 4400 source = "registry+https://github.com/rust-lang/crates.io-index" 4135 - checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" 4401 + checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" 4136 4402 dependencies = [ 4137 4403 "bytes", 4138 4404 "cfg_aliases", ··· 4140 4406 "quinn-proto", 4141 4407 "quinn-udp", 4142 4408 "rustc-hash", 4143 - "rustls 0.23.28", 4144 - "socket2", 4145 - "thiserror 2.0.12", 4409 + "rustls 0.23.36", 4410 + "socket2 0.6.2", 4411 + "thiserror 2.0.18", 4146 4412 "tokio", 4147 4413 "tracing", 4148 4414 "web-time", ··· 4150 4416 4151 4417 [[package]] 4152 4418 name = "quinn-proto" 4153 - version = "0.11.12" 4419 + version = "0.11.13" 4154 4420 source = "registry+https://github.com/rust-lang/crates.io-index" 4155 - checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" 4421 + checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" 4156 4422 dependencies = [ 4423 + "aws-lc-rs", 4157 4424 "bytes", 4158 - "getrandom 0.3.3", 4425 + "getrandom 0.3.4", 4159 4426 "lru-slab", 4160 - "rand 0.9.1", 4427 + "rand 0.9.2", 4161 4428 "ring", 4162 4429 "rustc-hash", 4163 - "rustls 0.23.28", 4430 + "rustls 0.23.36", 4164 4431 "rustls-pki-types", 4165 4432 "slab", 4166 - "thiserror 2.0.12", 4433 + "thiserror 2.0.18", 4167 4434 "tinyvec", 4168 4435 "tracing", 4169 4436 "web-time", ··· 4171 4438 4172 4439 [[package]] 4173 4440 name = "quinn-udp" 4174 - version = "0.5.13" 4441 + version = "0.5.14" 4175 4442 source = "registry+https://github.com/rust-lang/crates.io-index" 4176 - checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" 4443 + checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" 4177 4444 dependencies = [ 4178 4445 "cfg_aliases", 4179 4446 "libc", 4180 4447 "once_cell", 4181 - "socket2", 4448 + "socket2 0.6.2", 4182 4449 "tracing", 4183 - "windows-sys 0.59.0", 4450 + "windows-sys 0.60.2", 4184 4451 ] 4185 4452 4186 4453 [[package]] 4187 4454 name = "quote" 4188 - version = "1.0.40" 4455 + version = "1.0.44" 4189 4456 source = "registry+https://github.com/rust-lang/crates.io-index" 4190 - checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 4457 + checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" 4191 4458 dependencies = [ 4192 4459 "proc-macro2", 4193 4460 ] ··· 4205 4472 checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" 4206 4473 4207 4474 [[package]] 4475 + name = "rancor" 4476 + version = "0.1.1" 4477 + source = "registry+https://github.com/rust-lang/crates.io-index" 4478 + checksum = "a063ea72381527c2a0561da9c80000ef822bdd7c3241b1cc1b12100e3df081ee" 4479 + dependencies = [ 4480 + "ptr_meta 0.3.1", 4481 + ] 4482 + 4483 + [[package]] 4208 4484 name = "rand" 4209 4485 version = "0.7.3" 4210 4486 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4231 4507 4232 4508 [[package]] 4233 4509 name = "rand" 4234 - version = "0.9.1" 4510 + version = "0.9.2" 4235 4511 source = "registry+https://github.com/rust-lang/crates.io-index" 4236 - checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" 4512 + checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 4237 4513 dependencies = [ 4238 4514 "rand_chacha 0.9.0", 4239 - "rand_core 0.9.3", 4515 + "rand_core 0.9.5", 4516 + ] 4517 + 4518 + [[package]] 4519 + name = "rand" 4520 + version = "0.10.0" 4521 + source = "registry+https://github.com/rust-lang/crates.io-index" 4522 + checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" 4523 + dependencies = [ 4524 + "chacha20 0.10.0", 4525 + "getrandom 0.4.1", 4526 + "rand_core 0.10.0", 4240 4527 ] 4241 4528 4242 4529 [[package]] ··· 4266 4553 checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 4267 4554 dependencies = [ 4268 4555 "ppv-lite86", 4269 - "rand_core 0.9.3", 4556 + "rand_core 0.9.5", 4557 + ] 4558 + 4559 + [[package]] 4560 + name = "rand_chacha" 4561 + version = "0.10.0" 4562 + source = "registry+https://github.com/rust-lang/crates.io-index" 4563 + checksum = "3e6af7f3e25ded52c41df4e0b1af2d047e45896c2f3281792ed68a1c243daedb" 4564 + dependencies = [ 4565 + "ppv-lite86", 4566 + "rand_core 0.10.0", 4270 4567 ] 4271 4568 4272 4569 [[package]] ··· 4284 4581 source = "registry+https://github.com/rust-lang/crates.io-index" 4285 4582 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 4286 4583 dependencies = [ 4287 - "getrandom 0.2.16", 4584 + "getrandom 0.2.17", 4288 4585 ] 4289 4586 4290 4587 [[package]] 4291 4588 name = "rand_core" 4292 - version = "0.9.3" 4589 + version = "0.9.5" 4293 4590 source = "registry+https://github.com/rust-lang/crates.io-index" 4294 - checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 4591 + checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" 4295 4592 dependencies = [ 4296 - "getrandom 0.3.3", 4593 + "getrandom 0.3.4", 4297 4594 ] 4298 4595 4299 4596 [[package]] 4597 + name = "rand_core" 4598 + version = "0.10.0" 4599 + source = "registry+https://github.com/rust-lang/crates.io-index" 4600 + checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" 4601 + 4602 + [[package]] 4300 4603 name = "rand_hc" 4301 4604 version = "0.2.0" 4302 4605 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4335 4638 ] 4336 4639 4337 4640 [[package]] 4641 + name = "recvmsg" 4642 + version = "1.0.0" 4643 + source = "registry+https://github.com/rust-lang/crates.io-index" 4644 + checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" 4645 + 4646 + [[package]] 4338 4647 name = "redox_syscall" 4339 - version = "0.5.13" 4648 + version = "0.5.18" 4340 4649 source = "registry+https://github.com/rust-lang/crates.io-index" 4341 - checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" 4650 + checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 4342 4651 dependencies = [ 4343 - "bitflags 2.9.1", 4652 + "bitflags 2.11.0", 4344 4653 ] 4345 4654 4346 4655 [[package]] 4347 4656 name = "redox_users" 4348 - version = "0.5.0" 4657 + version = "0.5.2" 4349 4658 source = "registry+https://github.com/rust-lang/crates.io-index" 4350 - checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" 4659 + checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" 4351 4660 dependencies = [ 4352 - "getrandom 0.2.16", 4661 + "getrandom 0.2.17", 4353 4662 "libredox", 4354 - "thiserror 2.0.12", 4663 + "thiserror 2.0.18", 4355 4664 ] 4356 4665 4357 4666 [[package]] 4358 4667 name = "ref-cast" 4359 - version = "1.0.24" 4668 + version = "1.0.25" 4360 4669 source = "registry+https://github.com/rust-lang/crates.io-index" 4361 - checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" 4670 + checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" 4362 4671 dependencies = [ 4363 4672 "ref-cast-impl", 4364 4673 ] 4365 4674 4366 4675 [[package]] 4367 4676 name = "ref-cast-impl" 4368 - version = "1.0.24" 4677 + version = "1.0.25" 4369 4678 source = "registry+https://github.com/rust-lang/crates.io-index" 4370 - checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" 4679 + checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" 4371 4680 dependencies = [ 4372 4681 "proc-macro2", 4373 4682 "quote", 4374 - "syn 2.0.104", 4683 + "syn 2.0.116", 4375 4684 ] 4376 4685 4377 4686 [[package]] 4378 4687 name = "regex" 4379 - version = "1.11.1" 4688 + version = "1.12.3" 4380 4689 source = "registry+https://github.com/rust-lang/crates.io-index" 4381 - checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 4690 + checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" 4382 4691 dependencies = [ 4383 4692 "aho-corasick", 4384 4693 "memchr", ··· 4388 4697 4389 4698 [[package]] 4390 4699 name = "regex-automata" 4391 - version = "0.4.9" 4700 + version = "0.4.14" 4392 4701 source = "registry+https://github.com/rust-lang/crates.io-index" 4393 - checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 4702 + checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" 4394 4703 dependencies = [ 4395 4704 "aho-corasick", 4396 4705 "memchr", ··· 4399 4708 4400 4709 [[package]] 4401 4710 name = "regex-syntax" 4402 - version = "0.8.5" 4711 + version = "0.8.9" 4403 4712 source = "registry+https://github.com/rust-lang/crates.io-index" 4404 - checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 4713 + checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" 4405 4714 4406 4715 [[package]] 4407 4716 name = "rend" ··· 4409 4718 source = "registry+https://github.com/rust-lang/crates.io-index" 4410 4719 checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" 4411 4720 dependencies = [ 4412 - "bytecheck", 4721 + "bytecheck 0.6.12", 4722 + ] 4723 + 4724 + [[package]] 4725 + name = "rend" 4726 + version = "0.5.3" 4727 + source = "registry+https://github.com/rust-lang/crates.io-index" 4728 + checksum = "cadadef317c2f20755a64d7fdc48f9e7178ee6b0e1f7fce33fa60f1d68a276e6" 4729 + dependencies = [ 4730 + "bytecheck 0.8.2", 4413 4731 ] 4414 4732 4415 4733 [[package]] 4416 4734 name = "reqwest" 4417 - version = "0.12.20" 4735 + version = "0.13.2" 4418 4736 source = "registry+https://github.com/rust-lang/crates.io-index" 4419 - checksum = "eabf4c97d9130e2bf606614eb937e86edac8292eaa6f422f995d7e8de1eb1813" 4737 + checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" 4420 4738 dependencies = [ 4421 4739 "base64 0.22.1", 4422 4740 "bytes", ··· 4436 4754 "percent-encoding", 4437 4755 "pin-project-lite", 4438 4756 "quinn", 4439 - "rustls 0.23.28", 4757 + "rustls 0.23.36", 4440 4758 "rustls-pki-types", 4759 + "rustls-platform-verifier", 4441 4760 "serde", 4442 4761 "serde_json", 4443 - "serde_urlencoded", 4444 4762 "sync_wrapper", 4445 4763 "tokio", 4446 4764 "tokio-rustls", ··· 4453 4771 "wasm-bindgen-futures", 4454 4772 "wasm-streams", 4455 4773 "web-sys", 4456 - "webpki-roots 1.0.1", 4457 4774 ] 4458 4775 4459 4776 [[package]] ··· 4468 4785 4469 4786 [[package]] 4470 4787 name = "rfd" 4471 - version = "0.15.3" 4788 + version = "0.16.0" 4472 4789 source = "registry+https://github.com/rust-lang/crates.io-index" 4473 - checksum = "80c844748fdc82aae252ee4594a89b6e7ebef1063de7951545564cbc4e57075d" 4790 + checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672" 4474 4791 dependencies = [ 4475 - "ashpd", 4476 - "block2 0.6.1", 4477 - "dispatch2 0.2.0", 4792 + "block2", 4793 + "dispatch2", 4478 4794 "glib-sys", 4479 4795 "gobject-sys", 4480 4796 "gtk-sys", 4481 4797 "js-sys", 4482 4798 "log", 4483 - "objc2 0.6.1", 4799 + "objc2", 4484 4800 "objc2-app-kit", 4485 4801 "objc2-core-foundation", 4486 - "objc2-foundation 0.3.1", 4802 + "objc2-foundation", 4487 4803 "raw-window-handle", 4488 4804 "wasm-bindgen", 4489 4805 "wasm-bindgen-futures", 4490 4806 "web-sys", 4491 - "windows-sys 0.59.0", 4807 + "windows-sys 0.60.2", 4492 4808 ] 4493 4809 4494 4810 [[package]] ··· 4499 4815 dependencies = [ 4500 4816 "cc", 4501 4817 "cfg-if", 4502 - "getrandom 0.2.16", 4818 + "getrandom 0.2.17", 4503 4819 "libc", 4504 4820 "untrusted", 4505 4821 "windows-sys 0.52.0", ··· 4507 4823 4508 4824 [[package]] 4509 4825 name = "rkyv" 4510 - version = "0.7.45" 4826 + version = "0.7.46" 4511 4827 source = "registry+https://github.com/rust-lang/crates.io-index" 4512 - checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" 4828 + checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" 4513 4829 dependencies = [ 4514 4830 "bitvec", 4515 - "bytecheck", 4831 + "bytecheck 0.6.12", 4516 4832 "bytes", 4517 4833 "hashbrown 0.12.3", 4518 - "ptr_meta", 4519 - "rend", 4520 - "rkyv_derive", 4834 + "ptr_meta 0.1.4", 4835 + "rend 0.4.2", 4836 + "rkyv_derive 0.7.46", 4521 4837 "seahash", 4522 4838 "tinyvec", 4523 4839 "uuid", 4524 4840 ] 4525 4841 4526 4842 [[package]] 4843 + name = "rkyv" 4844 + version = "0.8.15" 4845 + source = "registry+https://github.com/rust-lang/crates.io-index" 4846 + checksum = "1a30e631b7f4a03dee9056b8ef6982e8ba371dd5bedb74d3ec86df4499132c70" 4847 + dependencies = [ 4848 + "bytecheck 0.8.2", 4849 + "bytes", 4850 + "hashbrown 0.16.1", 4851 + "indexmap 2.13.0", 4852 + "munge", 4853 + "ptr_meta 0.3.1", 4854 + "rancor", 4855 + "rend 0.5.3", 4856 + "rkyv_derive 0.8.15", 4857 + "tinyvec", 4858 + "uuid", 4859 + ] 4860 + 4861 + [[package]] 4527 4862 name = "rkyv_derive" 4528 - version = "0.7.45" 4863 + version = "0.7.46" 4529 4864 source = "registry+https://github.com/rust-lang/crates.io-index" 4530 - checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" 4865 + checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" 4531 4866 dependencies = [ 4532 4867 "proc-macro2", 4533 4868 "quote", ··· 4535 4870 ] 4536 4871 4537 4872 [[package]] 4873 + name = "rkyv_derive" 4874 + version = "0.8.15" 4875 + source = "registry+https://github.com/rust-lang/crates.io-index" 4876 + checksum = "8100bb34c0a1d0f907143db3149e6b4eea3c33b9ee8b189720168e818303986f" 4877 + dependencies = [ 4878 + "proc-macro2", 4879 + "quote", 4880 + "syn 2.0.116", 4881 + ] 4882 + 4883 + [[package]] 4538 4884 name = "rmp" 4539 - version = "0.8.14" 4885 + version = "0.8.15" 4540 4886 source = "registry+https://github.com/rust-lang/crates.io-index" 4541 - checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" 4887 + checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" 4542 4888 dependencies = [ 4543 - "byteorder", 4544 4889 "num-traits", 4545 - "paste", 4546 4890 ] 4547 4891 4548 4892 [[package]] 4549 4893 name = "rmp-serde" 4550 - version = "1.3.0" 4894 + version = "1.3.1" 4551 4895 source = "registry+https://github.com/rust-lang/crates.io-index" 4552 - checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" 4896 + checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" 4553 4897 dependencies = [ 4554 - "byteorder", 4555 4898 "rmp", 4556 4899 "serde", 4557 4900 ] 4558 4901 4559 4902 [[package]] 4560 4903 name = "rtcp" 4561 - version = "0.13.0" 4904 + version = "0.17.1" 4562 4905 source = "registry+https://github.com/rust-lang/crates.io-index" 4563 - checksum = "e9689528bf3a9eb311fd938d05516dd546412f9ce4fffc8acfc1db27cc3dbf72" 4906 + checksum = "cb22f1cc99aea8152fdae6a4bc52a9caddf4bd1ff083d897c1f9f279956177e8" 4564 4907 dependencies = [ 4565 4908 "bytes", 4566 4909 "thiserror 1.0.69", ··· 4569 4912 4570 4913 [[package]] 4571 4914 name = "rtp" 4572 - version = "0.13.0" 4915 + version = "0.17.1" 4573 4916 source = "registry+https://github.com/rust-lang/crates.io-index" 4574 - checksum = "c54733451a67d76caf9caa07a7a2cec6871ea9dda92a7847f98063d459200f4b" 4917 + checksum = "f8d41f3565d9add11caabe7c61745517f4ef511c168a6aa2b59ce4c701802cde" 4575 4918 dependencies = [ 4576 4919 "bytes", 4577 4920 "memchr", 4578 4921 "portable-atomic", 4579 - "rand 0.8.5", 4922 + "rand 0.9.2", 4580 4923 "serde", 4581 4924 "thiserror 1.0.69", 4582 4925 "webrtc-util", ··· 4584 4927 4585 4928 [[package]] 4586 4929 name = "rust_decimal" 4587 - version = "1.37.2" 4930 + version = "1.40.0" 4588 4931 source = "registry+https://github.com/rust-lang/crates.io-index" 4589 - checksum = "b203a6425500a03e0919c42d3c47caca51e79f1132046626d2c8871c5092035d" 4932 + checksum = "61f703d19852dbf87cbc513643fa81428361eb6940f1ac14fd58155d295a3eb0" 4590 4933 dependencies = [ 4591 4934 "arrayvec", 4592 4935 "borsh", 4593 4936 "bytes", 4594 4937 "num-traits", 4595 4938 "rand 0.8.5", 4596 - "rkyv", 4939 + "rkyv 0.7.46", 4597 4940 "serde", 4598 4941 "serde_json", 4599 4942 ] 4600 4943 4601 4944 [[package]] 4602 - name = "rustc-demangle" 4603 - version = "0.1.25" 4604 - source = "registry+https://github.com/rust-lang/crates.io-index" 4605 - checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" 4606 - 4607 - [[package]] 4608 4945 name = "rustc-hash" 4609 4946 version = "2.1.1" 4610 4947 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4630 4967 4631 4968 [[package]] 4632 4969 name = "rustix" 4633 - version = "1.0.7" 4970 + version = "1.1.3" 4634 4971 source = "registry+https://github.com/rust-lang/crates.io-index" 4635 - checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" 4972 + checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" 4636 4973 dependencies = [ 4637 - "bitflags 2.9.1", 4974 + "bitflags 2.11.0", 4638 4975 "errno", 4639 4976 "libc", 4640 4977 "linux-raw-sys", 4641 - "windows-sys 0.59.0", 4978 + "windows-sys 0.61.2", 4642 4979 ] 4643 4980 4644 4981 [[package]] ··· 4655 4992 4656 4993 [[package]] 4657 4994 name = "rustls" 4658 - version = "0.23.28" 4995 + version = "0.23.36" 4659 4996 source = "registry+https://github.com/rust-lang/crates.io-index" 4660 - checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" 4997 + checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" 4661 4998 dependencies = [ 4999 + "aws-lc-rs", 4662 5000 "once_cell", 4663 5001 "ring", 4664 5002 "rustls-pki-types", 4665 - "rustls-webpki 0.103.3", 5003 + "rustls-webpki 0.103.9", 4666 5004 "subtle", 4667 5005 "zeroize", 4668 5006 ] 4669 5007 4670 5008 [[package]] 5009 + name = "rustls-native-certs" 5010 + version = "0.8.3" 5011 + source = "registry+https://github.com/rust-lang/crates.io-index" 5012 + checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" 5013 + dependencies = [ 5014 + "openssl-probe", 5015 + "rustls-pki-types", 5016 + "schannel", 5017 + "security-framework", 5018 + ] 5019 + 5020 + [[package]] 4671 5021 name = "rustls-pemfile" 4672 5022 version = "1.0.4" 4673 5023 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4678 5028 4679 5029 [[package]] 4680 5030 name = "rustls-pki-types" 4681 - version = "1.12.0" 5031 + version = "1.14.0" 4682 5032 source = "registry+https://github.com/rust-lang/crates.io-index" 4683 - checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" 5033 + checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" 4684 5034 dependencies = [ 4685 5035 "web-time", 4686 5036 "zeroize", 4687 5037 ] 4688 5038 4689 5039 [[package]] 5040 + name = "rustls-platform-verifier" 5041 + version = "0.6.2" 5042 + source = "registry+https://github.com/rust-lang/crates.io-index" 5043 + checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" 5044 + dependencies = [ 5045 + "core-foundation 0.10.1", 5046 + "core-foundation-sys", 5047 + "jni", 5048 + "log", 5049 + "once_cell", 5050 + "rustls 0.23.36", 5051 + "rustls-native-certs", 5052 + "rustls-platform-verifier-android", 5053 + "rustls-webpki 0.103.9", 5054 + "security-framework", 5055 + "security-framework-sys", 5056 + "webpki-root-certs", 5057 + "windows-sys 0.61.2", 5058 + ] 5059 + 5060 + [[package]] 5061 + name = "rustls-platform-verifier-android" 5062 + version = "0.1.1" 5063 + source = "registry+https://github.com/rust-lang/crates.io-index" 5064 + checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" 5065 + 5066 + [[package]] 4690 5067 name = "rustls-webpki" 4691 5068 version = "0.101.7" 4692 5069 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4698 5075 4699 5076 [[package]] 4700 5077 name = "rustls-webpki" 4701 - version = "0.103.3" 5078 + version = "0.103.9" 4702 5079 source = "registry+https://github.com/rust-lang/crates.io-index" 4703 - checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" 5080 + checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" 4704 5081 dependencies = [ 5082 + "aws-lc-rs", 4705 5083 "ring", 4706 5084 "rustls-pki-types", 4707 5085 "untrusted", ··· 4709 5087 4710 5088 [[package]] 4711 5089 name = "rustversion" 4712 - version = "1.0.21" 5090 + version = "1.0.22" 4713 5091 source = "registry+https://github.com/rust-lang/crates.io-index" 4714 - checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" 5092 + checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 4715 5093 4716 5094 [[package]] 4717 5095 name = "ryu" 4718 - version = "1.0.20" 5096 + version = "1.0.23" 4719 5097 source = "registry+https://github.com/rust-lang/crates.io-index" 4720 - checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 5098 + checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" 4721 5099 4722 5100 [[package]] 4723 5101 name = "same-file" ··· 4729 5107 ] 4730 5108 4731 5109 [[package]] 5110 + name = "schannel" 5111 + version = "0.1.28" 5112 + source = "registry+https://github.com/rust-lang/crates.io-index" 5113 + checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" 5114 + dependencies = [ 5115 + "windows-sys 0.61.2", 5116 + ] 5117 + 5118 + [[package]] 4732 5119 name = "schemars" 4733 5120 version = "0.8.22" 4734 5121 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4756 5143 ] 4757 5144 4758 5145 [[package]] 5146 + name = "schemars" 5147 + version = "1.2.1" 5148 + source = "registry+https://github.com/rust-lang/crates.io-index" 5149 + checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" 5150 + dependencies = [ 5151 + "dyn-clone", 5152 + "ref-cast", 5153 + "serde", 5154 + "serde_json", 5155 + ] 5156 + 5157 + [[package]] 4759 5158 name = "schemars_derive" 4760 5159 version = "0.8.22" 4761 5160 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 4764 5163 "proc-macro2", 4765 5164 "quote", 4766 5165 "serde_derive_internals", 4767 - "syn 2.0.104", 5166 + "syn 2.0.116", 4768 5167 ] 4769 5168 4770 5169 [[package]] ··· 4785 5184 4786 5185 [[package]] 4787 5186 name = "sdp" 4788 - version = "0.8.0" 5187 + version = "0.17.1" 4789 5188 source = "registry+https://github.com/rust-lang/crates.io-index" 4790 - checksum = "4cd277015eada44a0bb810a4b84d3bf6e810573fa62fb442f457edf6a1087a69" 5189 + checksum = "22c3b0257608d7de4de4c4ea650ccc2e6e3e45e3cd80039fcdee768bcb449253" 4791 5190 dependencies = [ 4792 - "rand 0.8.5", 5191 + "rand 0.9.2", 4793 5192 "substring", 4794 5193 "thiserror 1.0.69", 4795 5194 "url", ··· 4816 5215 ] 4817 5216 4818 5217 [[package]] 5218 + name = "security-framework" 5219 + version = "3.6.0" 5220 + source = "registry+https://github.com/rust-lang/crates.io-index" 5221 + checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" 5222 + dependencies = [ 5223 + "bitflags 2.11.0", 5224 + "core-foundation 0.10.1", 5225 + "core-foundation-sys", 5226 + "libc", 5227 + "security-framework-sys", 5228 + ] 5229 + 5230 + [[package]] 5231 + name = "security-framework-sys" 5232 + version = "2.16.0" 5233 + source = "registry+https://github.com/rust-lang/crates.io-index" 5234 + checksum = "321c8673b092a9a42605034a9879d73cb79101ed5fd117bc9a597b89b4e9e61a" 5235 + dependencies = [ 5236 + "core-foundation-sys", 5237 + "libc", 5238 + ] 5239 + 5240 + [[package]] 4819 5241 name = "selectors" 4820 - version = "0.22.0" 5242 + version = "0.24.0" 4821 5243 source = "registry+https://github.com/rust-lang/crates.io-index" 4822 - checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" 5244 + checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" 4823 5245 dependencies = [ 4824 5246 "bitflags 1.3.2", 4825 5247 "cssparser", 4826 5248 "derive_more 0.99.20", 4827 5249 "fxhash", 4828 5250 "log", 4829 - "matches", 4830 5251 "phf 0.8.0", 4831 5252 "phf_codegen 0.8.0", 4832 5253 "precomputed-hash", 4833 5254 "servo_arc", 4834 5255 "smallvec", 4835 - "thin-slice", 4836 5256 ] 4837 5257 4838 5258 [[package]] 4839 5259 name = "semver" 4840 - version = "1.0.26" 5260 + version = "1.0.27" 4841 5261 source = "registry+https://github.com/rust-lang/crates.io-index" 4842 - checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" 5262 + checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 4843 5263 dependencies = [ 4844 5264 "serde", 5265 + "serde_core", 4845 5266 ] 4846 5267 4847 5268 [[package]] ··· 4858 5279 4859 5280 [[package]] 4860 5281 name = "serde" 4861 - version = "1.0.219" 5282 + version = "1.0.228" 4862 5283 source = "registry+https://github.com/rust-lang/crates.io-index" 4863 - checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 5284 + checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 4864 5285 dependencies = [ 5286 + "serde_core", 4865 5287 "serde_derive", 4866 5288 ] 4867 5289 4868 5290 [[package]] 4869 5291 name = "serde-untagged" 4870 - version = "0.1.7" 5292 + version = "0.1.9" 4871 5293 source = "registry+https://github.com/rust-lang/crates.io-index" 4872 - checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" 5294 + checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" 4873 5295 dependencies = [ 4874 5296 "erased-serde", 4875 5297 "serde", 5298 + "serde_core", 4876 5299 "typeid", 4877 5300 ] 4878 5301 ··· 4888 5311 ] 4889 5312 4890 5313 [[package]] 5314 + name = "serde_core" 5315 + version = "1.0.228" 5316 + source = "registry+https://github.com/rust-lang/crates.io-index" 5317 + checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 5318 + dependencies = [ 5319 + "serde_derive", 5320 + ] 5321 + 5322 + [[package]] 4891 5323 name = "serde_derive" 4892 - version = "1.0.219" 5324 + version = "1.0.228" 4893 5325 source = "registry+https://github.com/rust-lang/crates.io-index" 4894 - checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 5326 + checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 4895 5327 dependencies = [ 4896 5328 "proc-macro2", 4897 5329 "quote", 4898 - "syn 2.0.104", 5330 + "syn 2.0.116", 4899 5331 ] 4900 5332 4901 5333 [[package]] ··· 4906 5338 dependencies = [ 4907 5339 "proc-macro2", 4908 5340 "quote", 4909 - "syn 2.0.104", 5341 + "syn 2.0.116", 4910 5342 ] 4911 5343 4912 5344 [[package]] 4913 5345 name = "serde_json" 4914 - version = "1.0.140" 5346 + version = "1.0.149" 4915 5347 source = "registry+https://github.com/rust-lang/crates.io-index" 4916 - checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 5348 + checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" 4917 5349 dependencies = [ 4918 - "itoa 1.0.15", 5350 + "itoa", 4919 5351 "memchr", 4920 - "ryu", 4921 5352 "serde", 5353 + "serde_core", 5354 + "zmij", 4922 5355 ] 4923 5356 4924 5357 [[package]] 4925 5358 name = "serde_path_to_error" 4926 - version = "0.1.17" 5359 + version = "0.1.20" 4927 5360 source = "registry+https://github.com/rust-lang/crates.io-index" 4928 - checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" 5361 + checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" 4929 5362 dependencies = [ 4930 - "itoa 1.0.15", 5363 + "itoa", 4931 5364 "serde", 5365 + "serde_core", 4932 5366 ] 4933 5367 4934 5368 [[package]] ··· 4939 5373 dependencies = [ 4940 5374 "proc-macro2", 4941 5375 "quote", 4942 - "syn 2.0.104", 5376 + "syn 2.0.116", 4943 5377 ] 4944 5378 4945 5379 [[package]] ··· 4949 5383 checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" 4950 5384 dependencies = [ 4951 5385 "serde", 5386 + ] 5387 + 5388 + [[package]] 5389 + name = "serde_spanned" 5390 + version = "1.0.4" 5391 + source = "registry+https://github.com/rust-lang/crates.io-index" 5392 + checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" 5393 + dependencies = [ 5394 + "serde_core", 4952 5395 ] 4953 5396 4954 5397 [[package]] ··· 4958 5401 checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 4959 5402 dependencies = [ 4960 5403 "form_urlencoded", 4961 - "itoa 1.0.15", 5404 + "itoa", 4962 5405 "ryu", 4963 5406 "serde", 4964 5407 ] 4965 5408 4966 5409 [[package]] 4967 5410 name = "serde_with" 4968 - version = "3.13.0" 5411 + version = "3.16.1" 4969 5412 source = "registry+https://github.com/rust-lang/crates.io-index" 4970 - checksum = "bf65a400f8f66fb7b0552869ad70157166676db75ed8181f8104ea91cf9d0b42" 5413 + checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" 4971 5414 dependencies = [ 4972 5415 "base64 0.22.1", 4973 5416 "chrono", 4974 5417 "hex", 4975 5418 "indexmap 1.9.3", 4976 - "indexmap 2.9.0", 5419 + "indexmap 2.13.0", 4977 5420 "schemars 0.9.0", 4978 - "serde", 4979 - "serde_derive", 5421 + "schemars 1.2.1", 5422 + "serde_core", 4980 5423 "serde_json", 4981 5424 "serde_with_macros", 4982 5425 "time", ··· 4984 5427 4985 5428 [[package]] 4986 5429 name = "serde_with_macros" 4987 - version = "3.13.0" 5430 + version = "3.16.1" 4988 5431 source = "registry+https://github.com/rust-lang/crates.io-index" 4989 - checksum = "81679d9ed988d5e9a5e6531dc3f2c28efbd639cbd1dfb628df08edea6004da77" 5432 + checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" 4990 5433 dependencies = [ 4991 5434 "darling", 4992 5435 "proc-macro2", 4993 5436 "quote", 4994 - "syn 2.0.104", 5437 + "syn 2.0.116", 4995 5438 ] 4996 5439 4997 5440 [[package]] 4998 5441 name = "serialize-to-javascript" 4999 - version = "0.1.1" 5442 + version = "0.1.2" 5000 5443 source = "registry+https://github.com/rust-lang/crates.io-index" 5001 - checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" 5444 + checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" 5002 5445 dependencies = [ 5003 5446 "serde", 5004 5447 "serde_json", ··· 5007 5450 5008 5451 [[package]] 5009 5452 name = "serialize-to-javascript-impl" 5010 - version = "0.1.1" 5453 + version = "0.1.2" 5011 5454 source = "registry+https://github.com/rust-lang/crates.io-index" 5012 - checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" 5455 + checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" 5013 5456 dependencies = [ 5014 5457 "proc-macro2", 5015 5458 "quote", 5016 - "syn 1.0.109", 5459 + "syn 2.0.116", 5017 5460 ] 5018 5461 5019 5462 [[package]] 5020 5463 name = "servo_arc" 5021 - version = "0.1.1" 5464 + version = "0.2.0" 5022 5465 source = "registry+https://github.com/rust-lang/crates.io-index" 5023 - checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" 5466 + checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" 5024 5467 dependencies = [ 5025 5468 "nodrop", 5026 5469 "stable_deref_trait", ··· 5033 5476 checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 5034 5477 dependencies = [ 5035 5478 "cfg-if", 5036 - "cpufeatures", 5479 + "cpufeatures 0.2.17", 5037 5480 "digest", 5038 5481 ] 5039 5482 ··· 5044 5487 checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" 5045 5488 dependencies = [ 5046 5489 "cfg-if", 5047 - "cpufeatures", 5490 + "cpufeatures 0.2.17", 5048 5491 "digest", 5049 5492 ] 5050 5493 ··· 5056 5499 5057 5500 [[package]] 5058 5501 name = "signal-hook-registry" 5059 - version = "1.4.5" 5502 + version = "1.4.8" 5060 5503 source = "registry+https://github.com/rust-lang/crates.io-index" 5061 - checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 5504 + checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" 5062 5505 dependencies = [ 5506 + "errno", 5063 5507 "libc", 5064 5508 ] 5065 5509 ··· 5075 5519 5076 5520 [[package]] 5077 5521 name = "simd-adler32" 5078 - version = "0.3.7" 5522 + version = "0.3.8" 5079 5523 source = "registry+https://github.com/rust-lang/crates.io-index" 5080 - checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 5524 + checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" 5081 5525 5082 5526 [[package]] 5083 5527 name = "simdutf8" ··· 5093 5537 5094 5538 [[package]] 5095 5539 name = "siphasher" 5096 - version = "1.0.1" 5540 + version = "1.0.2" 5097 5541 source = "registry+https://github.com/rust-lang/crates.io-index" 5098 - checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" 5542 + checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" 5099 5543 5100 5544 [[package]] 5101 5545 name = "slab" 5102 - version = "0.4.10" 5546 + version = "0.4.12" 5103 5547 source = "registry+https://github.com/rust-lang/crates.io-index" 5104 - checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" 5548 + checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" 5105 5549 5106 5550 [[package]] 5107 5551 name = "smallvec" ··· 5129 5573 ] 5130 5574 5131 5575 [[package]] 5576 + name = "socket2" 5577 + version = "0.6.2" 5578 + source = "registry+https://github.com/rust-lang/crates.io-index" 5579 + checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" 5580 + dependencies = [ 5581 + "libc", 5582 + "windows-sys 0.60.2", 5583 + ] 5584 + 5585 + [[package]] 5132 5586 name = "softbuffer" 5133 - version = "0.4.6" 5587 + version = "0.4.8" 5134 5588 source = "registry+https://github.com/rust-lang/crates.io-index" 5135 - checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" 5589 + checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" 5136 5590 dependencies = [ 5137 5591 "bytemuck", 5138 - "cfg_aliases", 5139 - "core-graphics", 5140 - "foreign-types", 5141 5592 "js-sys", 5142 - "log", 5143 - "objc2 0.5.2", 5144 - "objc2-foundation 0.2.2", 5145 - "objc2-quartz-core 0.2.2", 5593 + "ndk", 5594 + "objc2", 5595 + "objc2-core-foundation", 5596 + "objc2-core-graphics", 5597 + "objc2-foundation", 5598 + "objc2-quartz-core", 5146 5599 "raw-window-handle", 5147 5600 "redox_syscall", 5601 + "tracing", 5148 5602 "wasm-bindgen", 5149 5603 "web-sys", 5150 - "windows-sys 0.59.0", 5604 + "windows-sys 0.61.2", 5151 5605 ] 5152 5606 5153 5607 [[package]] ··· 5199 5653 "Inflector", 5200 5654 "proc-macro2", 5201 5655 "quote", 5202 - "syn 2.0.104", 5656 + "syn 2.0.116", 5203 5657 ] 5204 5658 5205 5659 [[package]] ··· 5235 5689 5236 5690 [[package]] 5237 5691 name = "stable_deref_trait" 5238 - version = "1.2.0" 5239 - source = "registry+https://github.com/rust-lang/crates.io-index" 5240 - checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 5241 - 5242 - [[package]] 5243 - name = "static_assertions" 5244 - version = "1.1.0" 5692 + version = "1.2.1" 5245 5693 source = "registry+https://github.com/rust-lang/crates.io-index" 5246 - checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 5694 + checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 5247 5695 5248 5696 [[package]] 5249 5697 name = "string_cache" ··· 5278 5726 5279 5727 [[package]] 5280 5728 name = "stun" 5281 - version = "0.8.0" 5729 + version = "0.17.1" 5282 5730 source = "registry+https://github.com/rust-lang/crates.io-index" 5283 - checksum = "7dbc2bab375524093c143dc362a03fb6a1fb79e938391cdb21665688f88a088a" 5731 + checksum = "2e0fd33c04d4617df42c9c84c698511c59f59869629fb7a193067eec41bce347" 5284 5732 dependencies = [ 5285 5733 "base64 0.22.1", 5286 5734 "crc", 5287 5735 "lazy_static", 5288 5736 "md-5", 5289 - "rand 0.8.5", 5737 + "rand 0.9.2", 5290 5738 "ring", 5291 5739 "subtle", 5292 5740 "thiserror 1.0.69", ··· 5334 5782 5335 5783 [[package]] 5336 5784 name = "syn" 5337 - version = "2.0.104" 5785 + version = "2.0.116" 5338 5786 source = "registry+https://github.com/rust-lang/crates.io-index" 5339 - checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" 5787 + checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" 5340 5788 dependencies = [ 5341 5789 "proc-macro2", 5342 5790 "quote", ··· 5360 5808 dependencies = [ 5361 5809 "proc-macro2", 5362 5810 "quote", 5363 - "syn 2.0.104", 5811 + "syn 2.0.116", 5364 5812 ] 5365 5813 5366 5814 [[package]] 5367 5815 name = "system-configuration" 5368 - version = "0.6.1" 5816 + version = "0.7.0" 5369 5817 source = "registry+https://github.com/rust-lang/crates.io-index" 5370 - checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" 5818 + checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" 5371 5819 dependencies = [ 5372 - "bitflags 2.9.1", 5820 + "bitflags 2.11.0", 5373 5821 "core-foundation 0.9.4", 5374 5822 "system-configuration-sys", 5375 5823 ] ··· 5393 5841 "cfg-expr", 5394 5842 "heck 0.5.0", 5395 5843 "pkg-config", 5396 - "toml", 5844 + "toml 0.8.2", 5397 5845 "version-compare", 5398 5846 ] 5399 5847 5400 5848 [[package]] 5401 5849 name = "tao" 5402 - version = "0.33.0" 5850 + version = "0.34.5" 5403 5851 source = "registry+https://github.com/rust-lang/crates.io-index" 5404 - checksum = "1e59c1f38e657351a2e822eadf40d6a2ad4627b9c25557bc1180ec1b3295ef82" 5852 + checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" 5405 5853 dependencies = [ 5406 - "bitflags 2.9.1", 5854 + "bitflags 2.11.0", 5855 + "block2", 5407 5856 "core-foundation 0.10.1", 5408 5857 "core-graphics", 5409 5858 "crossbeam-channel", ··· 5420 5869 "ndk", 5421 5870 "ndk-context", 5422 5871 "ndk-sys", 5423 - "objc2 0.6.1", 5872 + "objc2", 5424 5873 "objc2-app-kit", 5425 - "objc2-foundation 0.3.1", 5874 + "objc2-foundation", 5426 5875 "once_cell", 5427 5876 "parking_lot", 5428 5877 "raw-window-handle", ··· 5431 5880 "unicode-segmentation", 5432 5881 "url", 5433 5882 "windows", 5434 - "windows-core", 5883 + "windows-core 0.61.2", 5435 5884 "windows-version", 5436 5885 "x11-dl", 5437 5886 ] ··· 5444 5893 dependencies = [ 5445 5894 "proc-macro2", 5446 5895 "quote", 5447 - "syn 2.0.104", 5896 + "syn 2.0.116", 5448 5897 ] 5449 5898 5450 5899 [[package]] ··· 5461 5910 5462 5911 [[package]] 5463 5912 name = "tauri" 5464 - version = "2.5.1" 5913 + version = "2.10.2" 5465 5914 source = "registry+https://github.com/rust-lang/crates.io-index" 5466 - checksum = "e7b0bc1aec81bda6bc455ea98fcaed26b3c98c1648c627ad6ff1c704e8bf8cbc" 5915 + checksum = "463ae8677aa6d0f063a900b9c41ecd4ac2b7ca82f0b058cc4491540e55b20129" 5467 5916 dependencies = [ 5468 5917 "anyhow", 5469 5918 "bytes", 5919 + "cookie", 5470 5920 "dirs", 5471 5921 "dunce", 5472 5922 "embed_plist", 5473 - "futures-util", 5474 - "getrandom 0.2.16", 5923 + "getrandom 0.3.4", 5475 5924 "glob", 5476 5925 "gtk", 5477 5926 "heck 0.5.0", ··· 5481 5930 "log", 5482 5931 "mime", 5483 5932 "muda", 5484 - "objc2 0.6.1", 5933 + "objc2", 5485 5934 "objc2-app-kit", 5486 - "objc2-foundation 0.3.1", 5935 + "objc2-foundation", 5487 5936 "objc2-ui-kit", 5937 + "objc2-web-kit", 5488 5938 "percent-encoding", 5489 5939 "plist", 5490 5940 "raw-window-handle", ··· 5500 5950 "tauri-runtime", 5501 5951 "tauri-runtime-wry", 5502 5952 "tauri-utils", 5503 - "thiserror 2.0.12", 5953 + "thiserror 2.0.18", 5504 5954 "tokio", 5505 5955 "tray-icon", 5506 5956 "url", 5507 - "urlpattern", 5508 5957 "webkit2gtk", 5509 5958 "webview2-com", 5510 5959 "window-vibrancy", ··· 5513 5962 5514 5963 [[package]] 5515 5964 name = "tauri-build" 5516 - version = "2.2.0" 5965 + version = "2.5.5" 5517 5966 source = "registry+https://github.com/rust-lang/crates.io-index" 5518 - checksum = "d7a0350f0df1db385ca5c02888a83e0e66655c245b7443db8b78a70da7d7f8fc" 5967 + checksum = "ca7bd893329425df750813e95bd2b643d5369d929438da96d5bbb7cc2c918f74" 5519 5968 dependencies = [ 5520 5969 "anyhow", 5521 5970 "cargo_toml", ··· 5529 5978 "serde_json", 5530 5979 "tauri-utils", 5531 5980 "tauri-winres", 5532 - "toml", 5981 + "toml 0.9.12+spec-1.1.0", 5533 5982 "walkdir", 5534 5983 ] 5535 5984 5536 5985 [[package]] 5537 5986 name = "tauri-codegen" 5538 - version = "2.2.0" 5987 + version = "2.5.4" 5539 5988 source = "registry+https://github.com/rust-lang/crates.io-index" 5540 - checksum = "f93f035551bf7b11b3f51ad9bc231ebbe5e085565527991c16cf326aa38cdf47" 5989 + checksum = "aac423e5859d9f9ccdd32e3cf6a5866a15bedbf25aa6630bcb2acde9468f6ae3" 5541 5990 dependencies = [ 5542 5991 "base64 0.22.1", 5543 5992 "brotli", ··· 5551 6000 "serde", 5552 6001 "serde_json", 5553 6002 "sha2", 5554 - "syn 2.0.104", 6003 + "syn 2.0.116", 5555 6004 "tauri-utils", 5556 - "thiserror 2.0.12", 6005 + "thiserror 2.0.18", 5557 6006 "time", 5558 6007 "url", 5559 6008 "uuid", ··· 5562 6011 5563 6012 [[package]] 5564 6013 name = "tauri-macros" 5565 - version = "2.2.0" 6014 + version = "2.5.4" 5566 6015 source = "registry+https://github.com/rust-lang/crates.io-index" 5567 - checksum = "8db4df25e2d9d45de0c4c910da61cd5500190da14ae4830749fee3466dddd112" 6016 + checksum = "1b6a1bd2861ff0c8766b1d38b32a6a410f6dc6532d4ef534c47cfb2236092f59" 5568 6017 dependencies = [ 5569 6018 "heck 0.5.0", 5570 6019 "proc-macro2", 5571 6020 "quote", 5572 - "syn 2.0.104", 6021 + "syn 2.0.116", 5573 6022 "tauri-codegen", 5574 6023 "tauri-utils", 5575 6024 ] 5576 6025 5577 6026 [[package]] 5578 6027 name = "tauri-plugin" 5579 - version = "2.2.0" 6028 + version = "2.5.3" 5580 6029 source = "registry+https://github.com/rust-lang/crates.io-index" 5581 - checksum = "37a5ebe6a610d1b78a94650896e6f7c9796323f408800cef436e0fa0539de601" 6030 + checksum = "692a77abd8b8773e107a42ec0e05b767b8d2b7ece76ab36c6c3947e34df9f53f" 5582 6031 dependencies = [ 5583 6032 "anyhow", 5584 6033 "glob", ··· 5587 6036 "serde", 5588 6037 "serde_json", 5589 6038 "tauri-utils", 5590 - "toml", 6039 + "toml 0.9.12+spec-1.1.0", 5591 6040 "walkdir", 5592 6041 ] 5593 6042 5594 6043 [[package]] 5595 6044 name = "tauri-plugin-dialog" 5596 - version = "2.2.2" 6045 + version = "2.6.0" 5597 6046 source = "registry+https://github.com/rust-lang/crates.io-index" 5598 - checksum = "a33318fe222fc2a612961de8b0419e2982767f213f54a4d3a21b0d7b85c41df8" 6047 + checksum = "9204b425d9be8d12aa60c2a83a289cf7d1caae40f57f336ed1155b3a5c0e359b" 5599 6048 dependencies = [ 5600 6049 "log", 5601 6050 "raw-window-handle", ··· 5605 6054 "tauri", 5606 6055 "tauri-plugin", 5607 6056 "tauri-plugin-fs", 5608 - "thiserror 2.0.12", 6057 + "thiserror 2.0.18", 5609 6058 "url", 5610 6059 ] 5611 6060 5612 6061 [[package]] 5613 6062 name = "tauri-plugin-fs" 5614 - version = "2.3.0" 6063 + version = "2.4.5" 5615 6064 source = "registry+https://github.com/rust-lang/crates.io-index" 5616 - checksum = "33ead0daec5d305adcefe05af9d970fc437bcc7996052d564e7393eb291252da" 6065 + checksum = "ed390cc669f937afeb8b28032ce837bac8ea023d975a2e207375ec05afaf1804" 5617 6066 dependencies = [ 5618 6067 "anyhow", 5619 6068 "dunce", ··· 5626 6075 "tauri", 5627 6076 "tauri-plugin", 5628 6077 "tauri-utils", 5629 - "thiserror 2.0.12", 5630 - "toml", 6078 + "thiserror 2.0.18", 6079 + "toml 0.9.12+spec-1.1.0", 5631 6080 "url", 5632 6081 ] 5633 6082 5634 6083 [[package]] 5635 6084 name = "tauri-plugin-geolocation" 5636 - version = "2.2.5" 6085 + version = "2.3.2" 5637 6086 source = "registry+https://github.com/rust-lang/crates.io-index" 5638 - checksum = "3dc06e23cb12d17533aca6001252f7f0fdbd295868194748821d0f0e6fbfbb59" 6087 + checksum = "0366e51823ad001ff1a47f116cd34ddfea3d94ebeb2309caf42e290dec27e0a6" 5639 6088 dependencies = [ 5640 6089 "log", 5641 6090 "serde", 5642 6091 "serde_json", 5643 6092 "tauri", 5644 6093 "tauri-plugin", 5645 - "thiserror 2.0.12", 6094 + "thiserror 2.0.18", 5646 6095 ] 5647 6096 5648 6097 [[package]] 5649 6098 name = "tauri-plugin-log" 5650 - version = "2.5.0" 6099 + version = "2.8.0" 5651 6100 source = "registry+https://github.com/rust-lang/crates.io-index" 5652 - checksum = "1063890b541877c4367d0ee9b1758360d86398862fbaafdd99aac02a55e28bf8" 6101 + checksum = "7545bd67f070a4500432c826e2e0682146a1d6712aee22a2786490156b574d93" 5653 6102 dependencies = [ 5654 6103 "android_logger", 5655 6104 "byte-unit", 5656 6105 "fern", 5657 6106 "log", 5658 - "objc2 0.6.1", 5659 - "objc2-foundation 0.3.1", 6107 + "objc2", 6108 + "objc2-foundation", 5660 6109 "serde", 5661 6110 "serde_json", 5662 6111 "serde_repr", 5663 6112 "swift-rs", 5664 6113 "tauri", 5665 6114 "tauri-plugin", 5666 - "thiserror 2.0.12", 6115 + "thiserror 2.0.18", 5667 6116 "time", 5668 6117 ] 5669 6118 5670 6119 [[package]] 5671 6120 name = "tauri-plugin-notification" 5672 - version = "2.2.3" 6121 + version = "2.3.3" 5673 6122 source = "registry+https://github.com/rust-lang/crates.io-index" 5674 - checksum = "d1c87f171cdb35c3aa8f17e8dfd84c1b9f68eb4086ec16a5a1b9f13b5541c574" 6123 + checksum = "01fc2c5ff41105bd1f7242d8201fdf3efd70749b82fa013a17f2126357d194cc" 5675 6124 dependencies = [ 5676 6125 "log", 5677 6126 "notify-rust", 5678 - "rand 0.8.5", 6127 + "rand 0.9.2", 5679 6128 "serde", 5680 6129 "serde_json", 5681 6130 "serde_repr", 5682 6131 "tauri", 5683 6132 "tauri-plugin", 5684 - "thiserror 2.0.12", 6133 + "thiserror 2.0.18", 5685 6134 "time", 5686 6135 "url", 5687 6136 ] 5688 6137 5689 6138 [[package]] 5690 6139 name = "tauri-plugin-opener" 5691 - version = "2.3.0" 6140 + version = "2.5.3" 5692 6141 source = "registry+https://github.com/rust-lang/crates.io-index" 5693 - checksum = "2c8983f50326d34437142a6d560b5c3426e91324297519b6eeb32ed0a1d1e0f2" 6142 + checksum = "fc624469b06f59f5a29f874bbc61a2ed737c0f9c23ef09855a292c389c42e83f" 5694 6143 dependencies = [ 5695 6144 "dunce", 5696 6145 "glob", 5697 6146 "objc2-app-kit", 5698 - "objc2-foundation 0.3.1", 6147 + "objc2-foundation", 5699 6148 "open", 5700 6149 "schemars 0.8.22", 5701 6150 "serde", 5702 6151 "serde_json", 5703 6152 "tauri", 5704 6153 "tauri-plugin", 5705 - "thiserror 2.0.12", 6154 + "thiserror 2.0.18", 5706 6155 "url", 5707 6156 "windows", 5708 6157 "zbus", ··· 5710 6159 5711 6160 [[package]] 5712 6161 name = "tauri-plugin-store" 5713 - version = "2.2.1" 6162 + version = "2.4.2" 5714 6163 source = "registry+https://github.com/rust-lang/crates.io-index" 5715 - checksum = "ada7e7aeea472dec9b8d09d25301e59fe3e8330dc11dbcf903d6388126cb3722" 6164 + checksum = "5ca1a8ff83c269b115e98726ffc13f9e548a10161544a92ad121d6d0a96e16ea" 5716 6165 dependencies = [ 5717 6166 "dunce", 5718 6167 "serde", 5719 6168 "serde_json", 5720 6169 "tauri", 5721 6170 "tauri-plugin", 5722 - "thiserror 2.0.12", 6171 + "thiserror 2.0.18", 5723 6172 "tokio", 5724 6173 "tracing", 5725 6174 ] 5726 6175 5727 6176 [[package]] 5728 6177 name = "tauri-runtime" 5729 - version = "2.6.0" 6178 + version = "2.10.0" 5730 6179 source = "registry+https://github.com/rust-lang/crates.io-index" 5731 - checksum = "00f004905d549854069e6774533d742b03cacfd6f03deb08940a8677586cbe39" 6180 + checksum = "b885ffeac82b00f1f6fd292b6e5aabfa7435d537cef57d11e38a489956535651" 5732 6181 dependencies = [ 5733 6182 "cookie", 5734 6183 "dpi", 5735 6184 "gtk", 5736 6185 "http", 5737 6186 "jni", 5738 - "objc2 0.6.1", 6187 + "objc2", 5739 6188 "objc2-ui-kit", 6189 + "objc2-web-kit", 5740 6190 "raw-window-handle", 5741 6191 "serde", 5742 6192 "serde_json", 5743 6193 "tauri-utils", 5744 - "thiserror 2.0.12", 6194 + "thiserror 2.0.18", 5745 6195 "url", 6196 + "webkit2gtk", 6197 + "webview2-com", 5746 6198 "windows", 5747 6199 ] 5748 6200 5749 6201 [[package]] 5750 6202 name = "tauri-runtime-wry" 5751 - version = "2.6.0" 6203 + version = "2.10.0" 5752 6204 source = "registry+https://github.com/rust-lang/crates.io-index" 5753 - checksum = "f85d056f4d4b014fe874814034f3416d57114b617a493a4fe552580851a3f3a2" 6205 + checksum = "5204682391625e867d16584fedc83fc292fb998814c9f7918605c789cd876314" 5754 6206 dependencies = [ 5755 6207 "gtk", 5756 6208 "http", 5757 6209 "jni", 5758 6210 "log", 5759 - "objc2 0.6.1", 6211 + "objc2", 5760 6212 "objc2-app-kit", 5761 - "objc2-foundation 0.3.1", 6213 + "objc2-foundation", 5762 6214 "once_cell", 5763 6215 "percent-encoding", 5764 6216 "raw-window-handle", ··· 5786 6238 "specta-typescript", 5787 6239 "tauri", 5788 6240 "tauri-specta-macros", 5789 - "thiserror 2.0.12", 6241 + "thiserror 2.0.18", 5790 6242 ] 5791 6243 5792 6244 [[package]] ··· 5798 6250 "heck 0.5.0", 5799 6251 "proc-macro2", 5800 6252 "quote", 5801 - "syn 2.0.104", 6253 + "syn 2.0.116", 5802 6254 ] 5803 6255 5804 6256 [[package]] 5805 6257 name = "tauri-utils" 5806 - version = "2.4.0" 6258 + version = "2.8.2" 5807 6259 source = "registry+https://github.com/rust-lang/crates.io-index" 5808 - checksum = "b2900399c239a471bcff7f15c4399eb1a8c4fe511ba2853e07c996d771a5e0a4" 6260 + checksum = "fcd169fccdff05eff2c1033210b9b94acd07a47e6fa9a3431cf09cfd4f01c87e" 5809 6261 dependencies = [ 5810 6262 "anyhow", 5811 6263 "brotli", ··· 5831 6283 "serde_json", 5832 6284 "serde_with", 5833 6285 "swift-rs", 5834 - "thiserror 2.0.12", 5835 - "toml", 6286 + "thiserror 2.0.18", 6287 + "toml 0.9.12+spec-1.1.0", 5836 6288 "url", 5837 6289 "urlpattern", 5838 6290 "uuid", ··· 5841 6293 5842 6294 [[package]] 5843 6295 name = "tauri-winres" 5844 - version = "0.3.1" 6296 + version = "0.3.5" 5845 6297 source = "registry+https://github.com/rust-lang/crates.io-index" 5846 - checksum = "e8d321dbc6f998d825ab3f0d62673e810c861aac2d0de2cc2c395328f1d113b4" 6298 + checksum = "1087b111fe2b005e42dbdc1990fc18593234238d47453b0c99b7de1c9ab2c1e0" 5847 6299 dependencies = [ 6300 + "dunce", 5848 6301 "embed-resource", 5849 - "indexmap 2.9.0", 5850 - "toml", 6302 + "toml 0.9.12+spec-1.1.0", 5851 6303 ] 5852 6304 5853 6305 [[package]] ··· 5856 6308 source = "registry+https://github.com/rust-lang/crates.io-index" 5857 6309 checksum = "0b1e66e07de489fe43a46678dd0b8df65e0c973909df1b60ba33874e297ba9b9" 5858 6310 dependencies = [ 5859 - "quick-xml", 5860 - "thiserror 2.0.12", 6311 + "quick-xml 0.37.5", 6312 + "thiserror 2.0.18", 5861 6313 "windows", 5862 6314 "windows-version", 5863 6315 ] 5864 6316 5865 6317 [[package]] 5866 6318 name = "tempfile" 5867 - version = "3.20.0" 6319 + version = "3.25.0" 5868 6320 source = "registry+https://github.com/rust-lang/crates.io-index" 5869 - checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" 6321 + checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" 5870 6322 dependencies = [ 5871 6323 "fastrand", 5872 - "getrandom 0.3.3", 6324 + "getrandom 0.4.1", 5873 6325 "once_cell", 5874 6326 "rustix", 5875 - "windows-sys 0.59.0", 6327 + "windows-sys 0.61.2", 5876 6328 ] 5877 6329 5878 6330 [[package]] ··· 5887 6339 ] 5888 6340 5889 6341 [[package]] 5890 - name = "thin-slice" 5891 - version = "0.1.1" 5892 - source = "registry+https://github.com/rust-lang/crates.io-index" 5893 - checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" 5894 - 5895 - [[package]] 5896 6342 name = "thiserror" 5897 6343 version = "1.0.69" 5898 6344 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 5903 6349 5904 6350 [[package]] 5905 6351 name = "thiserror" 5906 - version = "2.0.12" 6352 + version = "2.0.18" 5907 6353 source = "registry+https://github.com/rust-lang/crates.io-index" 5908 - checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 6354 + checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" 5909 6355 dependencies = [ 5910 - "thiserror-impl 2.0.12", 6356 + "thiserror-impl 2.0.18", 5911 6357 ] 5912 6358 5913 6359 [[package]] ··· 5918 6364 dependencies = [ 5919 6365 "proc-macro2", 5920 6366 "quote", 5921 - "syn 2.0.104", 6367 + "syn 2.0.116", 5922 6368 ] 5923 6369 5924 6370 [[package]] 5925 6371 name = "thiserror-impl" 5926 - version = "2.0.12" 6372 + version = "2.0.18" 5927 6373 source = "registry+https://github.com/rust-lang/crates.io-index" 5928 - checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 6374 + checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" 5929 6375 dependencies = [ 5930 6376 "proc-macro2", 5931 6377 "quote", 5932 - "syn 2.0.104", 6378 + "syn 2.0.116", 5933 6379 ] 5934 6380 5935 6381 [[package]] 5936 6382 name = "time" 5937 - version = "0.3.41" 6383 + version = "0.3.47" 5938 6384 source = "registry+https://github.com/rust-lang/crates.io-index" 5939 - checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" 6385 + checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" 5940 6386 dependencies = [ 5941 6387 "deranged", 5942 - "itoa 1.0.15", 6388 + "itoa", 5943 6389 "libc", 5944 6390 "num-conv", 5945 6391 "num_threads", 5946 6392 "powerfmt", 5947 - "serde", 6393 + "serde_core", 5948 6394 "time-core", 5949 6395 "time-macros", 5950 6396 ] 5951 6397 5952 6398 [[package]] 5953 6399 name = "time-core" 5954 - version = "0.1.4" 6400 + version = "0.1.8" 5955 6401 source = "registry+https://github.com/rust-lang/crates.io-index" 5956 - checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" 6402 + checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" 5957 6403 5958 6404 [[package]] 5959 6405 name = "time-macros" 5960 - version = "0.2.22" 6406 + version = "0.2.27" 5961 6407 source = "registry+https://github.com/rust-lang/crates.io-index" 5962 - checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" 6408 + checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" 5963 6409 dependencies = [ 5964 6410 "num-conv", 5965 6411 "time-core", ··· 5967 6413 5968 6414 [[package]] 5969 6415 name = "tinystr" 5970 - version = "0.8.1" 6416 + version = "0.8.2" 5971 6417 source = "registry+https://github.com/rust-lang/crates.io-index" 5972 - checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 6418 + checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" 5973 6419 dependencies = [ 5974 6420 "displaydoc", 5975 6421 "zerovec", ··· 5977 6423 5978 6424 [[package]] 5979 6425 name = "tinyvec" 5980 - version = "1.9.0" 6426 + version = "1.10.0" 5981 6427 source = "registry+https://github.com/rust-lang/crates.io-index" 5982 - checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" 6428 + checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" 5983 6429 dependencies = [ 5984 6430 "tinyvec_macros", 5985 6431 ] ··· 5992 6438 5993 6439 [[package]] 5994 6440 name = "tokio" 5995 - version = "1.45.1" 6441 + version = "1.49.0" 5996 6442 source = "registry+https://github.com/rust-lang/crates.io-index" 5997 - checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" 6443 + checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" 5998 6444 dependencies = [ 5999 - "backtrace", 6000 6445 "bytes", 6001 6446 "libc", 6002 6447 "mio", 6003 6448 "parking_lot", 6004 6449 "pin-project-lite", 6005 6450 "signal-hook-registry", 6006 - "socket2", 6451 + "socket2 0.6.2", 6007 6452 "tokio-macros", 6008 - "tracing", 6009 - "windows-sys 0.52.0", 6453 + "windows-sys 0.61.2", 6010 6454 ] 6011 6455 6012 6456 [[package]] 6013 6457 name = "tokio-macros" 6014 - version = "2.5.0" 6458 + version = "2.6.0" 6015 6459 source = "registry+https://github.com/rust-lang/crates.io-index" 6016 - checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 6460 + checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" 6017 6461 dependencies = [ 6018 6462 "proc-macro2", 6019 6463 "quote", 6020 - "syn 2.0.104", 6464 + "syn 2.0.116", 6021 6465 ] 6022 6466 6023 6467 [[package]] 6024 6468 name = "tokio-rustls" 6025 - version = "0.26.2" 6469 + version = "0.26.4" 6026 6470 source = "registry+https://github.com/rust-lang/crates.io-index" 6027 - checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" 6471 + checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" 6028 6472 dependencies = [ 6029 - "rustls 0.23.28", 6473 + "rustls 0.23.36", 6030 6474 "tokio", 6031 6475 ] 6032 6476 6033 6477 [[package]] 6034 6478 name = "tokio-stream" 6035 - version = "0.1.17" 6479 + version = "0.1.18" 6036 6480 source = "registry+https://github.com/rust-lang/crates.io-index" 6037 - checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 6481 + checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" 6038 6482 dependencies = [ 6039 6483 "futures-core", 6040 6484 "pin-project-lite", ··· 6043 6487 6044 6488 [[package]] 6045 6489 name = "tokio-tungstenite" 6046 - version = "0.26.2" 6490 + version = "0.28.0" 6047 6491 source = "registry+https://github.com/rust-lang/crates.io-index" 6048 - checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" 6492 + checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" 6049 6493 dependencies = [ 6050 6494 "futures-util", 6051 6495 "log", ··· 6055 6499 6056 6500 [[package]] 6057 6501 name = "tokio-util" 6058 - version = "0.7.15" 6502 + version = "0.7.18" 6059 6503 source = "registry+https://github.com/rust-lang/crates.io-index" 6060 - checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 6504 + checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" 6061 6505 dependencies = [ 6062 6506 "bytes", 6063 6507 "futures-core", ··· 6069 6513 6070 6514 [[package]] 6071 6515 name = "toml" 6072 - version = "0.8.23" 6516 + version = "0.8.2" 6073 6517 source = "registry+https://github.com/rust-lang/crates.io-index" 6074 - checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" 6518 + checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" 6075 6519 dependencies = [ 6076 6520 "serde", 6077 - "serde_spanned", 6078 - "toml_datetime", 6079 - "toml_edit 0.22.27", 6521 + "serde_spanned 0.6.9", 6522 + "toml_datetime 0.6.3", 6523 + "toml_edit 0.20.2", 6524 + ] 6525 + 6526 + [[package]] 6527 + name = "toml" 6528 + version = "0.9.12+spec-1.1.0" 6529 + source = "registry+https://github.com/rust-lang/crates.io-index" 6530 + checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" 6531 + dependencies = [ 6532 + "indexmap 2.13.0", 6533 + "serde_core", 6534 + "serde_spanned 1.0.4", 6535 + "toml_datetime 0.7.5+spec-1.1.0", 6536 + "toml_parser", 6537 + "toml_writer", 6538 + "winnow 0.7.14", 6080 6539 ] 6081 6540 6082 6541 [[package]] 6083 6542 name = "toml_datetime" 6084 - version = "0.6.11" 6543 + version = "0.6.3" 6085 6544 source = "registry+https://github.com/rust-lang/crates.io-index" 6086 - checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" 6545 + checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" 6087 6546 dependencies = [ 6088 6547 "serde", 6089 6548 ] 6090 6549 6091 6550 [[package]] 6551 + name = "toml_datetime" 6552 + version = "0.7.5+spec-1.1.0" 6553 + source = "registry+https://github.com/rust-lang/crates.io-index" 6554 + checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" 6555 + dependencies = [ 6556 + "serde_core", 6557 + ] 6558 + 6559 + [[package]] 6092 6560 name = "toml_edit" 6093 6561 version = "0.19.15" 6094 6562 source = "registry+https://github.com/rust-lang/crates.io-index" 6095 6563 checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" 6096 6564 dependencies = [ 6097 - "indexmap 2.9.0", 6098 - "toml_datetime", 6565 + "indexmap 2.13.0", 6566 + "toml_datetime 0.6.3", 6099 6567 "winnow 0.5.40", 6100 6568 ] 6101 6569 6102 6570 [[package]] 6103 6571 name = "toml_edit" 6104 - version = "0.20.7" 6572 + version = "0.20.2" 6105 6573 source = "registry+https://github.com/rust-lang/crates.io-index" 6106 - checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" 6574 + checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" 6107 6575 dependencies = [ 6108 - "indexmap 2.9.0", 6109 - "toml_datetime", 6576 + "indexmap 2.13.0", 6577 + "serde", 6578 + "serde_spanned 0.6.9", 6579 + "toml_datetime 0.6.3", 6110 6580 "winnow 0.5.40", 6111 6581 ] 6112 6582 6113 6583 [[package]] 6114 6584 name = "toml_edit" 6115 - version = "0.22.27" 6585 + version = "0.23.10+spec-1.0.0" 6116 6586 source = "registry+https://github.com/rust-lang/crates.io-index" 6117 - checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" 6587 + checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" 6588 + dependencies = [ 6589 + "indexmap 2.13.0", 6590 + "toml_datetime 0.7.5+spec-1.1.0", 6591 + "toml_parser", 6592 + "winnow 0.7.14", 6593 + ] 6594 + 6595 + [[package]] 6596 + name = "toml_parser" 6597 + version = "1.0.9+spec-1.1.0" 6598 + source = "registry+https://github.com/rust-lang/crates.io-index" 6599 + checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" 6118 6600 dependencies = [ 6119 - "indexmap 2.9.0", 6120 - "serde", 6121 - "serde_spanned", 6122 - "toml_datetime", 6123 - "toml_write", 6124 - "winnow 0.7.11", 6601 + "winnow 0.7.14", 6125 6602 ] 6126 6603 6127 6604 [[package]] 6128 - name = "toml_write" 6129 - version = "0.1.2" 6605 + name = "toml_writer" 6606 + version = "1.0.6+spec-1.1.0" 6130 6607 source = "registry+https://github.com/rust-lang/crates.io-index" 6131 - checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" 6608 + checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" 6132 6609 6133 6610 [[package]] 6134 6611 name = "tower" 6135 - version = "0.5.2" 6612 + version = "0.5.3" 6136 6613 source = "registry+https://github.com/rust-lang/crates.io-index" 6137 - checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 6614 + checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" 6138 6615 dependencies = [ 6139 6616 "futures-core", 6140 6617 "futures-util", ··· 6148 6625 6149 6626 [[package]] 6150 6627 name = "tower-http" 6151 - version = "0.6.6" 6628 + version = "0.6.8" 6152 6629 source = "registry+https://github.com/rust-lang/crates.io-index" 6153 - checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 6630 + checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" 6154 6631 dependencies = [ 6155 - "bitflags 2.9.1", 6632 + "bitflags 2.11.0", 6156 6633 "bytes", 6157 6634 "futures-util", 6158 6635 "http", ··· 6179 6656 6180 6657 [[package]] 6181 6658 name = "tracing" 6182 - version = "0.1.41" 6659 + version = "0.1.44" 6183 6660 source = "registry+https://github.com/rust-lang/crates.io-index" 6184 - checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 6661 + checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" 6185 6662 dependencies = [ 6186 6663 "log", 6187 6664 "pin-project-lite", ··· 6191 6668 6192 6669 [[package]] 6193 6670 name = "tracing-attributes" 6194 - version = "0.1.30" 6671 + version = "0.1.31" 6195 6672 source = "registry+https://github.com/rust-lang/crates.io-index" 6196 - checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" 6673 + checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" 6197 6674 dependencies = [ 6198 6675 "proc-macro2", 6199 6676 "quote", 6200 - "syn 2.0.104", 6677 + "syn 2.0.116", 6201 6678 ] 6202 6679 6203 6680 [[package]] 6204 6681 name = "tracing-core" 6205 - version = "0.1.34" 6682 + version = "0.1.36" 6206 6683 source = "registry+https://github.com/rust-lang/crates.io-index" 6207 - checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" 6684 + checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" 6208 6685 dependencies = [ 6209 6686 "once_cell", 6210 6687 ] 6211 6688 6212 6689 [[package]] 6213 6690 name = "tray-icon" 6214 - version = "0.20.1" 6691 + version = "0.21.3" 6215 6692 source = "registry+https://github.com/rust-lang/crates.io-index" 6216 - checksum = "9f7eee98ec5c90daf179d55c20a49d8c0d043054ce7c26336c09a24d31f14fa0" 6693 + checksum = "a5e85aa143ceb072062fc4d6356c1b520a51d636e7bc8e77ec94be3608e5e80c" 6217 6694 dependencies = [ 6218 6695 "crossbeam-channel", 6219 6696 "dirs", 6220 6697 "libappindicator", 6221 6698 "muda", 6222 - "objc2 0.6.1", 6699 + "objc2", 6223 6700 "objc2-app-kit", 6224 6701 "objc2-core-foundation", 6225 6702 "objc2-core-graphics", 6226 - "objc2-foundation 0.3.1", 6703 + "objc2-foundation", 6227 6704 "once_cell", 6228 6705 "png", 6229 6706 "serde", 6230 - "thiserror 2.0.12", 6231 - "windows-sys 0.59.0", 6707 + "thiserror 2.0.18", 6708 + "windows-sys 0.60.2", 6232 6709 ] 6233 6710 6234 6711 [[package]] ··· 6239 6716 6240 6717 [[package]] 6241 6718 name = "tungstenite" 6242 - version = "0.26.2" 6719 + version = "0.28.0" 6243 6720 source = "registry+https://github.com/rust-lang/crates.io-index" 6244 - checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" 6721 + checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" 6245 6722 dependencies = [ 6246 6723 "bytes", 6247 6724 "data-encoding", 6248 6725 "http", 6249 6726 "httparse", 6250 6727 "log", 6251 - "rand 0.9.1", 6728 + "rand 0.9.2", 6252 6729 "sha1", 6253 - "thiserror 2.0.12", 6730 + "thiserror 2.0.18", 6254 6731 "utf-8", 6255 6732 ] 6256 6733 6257 6734 [[package]] 6258 6735 name = "turn" 6259 - version = "0.10.0" 6736 + version = "0.17.1" 6260 6737 source = "registry+https://github.com/rust-lang/crates.io-index" 6261 - checksum = "3f5aea1116456e1da71c45586b87c72e3b43164fbf435eb93ff6aa475416a9a4" 6738 + checksum = "b6a8b8ac3543b2a8eb0b28c7ac3d5f2db6221e057f3b3ae47cf7637b1333a5c3" 6262 6739 dependencies = [ 6263 6740 "async-trait", 6264 6741 "base64 0.22.1", ··· 6266 6743 "log", 6267 6744 "md-5", 6268 6745 "portable-atomic", 6269 - "rand 0.8.5", 6746 + "rand 0.9.2", 6270 6747 "ring", 6271 6748 "stun", 6272 6749 "thiserror 1.0.69", ··· 6283 6760 6284 6761 [[package]] 6285 6762 name = "typenum" 6286 - version = "1.18.0" 6763 + version = "1.19.0" 6287 6764 source = "registry+https://github.com/rust-lang/crates.io-index" 6288 - checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 6765 + checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 6289 6766 6290 6767 [[package]] 6291 6768 name = "uds_windows" ··· 6340 6817 ] 6341 6818 6342 6819 [[package]] 6820 + name = "unicase" 6821 + version = "2.9.0" 6822 + source = "registry+https://github.com/rust-lang/crates.io-index" 6823 + checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" 6824 + 6825 + [[package]] 6343 6826 name = "unicode-ident" 6344 - version = "1.0.18" 6827 + version = "1.0.24" 6345 6828 source = "registry+https://github.com/rust-lang/crates.io-index" 6346 - checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 6829 + checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" 6347 6830 6348 6831 [[package]] 6349 6832 name = "unicode-segmentation" ··· 6375 6858 6376 6859 [[package]] 6377 6860 name = "url" 6378 - version = "2.5.4" 6861 + version = "2.5.8" 6379 6862 source = "registry+https://github.com/rust-lang/crates.io-index" 6380 - checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 6863 + checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" 6381 6864 dependencies = [ 6382 6865 "form_urlencoded", 6383 6866 "idna", 6384 6867 "percent-encoding", 6385 6868 "serde", 6869 + "serde_derive", 6386 6870 ] 6387 6871 6388 6872 [[package]] ··· 6405 6889 6406 6890 [[package]] 6407 6891 name = "utf8-width" 6408 - version = "0.1.7" 6892 + version = "0.1.8" 6409 6893 source = "registry+https://github.com/rust-lang/crates.io-index" 6410 - checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" 6894 + checksum = "1292c0d970b54115d14f2492fe0170adf21d68a1de108eebc51c1df4f346a091" 6411 6895 6412 6896 [[package]] 6413 6897 name = "utf8_iter" ··· 6423 6907 6424 6908 [[package]] 6425 6909 name = "uuid" 6426 - version = "1.17.0" 6910 + version = "1.21.0" 6427 6911 source = "registry+https://github.com/rust-lang/crates.io-index" 6428 - checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" 6912 + checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" 6429 6913 dependencies = [ 6430 - "getrandom 0.3.3", 6914 + "getrandom 0.4.1", 6431 6915 "js-sys", 6432 - "serde", 6916 + "serde_core", 6433 6917 "wasm-bindgen", 6434 6918 ] 6435 6919 6436 6920 [[package]] 6437 6921 name = "value-bag" 6438 - version = "1.11.1" 6922 + version = "1.12.0" 6439 6923 source = "registry+https://github.com/rust-lang/crates.io-index" 6440 - checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" 6924 + checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" 6441 6925 6442 6926 [[package]] 6443 6927 name = "version-compare" 6444 - version = "0.2.0" 6928 + version = "0.2.1" 6445 6929 source = "registry+https://github.com/rust-lang/crates.io-index" 6446 - checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 6930 + checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e" 6447 6931 6448 6932 [[package]] 6449 6933 name = "version_check" ··· 6512 6996 checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 6513 6997 6514 6998 [[package]] 6515 - name = "wasi" 6516 - version = "0.14.2+wasi-0.2.4" 6999 + name = "wasip2" 7000 + version = "1.0.2+wasi-0.2.9" 6517 7001 source = "registry+https://github.com/rust-lang/crates.io-index" 6518 - checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 7002 + checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" 6519 7003 dependencies = [ 6520 - "wit-bindgen-rt", 7004 + "wit-bindgen", 6521 7005 ] 6522 7006 6523 7007 [[package]] 6524 - name = "wasm-bindgen" 6525 - version = "0.2.100" 7008 + name = "wasip3" 7009 + version = "0.4.0+wasi-0.3.0-rc-2026-01-06" 6526 7010 source = "registry+https://github.com/rust-lang/crates.io-index" 6527 - checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 7011 + checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" 6528 7012 dependencies = [ 6529 - "cfg-if", 6530 - "once_cell", 6531 - "rustversion", 6532 - "wasm-bindgen-macro", 7013 + "wit-bindgen", 6533 7014 ] 6534 7015 6535 7016 [[package]] 6536 - name = "wasm-bindgen-backend" 6537 - version = "0.2.100" 7017 + name = "wasm-bindgen" 7018 + version = "0.2.108" 6538 7019 source = "registry+https://github.com/rust-lang/crates.io-index" 6539 - checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 7020 + checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" 6540 7021 dependencies = [ 6541 - "bumpalo", 6542 - "log", 6543 - "proc-macro2", 6544 - "quote", 6545 - "syn 2.0.104", 7022 + "cfg-if", 7023 + "once_cell", 7024 + "rustversion", 7025 + "wasm-bindgen-macro", 6546 7026 "wasm-bindgen-shared", 6547 7027 ] 6548 7028 6549 7029 [[package]] 6550 7030 name = "wasm-bindgen-futures" 6551 - version = "0.4.50" 7031 + version = "0.4.58" 6552 7032 source = "registry+https://github.com/rust-lang/crates.io-index" 6553 - checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 7033 + checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" 6554 7034 dependencies = [ 6555 7035 "cfg-if", 7036 + "futures-util", 6556 7037 "js-sys", 6557 7038 "once_cell", 6558 7039 "wasm-bindgen", ··· 6561 7042 6562 7043 [[package]] 6563 7044 name = "wasm-bindgen-macro" 6564 - version = "0.2.100" 7045 + version = "0.2.108" 6565 7046 source = "registry+https://github.com/rust-lang/crates.io-index" 6566 - checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 7047 + checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" 6567 7048 dependencies = [ 6568 7049 "quote", 6569 7050 "wasm-bindgen-macro-support", ··· 6571 7052 6572 7053 [[package]] 6573 7054 name = "wasm-bindgen-macro-support" 6574 - version = "0.2.100" 7055 + version = "0.2.108" 6575 7056 source = "registry+https://github.com/rust-lang/crates.io-index" 6576 - checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 7057 + checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" 6577 7058 dependencies = [ 7059 + "bumpalo", 6578 7060 "proc-macro2", 6579 7061 "quote", 6580 - "syn 2.0.104", 6581 - "wasm-bindgen-backend", 7062 + "syn 2.0.116", 6582 7063 "wasm-bindgen-shared", 6583 7064 ] 6584 7065 6585 7066 [[package]] 6586 7067 name = "wasm-bindgen-shared" 6587 - version = "0.2.100" 7068 + version = "0.2.108" 6588 7069 source = "registry+https://github.com/rust-lang/crates.io-index" 6589 - checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 7070 + checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" 6590 7071 dependencies = [ 6591 7072 "unicode-ident", 6592 7073 ] 6593 7074 6594 7075 [[package]] 7076 + name = "wasm-encoder" 7077 + version = "0.244.0" 7078 + source = "registry+https://github.com/rust-lang/crates.io-index" 7079 + checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" 7080 + dependencies = [ 7081 + "leb128fmt", 7082 + "wasmparser", 7083 + ] 7084 + 7085 + [[package]] 7086 + name = "wasm-metadata" 7087 + version = "0.244.0" 7088 + source = "registry+https://github.com/rust-lang/crates.io-index" 7089 + checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" 7090 + dependencies = [ 7091 + "anyhow", 7092 + "indexmap 2.13.0", 7093 + "wasm-encoder", 7094 + "wasmparser", 7095 + ] 7096 + 7097 + [[package]] 6595 7098 name = "wasm-streams" 6596 - version = "0.4.2" 7099 + version = "0.5.0" 6597 7100 source = "registry+https://github.com/rust-lang/crates.io-index" 6598 - checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" 7101 + checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" 6599 7102 dependencies = [ 6600 7103 "futures-util", 6601 7104 "js-sys", ··· 6605 7108 ] 6606 7109 6607 7110 [[package]] 7111 + name = "wasmparser" 7112 + version = "0.244.0" 7113 + source = "registry+https://github.com/rust-lang/crates.io-index" 7114 + checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" 7115 + dependencies = [ 7116 + "bitflags 2.11.0", 7117 + "hashbrown 0.15.5", 7118 + "indexmap 2.13.0", 7119 + "semver", 7120 + ] 7121 + 7122 + [[package]] 6608 7123 name = "web-sys" 6609 - version = "0.3.77" 7124 + version = "0.3.85" 6610 7125 source = "registry+https://github.com/rust-lang/crates.io-index" 6611 - checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 7126 + checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" 6612 7127 dependencies = [ 6613 7128 "js-sys", 6614 7129 "wasm-bindgen", ··· 6626 7141 6627 7142 [[package]] 6628 7143 name = "webkit2gtk" 6629 - version = "2.0.1" 7144 + version = "2.0.2" 6630 7145 source = "registry+https://github.com/rust-lang/crates.io-index" 6631 - checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" 7146 + checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793" 6632 7147 dependencies = [ 6633 7148 "bitflags 1.3.2", 6634 7149 "cairo-rs", ··· 6650 7165 6651 7166 [[package]] 6652 7167 name = "webkit2gtk-sys" 6653 - version = "2.0.1" 7168 + version = "2.0.2" 6654 7169 source = "registry+https://github.com/rust-lang/crates.io-index" 6655 - checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" 7170 + checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5" 6656 7171 dependencies = [ 6657 7172 "bitflags 1.3.2", 6658 7173 "cairo-sys-rs", ··· 6679 7194 ] 6680 7195 6681 7196 [[package]] 6682 - name = "webpki-roots" 6683 - version = "0.22.6" 7197 + name = "webpki-root-certs" 7198 + version = "1.0.6" 6684 7199 source = "registry+https://github.com/rust-lang/crates.io-index" 6685 - checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" 7200 + checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" 6686 7201 dependencies = [ 6687 - "webpki", 7202 + "rustls-pki-types", 6688 7203 ] 6689 7204 6690 7205 [[package]] 6691 7206 name = "webpki-roots" 6692 - version = "1.0.1" 7207 + version = "0.22.6" 6693 7208 source = "registry+https://github.com/rust-lang/crates.io-index" 6694 - checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502" 7209 + checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" 6695 7210 dependencies = [ 6696 - "rustls-pki-types", 7211 + "webpki", 6697 7212 ] 6698 7213 6699 7214 [[package]] 6700 7215 name = "webrtc" 6701 - version = "0.13.0" 7216 + version = "0.17.1" 6702 7217 source = "registry+https://github.com/rust-lang/crates.io-index" 6703 - checksum = "24bab7195998d605c862772f90a452ba655b90a2f463c850ac032038890e367a" 7218 + checksum = "8ba06986c4fcfbbb4b490abe4b88887b0ac9de0d3eb0aae36f3254e38d6ecdd1" 6704 7219 dependencies = [ 6705 7220 "arc-swap", 6706 7221 "async-trait", 6707 7222 "bytes", 6708 - "cfg-if", 7223 + "dtls", 6709 7224 "hex", 6710 7225 "interceptor", 6711 7226 "lazy_static", 6712 7227 "log", 6713 7228 "portable-atomic", 6714 - "rand 0.8.5", 7229 + "rand 0.9.2", 6715 7230 "rcgen", 6716 7231 "regex", 6717 7232 "ring", 6718 7233 "rtcp", 6719 7234 "rtp", 6720 - "rustls 0.23.28", 6721 7235 "sdp", 6722 7236 "serde", 6723 7237 "serde_json", ··· 6725 7239 "smol_str", 6726 7240 "stun", 6727 7241 "thiserror 1.0.69", 6728 - "time", 6729 7242 "tokio", 6730 7243 "turn", 7244 + "unicase", 6731 7245 "url", 6732 7246 "waitgroup", 6733 7247 "webrtc-data", 6734 - "webrtc-dtls", 6735 7248 "webrtc-ice", 6736 7249 "webrtc-mdns", 6737 7250 "webrtc-media", ··· 6742 7255 6743 7256 [[package]] 6744 7257 name = "webrtc-data" 6745 - version = "0.11.0" 7258 + version = "0.17.1" 6746 7259 source = "registry+https://github.com/rust-lang/crates.io-index" 6747 - checksum = "4e97b932854da633a767eff0cc805425a2222fc6481e96f463e57b015d949d1d" 7260 + checksum = "a7ca42127ee64bcb71da36d151e6f87b12488c5f14c4f379e73d2d52a8e54aa0" 6748 7261 dependencies = [ 6749 7262 "bytes", 6750 7263 "log", ··· 6756 7269 ] 6757 7270 6758 7271 [[package]] 6759 - name = "webrtc-dtls" 6760 - version = "0.12.0" 6761 - source = "registry+https://github.com/rust-lang/crates.io-index" 6762 - checksum = "5ccbe4d9049390ab52695c3646c1395c877e16c15fb05d3bda8eee0c7351711c" 6763 - dependencies = [ 6764 - "aes", 6765 - "aes-gcm", 6766 - "async-trait", 6767 - "bincode", 6768 - "byteorder", 6769 - "cbc", 6770 - "ccm", 6771 - "der-parser", 6772 - "hkdf", 6773 - "hmac", 6774 - "log", 6775 - "p256", 6776 - "p384", 6777 - "portable-atomic", 6778 - "rand 0.8.5", 6779 - "rand_core 0.6.4", 6780 - "rcgen", 6781 - "ring", 6782 - "rustls 0.23.28", 6783 - "sec1", 6784 - "serde", 6785 - "sha1", 6786 - "sha2", 6787 - "subtle", 6788 - "thiserror 1.0.69", 6789 - "tokio", 6790 - "webrtc-util", 6791 - "x25519-dalek", 6792 - "x509-parser", 6793 - ] 6794 - 6795 - [[package]] 6796 7272 name = "webrtc-ice" 6797 - version = "0.13.0" 7273 + version = "0.17.1" 6798 7274 source = "registry+https://github.com/rust-lang/crates.io-index" 6799 - checksum = "eb51bde0d790f109a15bfe4d04f1b56fb51d567da231643cb3f21bb74d678997" 7275 + checksum = "23ede72a36e5dda685814c389b2b34ac60b3ed000a81789e93626e27180eb785" 6800 7276 dependencies = [ 6801 7277 "arc-swap", 6802 7278 "async-trait", 6803 7279 "crc", 6804 7280 "log", 6805 7281 "portable-atomic", 6806 - "rand 0.8.5", 7282 + "rand 0.9.2", 6807 7283 "serde", 6808 7284 "serde_json", 6809 7285 "stun", ··· 6819 7295 6820 7296 [[package]] 6821 7297 name = "webrtc-mdns" 6822 - version = "0.9.0" 7298 + version = "0.17.1" 6823 7299 source = "registry+https://github.com/rust-lang/crates.io-index" 6824 - checksum = "979cc85259c53b7b620803509d10d35e2546fa505d228850cbe3f08765ea6ea8" 7300 + checksum = "1b62bc8d3fb5024bc6ffde5f4aad2127ce17f8359dbc6f70208a324a12e44677" 6825 7301 dependencies = [ 6826 7302 "log", 6827 - "socket2", 7303 + "socket2 0.5.10", 6828 7304 "thiserror 1.0.69", 6829 7305 "tokio", 6830 7306 "webrtc-util", ··· 6832 7308 6833 7309 [[package]] 6834 7310 name = "webrtc-media" 6835 - version = "0.10.0" 7311 + version = "0.17.1" 6836 7312 source = "registry+https://github.com/rust-lang/crates.io-index" 6837 - checksum = "80041211deccda758a3e19aa93d6b10bc1d37c9183b519054b40a83691d13810" 7313 + checksum = "a9a28290bd0cdda196f8bf5c6f7dddaef18cc913ee0702cd1ea237bad203e337" 6838 7314 dependencies = [ 6839 7315 "byteorder", 6840 7316 "bytes", 6841 - "rand 0.8.5", 7317 + "rand 0.9.2", 6842 7318 "rtp", 6843 7319 "thiserror 1.0.69", 6844 7320 ] 6845 7321 6846 7322 [[package]] 6847 7323 name = "webrtc-sctp" 6848 - version = "0.12.0" 7324 + version = "0.17.1" 6849 7325 source = "registry+https://github.com/rust-lang/crates.io-index" 6850 - checksum = "07439c134425d51d2f10907aaf2f815fdfb587dce19fe94a4ae8b5faf2aae5ae" 7326 + checksum = "2ea6633bf951b3fd71eba3244731c8d0814f6a80300620a4370cad2983a5a42f" 6851 7327 dependencies = [ 6852 7328 "arc-swap", 6853 7329 "async-trait", ··· 6855 7331 "crc", 6856 7332 "log", 6857 7333 "portable-atomic", 6858 - "rand 0.8.5", 7334 + "rand 0.9.2", 6859 7335 "thiserror 1.0.69", 6860 7336 "tokio", 6861 7337 "webrtc-util", ··· 6863 7339 6864 7340 [[package]] 6865 7341 name = "webrtc-srtp" 6866 - version = "0.15.0" 7342 + version = "0.17.1" 6867 7343 source = "registry+https://github.com/rust-lang/crates.io-index" 6868 - checksum = "01e773f79b09b057ffbda6b03fe7b43403b012a240cf8d05d630674c3723b5bb" 7344 + checksum = "9e437f74b04f42049192e25cbb33c21c86be308875e6afe14cf8e28d1ffa35ac" 6869 7345 dependencies = [ 6870 7346 "aead", 6871 7347 "aes", ··· 6886 7362 6887 7363 [[package]] 6888 7364 name = "webrtc-util" 6889 - version = "0.11.0" 7365 + version = "0.17.1" 6890 7366 source = "registry+https://github.com/rust-lang/crates.io-index" 6891 - checksum = "64bfb10dbe6d762f80169ae07cf252bafa1f764b9594d140008a0231c0cdce58" 7367 + checksum = "b65c1e0143a43d40f69e1d8c2ffc8734e379b49c06d45892ea4104c388bf9ead" 6892 7368 dependencies = [ 6893 7369 "async-trait", 6894 7370 "bitflags 1.3.2", 6895 7371 "bytes", 6896 7372 "ipnet", 6897 7373 "lazy_static", 6898 - "libc", 6899 7374 "log", 6900 - "nix 0.26.4", 7375 + "nix", 6901 7376 "portable-atomic", 6902 - "rand 0.8.5", 7377 + "rand 0.9.2", 6903 7378 "thiserror 1.0.69", 6904 7379 "tokio", 6905 7380 "winapi", ··· 6907 7382 6908 7383 [[package]] 6909 7384 name = "webview2-com" 6910 - version = "0.37.0" 7385 + version = "0.38.2" 6911 7386 source = "registry+https://github.com/rust-lang/crates.io-index" 6912 - checksum = "b542b5cfbd9618c46c2784e4d41ba218c336ac70d44c55e47b251033e7d85601" 7387 + checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" 6913 7388 dependencies = [ 6914 7389 "webview2-com-macros", 6915 7390 "webview2-com-sys", 6916 7391 "windows", 6917 - "windows-core", 7392 + "windows-core 0.61.2", 6918 7393 "windows-implement", 6919 7394 "windows-interface", 6920 7395 ] 6921 7396 6922 7397 [[package]] 6923 7398 name = "webview2-com-macros" 6924 - version = "0.8.0" 7399 + version = "0.8.1" 6925 7400 source = "registry+https://github.com/rust-lang/crates.io-index" 6926 - checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" 7401 + checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" 6927 7402 dependencies = [ 6928 7403 "proc-macro2", 6929 7404 "quote", 6930 - "syn 2.0.104", 7405 + "syn 2.0.116", 6931 7406 ] 6932 7407 6933 7408 [[package]] 6934 7409 name = "webview2-com-sys" 6935 - version = "0.37.0" 7410 + version = "0.38.2" 6936 7411 source = "registry+https://github.com/rust-lang/crates.io-index" 6937 - checksum = "8ae2d11c4a686e4409659d7891791254cf9286d3cfe0eef54df1523533d22295" 7412 + checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" 6938 7413 dependencies = [ 6939 - "thiserror 2.0.12", 7414 + "thiserror 2.0.18", 6940 7415 "windows", 6941 - "windows-core", 7416 + "windows-core 0.61.2", 6942 7417 ] 6943 7418 6944 7419 [[package]] 7420 + name = "widestring" 7421 + version = "1.2.1" 7422 + source = "registry+https://github.com/rust-lang/crates.io-index" 7423 + checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" 7424 + 7425 + [[package]] 6945 7426 name = "winapi" 6946 7427 version = "0.3.9" 6947 7428 source = "registry+https://github.com/rust-lang/crates.io-index" ··· 6959 7440 6960 7441 [[package]] 6961 7442 name = "winapi-util" 6962 - version = "0.1.9" 7443 + version = "0.1.11" 6963 7444 source = "registry+https://github.com/rust-lang/crates.io-index" 6964 - checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 7445 + checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 6965 7446 dependencies = [ 6966 - "windows-sys 0.59.0", 7447 + "windows-sys 0.61.2", 6967 7448 ] 6968 7449 6969 7450 [[package]] ··· 6978 7459 source = "registry+https://github.com/rust-lang/crates.io-index" 6979 7460 checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" 6980 7461 dependencies = [ 6981 - "objc2 0.6.1", 7462 + "objc2", 6982 7463 "objc2-app-kit", 6983 7464 "objc2-core-foundation", 6984 - "objc2-foundation 0.3.1", 7465 + "objc2-foundation", 6985 7466 "raw-window-handle", 6986 7467 "windows-sys 0.59.0", 6987 7468 "windows-version", ··· 6994 7475 checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" 6995 7476 dependencies = [ 6996 7477 "windows-collections", 6997 - "windows-core", 7478 + "windows-core 0.61.2", 6998 7479 "windows-future", 6999 - "windows-link", 7480 + "windows-link 0.1.3", 7000 7481 "windows-numerics", 7001 7482 ] 7002 7483 ··· 7006 7487 source = "registry+https://github.com/rust-lang/crates.io-index" 7007 7488 checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" 7008 7489 dependencies = [ 7009 - "windows-core", 7490 + "windows-core 0.61.2", 7010 7491 ] 7011 7492 7012 7493 [[package]] ··· 7017 7498 dependencies = [ 7018 7499 "windows-implement", 7019 7500 "windows-interface", 7020 - "windows-link", 7021 - "windows-result", 7022 - "windows-strings", 7501 + "windows-link 0.1.3", 7502 + "windows-result 0.3.4", 7503 + "windows-strings 0.4.2", 7504 + ] 7505 + 7506 + [[package]] 7507 + name = "windows-core" 7508 + version = "0.62.2" 7509 + source = "registry+https://github.com/rust-lang/crates.io-index" 7510 + checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" 7511 + dependencies = [ 7512 + "windows-implement", 7513 + "windows-interface", 7514 + "windows-link 0.2.1", 7515 + "windows-result 0.4.1", 7516 + "windows-strings 0.5.1", 7023 7517 ] 7024 7518 7025 7519 [[package]] ··· 7028 7522 source = "registry+https://github.com/rust-lang/crates.io-index" 7029 7523 checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" 7030 7524 dependencies = [ 7031 - "windows-core", 7032 - "windows-link", 7525 + "windows-core 0.61.2", 7526 + "windows-link 0.1.3", 7033 7527 "windows-threading", 7034 7528 ] 7035 7529 7036 7530 [[package]] 7037 7531 name = "windows-implement" 7038 - version = "0.60.0" 7532 + version = "0.60.2" 7039 7533 source = "registry+https://github.com/rust-lang/crates.io-index" 7040 - checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 7534 + checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" 7041 7535 dependencies = [ 7042 7536 "proc-macro2", 7043 7537 "quote", 7044 - "syn 2.0.104", 7538 + "syn 2.0.116", 7045 7539 ] 7046 7540 7047 7541 [[package]] 7048 7542 name = "windows-interface" 7049 - version = "0.59.1" 7543 + version = "0.59.3" 7050 7544 source = "registry+https://github.com/rust-lang/crates.io-index" 7051 - checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 7545 + checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" 7052 7546 dependencies = [ 7053 7547 "proc-macro2", 7054 7548 "quote", 7055 - "syn 2.0.104", 7549 + "syn 2.0.116", 7056 7550 ] 7057 7551 7058 7552 [[package]] ··· 7062 7556 checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 7063 7557 7064 7558 [[package]] 7559 + name = "windows-link" 7560 + version = "0.2.1" 7561 + source = "registry+https://github.com/rust-lang/crates.io-index" 7562 + checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 7563 + 7564 + [[package]] 7065 7565 name = "windows-numerics" 7066 7566 version = "0.2.0" 7067 7567 source = "registry+https://github.com/rust-lang/crates.io-index" 7068 7568 checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" 7069 7569 dependencies = [ 7070 - "windows-core", 7071 - "windows-link", 7570 + "windows-core 0.61.2", 7571 + "windows-link 0.1.3", 7072 7572 ] 7073 7573 7074 7574 [[package]] 7075 7575 name = "windows-registry" 7076 - version = "0.5.2" 7576 + version = "0.6.1" 7077 7577 source = "registry+https://github.com/rust-lang/crates.io-index" 7078 - checksum = "b3bab093bdd303a1240bb99b8aba8ea8a69ee19d34c9e2ef9594e708a4878820" 7578 + checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" 7079 7579 dependencies = [ 7080 - "windows-link", 7081 - "windows-result", 7082 - "windows-strings", 7580 + "windows-link 0.2.1", 7581 + "windows-result 0.4.1", 7582 + "windows-strings 0.5.1", 7083 7583 ] 7084 7584 7085 7585 [[package]] ··· 7088 7588 source = "registry+https://github.com/rust-lang/crates.io-index" 7089 7589 checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 7090 7590 dependencies = [ 7091 - "windows-link", 7591 + "windows-link 0.1.3", 7592 + ] 7593 + 7594 + [[package]] 7595 + name = "windows-result" 7596 + version = "0.4.1" 7597 + source = "registry+https://github.com/rust-lang/crates.io-index" 7598 + checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" 7599 + dependencies = [ 7600 + "windows-link 0.2.1", 7092 7601 ] 7093 7602 7094 7603 [[package]] ··· 7097 7606 source = "registry+https://github.com/rust-lang/crates.io-index" 7098 7607 checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 7099 7608 dependencies = [ 7100 - "windows-link", 7609 + "windows-link 0.1.3", 7610 + ] 7611 + 7612 + [[package]] 7613 + name = "windows-strings" 7614 + version = "0.5.1" 7615 + source = "registry+https://github.com/rust-lang/crates.io-index" 7616 + checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" 7617 + dependencies = [ 7618 + "windows-link 0.2.1", 7101 7619 ] 7102 7620 7103 7621 [[package]] ··· 7133 7651 source = "registry+https://github.com/rust-lang/crates.io-index" 7134 7652 checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 7135 7653 dependencies = [ 7136 - "windows-targets 0.53.2", 7654 + "windows-targets 0.53.5", 7655 + ] 7656 + 7657 + [[package]] 7658 + name = "windows-sys" 7659 + version = "0.61.2" 7660 + source = "registry+https://github.com/rust-lang/crates.io-index" 7661 + checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 7662 + dependencies = [ 7663 + "windows-link 0.2.1", 7137 7664 ] 7138 7665 7139 7666 [[package]] ··· 7169 7696 7170 7697 [[package]] 7171 7698 name = "windows-targets" 7172 - version = "0.53.2" 7699 + version = "0.53.5" 7173 7700 source = "registry+https://github.com/rust-lang/crates.io-index" 7174 - checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" 7701 + checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" 7175 7702 dependencies = [ 7176 - "windows_aarch64_gnullvm 0.53.0", 7177 - "windows_aarch64_msvc 0.53.0", 7178 - "windows_i686_gnu 0.53.0", 7179 - "windows_i686_gnullvm 0.53.0", 7180 - "windows_i686_msvc 0.53.0", 7181 - "windows_x86_64_gnu 0.53.0", 7182 - "windows_x86_64_gnullvm 0.53.0", 7183 - "windows_x86_64_msvc 0.53.0", 7703 + "windows-link 0.2.1", 7704 + "windows_aarch64_gnullvm 0.53.1", 7705 + "windows_aarch64_msvc 0.53.1", 7706 + "windows_i686_gnu 0.53.1", 7707 + "windows_i686_gnullvm 0.53.1", 7708 + "windows_i686_msvc 0.53.1", 7709 + "windows_x86_64_gnu 0.53.1", 7710 + "windows_x86_64_gnullvm 0.53.1", 7711 + "windows_x86_64_msvc 0.53.1", 7184 7712 ] 7185 7713 7186 7714 [[package]] ··· 7189 7717 source = "registry+https://github.com/rust-lang/crates.io-index" 7190 7718 checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" 7191 7719 dependencies = [ 7192 - "windows-link", 7720 + "windows-link 0.1.3", 7193 7721 ] 7194 7722 7195 7723 [[package]] 7196 7724 name = "windows-version" 7197 - version = "0.1.4" 7725 + version = "0.1.7" 7198 7726 source = "registry+https://github.com/rust-lang/crates.io-index" 7199 - checksum = "e04a5c6627e310a23ad2358483286c7df260c964eb2d003d8efd6d0f4e79265c" 7727 + checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" 7200 7728 dependencies = [ 7201 - "windows-link", 7729 + "windows-link 0.2.1", 7202 7730 ] 7203 7731 7204 7732 [[package]] ··· 7215 7743 7216 7744 [[package]] 7217 7745 name = "windows_aarch64_gnullvm" 7218 - version = "0.53.0" 7746 + version = "0.53.1" 7219 7747 source = "registry+https://github.com/rust-lang/crates.io-index" 7220 - checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 7748 + checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" 7221 7749 7222 7750 [[package]] 7223 7751 name = "windows_aarch64_msvc" ··· 7233 7761 7234 7762 [[package]] 7235 7763 name = "windows_aarch64_msvc" 7236 - version = "0.53.0" 7764 + version = "0.53.1" 7237 7765 source = "registry+https://github.com/rust-lang/crates.io-index" 7238 - checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 7766 + checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" 7239 7767 7240 7768 [[package]] 7241 7769 name = "windows_i686_gnu" ··· 7251 7779 7252 7780 [[package]] 7253 7781 name = "windows_i686_gnu" 7254 - version = "0.53.0" 7782 + version = "0.53.1" 7255 7783 source = "registry+https://github.com/rust-lang/crates.io-index" 7256 - checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 7784 + checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" 7257 7785 7258 7786 [[package]] 7259 7787 name = "windows_i686_gnullvm" ··· 7263 7791 7264 7792 [[package]] 7265 7793 name = "windows_i686_gnullvm" 7266 - version = "0.53.0" 7794 + version = "0.53.1" 7267 7795 source = "registry+https://github.com/rust-lang/crates.io-index" 7268 - checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 7796 + checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" 7269 7797 7270 7798 [[package]] 7271 7799 name = "windows_i686_msvc" ··· 7281 7809 7282 7810 [[package]] 7283 7811 name = "windows_i686_msvc" 7284 - version = "0.53.0" 7812 + version = "0.53.1" 7285 7813 source = "registry+https://github.com/rust-lang/crates.io-index" 7286 - checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 7814 + checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" 7287 7815 7288 7816 [[package]] 7289 7817 name = "windows_x86_64_gnu" ··· 7299 7827 7300 7828 [[package]] 7301 7829 name = "windows_x86_64_gnu" 7302 - version = "0.53.0" 7830 + version = "0.53.1" 7303 7831 source = "registry+https://github.com/rust-lang/crates.io-index" 7304 - checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 7832 + checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" 7305 7833 7306 7834 [[package]] 7307 7835 name = "windows_x86_64_gnullvm" ··· 7317 7845 7318 7846 [[package]] 7319 7847 name = "windows_x86_64_gnullvm" 7320 - version = "0.53.0" 7848 + version = "0.53.1" 7321 7849 source = "registry+https://github.com/rust-lang/crates.io-index" 7322 - checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 7850 + checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" 7323 7851 7324 7852 [[package]] 7325 7853 name = "windows_x86_64_msvc" ··· 7335 7863 7336 7864 [[package]] 7337 7865 name = "windows_x86_64_msvc" 7338 - version = "0.53.0" 7866 + version = "0.53.1" 7339 7867 source = "registry+https://github.com/rust-lang/crates.io-index" 7340 - checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 7868 + checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" 7341 7869 7342 7870 [[package]] 7343 7871 name = "winnow" ··· 7350 7878 7351 7879 [[package]] 7352 7880 name = "winnow" 7353 - version = "0.7.11" 7881 + version = "0.7.14" 7354 7882 source = "registry+https://github.com/rust-lang/crates.io-index" 7355 - checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" 7883 + checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" 7356 7884 dependencies = [ 7357 7885 "memchr", 7358 7886 ] ··· 7368 7896 ] 7369 7897 7370 7898 [[package]] 7371 - name = "wit-bindgen-rt" 7372 - version = "0.39.0" 7899 + name = "wit-bindgen" 7900 + version = "0.51.0" 7901 + source = "registry+https://github.com/rust-lang/crates.io-index" 7902 + checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" 7903 + dependencies = [ 7904 + "wit-bindgen-rust-macro", 7905 + ] 7906 + 7907 + [[package]] 7908 + name = "wit-bindgen-core" 7909 + version = "0.51.0" 7910 + source = "registry+https://github.com/rust-lang/crates.io-index" 7911 + checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" 7912 + dependencies = [ 7913 + "anyhow", 7914 + "heck 0.5.0", 7915 + "wit-parser", 7916 + ] 7917 + 7918 + [[package]] 7919 + name = "wit-bindgen-rust" 7920 + version = "0.51.0" 7921 + source = "registry+https://github.com/rust-lang/crates.io-index" 7922 + checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" 7923 + dependencies = [ 7924 + "anyhow", 7925 + "heck 0.5.0", 7926 + "indexmap 2.13.0", 7927 + "prettyplease", 7928 + "syn 2.0.116", 7929 + "wasm-metadata", 7930 + "wit-bindgen-core", 7931 + "wit-component", 7932 + ] 7933 + 7934 + [[package]] 7935 + name = "wit-bindgen-rust-macro" 7936 + version = "0.51.0" 7373 7937 source = "registry+https://github.com/rust-lang/crates.io-index" 7374 - checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 7938 + checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" 7375 7939 dependencies = [ 7376 - "bitflags 2.9.1", 7940 + "anyhow", 7941 + "prettyplease", 7942 + "proc-macro2", 7943 + "quote", 7944 + "syn 2.0.116", 7945 + "wit-bindgen-core", 7946 + "wit-bindgen-rust", 7947 + ] 7948 + 7949 + [[package]] 7950 + name = "wit-component" 7951 + version = "0.244.0" 7952 + source = "registry+https://github.com/rust-lang/crates.io-index" 7953 + checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" 7954 + dependencies = [ 7955 + "anyhow", 7956 + "bitflags 2.11.0", 7957 + "indexmap 2.13.0", 7958 + "log", 7959 + "serde", 7960 + "serde_derive", 7961 + "serde_json", 7962 + "wasm-encoder", 7963 + "wasm-metadata", 7964 + "wasmparser", 7965 + "wit-parser", 7966 + ] 7967 + 7968 + [[package]] 7969 + name = "wit-parser" 7970 + version = "0.244.0" 7971 + source = "registry+https://github.com/rust-lang/crates.io-index" 7972 + checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" 7973 + dependencies = [ 7974 + "anyhow", 7975 + "id-arena", 7976 + "indexmap 2.13.0", 7977 + "log", 7978 + "semver", 7979 + "serde", 7980 + "serde_derive", 7981 + "serde_json", 7982 + "unicode-xid", 7983 + "wasmparser", 7377 7984 ] 7378 7985 7379 7986 [[package]] 7380 7987 name = "writeable" 7381 - version = "0.6.1" 7988 + version = "0.6.2" 7382 7989 source = "registry+https://github.com/rust-lang/crates.io-index" 7383 - checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 7990 + checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" 7384 7991 7385 7992 [[package]] 7386 7993 name = "wry" 7387 - version = "0.51.2" 7994 + version = "0.54.2" 7388 7995 source = "registry+https://github.com/rust-lang/crates.io-index" 7389 - checksum = "c886a0a9d2a94fd90cfa1d929629b79cfefb1546e2c7430c63a47f0664c0e4e2" 7996 + checksum = "bb26159b420aa77684589a744ae9a9461a95395b848764ad12290a14d960a11a" 7390 7997 dependencies = [ 7391 7998 "base64 0.22.1", 7392 - "block2 0.6.1", 7999 + "block2", 7393 8000 "cookie", 7394 8001 "crossbeam-channel", 8002 + "dirs", 7395 8003 "dpi", 7396 8004 "dunce", 7397 8005 "gdkx11", ··· 7403 8011 "kuchikiki", 7404 8012 "libc", 7405 8013 "ndk", 7406 - "objc2 0.6.1", 8014 + "objc2", 7407 8015 "objc2-app-kit", 7408 8016 "objc2-core-foundation", 7409 - "objc2-foundation 0.3.1", 8017 + "objc2-foundation", 7410 8018 "objc2-ui-kit", 7411 8019 "objc2-web-kit", 7412 8020 "once_cell", ··· 7415 8023 "sha2", 7416 8024 "soup3", 7417 8025 "tao-macros", 7418 - "thiserror 2.0.12", 8026 + "thiserror 2.0.18", 7419 8027 "url", 7420 8028 "webkit2gtk", 7421 8029 "webkit2gtk-sys", 7422 8030 "webview2-com", 7423 8031 "windows", 7424 - "windows-core", 8032 + "windows-core 0.61.2", 7425 8033 "windows-version", 7426 8034 "x11-dl", 7427 8035 ] ··· 7439 8047 "pharos", 7440 8048 "rustc_version", 7441 8049 "send_wrapper 0.6.0", 7442 - "thiserror 2.0.12", 8050 + "thiserror 2.0.18", 7443 8051 "wasm-bindgen", 7444 8052 "wasm-bindgen-futures", 7445 8053 "web-sys", ··· 7516 8124 7517 8125 [[package]] 7518 8126 name = "yoke" 7519 - version = "0.8.0" 8127 + version = "0.8.1" 7520 8128 source = "registry+https://github.com/rust-lang/crates.io-index" 7521 - checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 8129 + checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" 7522 8130 dependencies = [ 7523 - "serde", 7524 8131 "stable_deref_trait", 7525 8132 "yoke-derive", 7526 8133 "zerofrom", ··· 7528 8135 7529 8136 [[package]] 7530 8137 name = "yoke-derive" 7531 - version = "0.8.0" 8138 + version = "0.8.1" 7532 8139 source = "registry+https://github.com/rust-lang/crates.io-index" 7533 - checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 8140 + checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" 7534 8141 dependencies = [ 7535 8142 "proc-macro2", 7536 8143 "quote", 7537 - "syn 2.0.104", 8144 + "syn 2.0.116", 7538 8145 "synstructure", 7539 8146 ] 7540 8147 7541 8148 [[package]] 7542 8149 name = "zbus" 7543 - version = "5.7.1" 8150 + version = "5.13.2" 7544 8151 source = "registry+https://github.com/rust-lang/crates.io-index" 7545 - checksum = "d3a7c7cee313d044fca3f48fa782cb750c79e4ca76ba7bc7718cd4024cdf6f68" 8152 + checksum = "1bfeff997a0aaa3eb20c4652baf788d2dfa6d2839a0ead0b3ff69ce2f9c4bdd1" 7546 8153 dependencies = [ 7547 8154 "async-broadcast", 7548 8155 "async-executor", ··· 7554 8161 "async-trait", 7555 8162 "blocking", 7556 8163 "enumflags2", 7557 - "event-listener 5.4.0", 8164 + "event-listener 5.4.1", 7558 8165 "futures-core", 7559 8166 "futures-lite", 7560 8167 "hex", 7561 - "nix 0.30.1", 8168 + "libc", 7562 8169 "ordered-stream", 8170 + "rustix", 7563 8171 "serde", 7564 8172 "serde_repr", 7565 - "tokio", 7566 8173 "tracing", 7567 8174 "uds_windows", 7568 - "windows-sys 0.59.0", 7569 - "winnow 0.7.11", 8175 + "uuid", 8176 + "windows-sys 0.61.2", 8177 + "winnow 0.7.14", 7570 8178 "zbus_macros", 7571 8179 "zbus_names", 7572 8180 "zvariant", ··· 7574 8182 7575 8183 [[package]] 7576 8184 name = "zbus_macros" 7577 - version = "5.7.1" 8185 + version = "5.13.2" 7578 8186 source = "registry+https://github.com/rust-lang/crates.io-index" 7579 - checksum = "a17e7e5eec1550f747e71a058df81a9a83813ba0f6a95f39c4e218bdc7ba366a" 8187 + checksum = "0bbd5a90dbe8feee5b13def448427ae314ccd26a49cac47905cafefb9ff846f1" 7580 8188 dependencies = [ 7581 - "proc-macro-crate 3.3.0", 8189 + "proc-macro-crate 3.4.0", 7582 8190 "proc-macro2", 7583 8191 "quote", 7584 - "syn 2.0.104", 8192 + "syn 2.0.116", 7585 8193 "zbus_names", 7586 8194 "zvariant", 7587 8195 "zvariant_utils", ··· 7589 8197 7590 8198 [[package]] 7591 8199 name = "zbus_names" 7592 - version = "4.2.0" 8200 + version = "4.3.1" 7593 8201 source = "registry+https://github.com/rust-lang/crates.io-index" 7594 - checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" 8202 + checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" 7595 8203 dependencies = [ 7596 8204 "serde", 7597 - "static_assertions", 7598 - "winnow 0.7.11", 8205 + "winnow 0.7.14", 7599 8206 "zvariant", 7600 8207 ] 7601 8208 7602 8209 [[package]] 7603 8210 name = "zerocopy" 7604 - version = "0.8.26" 8211 + version = "0.8.39" 7605 8212 source = "registry+https://github.com/rust-lang/crates.io-index" 7606 - checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 8213 + checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" 7607 8214 dependencies = [ 7608 8215 "zerocopy-derive", 7609 8216 ] 7610 8217 7611 8218 [[package]] 7612 8219 name = "zerocopy-derive" 7613 - version = "0.8.26" 8220 + version = "0.8.39" 7614 8221 source = "registry+https://github.com/rust-lang/crates.io-index" 7615 - checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 8222 + checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" 7616 8223 dependencies = [ 7617 8224 "proc-macro2", 7618 8225 "quote", 7619 - "syn 2.0.104", 8226 + "syn 2.0.116", 7620 8227 ] 7621 8228 7622 8229 [[package]] ··· 7636 8243 dependencies = [ 7637 8244 "proc-macro2", 7638 8245 "quote", 7639 - "syn 2.0.104", 8246 + "syn 2.0.116", 7640 8247 "synstructure", 7641 8248 ] 7642 8249 7643 8250 [[package]] 7644 8251 name = "zeroize" 7645 - version = "1.8.1" 8252 + version = "1.8.2" 7646 8253 source = "registry+https://github.com/rust-lang/crates.io-index" 7647 - checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 8254 + checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" 7648 8255 dependencies = [ 7649 8256 "zeroize_derive", 7650 8257 ] 7651 8258 7652 8259 [[package]] 7653 8260 name = "zeroize_derive" 7654 - version = "1.4.2" 8261 + version = "1.4.3" 7655 8262 source = "registry+https://github.com/rust-lang/crates.io-index" 7656 - checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" 8263 + checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" 7657 8264 dependencies = [ 7658 8265 "proc-macro2", 7659 8266 "quote", 7660 - "syn 2.0.104", 8267 + "syn 2.0.116", 7661 8268 ] 7662 8269 7663 8270 [[package]] 7664 8271 name = "zerotrie" 7665 - version = "0.2.2" 8272 + version = "0.2.3" 7666 8273 source = "registry+https://github.com/rust-lang/crates.io-index" 7667 - checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 8274 + checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" 7668 8275 dependencies = [ 7669 8276 "displaydoc", 7670 8277 "yoke", ··· 7673 8280 7674 8281 [[package]] 7675 8282 name = "zerovec" 7676 - version = "0.11.2" 8283 + version = "0.11.5" 7677 8284 source = "registry+https://github.com/rust-lang/crates.io-index" 7678 - checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 8285 + checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" 7679 8286 dependencies = [ 7680 8287 "yoke", 7681 8288 "zerofrom", ··· 7684 8291 7685 8292 [[package]] 7686 8293 name = "zerovec-derive" 7687 - version = "0.11.1" 8294 + version = "0.11.2" 7688 8295 source = "registry+https://github.com/rust-lang/crates.io-index" 7689 - checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 8296 + checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" 7690 8297 dependencies = [ 7691 8298 "proc-macro2", 7692 8299 "quote", 7693 - "syn 2.0.104", 8300 + "syn 2.0.116", 7694 8301 ] 8302 + 8303 + [[package]] 8304 + name = "zmij" 8305 + version = "1.0.21" 8306 + source = "registry+https://github.com/rust-lang/crates.io-index" 8307 + checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" 7695 8308 7696 8309 [[package]] 7697 8310 name = "zvariant" 7698 - version = "5.5.3" 8311 + version = "5.9.2" 7699 8312 source = "registry+https://github.com/rust-lang/crates.io-index" 7700 - checksum = "9d30786f75e393ee63a21de4f9074d4c038d52c5b1bb4471f955db249f9dffb1" 8313 + checksum = "68b64ef4f40c7951337ddc7023dd03528a57a3ce3408ee9da5e948bd29b232c4" 7701 8314 dependencies = [ 7702 8315 "endi", 7703 8316 "enumflags2", 7704 8317 "serde", 7705 - "url", 7706 - "winnow 0.7.11", 8318 + "winnow 0.7.14", 7707 8319 "zvariant_derive", 7708 8320 "zvariant_utils", 7709 8321 ] 7710 8322 7711 8323 [[package]] 7712 8324 name = "zvariant_derive" 7713 - version = "5.5.3" 8325 + version = "5.9.2" 7714 8326 source = "registry+https://github.com/rust-lang/crates.io-index" 7715 - checksum = "75fda702cd42d735ccd48117b1630432219c0e9616bf6cb0f8350844ee4d9580" 8327 + checksum = "484d5d975eb7afb52cc6b929c13d3719a20ad650fea4120e6310de3fc55e415c" 7716 8328 dependencies = [ 7717 - "proc-macro-crate 3.3.0", 8329 + "proc-macro-crate 3.4.0", 7718 8330 "proc-macro2", 7719 8331 "quote", 7720 - "syn 2.0.104", 8332 + "syn 2.0.116", 7721 8333 "zvariant_utils", 7722 8334 ] 7723 8335 7724 8336 [[package]] 7725 8337 name = "zvariant_utils" 7726 - version = "3.2.0" 8338 + version = "3.3.0" 7727 8339 source = "registry+https://github.com/rust-lang/crates.io-index" 7728 - checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" 8340 + checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" 7729 8341 dependencies = [ 7730 8342 "proc-macro2", 7731 8343 "quote", 7732 8344 "serde", 7733 - "static_assertions", 7734 - "syn 2.0.104", 7735 - "winnow 0.7.11", 8345 + "syn 2.0.116", 8346 + "winnow 0.7.14", 7736 8347 ]
+1 -1
Cargo.toml
··· 1 1 [workspace] 2 - members = ["backend", "manhunt-logic", "manhunt-signaling", "manhunt-transport"] 2 + members = ["manhunt-app", "manhunt-logic", "manhunt-signaling", "manhunt-testing", "manhunt-transport"] 3 3 resolver = "3" 4 4 5 5 [profile.release]
+8 -3
README.md
··· 30 30 - [Rust](https://rustup.rs) 31 31 - [Just](https://just.systems) (`cargo install just`) 32 32 - **On Windows**: Some implementation of `sh` (Git for Windows works well) 33 + - Cargo Nextest (only needed for running `just check-rust`, `cargo install cargo-nextest`) 33 34 - [Tauri's Pre-reqs](https://tauri.app/start/prerequisites/) 34 35 - [(Also pre-reqs for mobile dev if you are working on the app part)](https://tauri.app/start/prerequisites/#configure-for-mobile-targets) 35 36 - Tauri's CLI (`cargo install tauri-cli`) ··· 59 60 60 61 ### Project Layout 61 62 62 - - [backend/](https://github.com/Bwc9876/manhunt-app/tree/main/backend): App 63 + - [manhunt-logic/](https://github.com/Bwc9876/manhunt-app/tree/main/manhunt-logic): 64 + Game and lobby logic for the app 65 + - [manhunt-transport/](https://github.com/Bwc9876/manhunt-app/tree/main/manhunt-transport): 66 + Transport (networking) implementation for communication between apps 67 + - [manhunt-app/](https://github.com/Bwc9876/manhunt-app/tree/main/manhunt-app): App 63 68 backend, Rust side of the Tauri application 64 69 - [frontend/](https://github.com/Bwc9876/manhunt-app/tree/main/frontend): App 65 70 frontend, Web side of the Tauri application ··· 74 79 75 80 - `just fmt`: Formats all files in the repo 76 81 - `just check-rust`: Check (and fix) potential issues with Rust code 77 - (only need to run if you edited the backend or signaling) 82 + (only need to run if you edited rust code) 78 83 - `just check-frontend`: Check for potential issues on the frontend 79 84 (only need to run if you edited the frontend) 80 85 81 - **Important**: When changing any type in `backend` that derives `specta::Type`, 86 + **Important**: When changing any type in a rust file that derives `specta::Type`, 82 87 you need to run `just export-types` to sync these type bindings to the frontend. 83 88 Otherwise the TypeScript definitions will not match the ones that the backend expects. 84 89
+8 -4
TODO.md
··· 23 23 - [x] Transport : Handle transport cancellation better 24 24 - [x] Backend : Add checks for when the `powerup_locations` field is an empty array in settings 25 25 - [ ] Backend : More tests 26 - - [ ] Lobby tests 27 - - [ ] Game end test for actual return from loop 28 - - [ ] Testing crate for integration testing from a DSL 29 - - [ ] NixOS VM tests wrapping the testing crate 26 + - [x] Lobby tests 27 + - [x] Game end test for actual return from loop 28 + - [x] More transport crate tests 29 + - [x] Signaling is wrong, only kick everyone else on host leave if the lobby is open 30 + - [x] Organize signalling and seperate out more logic 31 + - [x] Signaling tests 32 + - [ ] Testing crate for integration testing? 33 + - [ ] NixOS VM tests wrapping the testing crate? 30 34 - [ ] Nix : Cheat the dependency nightmare and use crane 31 35 - [x] Nix : Fix manhunt.nix to actually build 32 36 - [ ] Frontend : Rework state management, better hooks
backend/.gitignore manhunt-app/.gitignore
+7 -7
backend/Cargo.toml manhunt-app/Cargo.toml
··· 3 3 version = "0.1.0" 4 4 description = "A mobile app for playing the game \"manhunt\"" 5 5 authors = ["Ben C <bwc9876@gmail.com>"] 6 - edition = "2021" 6 + edition = "2024" 7 7 default-run = "manhunt-app" 8 8 9 9 [lib] ··· 22 22 tauri-plugin-opener = "2" 23 23 serde = { version = "1", features = ["derive"] } 24 24 serde_json = "1" 25 - tokio = { version = "1.45", features = ["sync", "macros", "time", "fs"] } 25 + tokio = { version = "1.49", features = ["sync", "macros", "time", "fs"] } 26 26 tauri-plugin-geolocation = "2" 27 - tauri-plugin-store = "2.2.0" 27 + tauri-plugin-store = "2.4.2" 28 28 specta = { version = "=2.0.0-rc.22", features = ["chrono", "uuid", "export"] } 29 29 tauri-specta = { version = "=2.0.0-rc.21", features = ["derive", "typescript"] } 30 30 specta-typescript = "0.0.9" 31 31 tauri-plugin-log = "2" 32 32 tauri-plugin-notification = "2" 33 - log = "0.4.27" 34 - anyhow = "1.0.98" 33 + log = "0.4.29" 34 + anyhow = "1.0.101" 35 35 tauri-plugin-dialog = "2" 36 36 manhunt-logic = { version = "0.1.0", path = "../manhunt-logic" } 37 37 manhunt-transport = { version = "0.1.0", path = "../manhunt-transport" } 38 - uuid = { version = "1.17.0", features = ["serde"] } 39 - chrono = { version = "0.4.41", features = ["serde"] } 38 + uuid = { version = "1.21.0", features = ["serde"] } 39 + chrono = { version = "0.4.43", features = ["serde"] }
backend/build.rs manhunt-app/build.rs
backend/capabilities/default.json manhunt-app/capabilities/default.json
backend/gen/android/.editorconfig manhunt-app/gen/android/.editorconfig
backend/gen/android/.gitignore manhunt-app/gen/android/.gitignore
backend/gen/android/app/.gitignore manhunt-app/gen/android/app/.gitignore
backend/gen/android/app/build.gradle.kts manhunt-app/gen/android/app/build.gradle.kts
backend/gen/android/app/proguard-rules.pro manhunt-app/gen/android/app/proguard-rules.pro
backend/gen/android/app/src/main/AndroidManifest.xml manhunt-app/gen/android/app/src/main/AndroidManifest.xml
backend/gen/android/app/src/main/java/com/bwc9876/manhunt/app/MainActivity.kt manhunt-app/gen/android/app/src/main/java/com/bwc9876/manhunt/app/MainActivity.kt
backend/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml manhunt-app/gen/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
backend/gen/android/app/src/main/res/drawable/ic_launcher_background.xml manhunt-app/gen/android/app/src/main/res/drawable/ic_launcher_background.xml
backend/gen/android/app/src/main/res/layout/activity_main.xml manhunt-app/gen/android/app/src/main/res/layout/activity_main.xml
backend/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png manhunt-app/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
backend/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png manhunt-app/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
backend/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png manhunt-app/gen/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
backend/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png manhunt-app/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
backend/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png manhunt-app/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
backend/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png manhunt-app/gen/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
backend/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png manhunt-app/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
backend/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png manhunt-app/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
backend/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png manhunt-app/gen/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
backend/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png manhunt-app/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
backend/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png manhunt-app/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
backend/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png manhunt-app/gen/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
backend/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png manhunt-app/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
backend/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png manhunt-app/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
backend/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png manhunt-app/gen/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
backend/gen/android/app/src/main/res/values-night/themes.xml manhunt-app/gen/android/app/src/main/res/values-night/themes.xml
backend/gen/android/app/src/main/res/values/colors.xml manhunt-app/gen/android/app/src/main/res/values/colors.xml
backend/gen/android/app/src/main/res/values/strings.xml manhunt-app/gen/android/app/src/main/res/values/strings.xml
backend/gen/android/app/src/main/res/values/themes.xml manhunt-app/gen/android/app/src/main/res/values/themes.xml
backend/gen/android/app/src/main/res/xml/file_paths.xml manhunt-app/gen/android/app/src/main/res/xml/file_paths.xml
backend/gen/android/build.gradle.kts manhunt-app/gen/android/build.gradle.kts
backend/gen/android/buildSrc/build.gradle.kts manhunt-app/gen/android/buildSrc/build.gradle.kts
backend/gen/android/buildSrc/src/main/java/com/bwc9876/manhunt/app/kotlin/BuildTask.kt manhunt-app/gen/android/buildSrc/src/main/java/com/bwc9876/manhunt/app/kotlin/BuildTask.kt
backend/gen/android/buildSrc/src/main/java/com/bwc9876/manhunt/app/kotlin/RustPlugin.kt manhunt-app/gen/android/buildSrc/src/main/java/com/bwc9876/manhunt/app/kotlin/RustPlugin.kt
backend/gen/android/gradle.properties manhunt-app/gen/android/gradle.properties
backend/gen/android/gradle/wrapper/gradle-wrapper.jar manhunt-app/gen/android/gradle/wrapper/gradle-wrapper.jar
backend/gen/android/gradle/wrapper/gradle-wrapper.properties manhunt-app/gen/android/gradle/wrapper/gradle-wrapper.properties
backend/gen/android/gradlew manhunt-app/gen/android/gradlew
backend/gen/android/gradlew.bat manhunt-app/gen/android/gradlew.bat
backend/gen/android/settings.gradle manhunt-app/gen/android/settings.gradle
backend/icons/128x128.png manhunt-app/icons/128x128.png
backend/icons/128x128@2x.png manhunt-app/icons/128x128@2x.png
backend/icons/32x32.png manhunt-app/icons/32x32.png
backend/icons/Square107x107Logo.png manhunt-app/icons/Square107x107Logo.png
backend/icons/Square142x142Logo.png manhunt-app/icons/Square142x142Logo.png
backend/icons/Square150x150Logo.png manhunt-app/icons/Square150x150Logo.png
backend/icons/Square284x284Logo.png manhunt-app/icons/Square284x284Logo.png
backend/icons/Square30x30Logo.png manhunt-app/icons/Square30x30Logo.png
backend/icons/Square310x310Logo.png manhunt-app/icons/Square310x310Logo.png
backend/icons/Square44x44Logo.png manhunt-app/icons/Square44x44Logo.png
backend/icons/Square71x71Logo.png manhunt-app/icons/Square71x71Logo.png
backend/icons/Square89x89Logo.png manhunt-app/icons/Square89x89Logo.png
backend/icons/StoreLogo.png manhunt-app/icons/StoreLogo.png
backend/icons/icon.icns manhunt-app/icons/icon.icns
backend/icons/icon.ico manhunt-app/icons/icon.ico
backend/icons/icon.png manhunt-app/icons/icon.png
+3 -1
backend/src/export_types.rs manhunt-app/src/export_types.rs
··· 8 8 let path = args.get(1).expect("Usage: export-types path"); 9 9 let specta = mk_specta(); 10 10 let mut lang = Typescript::new(); 11 - lang.header = Cow::Borrowed("/* eslint @typescript-eslint/no-unused-vars: 0 */\n/* eslint @typescript-eslint/no-explicit-any: 0 */"); 11 + lang.header = Cow::Borrowed( 12 + "/* eslint @typescript-eslint/no-unused-vars: 0 */\n/* eslint @typescript-eslint/no-explicit-any: 0 */", 13 + ); 12 14 specta.export(lang, path).expect("Failed to export types"); 13 15 println!("Successfully exported types, events, and commands to {path}",); 14 16 }
+12 -3
backend/src/history.rs manhunt-app/src/history.rs
··· 5 5 use tauri_plugin_store::{Store, StoreExt}; 6 6 use uuid::Uuid; 7 7 8 - use manhunt_logic::{GameHistory, PlayerProfile}; 8 + use manhunt_logic::{GameHistory, GameSettings, PlayerProfile}; 9 9 10 10 use crate::UtcDT; 11 11 ··· 15 15 pub struct AppGameHistory { 16 16 history: GameHistory, 17 17 profiles: HashMap<Uuid, PlayerProfile>, 18 + settings: GameSettings, 18 19 } 19 20 20 21 impl AppGameHistory { 21 - pub fn new(history: GameHistory, profiles: HashMap<Uuid, PlayerProfile>) -> Self { 22 - Self { history, profiles } 22 + pub fn new( 23 + history: GameHistory, 24 + profiles: HashMap<Uuid, PlayerProfile>, 25 + settings: GameSettings, 26 + ) -> Self { 27 + Self { 28 + history, 29 + profiles, 30 + settings, 31 + } 23 32 } 24 33 25 34 fn get_store<R: Runtime>(app: &AppHandle<R>) -> Result<Arc<Store<R>>> {
-568
backend/src/lib.rs
··· 1 - mod history; 2 - mod location; 3 - mod profiles; 4 - 5 - use std::{collections::HashMap, marker::PhantomData, sync::Arc, time::Duration}; 6 - 7 - use anyhow::Context; 8 - use location::TauriLocation; 9 - use log::{error, info, warn, LevelFilter}; 10 - use manhunt_logic::{ 11 - Game as BaseGame, GameSettings, GameUiState, Lobby as BaseLobby, LobbyState, PlayerProfile, 12 - StartGameInfo, StateUpdateSender, 13 - }; 14 - use manhunt_transport::{generate_join_code, room_exists, MatchboxTransport}; 15 - use serde::{Deserialize, Serialize}; 16 - use tauri::{AppHandle, Manager, State}; 17 - use tauri_plugin_dialog::{DialogExt, MessageDialogKind}; 18 - use tauri_specta::{collect_commands, collect_events, ErrorHandlingMode, Event}; 19 - use tokio::sync::RwLock; 20 - use uuid::Uuid; 21 - 22 - type UtcDT = chrono::DateTime<chrono::Utc>; 23 - 24 - /// The state of the game has changed 25 - #[derive(Serialize, Deserialize, Clone, Default, Debug, specta::Type, tauri_specta::Event)] 26 - struct GameStateUpdate; 27 - 28 - /// The state of the lobby has changed 29 - #[derive(Serialize, Deserialize, Clone, Default, Debug, specta::Type, tauri_specta::Event)] 30 - struct LobbyStateUpdate; 31 - 32 - struct TauriStateUpdateSender<E: Clone + Default + Event + Serialize>(AppHandle, PhantomData<E>); 33 - 34 - impl<E: Serialize + Clone + Default + Event> TauriStateUpdateSender<E> { 35 - fn new(app: &AppHandle) -> Self { 36 - Self(app.clone(), PhantomData) 37 - } 38 - } 39 - 40 - impl<E: Serialize + Clone + Default + Event> StateUpdateSender for TauriStateUpdateSender<E> { 41 - fn send_update(&self) { 42 - if let Err(why) = E::default().emit(&self.0) { 43 - error!("Error sending Game state update to UI: {why:?}"); 44 - } 45 - } 46 - } 47 - 48 - type Game = BaseGame<TauriLocation, MatchboxTransport, TauriStateUpdateSender<GameStateUpdate>>; 49 - type Lobby = BaseLobby<MatchboxTransport, TauriStateUpdateSender<LobbyStateUpdate>>; 50 - 51 - enum AppState { 52 - Setup, 53 - Menu(PlayerProfile), 54 - Lobby(Arc<Lobby>), 55 - Game(Arc<Game>, HashMap<Uuid, PlayerProfile>), 56 - Replay(AppGameHistory), 57 - } 58 - 59 - #[derive(Serialize, Deserialize, specta::Type, Debug, Clone, Eq, PartialEq)] 60 - enum AppScreen { 61 - Setup, 62 - Menu, 63 - Lobby, 64 - Game, 65 - Replay, 66 - } 67 - 68 - type AppStateHandle = RwLock<AppState>; 69 - 70 - const GAME_TICK_RATE: Duration = Duration::from_secs(1); 71 - 72 - /// The app is changing screens, contains the screen it's switching to 73 - #[derive(Serialize, Deserialize, Clone, Debug, specta::Type, tauri_specta::Event)] 74 - struct ChangeScreen(AppScreen); 75 - 76 - fn error_dialog(app: &AppHandle, msg: &str) { 77 - app.dialog() 78 - .message(msg) 79 - .kind(MessageDialogKind::Error) 80 - .show(|_| {}); 81 - } 82 - 83 - impl AppState { 84 - pub async fn start_game(&mut self, app: AppHandle, start: StartGameInfo) { 85 - if let AppState::Lobby(lobby) = self { 86 - let transport = lobby.clone_transport(); 87 - let profiles = lobby.clone_profiles().await; 88 - let location = TauriLocation::new(app.clone()); 89 - let state_updates = TauriStateUpdateSender::new(&app); 90 - let game = Arc::new(Game::new( 91 - GAME_TICK_RATE, 92 - start, 93 - transport, 94 - location, 95 - state_updates, 96 - )); 97 - *self = AppState::Game(game.clone(), profiles.clone()); 98 - Self::game_loop(app.clone(), game, profiles); 99 - Self::emit_screen_change(&app, AppScreen::Game); 100 - } 101 - } 102 - 103 - fn game_loop(app: AppHandle, game: Arc<Game>, profiles: HashMap<Uuid, PlayerProfile>) { 104 - tokio::spawn(async move { 105 - let res = game.main_loop().await; 106 - let state_handle = app.state::<AppStateHandle>(); 107 - let mut state = state_handle.write().await; 108 - match res { 109 - Ok(Some(history)) => { 110 - let history = AppGameHistory::new(history, profiles); 111 - if let Err(why) = history.save_history(&app) { 112 - error!("Failed to save game history: {why:?}"); 113 - error_dialog(&app, "Failed to save the history of this game"); 114 - } 115 - state.quit_to_menu(app.clone()).await; 116 - } 117 - Ok(None) => { 118 - info!("User quit game"); 119 - } 120 - Err(why) => { 121 - error!("Game Error: {why:?}"); 122 - app.dialog() 123 - .message(format!("Connection Error: {why}")) 124 - .kind(MessageDialogKind::Error) 125 - .show(|_| {}); 126 - state.quit_to_menu(app.clone()).await; 127 - } 128 - } 129 - }); 130 - } 131 - 132 - pub fn get_menu(&self) -> Result<&PlayerProfile> { 133 - match self { 134 - AppState::Menu(player_profile) => Ok(player_profile), 135 - _ => Err("Not on menu screen".to_string()), 136 - } 137 - } 138 - 139 - pub fn get_menu_mut(&mut self) -> Result<&mut PlayerProfile> { 140 - match self { 141 - AppState::Menu(player_profile) => Ok(player_profile), 142 - _ => Err("Not on menu screen".to_string()), 143 - } 144 - } 145 - 146 - pub fn get_lobby(&self) -> Result<Arc<Lobby>> { 147 - if let AppState::Lobby(lobby) = self { 148 - Ok(lobby.clone()) 149 - } else { 150 - Err("Not on lobby screen".to_string()) 151 - } 152 - } 153 - 154 - pub fn get_game(&self) -> Result<Arc<Game>> { 155 - if let AppState::Game(game, _) = self { 156 - Ok(game.clone()) 157 - } else { 158 - Err("Not on game screen".to_string()) 159 - } 160 - } 161 - 162 - pub fn get_profiles(&self) -> Result<&HashMap<Uuid, PlayerProfile>> { 163 - if let AppState::Game(_, profiles) = self { 164 - Ok(profiles) 165 - } else { 166 - Err("Not on game screen".to_string()) 167 - } 168 - } 169 - 170 - pub fn get_replay(&self) -> Result<AppGameHistory> { 171 - if let AppState::Replay(history) = self { 172 - Ok(history.clone()) 173 - } else { 174 - Err("Not on replay screen".to_string()) 175 - } 176 - } 177 - 178 - fn emit_screen_change(app: &AppHandle, screen: AppScreen) { 179 - if let Err(why) = ChangeScreen(screen).emit(app) { 180 - warn!("Error emitting screen change: {why:?}"); 181 - } 182 - } 183 - 184 - pub fn complete_setup(&mut self, app: &AppHandle, profile: PlayerProfile) -> Result { 185 - if let AppState::Setup = self { 186 - write_profile_to_store(app, profile.clone()); 187 - *self = AppState::Menu(profile); 188 - Self::emit_screen_change(app, AppScreen::Menu); 189 - Ok(()) 190 - } else { 191 - Err("Must be on the Setup screen".to_string()) 192 - } 193 - } 194 - 195 - pub fn replay_game(&mut self, app: &AppHandle, id: UtcDT) -> Result { 196 - if let AppState::Menu(_) = self { 197 - let history = AppGameHistory::get_history(app, id) 198 - .context("Failed to read history") 199 - .map_err(|e| e.to_string())?; 200 - *self = AppState::Replay(history); 201 - Self::emit_screen_change(app, AppScreen::Replay); 202 - Ok(()) 203 - } else { 204 - Err("Not on menu screen".to_string()) 205 - } 206 - } 207 - 208 - fn lobby_loop(app: AppHandle, lobby: Arc<Lobby>) { 209 - tokio::spawn(async move { 210 - let res = lobby.main_loop().await; 211 - let app_game = app.clone(); 212 - let state_handle = app.state::<AppStateHandle>(); 213 - let mut state = state_handle.write().await; 214 - match res { 215 - Ok(Some(start)) => { 216 - info!("Starting game as"); 217 - state.start_game(app_game, start).await; 218 - } 219 - Ok(None) => { 220 - info!("User quit lobby"); 221 - } 222 - Err(why) => { 223 - error!("Lobby Error: {why}"); 224 - error_dialog(&app_game, &format!("Error joining the lobby: {why}")); 225 - state.quit_to_menu(app_game).await; 226 - } 227 - } 228 - }); 229 - } 230 - 231 - pub async fn start_lobby( 232 - &mut self, 233 - join_code: Option<String>, 234 - app: AppHandle, 235 - settings: GameSettings, 236 - ) { 237 - if let AppState::Menu(profile) = self { 238 - let host = join_code.is_none(); 239 - let room_code = join_code.unwrap_or_else(generate_join_code); 240 - let state_updates = TauriStateUpdateSender::<LobbyStateUpdate>::new(&app); 241 - let lobby = 242 - Lobby::new(&room_code, host, profile.clone(), settings, state_updates).await; 243 - match lobby { 244 - Ok(lobby) => { 245 - *self = AppState::Lobby(lobby.clone()); 246 - Self::lobby_loop(app.clone(), lobby); 247 - Self::emit_screen_change(&app, AppScreen::Lobby); 248 - } 249 - Err(why) => { 250 - error_dialog( 251 - &app, 252 - &format!("Couldn't connect you to the lobby\n\n{why:?}"), 253 - ); 254 - } 255 - } 256 - } 257 - } 258 - 259 - pub async fn quit_to_menu(&mut self, app: AppHandle) { 260 - let profile = match self { 261 - AppState::Setup => None, 262 - AppState::Menu(_) => { 263 - warn!("Already on menu!"); 264 - return; 265 - } 266 - AppState::Lobby(lobby) => { 267 - lobby.quit_lobby().await; 268 - read_profile_from_store(&app) 269 - } 270 - AppState::Game(game, _) => { 271 - game.quit_game().await; 272 - read_profile_from_store(&app) 273 - } 274 - AppState::Replay(_) => read_profile_from_store(&app), 275 - }; 276 - let screen = if let Some(profile) = profile { 277 - *self = AppState::Menu(profile); 278 - AppScreen::Menu 279 - } else { 280 - *self = AppState::Setup; 281 - AppScreen::Setup 282 - }; 283 - 284 - Self::emit_screen_change(&app, screen); 285 - } 286 - } 287 - 288 - use std::result::Result as StdResult; 289 - 290 - use crate::{ 291 - history::AppGameHistory, 292 - profiles::{read_profile_from_store, write_profile_to_store}, 293 - }; 294 - 295 - type Result<T = (), E = String> = StdResult<T, E>; 296 - 297 - // == GENERAL / FLOW COMMANDS == 298 - 299 - #[tauri::command] 300 - #[specta::specta] 301 - /// Get the screen the app should currently be on, returns [AppScreen] 302 - async fn get_current_screen(state: State<'_, AppStateHandle>) -> Result<AppScreen> { 303 - let state = state.read().await; 304 - Ok(match &*state { 305 - AppState::Setup => AppScreen::Setup, 306 - AppState::Menu(_player_profile) => AppScreen::Menu, 307 - AppState::Lobby(_lobby) => AppScreen::Lobby, 308 - AppState::Game(_game, _profiles) => AppScreen::Game, 309 - AppState::Replay(_) => AppScreen::Replay, 310 - }) 311 - } 312 - 313 - #[tauri::command] 314 - #[specta::specta] 315 - /// Quit a running game or leave a lobby 316 - async fn quit_to_menu(app: AppHandle, state: State<'_, AppStateHandle>) -> Result { 317 - let mut state = state.write().await; 318 - state.quit_to_menu(app).await; 319 - Ok(()) 320 - } 321 - 322 - // == AppState::Setup COMMANDS 323 - 324 - #[tauri::command] 325 - #[specta::specta] 326 - /// (Screen: Setup) Complete user setup and go to the menu screen 327 - async fn complete_setup( 328 - profile: PlayerProfile, 329 - app: AppHandle, 330 - state: State<'_, AppStateHandle>, 331 - ) -> Result { 332 - state.write().await.complete_setup(&app, profile) 333 - } 334 - 335 - // == AppState::Menu COMMANDS == 336 - 337 - #[tauri::command] 338 - #[specta::specta] 339 - /// (Screen: Menu) Get the user's player profile 340 - async fn get_profile(state: State<'_, AppStateHandle>) -> Result<PlayerProfile> { 341 - let state = state.read().await; 342 - let profile = state.get_menu()?; 343 - Ok(profile.clone()) 344 - } 345 - 346 - #[tauri::command] 347 - #[specta::specta] 348 - /// (Screen: Menu) Get a list of all previously played games, returns of list of DateTimes that represent when 349 - /// each game started, use this as a key 350 - fn list_game_histories(app: AppHandle) -> Result<Vec<UtcDT>> { 351 - AppGameHistory::ls_histories(&app) 352 - .map_err(|err| err.context("Failed to get game histories").to_string()) 353 - } 354 - 355 - #[tauri::command] 356 - #[specta::specta] 357 - /// (Screen: Menu) Go to the game replay screen to replay the game history specified by id 358 - async fn replay_game(id: UtcDT, app: AppHandle, state: State<'_, AppStateHandle>) -> Result { 359 - state.write().await.replay_game(&app, id) 360 - } 361 - 362 - #[tauri::command] 363 - #[specta::specta] 364 - /// (Screen: Menu) Check if a room code is valid to join, use this before starting a game 365 - /// for faster error checking. 366 - async fn check_room_code(code: &str) -> Result<bool> { 367 - room_exists(code).await.map_err(|err| err.to_string()) 368 - } 369 - 370 - #[tauri::command] 371 - #[specta::specta] 372 - /// (Screen: Menu) Update the player's profile and persist it 373 - async fn update_profile( 374 - new_profile: PlayerProfile, 375 - app: AppHandle, 376 - state: State<'_, AppStateHandle>, 377 - ) -> Result { 378 - write_profile_to_store(&app, new_profile.clone()); 379 - let mut state = state.write().await; 380 - let profile = state.get_menu_mut()?; 381 - *profile = new_profile; 382 - Ok(()) 383 - } 384 - 385 - #[tauri::command] 386 - #[specta::specta] 387 - /// (Screen: Menu) Start/Join a new lobby, set `join_code` to `null` to be host, 388 - /// set it to a join code to be a client. This triggers a screen change to [AppScreen::Lobby] 389 - async fn start_lobby( 390 - app: AppHandle, 391 - join_code: Option<String>, 392 - settings: GameSettings, 393 - state: State<'_, AppStateHandle>, 394 - ) -> Result { 395 - let mut state = state.write().await; 396 - state.start_lobby(join_code, app, settings).await; 397 - Ok(()) 398 - } 399 - 400 - // AppState::Lobby COMMANDS 401 - 402 - #[tauri::command] 403 - #[specta::specta] 404 - /// (Screen: Lobby) Get the current state of the lobby, call after receiving an update event 405 - async fn get_lobby_state(state: State<'_, AppStateHandle>) -> Result<LobbyState> { 406 - let lobby = state.read().await.get_lobby()?; 407 - Ok(lobby.clone_state().await) 408 - } 409 - 410 - #[tauri::command] 411 - #[specta::specta] 412 - /// (Screen: Lobby) Switch teams between seekers and hiders, returns the new [LobbyState] 413 - async fn switch_teams(seeker: bool, state: State<'_, AppStateHandle>) -> Result { 414 - let lobby = state.read().await.get_lobby()?; 415 - lobby.switch_teams(seeker).await; 416 - Ok(()) 417 - } 418 - 419 - #[tauri::command] 420 - #[specta::specta] 421 - /// (Screen: Lobby) HOST ONLY: Push new settings to everyone, does nothing on clients. Returns the 422 - /// new lobby state 423 - async fn host_update_settings(settings: GameSettings, state: State<'_, AppStateHandle>) -> Result { 424 - let lobby = state.read().await.get_lobby()?; 425 - lobby.update_settings(settings).await; 426 - Ok(()) 427 - } 428 - 429 - #[tauri::command] 430 - #[specta::specta] 431 - /// (Screen: Lobby) HOST ONLY: Start the game, stops anyone else from joining and switched screen 432 - /// to AppScreen::Game. 433 - async fn host_start_game(state: State<'_, AppStateHandle>) -> Result { 434 - state.read().await.get_lobby()?.start_game().await; 435 - Ok(()) 436 - } 437 - 438 - // AppScreen::Game COMMANDS 439 - 440 - #[tauri::command] 441 - #[specta::specta] 442 - /// (Screen: Game) Get all player profiles with display names and profile pictures for this game. 443 - /// This value will never change and is fairly expensive to clone, so please minimize calls to 444 - /// this command. 445 - async fn get_profiles(state: State<'_, AppStateHandle>) -> Result<HashMap<Uuid, PlayerProfile>> { 446 - state.read().await.get_profiles().cloned() 447 - } 448 - 449 - #[tauri::command] 450 - #[specta::specta] 451 - /// (Screen: Game) Get the current settings for this game. 452 - async fn get_game_settings(state: State<'_, AppStateHandle>) -> Result<GameSettings> { 453 - Ok(state.read().await.get_game()?.clone_settings().await) 454 - } 455 - 456 - #[tauri::command] 457 - #[specta::specta] 458 - /// (Screen: Game) Get the current state of the game. 459 - async fn get_game_state(state: State<'_, AppStateHandle>) -> Result<GameUiState> { 460 - Ok(state.read().await.get_game()?.get_ui_state().await) 461 - } 462 - 463 - #[tauri::command] 464 - #[specta::specta] 465 - /// (Screen: Game) Mark this player as caught, this player will become a seeker. Returns the new game state 466 - async fn mark_caught(state: State<'_, AppStateHandle>) -> Result { 467 - let game = state.read().await.get_game()?; 468 - game.mark_caught().await; 469 - Ok(()) 470 - } 471 - 472 - #[tauri::command] 473 - #[specta::specta] 474 - /// (Screen: Game) Grab a powerup on the map, this should be called when the user is *in range* of 475 - /// the powerup. Returns the new game state after rolling for the powerup 476 - async fn grab_powerup(state: State<'_, AppStateHandle>) -> Result { 477 - let game = state.read().await.get_game()?; 478 - game.get_powerup().await; 479 - Ok(()) 480 - } 481 - 482 - #[tauri::command] 483 - #[specta::specta] 484 - /// (Screen: Game) Use the currently held powerup in the player's held_powerup. Does nothing if the 485 - /// player has none. Returns the updated game state 486 - async fn activate_powerup(state: State<'_, AppStateHandle>) -> Result { 487 - let game = state.read().await.get_game()?; 488 - game.use_powerup().await; 489 - Ok(()) 490 - } 491 - 492 - // AppState::Replay COMMANDS 493 - 494 - #[tauri::command] 495 - #[specta::specta] 496 - /// (Screen: Replay) Get the game history that's currently being replayed. Try to limit calls to 497 - /// this 498 - async fn get_current_replay_history(state: State<'_, AppStateHandle>) -> Result<AppGameHistory> { 499 - state.read().await.get_replay() 500 - } 501 - 502 - pub fn mk_specta() -> tauri_specta::Builder { 503 - tauri_specta::Builder::<tauri::Wry>::new() 504 - .error_handling(ErrorHandlingMode::Throw) 505 - .commands(collect_commands![ 506 - start_lobby, 507 - get_profile, 508 - quit_to_menu, 509 - get_current_screen, 510 - update_profile, 511 - get_lobby_state, 512 - host_update_settings, 513 - switch_teams, 514 - host_start_game, 515 - mark_caught, 516 - grab_powerup, 517 - activate_powerup, 518 - check_room_code, 519 - get_profiles, 520 - replay_game, 521 - list_game_histories, 522 - get_current_replay_history, 523 - get_game_settings, 524 - get_game_state, 525 - complete_setup, 526 - ]) 527 - .events(collect_events![ 528 - ChangeScreen, 529 - GameStateUpdate, 530 - LobbyStateUpdate 531 - ]) 532 - } 533 - 534 - #[cfg_attr(mobile, tauri::mobile_entry_point)] 535 - pub fn run() { 536 - let state = RwLock::new(AppState::Setup); 537 - 538 - let builder = mk_specta(); 539 - 540 - tauri::Builder::default() 541 - .plugin(tauri_plugin_dialog::init()) 542 - .plugin(tauri_plugin_notification::init()) 543 - .plugin( 544 - tauri_plugin_log::Builder::new() 545 - .level(LevelFilter::Debug) 546 - .build(), 547 - ) 548 - .plugin(tauri_plugin_opener::init()) 549 - .plugin(tauri_plugin_geolocation::init()) 550 - .plugin(tauri_plugin_store::Builder::default().build()) 551 - .invoke_handler(builder.invoke_handler()) 552 - .manage(state) 553 - .setup(move |app| { 554 - builder.mount_events(app); 555 - 556 - let handle = app.handle().clone(); 557 - tauri::async_runtime::spawn(async move { 558 - if let Some(profile) = read_profile_from_store(&handle) { 559 - let state_handle = handle.state::<AppStateHandle>(); 560 - let mut state = state_handle.write().await; 561 - *state = AppState::Menu(profile); 562 - } 563 - }); 564 - Ok(()) 565 - }) 566 - .run(tauri::generate_context!()) 567 - .expect("error while running tauri application"); 568 - }
backend/src/location.rs manhunt-app/src/location.rs
backend/src/main.rs manhunt-app/src/main.rs
backend/src/profiles.rs manhunt-app/src/profiles.rs
backend/tauri.conf.json manhunt-app/tauri.conf.json
+80 -78
flake.lock
··· 1 1 { 2 - "nodes": { 3 - "flakelight": { 4 - "inputs": { 5 - "nixpkgs": "nixpkgs" 6 - }, 7 - "locked": { 8 - "lastModified": 1750683087, 9 - "narHash": "sha256-CkmobghX9K9soC4DoorFo/vlWXxpf8xuZyoCsOnWzqM=", 10 - "owner": "nix-community", 11 - "repo": "flakelight", 12 - "rev": "aa93e0e1ecdccc70c7a185f60c562effbfe3c8d9", 13 - "type": "github" 14 - }, 15 - "original": { 16 - "owner": "nix-community", 17 - "repo": "flakelight", 18 - "type": "github" 19 - } 20 - }, 21 - "nixpkgs": { 22 - "locked": { 23 - "lastModified": 1750506804, 24 - "narHash": "sha256-VLFNc4egNjovYVxDGyBYTrvVCgDYgENp5bVi9fPTDYc=", 25 - "owner": "NixOS", 26 - "repo": "nixpkgs", 27 - "rev": "4206c4cb56751df534751b058295ea61357bbbaa", 28 - "type": "github" 29 - }, 30 - "original": { 31 - "owner": "NixOS", 32 - "ref": "nixos-unstable", 33 - "repo": "nixpkgs", 34 - "type": "github" 35 - } 36 - }, 37 - "nixpkgs_2": { 38 - "locked": { 39 - "lastModified": 1750731501, 40 - "narHash": "sha256-Ah4qq+SbwMaGkuXCibyg+Fwn00el4KmI3XFX6htfDuk=", 41 - "owner": "NixOS", 42 - "repo": "nixpkgs", 43 - "rev": "69dfebb3d175bde602f612915c5576a41b18486b", 44 - "type": "github" 45 - }, 46 - "original": { 47 - "owner": "NixOS", 48 - "ref": "nixpkgs-unstable", 49 - "repo": "nixpkgs", 50 - "type": "github" 51 - } 52 - }, 53 - "root": { 54 - "inputs": { 55 - "flakelight": "flakelight", 56 - "nixpkgs": "nixpkgs_2", 57 - "rust-overlay": "rust-overlay" 58 - } 59 - }, 60 - "rust-overlay": { 61 - "inputs": { 62 - "nixpkgs": ["nixpkgs"] 63 - }, 64 - "locked": { 65 - "lastModified": 1750732748, 66 - "narHash": "sha256-HR2b3RHsPeJm+Fb+1ui8nXibgniVj7hBNvUbXEyz0DU=", 67 - "owner": "oxalica", 68 - "repo": "rust-overlay", 69 - "rev": "4b4494b2ba7e8a8041b2e28320b2ee02c115c75f", 70 - "type": "github" 71 - }, 72 - "original": { 73 - "owner": "oxalica", 74 - "repo": "rust-overlay", 75 - "type": "github" 76 - } 77 - } 2 + "nodes": { 3 + "flakelight": { 4 + "inputs": { 5 + "nixpkgs": "nixpkgs" 6 + }, 7 + "locked": { 8 + "lastModified": 1771247707, 9 + "narHash": "sha256-IWXkmCA3vWZ9AjQpStiHoRG4SEiBPDZyXv+1SoyTReE=", 10 + "owner": "nix-community", 11 + "repo": "flakelight", 12 + "rev": "37354ba2661e62f57a127e19272ee18f4cc01bba", 13 + "type": "github" 14 + }, 15 + "original": { 16 + "owner": "nix-community", 17 + "repo": "flakelight", 18 + "type": "github" 19 + } 78 20 }, 79 - "root": "root", 80 - "version": 7 21 + "nixpkgs": { 22 + "locked": { 23 + "lastModified": 1771008912, 24 + "narHash": "sha256-gf2AmWVTs8lEq7z/3ZAsgnZDhWIckkb+ZnAo5RzSxJg=", 25 + "owner": "NixOS", 26 + "repo": "nixpkgs", 27 + "rev": "a82ccc39b39b621151d6732718e3e250109076fa", 28 + "type": "github" 29 + }, 30 + "original": { 31 + "owner": "NixOS", 32 + "ref": "nixos-unstable", 33 + "repo": "nixpkgs", 34 + "type": "github" 35 + } 36 + }, 37 + "nixpkgs_2": { 38 + "locked": { 39 + "lastModified": 1771177547, 40 + "narHash": "sha256-trTtk3WTOHz7hSw89xIIvahkgoFJYQ0G43IlqprFoMA=", 41 + "owner": "NixOS", 42 + "repo": "nixpkgs", 43 + "rev": "ac055f38c798b0d87695240c7b761b82fc7e5bc2", 44 + "type": "github" 45 + }, 46 + "original": { 47 + "owner": "NixOS", 48 + "ref": "nixpkgs-unstable", 49 + "repo": "nixpkgs", 50 + "type": "github" 51 + } 52 + }, 53 + "root": { 54 + "inputs": { 55 + "flakelight": "flakelight", 56 + "nixpkgs": "nixpkgs_2", 57 + "rust-overlay": "rust-overlay" 58 + } 59 + }, 60 + "rust-overlay": { 61 + "inputs": { 62 + "nixpkgs": [ 63 + "nixpkgs" 64 + ] 65 + }, 66 + "locked": { 67 + "lastModified": 1771297684, 68 + "narHash": "sha256-wieWskQxZLPlNXX06JEB0bMoS/ZYQ89xBzF0RL9lyLs=", 69 + "owner": "oxalica", 70 + "repo": "rust-overlay", 71 + "rev": "755d3669699a7c62aef35af187d75dc2728cfd85", 72 + "type": "github" 73 + }, 74 + "original": { 75 + "owner": "oxalica", 76 + "repo": "rust-overlay", 77 + "type": "github" 78 + } 79 + } 80 + }, 81 + "root": "root", 82 + "version": 7 81 83 }
+3 -1
flake.nix
··· 18 18 formatters = pkgs: let 19 19 prettier = "${pkgs.prettier}/bin/prettier --write ."; 20 20 alejandra = "${pkgs.alejandra}/bin/alejandra ."; 21 - rustfmt = "${pkgs.rustfmt}/bin/rustfmt"; 21 + rustfmt = "${pkgs.rustfmt}/bin/rustfmt fmt"; 22 22 just = "${pkgs.just}/bin/just --fmt --unstable"; 23 23 in { 24 24 "justfile" = just; ··· 37 37 androidComposition = pkgs.androidenv.composeAndroidPackages { 38 38 platformVersions = [ 39 39 "34" 40 + "36" 40 41 "latest" 41 42 ]; 42 43 systemImageTypes = ["google_apis_playstore"]; ··· 76 77 just 77 78 pango 78 79 webkitgtk_4_1 80 + cargo-nextest 79 81 openssl 80 82 pkg-config 81 83 gobject-introspection
+5259 -5400
frontend/package-lock.json
··· 1 1 { 2 - "name": "manhunt-app", 3 - "version": "0.1.0", 4 - "lockfileVersion": 3, 5 - "requires": true, 6 - "packages": { 7 - "": { 8 - "name": "manhunt-app", 9 - "version": "0.1.0", 10 - "dependencies": { 11 - "@tauri-apps/api": "^2", 12 - "@tauri-apps/plugin-dialog": "^2", 13 - "@tauri-apps/plugin-geolocation": "^2", 14 - "@tauri-apps/plugin-log": "^2", 15 - "@tauri-apps/plugin-notification": "^2", 16 - "@tauri-apps/plugin-opener": "^2", 17 - "react": "^19", 18 - "react-dom": "^19", 19 - "swr": "^2.3.3" 20 - }, 21 - "devDependencies": { 22 - "@eslint/js": "^9", 23 - "@types/node": "^24.0.3", 24 - "@types/react": "^19", 25 - "@types/react-dom": "^19", 26 - "@vitejs/plugin-react": "^4", 27 - "eslint": "^9", 28 - "eslint-plugin-react": "^7", 29 - "eslint-plugin-react-hooks": "^5", 30 - "globals": "^16", 31 - "prettier": "^3", 32 - "typescript": "^5", 33 - "typescript-eslint": "^8", 34 - "vite": "^6" 35 - } 2 + "name": "manhunt-app", 3 + "version": "0.1.0", 4 + "lockfileVersion": 3, 5 + "requires": true, 6 + "packages": { 7 + "": { 8 + "name": "manhunt-app", 9 + "version": "0.1.0", 10 + "dependencies": { 11 + "@tauri-apps/api": "^2", 12 + "@tauri-apps/plugin-dialog": "^2", 13 + "@tauri-apps/plugin-geolocation": "^2", 14 + "@tauri-apps/plugin-log": "^2", 15 + "@tauri-apps/plugin-notification": "^2", 16 + "@tauri-apps/plugin-opener": "^2", 17 + "react": "^19", 18 + "react-dom": "^19", 19 + "swr": "^2" 20 + }, 21 + "devDependencies": { 22 + "@eslint/js": "^9.39.2", 23 + "@types/node": "^25.2.3", 24 + "@types/react": "^19", 25 + "@types/react-dom": "^19", 26 + "@vitejs/plugin-react": "^5.1.4", 27 + "eslint": "^9.39.2", 28 + "eslint-plugin-react": "^7", 29 + "eslint-plugin-react-hooks": "^5.2.0", 30 + "globals": "^17.3.0", 31 + "prettier": "^3", 32 + "typescript": "^5", 33 + "typescript-eslint": "^8", 34 + "vite": "^7" 35 + } 36 + }, 37 + "node_modules/@babel/code-frame": { 38 + "version": "7.29.0", 39 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", 40 + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", 41 + "dev": true, 42 + "license": "MIT", 43 + "dependencies": { 44 + "@babel/helper-validator-identifier": "^7.28.5", 45 + "js-tokens": "^4.0.0", 46 + "picocolors": "^1.1.1" 47 + }, 48 + "engines": { 49 + "node": ">=6.9.0" 50 + } 51 + }, 52 + "node_modules/@babel/compat-data": { 53 + "version": "7.29.0", 54 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", 55 + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", 56 + "dev": true, 57 + "license": "MIT", 58 + "engines": { 59 + "node": ">=6.9.0" 60 + } 61 + }, 62 + "node_modules/@babel/core": { 63 + "version": "7.29.0", 64 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", 65 + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", 66 + "dev": true, 67 + "license": "MIT", 68 + "dependencies": { 69 + "@babel/code-frame": "^7.29.0", 70 + "@babel/generator": "^7.29.0", 71 + "@babel/helper-compilation-targets": "^7.28.6", 72 + "@babel/helper-module-transforms": "^7.28.6", 73 + "@babel/helpers": "^7.28.6", 74 + "@babel/parser": "^7.29.0", 75 + "@babel/template": "^7.28.6", 76 + "@babel/traverse": "^7.29.0", 77 + "@babel/types": "^7.29.0", 78 + "@jridgewell/remapping": "^2.3.5", 79 + "convert-source-map": "^2.0.0", 80 + "debug": "^4.1.0", 81 + "gensync": "^1.0.0-beta.2", 82 + "json5": "^2.2.3", 83 + "semver": "^6.3.1" 84 + }, 85 + "engines": { 86 + "node": ">=6.9.0" 87 + }, 88 + "funding": { 89 + "type": "opencollective", 90 + "url": "https://opencollective.com/babel" 91 + } 92 + }, 93 + "node_modules/@babel/generator": { 94 + "version": "7.29.1", 95 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", 96 + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", 97 + "dev": true, 98 + "license": "MIT", 99 + "dependencies": { 100 + "@babel/parser": "^7.29.0", 101 + "@babel/types": "^7.29.0", 102 + "@jridgewell/gen-mapping": "^0.3.12", 103 + "@jridgewell/trace-mapping": "^0.3.28", 104 + "jsesc": "^3.0.2" 105 + }, 106 + "engines": { 107 + "node": ">=6.9.0" 108 + } 109 + }, 110 + "node_modules/@babel/helper-compilation-targets": { 111 + "version": "7.28.6", 112 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", 113 + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", 114 + "dev": true, 115 + "license": "MIT", 116 + "dependencies": { 117 + "@babel/compat-data": "^7.28.6", 118 + "@babel/helper-validator-option": "^7.27.1", 119 + "browserslist": "^4.24.0", 120 + "lru-cache": "^5.1.1", 121 + "semver": "^6.3.1" 122 + }, 123 + "engines": { 124 + "node": ">=6.9.0" 125 + } 126 + }, 127 + "node_modules/@babel/helper-globals": { 128 + "version": "7.28.0", 129 + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", 130 + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", 131 + "dev": true, 132 + "license": "MIT", 133 + "engines": { 134 + "node": ">=6.9.0" 135 + } 136 + }, 137 + "node_modules/@babel/helper-module-imports": { 138 + "version": "7.28.6", 139 + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", 140 + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", 141 + "dev": true, 142 + "license": "MIT", 143 + "dependencies": { 144 + "@babel/traverse": "^7.28.6", 145 + "@babel/types": "^7.28.6" 146 + }, 147 + "engines": { 148 + "node": ">=6.9.0" 149 + } 150 + }, 151 + "node_modules/@babel/helper-module-transforms": { 152 + "version": "7.28.6", 153 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", 154 + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", 155 + "dev": true, 156 + "license": "MIT", 157 + "dependencies": { 158 + "@babel/helper-module-imports": "^7.28.6", 159 + "@babel/helper-validator-identifier": "^7.28.5", 160 + "@babel/traverse": "^7.28.6" 161 + }, 162 + "engines": { 163 + "node": ">=6.9.0" 164 + }, 165 + "peerDependencies": { 166 + "@babel/core": "^7.0.0" 167 + } 168 + }, 169 + "node_modules/@babel/helper-plugin-utils": { 170 + "version": "7.28.6", 171 + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", 172 + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", 173 + "dev": true, 174 + "license": "MIT", 175 + "engines": { 176 + "node": ">=6.9.0" 177 + } 178 + }, 179 + "node_modules/@babel/helper-string-parser": { 180 + "version": "7.27.1", 181 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", 182 + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", 183 + "dev": true, 184 + "license": "MIT", 185 + "engines": { 186 + "node": ">=6.9.0" 187 + } 188 + }, 189 + "node_modules/@babel/helper-validator-identifier": { 190 + "version": "7.28.5", 191 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", 192 + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", 193 + "dev": true, 194 + "license": "MIT", 195 + "engines": { 196 + "node": ">=6.9.0" 197 + } 198 + }, 199 + "node_modules/@babel/helper-validator-option": { 200 + "version": "7.27.1", 201 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", 202 + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", 203 + "dev": true, 204 + "license": "MIT", 205 + "engines": { 206 + "node": ">=6.9.0" 207 + } 208 + }, 209 + "node_modules/@babel/helpers": { 210 + "version": "7.28.6", 211 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", 212 + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", 213 + "dev": true, 214 + "license": "MIT", 215 + "dependencies": { 216 + "@babel/template": "^7.28.6", 217 + "@babel/types": "^7.28.6" 218 + }, 219 + "engines": { 220 + "node": ">=6.9.0" 221 + } 222 + }, 223 + "node_modules/@babel/parser": { 224 + "version": "7.29.0", 225 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", 226 + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", 227 + "dev": true, 228 + "license": "MIT", 229 + "dependencies": { 230 + "@babel/types": "^7.29.0" 231 + }, 232 + "bin": { 233 + "parser": "bin/babel-parser.js" 234 + }, 235 + "engines": { 236 + "node": ">=6.0.0" 237 + } 238 + }, 239 + "node_modules/@babel/plugin-transform-react-jsx-self": { 240 + "version": "7.27.1", 241 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", 242 + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", 243 + "dev": true, 244 + "license": "MIT", 245 + "dependencies": { 246 + "@babel/helper-plugin-utils": "^7.27.1" 247 + }, 248 + "engines": { 249 + "node": ">=6.9.0" 250 + }, 251 + "peerDependencies": { 252 + "@babel/core": "^7.0.0-0" 253 + } 254 + }, 255 + "node_modules/@babel/plugin-transform-react-jsx-source": { 256 + "version": "7.27.1", 257 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", 258 + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", 259 + "dev": true, 260 + "license": "MIT", 261 + "dependencies": { 262 + "@babel/helper-plugin-utils": "^7.27.1" 263 + }, 264 + "engines": { 265 + "node": ">=6.9.0" 266 + }, 267 + "peerDependencies": { 268 + "@babel/core": "^7.0.0-0" 269 + } 270 + }, 271 + "node_modules/@babel/template": { 272 + "version": "7.28.6", 273 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", 274 + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", 275 + "dev": true, 276 + "license": "MIT", 277 + "dependencies": { 278 + "@babel/code-frame": "^7.28.6", 279 + "@babel/parser": "^7.28.6", 280 + "@babel/types": "^7.28.6" 281 + }, 282 + "engines": { 283 + "node": ">=6.9.0" 284 + } 285 + }, 286 + "node_modules/@babel/traverse": { 287 + "version": "7.29.0", 288 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", 289 + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", 290 + "dev": true, 291 + "license": "MIT", 292 + "dependencies": { 293 + "@babel/code-frame": "^7.29.0", 294 + "@babel/generator": "^7.29.0", 295 + "@babel/helper-globals": "^7.28.0", 296 + "@babel/parser": "^7.29.0", 297 + "@babel/template": "^7.28.6", 298 + "@babel/types": "^7.29.0", 299 + "debug": "^4.3.1" 300 + }, 301 + "engines": { 302 + "node": ">=6.9.0" 303 + } 304 + }, 305 + "node_modules/@babel/types": { 306 + "version": "7.29.0", 307 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", 308 + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", 309 + "dev": true, 310 + "license": "MIT", 311 + "dependencies": { 312 + "@babel/helper-string-parser": "^7.27.1", 313 + "@babel/helper-validator-identifier": "^7.28.5" 314 + }, 315 + "engines": { 316 + "node": ">=6.9.0" 317 + } 318 + }, 319 + "node_modules/@esbuild/aix-ppc64": { 320 + "version": "0.27.3", 321 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", 322 + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", 323 + "cpu": [ 324 + "ppc64" 325 + ], 326 + "dev": true, 327 + "license": "MIT", 328 + "optional": true, 329 + "os": [ 330 + "aix" 331 + ], 332 + "engines": { 333 + "node": ">=18" 334 + } 335 + }, 336 + "node_modules/@esbuild/android-arm": { 337 + "version": "0.27.3", 338 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", 339 + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", 340 + "cpu": [ 341 + "arm" 342 + ], 343 + "dev": true, 344 + "license": "MIT", 345 + "optional": true, 346 + "os": [ 347 + "android" 348 + ], 349 + "engines": { 350 + "node": ">=18" 351 + } 352 + }, 353 + "node_modules/@esbuild/android-arm64": { 354 + "version": "0.27.3", 355 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", 356 + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", 357 + "cpu": [ 358 + "arm64" 359 + ], 360 + "dev": true, 361 + "license": "MIT", 362 + "optional": true, 363 + "os": [ 364 + "android" 365 + ], 366 + "engines": { 367 + "node": ">=18" 368 + } 369 + }, 370 + "node_modules/@esbuild/android-x64": { 371 + "version": "0.27.3", 372 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", 373 + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", 374 + "cpu": [ 375 + "x64" 376 + ], 377 + "dev": true, 378 + "license": "MIT", 379 + "optional": true, 380 + "os": [ 381 + "android" 382 + ], 383 + "engines": { 384 + "node": ">=18" 385 + } 386 + }, 387 + "node_modules/@esbuild/darwin-arm64": { 388 + "version": "0.27.3", 389 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", 390 + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", 391 + "cpu": [ 392 + "arm64" 393 + ], 394 + "dev": true, 395 + "license": "MIT", 396 + "optional": true, 397 + "os": [ 398 + "darwin" 399 + ], 400 + "engines": { 401 + "node": ">=18" 402 + } 403 + }, 404 + "node_modules/@esbuild/darwin-x64": { 405 + "version": "0.27.3", 406 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", 407 + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", 408 + "cpu": [ 409 + "x64" 410 + ], 411 + "dev": true, 412 + "license": "MIT", 413 + "optional": true, 414 + "os": [ 415 + "darwin" 416 + ], 417 + "engines": { 418 + "node": ">=18" 419 + } 420 + }, 421 + "node_modules/@esbuild/freebsd-arm64": { 422 + "version": "0.27.3", 423 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", 424 + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", 425 + "cpu": [ 426 + "arm64" 427 + ], 428 + "dev": true, 429 + "license": "MIT", 430 + "optional": true, 431 + "os": [ 432 + "freebsd" 433 + ], 434 + "engines": { 435 + "node": ">=18" 436 + } 437 + }, 438 + "node_modules/@esbuild/freebsd-x64": { 439 + "version": "0.27.3", 440 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", 441 + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", 442 + "cpu": [ 443 + "x64" 444 + ], 445 + "dev": true, 446 + "license": "MIT", 447 + "optional": true, 448 + "os": [ 449 + "freebsd" 450 + ], 451 + "engines": { 452 + "node": ">=18" 453 + } 454 + }, 455 + "node_modules/@esbuild/linux-arm": { 456 + "version": "0.27.3", 457 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", 458 + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", 459 + "cpu": [ 460 + "arm" 461 + ], 462 + "dev": true, 463 + "license": "MIT", 464 + "optional": true, 465 + "os": [ 466 + "linux" 467 + ], 468 + "engines": { 469 + "node": ">=18" 470 + } 471 + }, 472 + "node_modules/@esbuild/linux-arm64": { 473 + "version": "0.27.3", 474 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", 475 + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", 476 + "cpu": [ 477 + "arm64" 478 + ], 479 + "dev": true, 480 + "license": "MIT", 481 + "optional": true, 482 + "os": [ 483 + "linux" 484 + ], 485 + "engines": { 486 + "node": ">=18" 487 + } 488 + }, 489 + "node_modules/@esbuild/linux-ia32": { 490 + "version": "0.27.3", 491 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", 492 + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", 493 + "cpu": [ 494 + "ia32" 495 + ], 496 + "dev": true, 497 + "license": "MIT", 498 + "optional": true, 499 + "os": [ 500 + "linux" 501 + ], 502 + "engines": { 503 + "node": ">=18" 504 + } 505 + }, 506 + "node_modules/@esbuild/linux-loong64": { 507 + "version": "0.27.3", 508 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", 509 + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", 510 + "cpu": [ 511 + "loong64" 512 + ], 513 + "dev": true, 514 + "license": "MIT", 515 + "optional": true, 516 + "os": [ 517 + "linux" 518 + ], 519 + "engines": { 520 + "node": ">=18" 521 + } 522 + }, 523 + "node_modules/@esbuild/linux-mips64el": { 524 + "version": "0.27.3", 525 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", 526 + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", 527 + "cpu": [ 528 + "mips64el" 529 + ], 530 + "dev": true, 531 + "license": "MIT", 532 + "optional": true, 533 + "os": [ 534 + "linux" 535 + ], 536 + "engines": { 537 + "node": ">=18" 538 + } 539 + }, 540 + "node_modules/@esbuild/linux-ppc64": { 541 + "version": "0.27.3", 542 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", 543 + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", 544 + "cpu": [ 545 + "ppc64" 546 + ], 547 + "dev": true, 548 + "license": "MIT", 549 + "optional": true, 550 + "os": [ 551 + "linux" 552 + ], 553 + "engines": { 554 + "node": ">=18" 555 + } 556 + }, 557 + "node_modules/@esbuild/linux-riscv64": { 558 + "version": "0.27.3", 559 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", 560 + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", 561 + "cpu": [ 562 + "riscv64" 563 + ], 564 + "dev": true, 565 + "license": "MIT", 566 + "optional": true, 567 + "os": [ 568 + "linux" 569 + ], 570 + "engines": { 571 + "node": ">=18" 572 + } 573 + }, 574 + "node_modules/@esbuild/linux-s390x": { 575 + "version": "0.27.3", 576 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", 577 + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", 578 + "cpu": [ 579 + "s390x" 580 + ], 581 + "dev": true, 582 + "license": "MIT", 583 + "optional": true, 584 + "os": [ 585 + "linux" 586 + ], 587 + "engines": { 588 + "node": ">=18" 589 + } 590 + }, 591 + "node_modules/@esbuild/linux-x64": { 592 + "version": "0.27.3", 593 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", 594 + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", 595 + "cpu": [ 596 + "x64" 597 + ], 598 + "dev": true, 599 + "license": "MIT", 600 + "optional": true, 601 + "os": [ 602 + "linux" 603 + ], 604 + "engines": { 605 + "node": ">=18" 606 + } 607 + }, 608 + "node_modules/@esbuild/netbsd-arm64": { 609 + "version": "0.27.3", 610 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", 611 + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", 612 + "cpu": [ 613 + "arm64" 614 + ], 615 + "dev": true, 616 + "license": "MIT", 617 + "optional": true, 618 + "os": [ 619 + "netbsd" 620 + ], 621 + "engines": { 622 + "node": ">=18" 623 + } 624 + }, 625 + "node_modules/@esbuild/netbsd-x64": { 626 + "version": "0.27.3", 627 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", 628 + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", 629 + "cpu": [ 630 + "x64" 631 + ], 632 + "dev": true, 633 + "license": "MIT", 634 + "optional": true, 635 + "os": [ 636 + "netbsd" 637 + ], 638 + "engines": { 639 + "node": ">=18" 640 + } 641 + }, 642 + "node_modules/@esbuild/openbsd-arm64": { 643 + "version": "0.27.3", 644 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", 645 + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", 646 + "cpu": [ 647 + "arm64" 648 + ], 649 + "dev": true, 650 + "license": "MIT", 651 + "optional": true, 652 + "os": [ 653 + "openbsd" 654 + ], 655 + "engines": { 656 + "node": ">=18" 657 + } 658 + }, 659 + "node_modules/@esbuild/openbsd-x64": { 660 + "version": "0.27.3", 661 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", 662 + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", 663 + "cpu": [ 664 + "x64" 665 + ], 666 + "dev": true, 667 + "license": "MIT", 668 + "optional": true, 669 + "os": [ 670 + "openbsd" 671 + ], 672 + "engines": { 673 + "node": ">=18" 674 + } 675 + }, 676 + "node_modules/@esbuild/openharmony-arm64": { 677 + "version": "0.27.3", 678 + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", 679 + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", 680 + "cpu": [ 681 + "arm64" 682 + ], 683 + "dev": true, 684 + "license": "MIT", 685 + "optional": true, 686 + "os": [ 687 + "openharmony" 688 + ], 689 + "engines": { 690 + "node": ">=18" 691 + } 692 + }, 693 + "node_modules/@esbuild/sunos-x64": { 694 + "version": "0.27.3", 695 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", 696 + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", 697 + "cpu": [ 698 + "x64" 699 + ], 700 + "dev": true, 701 + "license": "MIT", 702 + "optional": true, 703 + "os": [ 704 + "sunos" 705 + ], 706 + "engines": { 707 + "node": ">=18" 708 + } 709 + }, 710 + "node_modules/@esbuild/win32-arm64": { 711 + "version": "0.27.3", 712 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", 713 + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", 714 + "cpu": [ 715 + "arm64" 716 + ], 717 + "dev": true, 718 + "license": "MIT", 719 + "optional": true, 720 + "os": [ 721 + "win32" 722 + ], 723 + "engines": { 724 + "node": ">=18" 725 + } 726 + }, 727 + "node_modules/@esbuild/win32-ia32": { 728 + "version": "0.27.3", 729 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", 730 + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", 731 + "cpu": [ 732 + "ia32" 733 + ], 734 + "dev": true, 735 + "license": "MIT", 736 + "optional": true, 737 + "os": [ 738 + "win32" 739 + ], 740 + "engines": { 741 + "node": ">=18" 742 + } 743 + }, 744 + "node_modules/@esbuild/win32-x64": { 745 + "version": "0.27.3", 746 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", 747 + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", 748 + "cpu": [ 749 + "x64" 750 + ], 751 + "dev": true, 752 + "license": "MIT", 753 + "optional": true, 754 + "os": [ 755 + "win32" 756 + ], 757 + "engines": { 758 + "node": ">=18" 759 + } 760 + }, 761 + "node_modules/@eslint-community/eslint-utils": { 762 + "version": "4.9.1", 763 + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", 764 + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", 765 + "dev": true, 766 + "license": "MIT", 767 + "dependencies": { 768 + "eslint-visitor-keys": "^3.4.3" 769 + }, 770 + "engines": { 771 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 772 + }, 773 + "funding": { 774 + "url": "https://opencollective.com/eslint" 775 + }, 776 + "peerDependencies": { 777 + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 778 + } 779 + }, 780 + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 781 + "version": "3.4.3", 782 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 783 + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 784 + "dev": true, 785 + "license": "Apache-2.0", 786 + "engines": { 787 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 788 + }, 789 + "funding": { 790 + "url": "https://opencollective.com/eslint" 791 + } 792 + }, 793 + "node_modules/@eslint-community/regexpp": { 794 + "version": "4.12.2", 795 + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", 796 + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", 797 + "dev": true, 798 + "license": "MIT", 799 + "engines": { 800 + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 801 + } 802 + }, 803 + "node_modules/@eslint/config-array": { 804 + "version": "0.21.1", 805 + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", 806 + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", 807 + "dev": true, 808 + "license": "Apache-2.0", 809 + "dependencies": { 810 + "@eslint/object-schema": "^2.1.7", 811 + "debug": "^4.3.1", 812 + "minimatch": "^3.1.2" 813 + }, 814 + "engines": { 815 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 816 + } 817 + }, 818 + "node_modules/@eslint/config-helpers": { 819 + "version": "0.4.2", 820 + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", 821 + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", 822 + "dev": true, 823 + "license": "Apache-2.0", 824 + "dependencies": { 825 + "@eslint/core": "^0.17.0" 826 + }, 827 + "engines": { 828 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 829 + } 830 + }, 831 + "node_modules/@eslint/core": { 832 + "version": "0.17.0", 833 + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", 834 + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", 835 + "dev": true, 836 + "license": "Apache-2.0", 837 + "dependencies": { 838 + "@types/json-schema": "^7.0.15" 839 + }, 840 + "engines": { 841 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 842 + } 843 + }, 844 + "node_modules/@eslint/eslintrc": { 845 + "version": "3.3.3", 846 + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", 847 + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", 848 + "dev": true, 849 + "license": "MIT", 850 + "dependencies": { 851 + "ajv": "^6.12.4", 852 + "debug": "^4.3.2", 853 + "espree": "^10.0.1", 854 + "globals": "^14.0.0", 855 + "ignore": "^5.2.0", 856 + "import-fresh": "^3.2.1", 857 + "js-yaml": "^4.1.1", 858 + "minimatch": "^3.1.2", 859 + "strip-json-comments": "^3.1.1" 860 + }, 861 + "engines": { 862 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 863 + }, 864 + "funding": { 865 + "url": "https://opencollective.com/eslint" 866 + } 867 + }, 868 + "node_modules/@eslint/eslintrc/node_modules/globals": { 869 + "version": "14.0.0", 870 + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 871 + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 872 + "dev": true, 873 + "license": "MIT", 874 + "engines": { 875 + "node": ">=18" 876 + }, 877 + "funding": { 878 + "url": "https://github.com/sponsors/sindresorhus" 879 + } 880 + }, 881 + "node_modules/@eslint/js": { 882 + "version": "9.39.2", 883 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", 884 + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", 885 + "dev": true, 886 + "license": "MIT", 887 + "engines": { 888 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 889 + }, 890 + "funding": { 891 + "url": "https://eslint.org/donate" 892 + } 893 + }, 894 + "node_modules/@eslint/object-schema": { 895 + "version": "2.1.7", 896 + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", 897 + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", 898 + "dev": true, 899 + "license": "Apache-2.0", 900 + "engines": { 901 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 902 + } 903 + }, 904 + "node_modules/@eslint/plugin-kit": { 905 + "version": "0.4.1", 906 + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", 907 + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", 908 + "dev": true, 909 + "license": "Apache-2.0", 910 + "dependencies": { 911 + "@eslint/core": "^0.17.0", 912 + "levn": "^0.4.1" 913 + }, 914 + "engines": { 915 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 916 + } 917 + }, 918 + "node_modules/@humanfs/core": { 919 + "version": "0.19.1", 920 + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 921 + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 922 + "dev": true, 923 + "license": "Apache-2.0", 924 + "engines": { 925 + "node": ">=18.18.0" 926 + } 927 + }, 928 + "node_modules/@humanfs/node": { 929 + "version": "0.16.7", 930 + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", 931 + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", 932 + "dev": true, 933 + "license": "Apache-2.0", 934 + "dependencies": { 935 + "@humanfs/core": "^0.19.1", 936 + "@humanwhocodes/retry": "^0.4.0" 937 + }, 938 + "engines": { 939 + "node": ">=18.18.0" 940 + } 941 + }, 942 + "node_modules/@humanwhocodes/module-importer": { 943 + "version": "1.0.1", 944 + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 945 + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 946 + "dev": true, 947 + "license": "Apache-2.0", 948 + "engines": { 949 + "node": ">=12.22" 950 + }, 951 + "funding": { 952 + "type": "github", 953 + "url": "https://github.com/sponsors/nzakas" 954 + } 955 + }, 956 + "node_modules/@humanwhocodes/retry": { 957 + "version": "0.4.3", 958 + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", 959 + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", 960 + "dev": true, 961 + "license": "Apache-2.0", 962 + "engines": { 963 + "node": ">=18.18" 964 + }, 965 + "funding": { 966 + "type": "github", 967 + "url": "https://github.com/sponsors/nzakas" 968 + } 969 + }, 970 + "node_modules/@jridgewell/gen-mapping": { 971 + "version": "0.3.13", 972 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", 973 + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", 974 + "dev": true, 975 + "license": "MIT", 976 + "dependencies": { 977 + "@jridgewell/sourcemap-codec": "^1.5.0", 978 + "@jridgewell/trace-mapping": "^0.3.24" 979 + } 980 + }, 981 + "node_modules/@jridgewell/remapping": { 982 + "version": "2.3.5", 983 + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", 984 + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", 985 + "dev": true, 986 + "license": "MIT", 987 + "dependencies": { 988 + "@jridgewell/gen-mapping": "^0.3.5", 989 + "@jridgewell/trace-mapping": "^0.3.24" 990 + } 991 + }, 992 + "node_modules/@jridgewell/resolve-uri": { 993 + "version": "3.1.2", 994 + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 995 + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 996 + "dev": true, 997 + "license": "MIT", 998 + "engines": { 999 + "node": ">=6.0.0" 1000 + } 1001 + }, 1002 + "node_modules/@jridgewell/sourcemap-codec": { 1003 + "version": "1.5.5", 1004 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", 1005 + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", 1006 + "dev": true, 1007 + "license": "MIT" 1008 + }, 1009 + "node_modules/@jridgewell/trace-mapping": { 1010 + "version": "0.3.31", 1011 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", 1012 + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", 1013 + "dev": true, 1014 + "license": "MIT", 1015 + "dependencies": { 1016 + "@jridgewell/resolve-uri": "^3.1.0", 1017 + "@jridgewell/sourcemap-codec": "^1.4.14" 1018 + } 1019 + }, 1020 + "node_modules/@rolldown/pluginutils": { 1021 + "version": "1.0.0-rc.3", 1022 + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz", 1023 + "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==", 1024 + "dev": true, 1025 + "license": "MIT" 1026 + }, 1027 + "node_modules/@rollup/rollup-android-arm-eabi": { 1028 + "version": "4.57.1", 1029 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", 1030 + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", 1031 + "cpu": [ 1032 + "arm" 1033 + ], 1034 + "dev": true, 1035 + "license": "MIT", 1036 + "optional": true, 1037 + "os": [ 1038 + "android" 1039 + ] 1040 + }, 1041 + "node_modules/@rollup/rollup-android-arm64": { 1042 + "version": "4.57.1", 1043 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", 1044 + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", 1045 + "cpu": [ 1046 + "arm64" 1047 + ], 1048 + "dev": true, 1049 + "license": "MIT", 1050 + "optional": true, 1051 + "os": [ 1052 + "android" 1053 + ] 1054 + }, 1055 + "node_modules/@rollup/rollup-darwin-arm64": { 1056 + "version": "4.57.1", 1057 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", 1058 + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", 1059 + "cpu": [ 1060 + "arm64" 1061 + ], 1062 + "dev": true, 1063 + "license": "MIT", 1064 + "optional": true, 1065 + "os": [ 1066 + "darwin" 1067 + ] 1068 + }, 1069 + "node_modules/@rollup/rollup-darwin-x64": { 1070 + "version": "4.57.1", 1071 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", 1072 + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", 1073 + "cpu": [ 1074 + "x64" 1075 + ], 1076 + "dev": true, 1077 + "license": "MIT", 1078 + "optional": true, 1079 + "os": [ 1080 + "darwin" 1081 + ] 1082 + }, 1083 + "node_modules/@rollup/rollup-freebsd-arm64": { 1084 + "version": "4.57.1", 1085 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", 1086 + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", 1087 + "cpu": [ 1088 + "arm64" 1089 + ], 1090 + "dev": true, 1091 + "license": "MIT", 1092 + "optional": true, 1093 + "os": [ 1094 + "freebsd" 1095 + ] 1096 + }, 1097 + "node_modules/@rollup/rollup-freebsd-x64": { 1098 + "version": "4.57.1", 1099 + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", 1100 + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", 1101 + "cpu": [ 1102 + "x64" 1103 + ], 1104 + "dev": true, 1105 + "license": "MIT", 1106 + "optional": true, 1107 + "os": [ 1108 + "freebsd" 1109 + ] 1110 + }, 1111 + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 1112 + "version": "4.57.1", 1113 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", 1114 + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", 1115 + "cpu": [ 1116 + "arm" 1117 + ], 1118 + "dev": true, 1119 + "license": "MIT", 1120 + "optional": true, 1121 + "os": [ 1122 + "linux" 1123 + ] 1124 + }, 1125 + "node_modules/@rollup/rollup-linux-arm-musleabihf": { 1126 + "version": "4.57.1", 1127 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", 1128 + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", 1129 + "cpu": [ 1130 + "arm" 1131 + ], 1132 + "dev": true, 1133 + "license": "MIT", 1134 + "optional": true, 1135 + "os": [ 1136 + "linux" 1137 + ] 1138 + }, 1139 + "node_modules/@rollup/rollup-linux-arm64-gnu": { 1140 + "version": "4.57.1", 1141 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", 1142 + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", 1143 + "cpu": [ 1144 + "arm64" 1145 + ], 1146 + "dev": true, 1147 + "license": "MIT", 1148 + "optional": true, 1149 + "os": [ 1150 + "linux" 1151 + ] 1152 + }, 1153 + "node_modules/@rollup/rollup-linux-arm64-musl": { 1154 + "version": "4.57.1", 1155 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", 1156 + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", 1157 + "cpu": [ 1158 + "arm64" 1159 + ], 1160 + "dev": true, 1161 + "license": "MIT", 1162 + "optional": true, 1163 + "os": [ 1164 + "linux" 1165 + ] 1166 + }, 1167 + "node_modules/@rollup/rollup-linux-loong64-gnu": { 1168 + "version": "4.57.1", 1169 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", 1170 + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", 1171 + "cpu": [ 1172 + "loong64" 1173 + ], 1174 + "dev": true, 1175 + "license": "MIT", 1176 + "optional": true, 1177 + "os": [ 1178 + "linux" 1179 + ] 1180 + }, 1181 + "node_modules/@rollup/rollup-linux-loong64-musl": { 1182 + "version": "4.57.1", 1183 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", 1184 + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", 1185 + "cpu": [ 1186 + "loong64" 1187 + ], 1188 + "dev": true, 1189 + "license": "MIT", 1190 + "optional": true, 1191 + "os": [ 1192 + "linux" 1193 + ] 1194 + }, 1195 + "node_modules/@rollup/rollup-linux-ppc64-gnu": { 1196 + "version": "4.57.1", 1197 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", 1198 + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", 1199 + "cpu": [ 1200 + "ppc64" 1201 + ], 1202 + "dev": true, 1203 + "license": "MIT", 1204 + "optional": true, 1205 + "os": [ 1206 + "linux" 1207 + ] 1208 + }, 1209 + "node_modules/@rollup/rollup-linux-ppc64-musl": { 1210 + "version": "4.57.1", 1211 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", 1212 + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", 1213 + "cpu": [ 1214 + "ppc64" 1215 + ], 1216 + "dev": true, 1217 + "license": "MIT", 1218 + "optional": true, 1219 + "os": [ 1220 + "linux" 1221 + ] 1222 + }, 1223 + "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1224 + "version": "4.57.1", 1225 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", 1226 + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", 1227 + "cpu": [ 1228 + "riscv64" 1229 + ], 1230 + "dev": true, 1231 + "license": "MIT", 1232 + "optional": true, 1233 + "os": [ 1234 + "linux" 1235 + ] 1236 + }, 1237 + "node_modules/@rollup/rollup-linux-riscv64-musl": { 1238 + "version": "4.57.1", 1239 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", 1240 + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", 1241 + "cpu": [ 1242 + "riscv64" 1243 + ], 1244 + "dev": true, 1245 + "license": "MIT", 1246 + "optional": true, 1247 + "os": [ 1248 + "linux" 1249 + ] 1250 + }, 1251 + "node_modules/@rollup/rollup-linux-s390x-gnu": { 1252 + "version": "4.57.1", 1253 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", 1254 + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", 1255 + "cpu": [ 1256 + "s390x" 1257 + ], 1258 + "dev": true, 1259 + "license": "MIT", 1260 + "optional": true, 1261 + "os": [ 1262 + "linux" 1263 + ] 1264 + }, 1265 + "node_modules/@rollup/rollup-linux-x64-gnu": { 1266 + "version": "4.57.1", 1267 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", 1268 + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", 1269 + "cpu": [ 1270 + "x64" 1271 + ], 1272 + "dev": true, 1273 + "license": "MIT", 1274 + "optional": true, 1275 + "os": [ 1276 + "linux" 1277 + ] 1278 + }, 1279 + "node_modules/@rollup/rollup-linux-x64-musl": { 1280 + "version": "4.57.1", 1281 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", 1282 + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", 1283 + "cpu": [ 1284 + "x64" 1285 + ], 1286 + "dev": true, 1287 + "license": "MIT", 1288 + "optional": true, 1289 + "os": [ 1290 + "linux" 1291 + ] 1292 + }, 1293 + "node_modules/@rollup/rollup-openbsd-x64": { 1294 + "version": "4.57.1", 1295 + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", 1296 + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", 1297 + "cpu": [ 1298 + "x64" 1299 + ], 1300 + "dev": true, 1301 + "license": "MIT", 1302 + "optional": true, 1303 + "os": [ 1304 + "openbsd" 1305 + ] 1306 + }, 1307 + "node_modules/@rollup/rollup-openharmony-arm64": { 1308 + "version": "4.57.1", 1309 + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", 1310 + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", 1311 + "cpu": [ 1312 + "arm64" 1313 + ], 1314 + "dev": true, 1315 + "license": "MIT", 1316 + "optional": true, 1317 + "os": [ 1318 + "openharmony" 1319 + ] 1320 + }, 1321 + "node_modules/@rollup/rollup-win32-arm64-msvc": { 1322 + "version": "4.57.1", 1323 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", 1324 + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", 1325 + "cpu": [ 1326 + "arm64" 1327 + ], 1328 + "dev": true, 1329 + "license": "MIT", 1330 + "optional": true, 1331 + "os": [ 1332 + "win32" 1333 + ] 1334 + }, 1335 + "node_modules/@rollup/rollup-win32-ia32-msvc": { 1336 + "version": "4.57.1", 1337 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", 1338 + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", 1339 + "cpu": [ 1340 + "ia32" 1341 + ], 1342 + "dev": true, 1343 + "license": "MIT", 1344 + "optional": true, 1345 + "os": [ 1346 + "win32" 1347 + ] 1348 + }, 1349 + "node_modules/@rollup/rollup-win32-x64-gnu": { 1350 + "version": "4.57.1", 1351 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", 1352 + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", 1353 + "cpu": [ 1354 + "x64" 1355 + ], 1356 + "dev": true, 1357 + "license": "MIT", 1358 + "optional": true, 1359 + "os": [ 1360 + "win32" 1361 + ] 1362 + }, 1363 + "node_modules/@rollup/rollup-win32-x64-msvc": { 1364 + "version": "4.57.1", 1365 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", 1366 + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", 1367 + "cpu": [ 1368 + "x64" 1369 + ], 1370 + "dev": true, 1371 + "license": "MIT", 1372 + "optional": true, 1373 + "os": [ 1374 + "win32" 1375 + ] 1376 + }, 1377 + "node_modules/@tauri-apps/api": { 1378 + "version": "2.10.1", 1379 + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.10.1.tgz", 1380 + "integrity": "sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw==", 1381 + "license": "Apache-2.0 OR MIT", 1382 + "funding": { 1383 + "type": "opencollective", 1384 + "url": "https://opencollective.com/tauri" 1385 + } 1386 + }, 1387 + "node_modules/@tauri-apps/plugin-dialog": { 1388 + "version": "2.6.0", 1389 + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.6.0.tgz", 1390 + "integrity": "sha512-q4Uq3eY87TdcYzXACiYSPhmpBA76shgmQswGkSVio4C82Sz2W4iehe9TnKYwbq7weHiL88Yw19XZm7v28+Micg==", 1391 + "license": "MIT OR Apache-2.0", 1392 + "dependencies": { 1393 + "@tauri-apps/api": "^2.8.0" 1394 + } 1395 + }, 1396 + "node_modules/@tauri-apps/plugin-geolocation": { 1397 + "version": "2.3.2", 1398 + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-geolocation/-/plugin-geolocation-2.3.2.tgz", 1399 + "integrity": "sha512-ONCwav1monafjeO8/JdXtRlbhZ3xgAdBYxo/62qgw99u9+y6xGsohy3avZgFZsBHA0JVNe1uJnMi+vfT5ZSFUA==", 1400 + "license": "MIT OR Apache-2.0", 1401 + "dependencies": { 1402 + "@tauri-apps/api": "^2.8.0" 1403 + } 1404 + }, 1405 + "node_modules/@tauri-apps/plugin-log": { 1406 + "version": "2.8.0", 1407 + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-log/-/plugin-log-2.8.0.tgz", 1408 + "integrity": "sha512-a+7rOq3MJwpTOLLKbL8d0qGZ85hgHw5pNOWusA9o3cf7cEgtYHiGY/+O8fj8MvywQIGqFv0da2bYQDlrqLE7rw==", 1409 + "license": "MIT OR Apache-2.0", 1410 + "dependencies": { 1411 + "@tauri-apps/api": "^2.8.0" 1412 + } 1413 + }, 1414 + "node_modules/@tauri-apps/plugin-notification": { 1415 + "version": "2.3.3", 1416 + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-notification/-/plugin-notification-2.3.3.tgz", 1417 + "integrity": "sha512-Zw+ZH18RJb41G4NrfHgIuofJiymusqN+q8fGUIIV7vyCH+5sSn5coqRv/MWB9qETsUs97vmU045q7OyseCV3Qg==", 1418 + "license": "MIT OR Apache-2.0", 1419 + "dependencies": { 1420 + "@tauri-apps/api": "^2.8.0" 1421 + } 1422 + }, 1423 + "node_modules/@tauri-apps/plugin-opener": { 1424 + "version": "2.5.3", 1425 + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.5.3.tgz", 1426 + "integrity": "sha512-CCcUltXMOfUEArbf3db3kCE7Ggy1ExBEBl51Ko2ODJ6GDYHRp1nSNlQm5uNCFY5k7/ufaK5Ib3Du/Zir19IYQQ==", 1427 + "license": "MIT OR Apache-2.0", 1428 + "dependencies": { 1429 + "@tauri-apps/api": "^2.8.0" 1430 + } 1431 + }, 1432 + "node_modules/@types/babel__core": { 1433 + "version": "7.20.5", 1434 + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", 1435 + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", 1436 + "dev": true, 1437 + "license": "MIT", 1438 + "dependencies": { 1439 + "@babel/parser": "^7.20.7", 1440 + "@babel/types": "^7.20.7", 1441 + "@types/babel__generator": "*", 1442 + "@types/babel__template": "*", 1443 + "@types/babel__traverse": "*" 1444 + } 1445 + }, 1446 + "node_modules/@types/babel__generator": { 1447 + "version": "7.27.0", 1448 + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", 1449 + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", 1450 + "dev": true, 1451 + "license": "MIT", 1452 + "dependencies": { 1453 + "@babel/types": "^7.0.0" 1454 + } 1455 + }, 1456 + "node_modules/@types/babel__template": { 1457 + "version": "7.4.4", 1458 + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", 1459 + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", 1460 + "dev": true, 1461 + "license": "MIT", 1462 + "dependencies": { 1463 + "@babel/parser": "^7.1.0", 1464 + "@babel/types": "^7.0.0" 1465 + } 1466 + }, 1467 + "node_modules/@types/babel__traverse": { 1468 + "version": "7.28.0", 1469 + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", 1470 + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", 1471 + "dev": true, 1472 + "license": "MIT", 1473 + "dependencies": { 1474 + "@babel/types": "^7.28.2" 1475 + } 1476 + }, 1477 + "node_modules/@types/estree": { 1478 + "version": "1.0.8", 1479 + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", 1480 + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", 1481 + "dev": true, 1482 + "license": "MIT" 1483 + }, 1484 + "node_modules/@types/json-schema": { 1485 + "version": "7.0.15", 1486 + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 1487 + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 1488 + "dev": true, 1489 + "license": "MIT" 1490 + }, 1491 + "node_modules/@types/node": { 1492 + "version": "25.2.3", 1493 + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", 1494 + "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", 1495 + "dev": true, 1496 + "license": "MIT", 1497 + "dependencies": { 1498 + "undici-types": "~7.16.0" 1499 + } 1500 + }, 1501 + "node_modules/@types/react": { 1502 + "version": "19.2.14", 1503 + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", 1504 + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", 1505 + "dev": true, 1506 + "license": "MIT", 1507 + "dependencies": { 1508 + "csstype": "^3.2.2" 1509 + } 1510 + }, 1511 + "node_modules/@types/react-dom": { 1512 + "version": "19.2.3", 1513 + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", 1514 + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", 1515 + "dev": true, 1516 + "license": "MIT", 1517 + "peerDependencies": { 1518 + "@types/react": "^19.2.0" 1519 + } 1520 + }, 1521 + "node_modules/@typescript-eslint/eslint-plugin": { 1522 + "version": "8.56.0", 1523 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.0.tgz", 1524 + "integrity": "sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==", 1525 + "dev": true, 1526 + "license": "MIT", 1527 + "dependencies": { 1528 + "@eslint-community/regexpp": "^4.12.2", 1529 + "@typescript-eslint/scope-manager": "8.56.0", 1530 + "@typescript-eslint/type-utils": "8.56.0", 1531 + "@typescript-eslint/utils": "8.56.0", 1532 + "@typescript-eslint/visitor-keys": "8.56.0", 1533 + "ignore": "^7.0.5", 1534 + "natural-compare": "^1.4.0", 1535 + "ts-api-utils": "^2.4.0" 1536 + }, 1537 + "engines": { 1538 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1539 + }, 1540 + "funding": { 1541 + "type": "opencollective", 1542 + "url": "https://opencollective.com/typescript-eslint" 1543 + }, 1544 + "peerDependencies": { 1545 + "@typescript-eslint/parser": "^8.56.0", 1546 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", 1547 + "typescript": ">=4.8.4 <6.0.0" 1548 + } 1549 + }, 1550 + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { 1551 + "version": "7.0.5", 1552 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", 1553 + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", 1554 + "dev": true, 1555 + "license": "MIT", 1556 + "engines": { 1557 + "node": ">= 4" 1558 + } 1559 + }, 1560 + "node_modules/@typescript-eslint/parser": { 1561 + "version": "8.56.0", 1562 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.0.tgz", 1563 + "integrity": "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==", 1564 + "dev": true, 1565 + "license": "MIT", 1566 + "dependencies": { 1567 + "@typescript-eslint/scope-manager": "8.56.0", 1568 + "@typescript-eslint/types": "8.56.0", 1569 + "@typescript-eslint/typescript-estree": "8.56.0", 1570 + "@typescript-eslint/visitor-keys": "8.56.0", 1571 + "debug": "^4.4.3" 1572 + }, 1573 + "engines": { 1574 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1575 + }, 1576 + "funding": { 1577 + "type": "opencollective", 1578 + "url": "https://opencollective.com/typescript-eslint" 1579 + }, 1580 + "peerDependencies": { 1581 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", 1582 + "typescript": ">=4.8.4 <6.0.0" 1583 + } 1584 + }, 1585 + "node_modules/@typescript-eslint/project-service": { 1586 + "version": "8.56.0", 1587 + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.0.tgz", 1588 + "integrity": "sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==", 1589 + "dev": true, 1590 + "license": "MIT", 1591 + "dependencies": { 1592 + "@typescript-eslint/tsconfig-utils": "^8.56.0", 1593 + "@typescript-eslint/types": "^8.56.0", 1594 + "debug": "^4.4.3" 1595 + }, 1596 + "engines": { 1597 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1598 + }, 1599 + "funding": { 1600 + "type": "opencollective", 1601 + "url": "https://opencollective.com/typescript-eslint" 1602 + }, 1603 + "peerDependencies": { 1604 + "typescript": ">=4.8.4 <6.0.0" 1605 + } 1606 + }, 1607 + "node_modules/@typescript-eslint/scope-manager": { 1608 + "version": "8.56.0", 1609 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.0.tgz", 1610 + "integrity": "sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==", 1611 + "dev": true, 1612 + "license": "MIT", 1613 + "dependencies": { 1614 + "@typescript-eslint/types": "8.56.0", 1615 + "@typescript-eslint/visitor-keys": "8.56.0" 1616 + }, 1617 + "engines": { 1618 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1619 + }, 1620 + "funding": { 1621 + "type": "opencollective", 1622 + "url": "https://opencollective.com/typescript-eslint" 1623 + } 1624 + }, 1625 + "node_modules/@typescript-eslint/tsconfig-utils": { 1626 + "version": "8.56.0", 1627 + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.0.tgz", 1628 + "integrity": "sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==", 1629 + "dev": true, 1630 + "license": "MIT", 1631 + "engines": { 1632 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1633 + }, 1634 + "funding": { 1635 + "type": "opencollective", 1636 + "url": "https://opencollective.com/typescript-eslint" 1637 + }, 1638 + "peerDependencies": { 1639 + "typescript": ">=4.8.4 <6.0.0" 1640 + } 1641 + }, 1642 + "node_modules/@typescript-eslint/type-utils": { 1643 + "version": "8.56.0", 1644 + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.0.tgz", 1645 + "integrity": "sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==", 1646 + "dev": true, 1647 + "license": "MIT", 1648 + "dependencies": { 1649 + "@typescript-eslint/types": "8.56.0", 1650 + "@typescript-eslint/typescript-estree": "8.56.0", 1651 + "@typescript-eslint/utils": "8.56.0", 1652 + "debug": "^4.4.3", 1653 + "ts-api-utils": "^2.4.0" 1654 + }, 1655 + "engines": { 1656 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1657 + }, 1658 + "funding": { 1659 + "type": "opencollective", 1660 + "url": "https://opencollective.com/typescript-eslint" 1661 + }, 1662 + "peerDependencies": { 1663 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", 1664 + "typescript": ">=4.8.4 <6.0.0" 1665 + } 1666 + }, 1667 + "node_modules/@typescript-eslint/types": { 1668 + "version": "8.56.0", 1669 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz", 1670 + "integrity": "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==", 1671 + "dev": true, 1672 + "license": "MIT", 1673 + "engines": { 1674 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1675 + }, 1676 + "funding": { 1677 + "type": "opencollective", 1678 + "url": "https://opencollective.com/typescript-eslint" 1679 + } 1680 + }, 1681 + "node_modules/@typescript-eslint/typescript-estree": { 1682 + "version": "8.56.0", 1683 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.0.tgz", 1684 + "integrity": "sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==", 1685 + "dev": true, 1686 + "license": "MIT", 1687 + "dependencies": { 1688 + "@typescript-eslint/project-service": "8.56.0", 1689 + "@typescript-eslint/tsconfig-utils": "8.56.0", 1690 + "@typescript-eslint/types": "8.56.0", 1691 + "@typescript-eslint/visitor-keys": "8.56.0", 1692 + "debug": "^4.4.3", 1693 + "minimatch": "^9.0.5", 1694 + "semver": "^7.7.3", 1695 + "tinyglobby": "^0.2.15", 1696 + "ts-api-utils": "^2.4.0" 1697 + }, 1698 + "engines": { 1699 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1700 + }, 1701 + "funding": { 1702 + "type": "opencollective", 1703 + "url": "https://opencollective.com/typescript-eslint" 1704 + }, 1705 + "peerDependencies": { 1706 + "typescript": ">=4.8.4 <6.0.0" 1707 + } 1708 + }, 1709 + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { 1710 + "version": "2.0.2", 1711 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", 1712 + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", 1713 + "dev": true, 1714 + "license": "MIT", 1715 + "dependencies": { 1716 + "balanced-match": "^1.0.0" 1717 + } 1718 + }, 1719 + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { 1720 + "version": "9.0.5", 1721 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1722 + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1723 + "dev": true, 1724 + "license": "ISC", 1725 + "dependencies": { 1726 + "brace-expansion": "^2.0.1" 1727 + }, 1728 + "engines": { 1729 + "node": ">=16 || 14 >=14.17" 1730 + }, 1731 + "funding": { 1732 + "url": "https://github.com/sponsors/isaacs" 1733 + } 1734 + }, 1735 + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { 1736 + "version": "7.7.4", 1737 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", 1738 + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", 1739 + "dev": true, 1740 + "license": "ISC", 1741 + "bin": { 1742 + "semver": "bin/semver.js" 1743 + }, 1744 + "engines": { 1745 + "node": ">=10" 1746 + } 1747 + }, 1748 + "node_modules/@typescript-eslint/utils": { 1749 + "version": "8.56.0", 1750 + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.0.tgz", 1751 + "integrity": "sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==", 1752 + "dev": true, 1753 + "license": "MIT", 1754 + "dependencies": { 1755 + "@eslint-community/eslint-utils": "^4.9.1", 1756 + "@typescript-eslint/scope-manager": "8.56.0", 1757 + "@typescript-eslint/types": "8.56.0", 1758 + "@typescript-eslint/typescript-estree": "8.56.0" 1759 + }, 1760 + "engines": { 1761 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1762 + }, 1763 + "funding": { 1764 + "type": "opencollective", 1765 + "url": "https://opencollective.com/typescript-eslint" 1766 + }, 1767 + "peerDependencies": { 1768 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", 1769 + "typescript": ">=4.8.4 <6.0.0" 1770 + } 1771 + }, 1772 + "node_modules/@typescript-eslint/visitor-keys": { 1773 + "version": "8.56.0", 1774 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.0.tgz", 1775 + "integrity": "sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==", 1776 + "dev": true, 1777 + "license": "MIT", 1778 + "dependencies": { 1779 + "@typescript-eslint/types": "8.56.0", 1780 + "eslint-visitor-keys": "^5.0.0" 1781 + }, 1782 + "engines": { 1783 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1784 + }, 1785 + "funding": { 1786 + "type": "opencollective", 1787 + "url": "https://opencollective.com/typescript-eslint" 1788 + } 1789 + }, 1790 + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { 1791 + "version": "5.0.0", 1792 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", 1793 + "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", 1794 + "dev": true, 1795 + "license": "Apache-2.0", 1796 + "engines": { 1797 + "node": "^20.19.0 || ^22.13.0 || >=24" 1798 + }, 1799 + "funding": { 1800 + "url": "https://opencollective.com/eslint" 1801 + } 1802 + }, 1803 + "node_modules/@vitejs/plugin-react": { 1804 + "version": "5.1.4", 1805 + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz", 1806 + "integrity": "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA==", 1807 + "dev": true, 1808 + "license": "MIT", 1809 + "dependencies": { 1810 + "@babel/core": "^7.29.0", 1811 + "@babel/plugin-transform-react-jsx-self": "^7.27.1", 1812 + "@babel/plugin-transform-react-jsx-source": "^7.27.1", 1813 + "@rolldown/pluginutils": "1.0.0-rc.3", 1814 + "@types/babel__core": "^7.20.5", 1815 + "react-refresh": "^0.18.0" 1816 + }, 1817 + "engines": { 1818 + "node": "^20.19.0 || >=22.12.0" 1819 + }, 1820 + "peerDependencies": { 1821 + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" 1822 + } 1823 + }, 1824 + "node_modules/acorn": { 1825 + "version": "8.15.0", 1826 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", 1827 + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", 1828 + "dev": true, 1829 + "license": "MIT", 1830 + "bin": { 1831 + "acorn": "bin/acorn" 1832 + }, 1833 + "engines": { 1834 + "node": ">=0.4.0" 1835 + } 1836 + }, 1837 + "node_modules/acorn-jsx": { 1838 + "version": "5.3.2", 1839 + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1840 + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1841 + "dev": true, 1842 + "license": "MIT", 1843 + "peerDependencies": { 1844 + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 1845 + } 1846 + }, 1847 + "node_modules/ajv": { 1848 + "version": "6.12.6", 1849 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1850 + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1851 + "dev": true, 1852 + "license": "MIT", 1853 + "dependencies": { 1854 + "fast-deep-equal": "^3.1.1", 1855 + "fast-json-stable-stringify": "^2.0.0", 1856 + "json-schema-traverse": "^0.4.1", 1857 + "uri-js": "^4.2.2" 1858 + }, 1859 + "funding": { 1860 + "type": "github", 1861 + "url": "https://github.com/sponsors/epoberezkin" 1862 + } 1863 + }, 1864 + "node_modules/ansi-styles": { 1865 + "version": "4.3.0", 1866 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1867 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1868 + "dev": true, 1869 + "license": "MIT", 1870 + "dependencies": { 1871 + "color-convert": "^2.0.1" 1872 + }, 1873 + "engines": { 1874 + "node": ">=8" 1875 + }, 1876 + "funding": { 1877 + "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1878 + } 1879 + }, 1880 + "node_modules/argparse": { 1881 + "version": "2.0.1", 1882 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1883 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1884 + "dev": true, 1885 + "license": "Python-2.0" 1886 + }, 1887 + "node_modules/array-buffer-byte-length": { 1888 + "version": "1.0.2", 1889 + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", 1890 + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", 1891 + "dev": true, 1892 + "license": "MIT", 1893 + "dependencies": { 1894 + "call-bound": "^1.0.3", 1895 + "is-array-buffer": "^3.0.5" 1896 + }, 1897 + "engines": { 1898 + "node": ">= 0.4" 1899 + }, 1900 + "funding": { 1901 + "url": "https://github.com/sponsors/ljharb" 1902 + } 1903 + }, 1904 + "node_modules/array-includes": { 1905 + "version": "3.1.9", 1906 + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", 1907 + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", 1908 + "dev": true, 1909 + "license": "MIT", 1910 + "dependencies": { 1911 + "call-bind": "^1.0.8", 1912 + "call-bound": "^1.0.4", 1913 + "define-properties": "^1.2.1", 1914 + "es-abstract": "^1.24.0", 1915 + "es-object-atoms": "^1.1.1", 1916 + "get-intrinsic": "^1.3.0", 1917 + "is-string": "^1.1.1", 1918 + "math-intrinsics": "^1.1.0" 1919 + }, 1920 + "engines": { 1921 + "node": ">= 0.4" 1922 + }, 1923 + "funding": { 1924 + "url": "https://github.com/sponsors/ljharb" 1925 + } 1926 + }, 1927 + "node_modules/array.prototype.findlast": { 1928 + "version": "1.2.5", 1929 + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", 1930 + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", 1931 + "dev": true, 1932 + "license": "MIT", 1933 + "dependencies": { 1934 + "call-bind": "^1.0.7", 1935 + "define-properties": "^1.2.1", 1936 + "es-abstract": "^1.23.2", 1937 + "es-errors": "^1.3.0", 1938 + "es-object-atoms": "^1.0.0", 1939 + "es-shim-unscopables": "^1.0.2" 1940 + }, 1941 + "engines": { 1942 + "node": ">= 0.4" 1943 + }, 1944 + "funding": { 1945 + "url": "https://github.com/sponsors/ljharb" 1946 + } 1947 + }, 1948 + "node_modules/array.prototype.flat": { 1949 + "version": "1.3.3", 1950 + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", 1951 + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", 1952 + "dev": true, 1953 + "license": "MIT", 1954 + "dependencies": { 1955 + "call-bind": "^1.0.8", 1956 + "define-properties": "^1.2.1", 1957 + "es-abstract": "^1.23.5", 1958 + "es-shim-unscopables": "^1.0.2" 1959 + }, 1960 + "engines": { 1961 + "node": ">= 0.4" 1962 + }, 1963 + "funding": { 1964 + "url": "https://github.com/sponsors/ljharb" 1965 + } 1966 + }, 1967 + "node_modules/array.prototype.flatmap": { 1968 + "version": "1.3.3", 1969 + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", 1970 + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", 1971 + "dev": true, 1972 + "license": "MIT", 1973 + "dependencies": { 1974 + "call-bind": "^1.0.8", 1975 + "define-properties": "^1.2.1", 1976 + "es-abstract": "^1.23.5", 1977 + "es-shim-unscopables": "^1.0.2" 1978 + }, 1979 + "engines": { 1980 + "node": ">= 0.4" 1981 + }, 1982 + "funding": { 1983 + "url": "https://github.com/sponsors/ljharb" 1984 + } 1985 + }, 1986 + "node_modules/array.prototype.tosorted": { 1987 + "version": "1.1.4", 1988 + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", 1989 + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", 1990 + "dev": true, 1991 + "license": "MIT", 1992 + "dependencies": { 1993 + "call-bind": "^1.0.7", 1994 + "define-properties": "^1.2.1", 1995 + "es-abstract": "^1.23.3", 1996 + "es-errors": "^1.3.0", 1997 + "es-shim-unscopables": "^1.0.2" 1998 + }, 1999 + "engines": { 2000 + "node": ">= 0.4" 2001 + } 2002 + }, 2003 + "node_modules/arraybuffer.prototype.slice": { 2004 + "version": "1.0.4", 2005 + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", 2006 + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", 2007 + "dev": true, 2008 + "license": "MIT", 2009 + "dependencies": { 2010 + "array-buffer-byte-length": "^1.0.1", 2011 + "call-bind": "^1.0.8", 2012 + "define-properties": "^1.2.1", 2013 + "es-abstract": "^1.23.5", 2014 + "es-errors": "^1.3.0", 2015 + "get-intrinsic": "^1.2.6", 2016 + "is-array-buffer": "^3.0.4" 2017 + }, 2018 + "engines": { 2019 + "node": ">= 0.4" 2020 + }, 2021 + "funding": { 2022 + "url": "https://github.com/sponsors/ljharb" 2023 + } 2024 + }, 2025 + "node_modules/async-function": { 2026 + "version": "1.0.0", 2027 + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", 2028 + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", 2029 + "dev": true, 2030 + "license": "MIT", 2031 + "engines": { 2032 + "node": ">= 0.4" 2033 + } 2034 + }, 2035 + "node_modules/available-typed-arrays": { 2036 + "version": "1.0.7", 2037 + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", 2038 + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", 2039 + "dev": true, 2040 + "license": "MIT", 2041 + "dependencies": { 2042 + "possible-typed-array-names": "^1.0.0" 2043 + }, 2044 + "engines": { 2045 + "node": ">= 0.4" 2046 + }, 2047 + "funding": { 2048 + "url": "https://github.com/sponsors/ljharb" 2049 + } 2050 + }, 2051 + "node_modules/balanced-match": { 2052 + "version": "1.0.2", 2053 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 2054 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 2055 + "dev": true, 2056 + "license": "MIT" 2057 + }, 2058 + "node_modules/baseline-browser-mapping": { 2059 + "version": "2.9.19", 2060 + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", 2061 + "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", 2062 + "dev": true, 2063 + "license": "Apache-2.0", 2064 + "bin": { 2065 + "baseline-browser-mapping": "dist/cli.js" 2066 + } 2067 + }, 2068 + "node_modules/brace-expansion": { 2069 + "version": "1.1.12", 2070 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", 2071 + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", 2072 + "dev": true, 2073 + "license": "MIT", 2074 + "dependencies": { 2075 + "balanced-match": "^1.0.0", 2076 + "concat-map": "0.0.1" 2077 + } 2078 + }, 2079 + "node_modules/browserslist": { 2080 + "version": "4.28.1", 2081 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", 2082 + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", 2083 + "dev": true, 2084 + "funding": [ 2085 + { 2086 + "type": "opencollective", 2087 + "url": "https://opencollective.com/browserslist" 36 2088 }, 37 - "node_modules/@ampproject/remapping": { 38 - "version": "2.3.0", 39 - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 40 - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 41 - "dev": true, 42 - "license": "Apache-2.0", 43 - "dependencies": { 44 - "@jridgewell/gen-mapping": "^0.3.5", 45 - "@jridgewell/trace-mapping": "^0.3.24" 46 - }, 47 - "engines": { 48 - "node": ">=6.0.0" 49 - } 2089 + { 2090 + "type": "tidelift", 2091 + "url": "https://tidelift.com/funding/github/npm/browserslist" 50 2092 }, 51 - "node_modules/@babel/code-frame": { 52 - "version": "7.27.1", 53 - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", 54 - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", 55 - "dev": true, 56 - "license": "MIT", 57 - "dependencies": { 58 - "@babel/helper-validator-identifier": "^7.27.1", 59 - "js-tokens": "^4.0.0", 60 - "picocolors": "^1.1.1" 61 - }, 62 - "engines": { 63 - "node": ">=6.9.0" 64 - } 2093 + { 2094 + "type": "github", 2095 + "url": "https://github.com/sponsors/ai" 2096 + } 2097 + ], 2098 + "license": "MIT", 2099 + "dependencies": { 2100 + "baseline-browser-mapping": "^2.9.0", 2101 + "caniuse-lite": "^1.0.30001759", 2102 + "electron-to-chromium": "^1.5.263", 2103 + "node-releases": "^2.0.27", 2104 + "update-browserslist-db": "^1.2.0" 2105 + }, 2106 + "bin": { 2107 + "browserslist": "cli.js" 2108 + }, 2109 + "engines": { 2110 + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 2111 + } 2112 + }, 2113 + "node_modules/call-bind": { 2114 + "version": "1.0.8", 2115 + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", 2116 + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", 2117 + "dev": true, 2118 + "license": "MIT", 2119 + "dependencies": { 2120 + "call-bind-apply-helpers": "^1.0.0", 2121 + "es-define-property": "^1.0.0", 2122 + "get-intrinsic": "^1.2.4", 2123 + "set-function-length": "^1.2.2" 2124 + }, 2125 + "engines": { 2126 + "node": ">= 0.4" 2127 + }, 2128 + "funding": { 2129 + "url": "https://github.com/sponsors/ljharb" 2130 + } 2131 + }, 2132 + "node_modules/call-bind-apply-helpers": { 2133 + "version": "1.0.2", 2134 + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 2135 + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 2136 + "dev": true, 2137 + "license": "MIT", 2138 + "dependencies": { 2139 + "es-errors": "^1.3.0", 2140 + "function-bind": "^1.1.2" 2141 + }, 2142 + "engines": { 2143 + "node": ">= 0.4" 2144 + } 2145 + }, 2146 + "node_modules/call-bound": { 2147 + "version": "1.0.4", 2148 + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", 2149 + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 2150 + "dev": true, 2151 + "license": "MIT", 2152 + "dependencies": { 2153 + "call-bind-apply-helpers": "^1.0.2", 2154 + "get-intrinsic": "^1.3.0" 2155 + }, 2156 + "engines": { 2157 + "node": ">= 0.4" 2158 + }, 2159 + "funding": { 2160 + "url": "https://github.com/sponsors/ljharb" 2161 + } 2162 + }, 2163 + "node_modules/callsites": { 2164 + "version": "3.1.0", 2165 + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 2166 + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 2167 + "dev": true, 2168 + "license": "MIT", 2169 + "engines": { 2170 + "node": ">=6" 2171 + } 2172 + }, 2173 + "node_modules/caniuse-lite": { 2174 + "version": "1.0.30001770", 2175 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz", 2176 + "integrity": "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==", 2177 + "dev": true, 2178 + "funding": [ 2179 + { 2180 + "type": "opencollective", 2181 + "url": "https://opencollective.com/browserslist" 65 2182 }, 66 - "node_modules/@babel/compat-data": { 67 - "version": "7.27.5", 68 - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", 69 - "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", 70 - "dev": true, 71 - "license": "MIT", 72 - "engines": { 73 - "node": ">=6.9.0" 74 - } 2183 + { 2184 + "type": "tidelift", 2185 + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 75 2186 }, 76 - "node_modules/@babel/core": { 77 - "version": "7.27.4", 78 - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", 79 - "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", 80 - "dev": true, 81 - "license": "MIT", 82 - "dependencies": { 83 - "@ampproject/remapping": "^2.2.0", 84 - "@babel/code-frame": "^7.27.1", 85 - "@babel/generator": "^7.27.3", 86 - "@babel/helper-compilation-targets": "^7.27.2", 87 - "@babel/helper-module-transforms": "^7.27.3", 88 - "@babel/helpers": "^7.27.4", 89 - "@babel/parser": "^7.27.4", 90 - "@babel/template": "^7.27.2", 91 - "@babel/traverse": "^7.27.4", 92 - "@babel/types": "^7.27.3", 93 - "convert-source-map": "^2.0.0", 94 - "debug": "^4.1.0", 95 - "gensync": "^1.0.0-beta.2", 96 - "json5": "^2.2.3", 97 - "semver": "^6.3.1" 98 - }, 99 - "engines": { 100 - "node": ">=6.9.0" 101 - }, 102 - "funding": { 103 - "type": "opencollective", 104 - "url": "https://opencollective.com/babel" 105 - } 2187 + { 2188 + "type": "github", 2189 + "url": "https://github.com/sponsors/ai" 2190 + } 2191 + ], 2192 + "license": "CC-BY-4.0" 2193 + }, 2194 + "node_modules/chalk": { 2195 + "version": "4.1.2", 2196 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 2197 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 2198 + "dev": true, 2199 + "license": "MIT", 2200 + "dependencies": { 2201 + "ansi-styles": "^4.1.0", 2202 + "supports-color": "^7.1.0" 2203 + }, 2204 + "engines": { 2205 + "node": ">=10" 2206 + }, 2207 + "funding": { 2208 + "url": "https://github.com/chalk/chalk?sponsor=1" 2209 + } 2210 + }, 2211 + "node_modules/color-convert": { 2212 + "version": "2.0.1", 2213 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2214 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2215 + "dev": true, 2216 + "license": "MIT", 2217 + "dependencies": { 2218 + "color-name": "~1.1.4" 2219 + }, 2220 + "engines": { 2221 + "node": ">=7.0.0" 2222 + } 2223 + }, 2224 + "node_modules/color-name": { 2225 + "version": "1.1.4", 2226 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2227 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2228 + "dev": true, 2229 + "license": "MIT" 2230 + }, 2231 + "node_modules/concat-map": { 2232 + "version": "0.0.1", 2233 + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 2234 + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 2235 + "dev": true, 2236 + "license": "MIT" 2237 + }, 2238 + "node_modules/convert-source-map": { 2239 + "version": "2.0.0", 2240 + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 2241 + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 2242 + "dev": true, 2243 + "license": "MIT" 2244 + }, 2245 + "node_modules/cross-spawn": { 2246 + "version": "7.0.6", 2247 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 2248 + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 2249 + "dev": true, 2250 + "license": "MIT", 2251 + "dependencies": { 2252 + "path-key": "^3.1.0", 2253 + "shebang-command": "^2.0.0", 2254 + "which": "^2.0.1" 2255 + }, 2256 + "engines": { 2257 + "node": ">= 8" 2258 + } 2259 + }, 2260 + "node_modules/csstype": { 2261 + "version": "3.2.3", 2262 + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", 2263 + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", 2264 + "dev": true, 2265 + "license": "MIT" 2266 + }, 2267 + "node_modules/data-view-buffer": { 2268 + "version": "1.0.2", 2269 + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", 2270 + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", 2271 + "dev": true, 2272 + "license": "MIT", 2273 + "dependencies": { 2274 + "call-bound": "^1.0.3", 2275 + "es-errors": "^1.3.0", 2276 + "is-data-view": "^1.0.2" 2277 + }, 2278 + "engines": { 2279 + "node": ">= 0.4" 2280 + }, 2281 + "funding": { 2282 + "url": "https://github.com/sponsors/ljharb" 2283 + } 2284 + }, 2285 + "node_modules/data-view-byte-length": { 2286 + "version": "1.0.2", 2287 + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", 2288 + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", 2289 + "dev": true, 2290 + "license": "MIT", 2291 + "dependencies": { 2292 + "call-bound": "^1.0.3", 2293 + "es-errors": "^1.3.0", 2294 + "is-data-view": "^1.0.2" 2295 + }, 2296 + "engines": { 2297 + "node": ">= 0.4" 2298 + }, 2299 + "funding": { 2300 + "url": "https://github.com/sponsors/inspect-js" 2301 + } 2302 + }, 2303 + "node_modules/data-view-byte-offset": { 2304 + "version": "1.0.1", 2305 + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", 2306 + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", 2307 + "dev": true, 2308 + "license": "MIT", 2309 + "dependencies": { 2310 + "call-bound": "^1.0.2", 2311 + "es-errors": "^1.3.0", 2312 + "is-data-view": "^1.0.1" 2313 + }, 2314 + "engines": { 2315 + "node": ">= 0.4" 2316 + }, 2317 + "funding": { 2318 + "url": "https://github.com/sponsors/ljharb" 2319 + } 2320 + }, 2321 + "node_modules/debug": { 2322 + "version": "4.4.3", 2323 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", 2324 + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 2325 + "dev": true, 2326 + "license": "MIT", 2327 + "dependencies": { 2328 + "ms": "^2.1.3" 2329 + }, 2330 + "engines": { 2331 + "node": ">=6.0" 2332 + }, 2333 + "peerDependenciesMeta": { 2334 + "supports-color": { 2335 + "optional": true 2336 + } 2337 + } 2338 + }, 2339 + "node_modules/deep-is": { 2340 + "version": "0.1.4", 2341 + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 2342 + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 2343 + "dev": true, 2344 + "license": "MIT" 2345 + }, 2346 + "node_modules/define-data-property": { 2347 + "version": "1.1.4", 2348 + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 2349 + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 2350 + "dev": true, 2351 + "license": "MIT", 2352 + "dependencies": { 2353 + "es-define-property": "^1.0.0", 2354 + "es-errors": "^1.3.0", 2355 + "gopd": "^1.0.1" 2356 + }, 2357 + "engines": { 2358 + "node": ">= 0.4" 2359 + }, 2360 + "funding": { 2361 + "url": "https://github.com/sponsors/ljharb" 2362 + } 2363 + }, 2364 + "node_modules/define-properties": { 2365 + "version": "1.2.1", 2366 + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", 2367 + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", 2368 + "dev": true, 2369 + "license": "MIT", 2370 + "dependencies": { 2371 + "define-data-property": "^1.0.1", 2372 + "has-property-descriptors": "^1.0.0", 2373 + "object-keys": "^1.1.1" 2374 + }, 2375 + "engines": { 2376 + "node": ">= 0.4" 2377 + }, 2378 + "funding": { 2379 + "url": "https://github.com/sponsors/ljharb" 2380 + } 2381 + }, 2382 + "node_modules/dequal": { 2383 + "version": "2.0.3", 2384 + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", 2385 + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", 2386 + "license": "MIT", 2387 + "engines": { 2388 + "node": ">=6" 2389 + } 2390 + }, 2391 + "node_modules/doctrine": { 2392 + "version": "2.1.0", 2393 + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 2394 + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 2395 + "dev": true, 2396 + "license": "Apache-2.0", 2397 + "dependencies": { 2398 + "esutils": "^2.0.2" 2399 + }, 2400 + "engines": { 2401 + "node": ">=0.10.0" 2402 + } 2403 + }, 2404 + "node_modules/dunder-proto": { 2405 + "version": "1.0.1", 2406 + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 2407 + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 2408 + "dev": true, 2409 + "license": "MIT", 2410 + "dependencies": { 2411 + "call-bind-apply-helpers": "^1.0.1", 2412 + "es-errors": "^1.3.0", 2413 + "gopd": "^1.2.0" 2414 + }, 2415 + "engines": { 2416 + "node": ">= 0.4" 2417 + } 2418 + }, 2419 + "node_modules/electron-to-chromium": { 2420 + "version": "1.5.286", 2421 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", 2422 + "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", 2423 + "dev": true, 2424 + "license": "ISC" 2425 + }, 2426 + "node_modules/es-abstract": { 2427 + "version": "1.24.1", 2428 + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", 2429 + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", 2430 + "dev": true, 2431 + "license": "MIT", 2432 + "dependencies": { 2433 + "array-buffer-byte-length": "^1.0.2", 2434 + "arraybuffer.prototype.slice": "^1.0.4", 2435 + "available-typed-arrays": "^1.0.7", 2436 + "call-bind": "^1.0.8", 2437 + "call-bound": "^1.0.4", 2438 + "data-view-buffer": "^1.0.2", 2439 + "data-view-byte-length": "^1.0.2", 2440 + "data-view-byte-offset": "^1.0.1", 2441 + "es-define-property": "^1.0.1", 2442 + "es-errors": "^1.3.0", 2443 + "es-object-atoms": "^1.1.1", 2444 + "es-set-tostringtag": "^2.1.0", 2445 + "es-to-primitive": "^1.3.0", 2446 + "function.prototype.name": "^1.1.8", 2447 + "get-intrinsic": "^1.3.0", 2448 + "get-proto": "^1.0.1", 2449 + "get-symbol-description": "^1.1.0", 2450 + "globalthis": "^1.0.4", 2451 + "gopd": "^1.2.0", 2452 + "has-property-descriptors": "^1.0.2", 2453 + "has-proto": "^1.2.0", 2454 + "has-symbols": "^1.1.0", 2455 + "hasown": "^2.0.2", 2456 + "internal-slot": "^1.1.0", 2457 + "is-array-buffer": "^3.0.5", 2458 + "is-callable": "^1.2.7", 2459 + "is-data-view": "^1.0.2", 2460 + "is-negative-zero": "^2.0.3", 2461 + "is-regex": "^1.2.1", 2462 + "is-set": "^2.0.3", 2463 + "is-shared-array-buffer": "^1.0.4", 2464 + "is-string": "^1.1.1", 2465 + "is-typed-array": "^1.1.15", 2466 + "is-weakref": "^1.1.1", 2467 + "math-intrinsics": "^1.1.0", 2468 + "object-inspect": "^1.13.4", 2469 + "object-keys": "^1.1.1", 2470 + "object.assign": "^4.1.7", 2471 + "own-keys": "^1.0.1", 2472 + "regexp.prototype.flags": "^1.5.4", 2473 + "safe-array-concat": "^1.1.3", 2474 + "safe-push-apply": "^1.0.0", 2475 + "safe-regex-test": "^1.1.0", 2476 + "set-proto": "^1.0.0", 2477 + "stop-iteration-iterator": "^1.1.0", 2478 + "string.prototype.trim": "^1.2.10", 2479 + "string.prototype.trimend": "^1.0.9", 2480 + "string.prototype.trimstart": "^1.0.8", 2481 + "typed-array-buffer": "^1.0.3", 2482 + "typed-array-byte-length": "^1.0.3", 2483 + "typed-array-byte-offset": "^1.0.4", 2484 + "typed-array-length": "^1.0.7", 2485 + "unbox-primitive": "^1.1.0", 2486 + "which-typed-array": "^1.1.19" 2487 + }, 2488 + "engines": { 2489 + "node": ">= 0.4" 2490 + }, 2491 + "funding": { 2492 + "url": "https://github.com/sponsors/ljharb" 2493 + } 2494 + }, 2495 + "node_modules/es-define-property": { 2496 + "version": "1.0.1", 2497 + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 2498 + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 2499 + "dev": true, 2500 + "license": "MIT", 2501 + "engines": { 2502 + "node": ">= 0.4" 2503 + } 2504 + }, 2505 + "node_modules/es-errors": { 2506 + "version": "1.3.0", 2507 + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 2508 + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 2509 + "dev": true, 2510 + "license": "MIT", 2511 + "engines": { 2512 + "node": ">= 0.4" 2513 + } 2514 + }, 2515 + "node_modules/es-iterator-helpers": { 2516 + "version": "1.2.2", 2517 + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", 2518 + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", 2519 + "dev": true, 2520 + "license": "MIT", 2521 + "dependencies": { 2522 + "call-bind": "^1.0.8", 2523 + "call-bound": "^1.0.4", 2524 + "define-properties": "^1.2.1", 2525 + "es-abstract": "^1.24.1", 2526 + "es-errors": "^1.3.0", 2527 + "es-set-tostringtag": "^2.1.0", 2528 + "function-bind": "^1.1.2", 2529 + "get-intrinsic": "^1.3.0", 2530 + "globalthis": "^1.0.4", 2531 + "gopd": "^1.2.0", 2532 + "has-property-descriptors": "^1.0.2", 2533 + "has-proto": "^1.2.0", 2534 + "has-symbols": "^1.1.0", 2535 + "internal-slot": "^1.1.0", 2536 + "iterator.prototype": "^1.1.5", 2537 + "safe-array-concat": "^1.1.3" 2538 + }, 2539 + "engines": { 2540 + "node": ">= 0.4" 2541 + } 2542 + }, 2543 + "node_modules/es-object-atoms": { 2544 + "version": "1.1.1", 2545 + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 2546 + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 2547 + "dev": true, 2548 + "license": "MIT", 2549 + "dependencies": { 2550 + "es-errors": "^1.3.0" 2551 + }, 2552 + "engines": { 2553 + "node": ">= 0.4" 2554 + } 2555 + }, 2556 + "node_modules/es-set-tostringtag": { 2557 + "version": "2.1.0", 2558 + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", 2559 + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", 2560 + "dev": true, 2561 + "license": "MIT", 2562 + "dependencies": { 2563 + "es-errors": "^1.3.0", 2564 + "get-intrinsic": "^1.2.6", 2565 + "has-tostringtag": "^1.0.2", 2566 + "hasown": "^2.0.2" 2567 + }, 2568 + "engines": { 2569 + "node": ">= 0.4" 2570 + } 2571 + }, 2572 + "node_modules/es-shim-unscopables": { 2573 + "version": "1.1.0", 2574 + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", 2575 + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", 2576 + "dev": true, 2577 + "license": "MIT", 2578 + "dependencies": { 2579 + "hasown": "^2.0.2" 2580 + }, 2581 + "engines": { 2582 + "node": ">= 0.4" 2583 + } 2584 + }, 2585 + "node_modules/es-to-primitive": { 2586 + "version": "1.3.0", 2587 + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", 2588 + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", 2589 + "dev": true, 2590 + "license": "MIT", 2591 + "dependencies": { 2592 + "is-callable": "^1.2.7", 2593 + "is-date-object": "^1.0.5", 2594 + "is-symbol": "^1.0.4" 2595 + }, 2596 + "engines": { 2597 + "node": ">= 0.4" 2598 + }, 2599 + "funding": { 2600 + "url": "https://github.com/sponsors/ljharb" 2601 + } 2602 + }, 2603 + "node_modules/esbuild": { 2604 + "version": "0.27.3", 2605 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", 2606 + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", 2607 + "dev": true, 2608 + "hasInstallScript": true, 2609 + "license": "MIT", 2610 + "bin": { 2611 + "esbuild": "bin/esbuild" 2612 + }, 2613 + "engines": { 2614 + "node": ">=18" 2615 + }, 2616 + "optionalDependencies": { 2617 + "@esbuild/aix-ppc64": "0.27.3", 2618 + "@esbuild/android-arm": "0.27.3", 2619 + "@esbuild/android-arm64": "0.27.3", 2620 + "@esbuild/android-x64": "0.27.3", 2621 + "@esbuild/darwin-arm64": "0.27.3", 2622 + "@esbuild/darwin-x64": "0.27.3", 2623 + "@esbuild/freebsd-arm64": "0.27.3", 2624 + "@esbuild/freebsd-x64": "0.27.3", 2625 + "@esbuild/linux-arm": "0.27.3", 2626 + "@esbuild/linux-arm64": "0.27.3", 2627 + "@esbuild/linux-ia32": "0.27.3", 2628 + "@esbuild/linux-loong64": "0.27.3", 2629 + "@esbuild/linux-mips64el": "0.27.3", 2630 + "@esbuild/linux-ppc64": "0.27.3", 2631 + "@esbuild/linux-riscv64": "0.27.3", 2632 + "@esbuild/linux-s390x": "0.27.3", 2633 + "@esbuild/linux-x64": "0.27.3", 2634 + "@esbuild/netbsd-arm64": "0.27.3", 2635 + "@esbuild/netbsd-x64": "0.27.3", 2636 + "@esbuild/openbsd-arm64": "0.27.3", 2637 + "@esbuild/openbsd-x64": "0.27.3", 2638 + "@esbuild/openharmony-arm64": "0.27.3", 2639 + "@esbuild/sunos-x64": "0.27.3", 2640 + "@esbuild/win32-arm64": "0.27.3", 2641 + "@esbuild/win32-ia32": "0.27.3", 2642 + "@esbuild/win32-x64": "0.27.3" 2643 + } 2644 + }, 2645 + "node_modules/escalade": { 2646 + "version": "3.2.0", 2647 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 2648 + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 2649 + "dev": true, 2650 + "license": "MIT", 2651 + "engines": { 2652 + "node": ">=6" 2653 + } 2654 + }, 2655 + "node_modules/escape-string-regexp": { 2656 + "version": "4.0.0", 2657 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 2658 + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 2659 + "dev": true, 2660 + "license": "MIT", 2661 + "engines": { 2662 + "node": ">=10" 2663 + }, 2664 + "funding": { 2665 + "url": "https://github.com/sponsors/sindresorhus" 2666 + } 2667 + }, 2668 + "node_modules/eslint": { 2669 + "version": "9.39.2", 2670 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", 2671 + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", 2672 + "dev": true, 2673 + "license": "MIT", 2674 + "dependencies": { 2675 + "@eslint-community/eslint-utils": "^4.8.0", 2676 + "@eslint-community/regexpp": "^4.12.1", 2677 + "@eslint/config-array": "^0.21.1", 2678 + "@eslint/config-helpers": "^0.4.2", 2679 + "@eslint/core": "^0.17.0", 2680 + "@eslint/eslintrc": "^3.3.1", 2681 + "@eslint/js": "9.39.2", 2682 + "@eslint/plugin-kit": "^0.4.1", 2683 + "@humanfs/node": "^0.16.6", 2684 + "@humanwhocodes/module-importer": "^1.0.1", 2685 + "@humanwhocodes/retry": "^0.4.2", 2686 + "@types/estree": "^1.0.6", 2687 + "ajv": "^6.12.4", 2688 + "chalk": "^4.0.0", 2689 + "cross-spawn": "^7.0.6", 2690 + "debug": "^4.3.2", 2691 + "escape-string-regexp": "^4.0.0", 2692 + "eslint-scope": "^8.4.0", 2693 + "eslint-visitor-keys": "^4.2.1", 2694 + "espree": "^10.4.0", 2695 + "esquery": "^1.5.0", 2696 + "esutils": "^2.0.2", 2697 + "fast-deep-equal": "^3.1.3", 2698 + "file-entry-cache": "^8.0.0", 2699 + "find-up": "^5.0.0", 2700 + "glob-parent": "^6.0.2", 2701 + "ignore": "^5.2.0", 2702 + "imurmurhash": "^0.1.4", 2703 + "is-glob": "^4.0.0", 2704 + "json-stable-stringify-without-jsonify": "^1.0.1", 2705 + "lodash.merge": "^4.6.2", 2706 + "minimatch": "^3.1.2", 2707 + "natural-compare": "^1.4.0", 2708 + "optionator": "^0.9.3" 2709 + }, 2710 + "bin": { 2711 + "eslint": "bin/eslint.js" 2712 + }, 2713 + "engines": { 2714 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2715 + }, 2716 + "funding": { 2717 + "url": "https://eslint.org/donate" 2718 + }, 2719 + "peerDependencies": { 2720 + "jiti": "*" 2721 + }, 2722 + "peerDependenciesMeta": { 2723 + "jiti": { 2724 + "optional": true 2725 + } 2726 + } 2727 + }, 2728 + "node_modules/eslint-plugin-react": { 2729 + "version": "7.37.5", 2730 + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", 2731 + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", 2732 + "dev": true, 2733 + "license": "MIT", 2734 + "dependencies": { 2735 + "array-includes": "^3.1.8", 2736 + "array.prototype.findlast": "^1.2.5", 2737 + "array.prototype.flatmap": "^1.3.3", 2738 + "array.prototype.tosorted": "^1.1.4", 2739 + "doctrine": "^2.1.0", 2740 + "es-iterator-helpers": "^1.2.1", 2741 + "estraverse": "^5.3.0", 2742 + "hasown": "^2.0.2", 2743 + "jsx-ast-utils": "^2.4.1 || ^3.0.0", 2744 + "minimatch": "^3.1.2", 2745 + "object.entries": "^1.1.9", 2746 + "object.fromentries": "^2.0.8", 2747 + "object.values": "^1.2.1", 2748 + "prop-types": "^15.8.1", 2749 + "resolve": "^2.0.0-next.5", 2750 + "semver": "^6.3.1", 2751 + "string.prototype.matchall": "^4.0.12", 2752 + "string.prototype.repeat": "^1.0.0" 2753 + }, 2754 + "engines": { 2755 + "node": ">=4" 2756 + }, 2757 + "peerDependencies": { 2758 + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" 2759 + } 2760 + }, 2761 + "node_modules/eslint-plugin-react-hooks": { 2762 + "version": "5.2.0", 2763 + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", 2764 + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", 2765 + "dev": true, 2766 + "license": "MIT", 2767 + "engines": { 2768 + "node": ">=10" 2769 + }, 2770 + "peerDependencies": { 2771 + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" 2772 + } 2773 + }, 2774 + "node_modules/eslint-scope": { 2775 + "version": "8.4.0", 2776 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", 2777 + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", 2778 + "dev": true, 2779 + "license": "BSD-2-Clause", 2780 + "dependencies": { 2781 + "esrecurse": "^4.3.0", 2782 + "estraverse": "^5.2.0" 2783 + }, 2784 + "engines": { 2785 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2786 + }, 2787 + "funding": { 2788 + "url": "https://opencollective.com/eslint" 2789 + } 2790 + }, 2791 + "node_modules/eslint-visitor-keys": { 2792 + "version": "4.2.1", 2793 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", 2794 + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", 2795 + "dev": true, 2796 + "license": "Apache-2.0", 2797 + "engines": { 2798 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2799 + }, 2800 + "funding": { 2801 + "url": "https://opencollective.com/eslint" 2802 + } 2803 + }, 2804 + "node_modules/espree": { 2805 + "version": "10.4.0", 2806 + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", 2807 + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", 2808 + "dev": true, 2809 + "license": "BSD-2-Clause", 2810 + "dependencies": { 2811 + "acorn": "^8.15.0", 2812 + "acorn-jsx": "^5.3.2", 2813 + "eslint-visitor-keys": "^4.2.1" 2814 + }, 2815 + "engines": { 2816 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2817 + }, 2818 + "funding": { 2819 + "url": "https://opencollective.com/eslint" 2820 + } 2821 + }, 2822 + "node_modules/esquery": { 2823 + "version": "1.7.0", 2824 + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", 2825 + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", 2826 + "dev": true, 2827 + "license": "BSD-3-Clause", 2828 + "dependencies": { 2829 + "estraverse": "^5.1.0" 2830 + }, 2831 + "engines": { 2832 + "node": ">=0.10" 2833 + } 2834 + }, 2835 + "node_modules/esrecurse": { 2836 + "version": "4.3.0", 2837 + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 2838 + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 2839 + "dev": true, 2840 + "license": "BSD-2-Clause", 2841 + "dependencies": { 2842 + "estraverse": "^5.2.0" 2843 + }, 2844 + "engines": { 2845 + "node": ">=4.0" 2846 + } 2847 + }, 2848 + "node_modules/estraverse": { 2849 + "version": "5.3.0", 2850 + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 2851 + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 2852 + "dev": true, 2853 + "license": "BSD-2-Clause", 2854 + "engines": { 2855 + "node": ">=4.0" 2856 + } 2857 + }, 2858 + "node_modules/esutils": { 2859 + "version": "2.0.3", 2860 + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 2861 + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 2862 + "dev": true, 2863 + "license": "BSD-2-Clause", 2864 + "engines": { 2865 + "node": ">=0.10.0" 2866 + } 2867 + }, 2868 + "node_modules/fast-deep-equal": { 2869 + "version": "3.1.3", 2870 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2871 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 2872 + "dev": true, 2873 + "license": "MIT" 2874 + }, 2875 + "node_modules/fast-json-stable-stringify": { 2876 + "version": "2.1.0", 2877 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2878 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 2879 + "dev": true, 2880 + "license": "MIT" 2881 + }, 2882 + "node_modules/fast-levenshtein": { 2883 + "version": "2.0.6", 2884 + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 2885 + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 2886 + "dev": true, 2887 + "license": "MIT" 2888 + }, 2889 + "node_modules/fdir": { 2890 + "version": "6.5.0", 2891 + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", 2892 + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", 2893 + "dev": true, 2894 + "license": "MIT", 2895 + "engines": { 2896 + "node": ">=12.0.0" 2897 + }, 2898 + "peerDependencies": { 2899 + "picomatch": "^3 || ^4" 2900 + }, 2901 + "peerDependenciesMeta": { 2902 + "picomatch": { 2903 + "optional": true 2904 + } 2905 + } 2906 + }, 2907 + "node_modules/file-entry-cache": { 2908 + "version": "8.0.0", 2909 + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 2910 + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 2911 + "dev": true, 2912 + "license": "MIT", 2913 + "dependencies": { 2914 + "flat-cache": "^4.0.0" 2915 + }, 2916 + "engines": { 2917 + "node": ">=16.0.0" 2918 + } 2919 + }, 2920 + "node_modules/find-up": { 2921 + "version": "5.0.0", 2922 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 2923 + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 2924 + "dev": true, 2925 + "license": "MIT", 2926 + "dependencies": { 2927 + "locate-path": "^6.0.0", 2928 + "path-exists": "^4.0.0" 2929 + }, 2930 + "engines": { 2931 + "node": ">=10" 2932 + }, 2933 + "funding": { 2934 + "url": "https://github.com/sponsors/sindresorhus" 2935 + } 2936 + }, 2937 + "node_modules/flat-cache": { 2938 + "version": "4.0.1", 2939 + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 2940 + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 2941 + "dev": true, 2942 + "license": "MIT", 2943 + "dependencies": { 2944 + "flatted": "^3.2.9", 2945 + "keyv": "^4.5.4" 2946 + }, 2947 + "engines": { 2948 + "node": ">=16" 2949 + } 2950 + }, 2951 + "node_modules/flatted": { 2952 + "version": "3.3.3", 2953 + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", 2954 + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", 2955 + "dev": true, 2956 + "license": "ISC" 2957 + }, 2958 + "node_modules/for-each": { 2959 + "version": "0.3.5", 2960 + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", 2961 + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", 2962 + "dev": true, 2963 + "license": "MIT", 2964 + "dependencies": { 2965 + "is-callable": "^1.2.7" 2966 + }, 2967 + "engines": { 2968 + "node": ">= 0.4" 2969 + }, 2970 + "funding": { 2971 + "url": "https://github.com/sponsors/ljharb" 2972 + } 2973 + }, 2974 + "node_modules/fsevents": { 2975 + "version": "2.3.3", 2976 + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 2977 + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 2978 + "dev": true, 2979 + "hasInstallScript": true, 2980 + "license": "MIT", 2981 + "optional": true, 2982 + "os": [ 2983 + "darwin" 2984 + ], 2985 + "engines": { 2986 + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 2987 + } 2988 + }, 2989 + "node_modules/function-bind": { 2990 + "version": "1.1.2", 2991 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 2992 + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 2993 + "dev": true, 2994 + "license": "MIT", 2995 + "funding": { 2996 + "url": "https://github.com/sponsors/ljharb" 2997 + } 2998 + }, 2999 + "node_modules/function.prototype.name": { 3000 + "version": "1.1.8", 3001 + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", 3002 + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", 3003 + "dev": true, 3004 + "license": "MIT", 3005 + "dependencies": { 3006 + "call-bind": "^1.0.8", 3007 + "call-bound": "^1.0.3", 3008 + "define-properties": "^1.2.1", 3009 + "functions-have-names": "^1.2.3", 3010 + "hasown": "^2.0.2", 3011 + "is-callable": "^1.2.7" 3012 + }, 3013 + "engines": { 3014 + "node": ">= 0.4" 3015 + }, 3016 + "funding": { 3017 + "url": "https://github.com/sponsors/ljharb" 3018 + } 3019 + }, 3020 + "node_modules/functions-have-names": { 3021 + "version": "1.2.3", 3022 + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 3023 + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 3024 + "dev": true, 3025 + "license": "MIT", 3026 + "funding": { 3027 + "url": "https://github.com/sponsors/ljharb" 3028 + } 3029 + }, 3030 + "node_modules/generator-function": { 3031 + "version": "2.0.1", 3032 + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", 3033 + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", 3034 + "dev": true, 3035 + "license": "MIT", 3036 + "engines": { 3037 + "node": ">= 0.4" 3038 + } 3039 + }, 3040 + "node_modules/gensync": { 3041 + "version": "1.0.0-beta.2", 3042 + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 3043 + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 3044 + "dev": true, 3045 + "license": "MIT", 3046 + "engines": { 3047 + "node": ">=6.9.0" 3048 + } 3049 + }, 3050 + "node_modules/get-intrinsic": { 3051 + "version": "1.3.0", 3052 + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 3053 + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 3054 + "dev": true, 3055 + "license": "MIT", 3056 + "dependencies": { 3057 + "call-bind-apply-helpers": "^1.0.2", 3058 + "es-define-property": "^1.0.1", 3059 + "es-errors": "^1.3.0", 3060 + "es-object-atoms": "^1.1.1", 3061 + "function-bind": "^1.1.2", 3062 + "get-proto": "^1.0.1", 3063 + "gopd": "^1.2.0", 3064 + "has-symbols": "^1.1.0", 3065 + "hasown": "^2.0.2", 3066 + "math-intrinsics": "^1.1.0" 3067 + }, 3068 + "engines": { 3069 + "node": ">= 0.4" 3070 + }, 3071 + "funding": { 3072 + "url": "https://github.com/sponsors/ljharb" 3073 + } 3074 + }, 3075 + "node_modules/get-proto": { 3076 + "version": "1.0.1", 3077 + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 3078 + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 3079 + "dev": true, 3080 + "license": "MIT", 3081 + "dependencies": { 3082 + "dunder-proto": "^1.0.1", 3083 + "es-object-atoms": "^1.0.0" 3084 + }, 3085 + "engines": { 3086 + "node": ">= 0.4" 3087 + } 3088 + }, 3089 + "node_modules/get-symbol-description": { 3090 + "version": "1.1.0", 3091 + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", 3092 + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", 3093 + "dev": true, 3094 + "license": "MIT", 3095 + "dependencies": { 3096 + "call-bound": "^1.0.3", 3097 + "es-errors": "^1.3.0", 3098 + "get-intrinsic": "^1.2.6" 3099 + }, 3100 + "engines": { 3101 + "node": ">= 0.4" 3102 + }, 3103 + "funding": { 3104 + "url": "https://github.com/sponsors/ljharb" 3105 + } 3106 + }, 3107 + "node_modules/glob-parent": { 3108 + "version": "6.0.2", 3109 + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 3110 + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 3111 + "dev": true, 3112 + "license": "ISC", 3113 + "dependencies": { 3114 + "is-glob": "^4.0.3" 3115 + }, 3116 + "engines": { 3117 + "node": ">=10.13.0" 3118 + } 3119 + }, 3120 + "node_modules/globals": { 3121 + "version": "17.3.0", 3122 + "resolved": "https://registry.npmjs.org/globals/-/globals-17.3.0.tgz", 3123 + "integrity": "sha512-yMqGUQVVCkD4tqjOJf3TnrvaaHDMYp4VlUSObbkIiuCPe/ofdMBFIAcBbCSRFWOnos6qRiTVStDwqPLUclaxIw==", 3124 + "dev": true, 3125 + "license": "MIT", 3126 + "engines": { 3127 + "node": ">=18" 3128 + }, 3129 + "funding": { 3130 + "url": "https://github.com/sponsors/sindresorhus" 3131 + } 3132 + }, 3133 + "node_modules/globalthis": { 3134 + "version": "1.0.4", 3135 + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", 3136 + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", 3137 + "dev": true, 3138 + "license": "MIT", 3139 + "dependencies": { 3140 + "define-properties": "^1.2.1", 3141 + "gopd": "^1.0.1" 3142 + }, 3143 + "engines": { 3144 + "node": ">= 0.4" 3145 + }, 3146 + "funding": { 3147 + "url": "https://github.com/sponsors/ljharb" 3148 + } 3149 + }, 3150 + "node_modules/gopd": { 3151 + "version": "1.2.0", 3152 + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 3153 + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 3154 + "dev": true, 3155 + "license": "MIT", 3156 + "engines": { 3157 + "node": ">= 0.4" 3158 + }, 3159 + "funding": { 3160 + "url": "https://github.com/sponsors/ljharb" 3161 + } 3162 + }, 3163 + "node_modules/has-bigints": { 3164 + "version": "1.1.0", 3165 + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", 3166 + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", 3167 + "dev": true, 3168 + "license": "MIT", 3169 + "engines": { 3170 + "node": ">= 0.4" 3171 + }, 3172 + "funding": { 3173 + "url": "https://github.com/sponsors/ljharb" 3174 + } 3175 + }, 3176 + "node_modules/has-flag": { 3177 + "version": "4.0.0", 3178 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 3179 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 3180 + "dev": true, 3181 + "license": "MIT", 3182 + "engines": { 3183 + "node": ">=8" 3184 + } 3185 + }, 3186 + "node_modules/has-property-descriptors": { 3187 + "version": "1.0.2", 3188 + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 3189 + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 3190 + "dev": true, 3191 + "license": "MIT", 3192 + "dependencies": { 3193 + "es-define-property": "^1.0.0" 3194 + }, 3195 + "funding": { 3196 + "url": "https://github.com/sponsors/ljharb" 3197 + } 3198 + }, 3199 + "node_modules/has-proto": { 3200 + "version": "1.2.0", 3201 + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", 3202 + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", 3203 + "dev": true, 3204 + "license": "MIT", 3205 + "dependencies": { 3206 + "dunder-proto": "^1.0.0" 3207 + }, 3208 + "engines": { 3209 + "node": ">= 0.4" 3210 + }, 3211 + "funding": { 3212 + "url": "https://github.com/sponsors/ljharb" 3213 + } 3214 + }, 3215 + "node_modules/has-symbols": { 3216 + "version": "1.1.0", 3217 + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 3218 + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 3219 + "dev": true, 3220 + "license": "MIT", 3221 + "engines": { 3222 + "node": ">= 0.4" 3223 + }, 3224 + "funding": { 3225 + "url": "https://github.com/sponsors/ljharb" 3226 + } 3227 + }, 3228 + "node_modules/has-tostringtag": { 3229 + "version": "1.0.2", 3230 + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 3231 + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 3232 + "dev": true, 3233 + "license": "MIT", 3234 + "dependencies": { 3235 + "has-symbols": "^1.0.3" 3236 + }, 3237 + "engines": { 3238 + "node": ">= 0.4" 3239 + }, 3240 + "funding": { 3241 + "url": "https://github.com/sponsors/ljharb" 3242 + } 3243 + }, 3244 + "node_modules/hasown": { 3245 + "version": "2.0.2", 3246 + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 3247 + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 3248 + "dev": true, 3249 + "license": "MIT", 3250 + "dependencies": { 3251 + "function-bind": "^1.1.2" 3252 + }, 3253 + "engines": { 3254 + "node": ">= 0.4" 3255 + } 3256 + }, 3257 + "node_modules/ignore": { 3258 + "version": "5.3.2", 3259 + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 3260 + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 3261 + "dev": true, 3262 + "license": "MIT", 3263 + "engines": { 3264 + "node": ">= 4" 3265 + } 3266 + }, 3267 + "node_modules/import-fresh": { 3268 + "version": "3.3.1", 3269 + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 3270 + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 3271 + "dev": true, 3272 + "license": "MIT", 3273 + "dependencies": { 3274 + "parent-module": "^1.0.0", 3275 + "resolve-from": "^4.0.0" 3276 + }, 3277 + "engines": { 3278 + "node": ">=6" 3279 + }, 3280 + "funding": { 3281 + "url": "https://github.com/sponsors/sindresorhus" 3282 + } 3283 + }, 3284 + "node_modules/imurmurhash": { 3285 + "version": "0.1.4", 3286 + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 3287 + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 3288 + "dev": true, 3289 + "license": "MIT", 3290 + "engines": { 3291 + "node": ">=0.8.19" 3292 + } 3293 + }, 3294 + "node_modules/internal-slot": { 3295 + "version": "1.1.0", 3296 + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", 3297 + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", 3298 + "dev": true, 3299 + "license": "MIT", 3300 + "dependencies": { 3301 + "es-errors": "^1.3.0", 3302 + "hasown": "^2.0.2", 3303 + "side-channel": "^1.1.0" 3304 + }, 3305 + "engines": { 3306 + "node": ">= 0.4" 3307 + } 3308 + }, 3309 + "node_modules/is-array-buffer": { 3310 + "version": "3.0.5", 3311 + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", 3312 + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", 3313 + "dev": true, 3314 + "license": "MIT", 3315 + "dependencies": { 3316 + "call-bind": "^1.0.8", 3317 + "call-bound": "^1.0.3", 3318 + "get-intrinsic": "^1.2.6" 3319 + }, 3320 + "engines": { 3321 + "node": ">= 0.4" 3322 + }, 3323 + "funding": { 3324 + "url": "https://github.com/sponsors/ljharb" 3325 + } 3326 + }, 3327 + "node_modules/is-async-function": { 3328 + "version": "2.1.1", 3329 + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", 3330 + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", 3331 + "dev": true, 3332 + "license": "MIT", 3333 + "dependencies": { 3334 + "async-function": "^1.0.0", 3335 + "call-bound": "^1.0.3", 3336 + "get-proto": "^1.0.1", 3337 + "has-tostringtag": "^1.0.2", 3338 + "safe-regex-test": "^1.1.0" 3339 + }, 3340 + "engines": { 3341 + "node": ">= 0.4" 3342 + }, 3343 + "funding": { 3344 + "url": "https://github.com/sponsors/ljharb" 3345 + } 3346 + }, 3347 + "node_modules/is-bigint": { 3348 + "version": "1.1.0", 3349 + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", 3350 + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", 3351 + "dev": true, 3352 + "license": "MIT", 3353 + "dependencies": { 3354 + "has-bigints": "^1.0.2" 3355 + }, 3356 + "engines": { 3357 + "node": ">= 0.4" 3358 + }, 3359 + "funding": { 3360 + "url": "https://github.com/sponsors/ljharb" 3361 + } 3362 + }, 3363 + "node_modules/is-boolean-object": { 3364 + "version": "1.2.2", 3365 + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", 3366 + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", 3367 + "dev": true, 3368 + "license": "MIT", 3369 + "dependencies": { 3370 + "call-bound": "^1.0.3", 3371 + "has-tostringtag": "^1.0.2" 3372 + }, 3373 + "engines": { 3374 + "node": ">= 0.4" 3375 + }, 3376 + "funding": { 3377 + "url": "https://github.com/sponsors/ljharb" 3378 + } 3379 + }, 3380 + "node_modules/is-callable": { 3381 + "version": "1.2.7", 3382 + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 3383 + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 3384 + "dev": true, 3385 + "license": "MIT", 3386 + "engines": { 3387 + "node": ">= 0.4" 3388 + }, 3389 + "funding": { 3390 + "url": "https://github.com/sponsors/ljharb" 3391 + } 3392 + }, 3393 + "node_modules/is-core-module": { 3394 + "version": "2.16.1", 3395 + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 3396 + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 3397 + "dev": true, 3398 + "license": "MIT", 3399 + "dependencies": { 3400 + "hasown": "^2.0.2" 3401 + }, 3402 + "engines": { 3403 + "node": ">= 0.4" 3404 + }, 3405 + "funding": { 3406 + "url": "https://github.com/sponsors/ljharb" 3407 + } 3408 + }, 3409 + "node_modules/is-data-view": { 3410 + "version": "1.0.2", 3411 + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", 3412 + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", 3413 + "dev": true, 3414 + "license": "MIT", 3415 + "dependencies": { 3416 + "call-bound": "^1.0.2", 3417 + "get-intrinsic": "^1.2.6", 3418 + "is-typed-array": "^1.1.13" 3419 + }, 3420 + "engines": { 3421 + "node": ">= 0.4" 3422 + }, 3423 + "funding": { 3424 + "url": "https://github.com/sponsors/ljharb" 3425 + } 3426 + }, 3427 + "node_modules/is-date-object": { 3428 + "version": "1.1.0", 3429 + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", 3430 + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", 3431 + "dev": true, 3432 + "license": "MIT", 3433 + "dependencies": { 3434 + "call-bound": "^1.0.2", 3435 + "has-tostringtag": "^1.0.2" 3436 + }, 3437 + "engines": { 3438 + "node": ">= 0.4" 3439 + }, 3440 + "funding": { 3441 + "url": "https://github.com/sponsors/ljharb" 3442 + } 3443 + }, 3444 + "node_modules/is-extglob": { 3445 + "version": "2.1.1", 3446 + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 3447 + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 3448 + "dev": true, 3449 + "license": "MIT", 3450 + "engines": { 3451 + "node": ">=0.10.0" 3452 + } 3453 + }, 3454 + "node_modules/is-finalizationregistry": { 3455 + "version": "1.1.1", 3456 + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", 3457 + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", 3458 + "dev": true, 3459 + "license": "MIT", 3460 + "dependencies": { 3461 + "call-bound": "^1.0.3" 3462 + }, 3463 + "engines": { 3464 + "node": ">= 0.4" 3465 + }, 3466 + "funding": { 3467 + "url": "https://github.com/sponsors/ljharb" 3468 + } 3469 + }, 3470 + "node_modules/is-generator-function": { 3471 + "version": "1.1.2", 3472 + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", 3473 + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", 3474 + "dev": true, 3475 + "license": "MIT", 3476 + "dependencies": { 3477 + "call-bound": "^1.0.4", 3478 + "generator-function": "^2.0.0", 3479 + "get-proto": "^1.0.1", 3480 + "has-tostringtag": "^1.0.2", 3481 + "safe-regex-test": "^1.1.0" 3482 + }, 3483 + "engines": { 3484 + "node": ">= 0.4" 3485 + }, 3486 + "funding": { 3487 + "url": "https://github.com/sponsors/ljharb" 3488 + } 3489 + }, 3490 + "node_modules/is-glob": { 3491 + "version": "4.0.3", 3492 + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 3493 + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 3494 + "dev": true, 3495 + "license": "MIT", 3496 + "dependencies": { 3497 + "is-extglob": "^2.1.1" 3498 + }, 3499 + "engines": { 3500 + "node": ">=0.10.0" 3501 + } 3502 + }, 3503 + "node_modules/is-map": { 3504 + "version": "2.0.3", 3505 + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", 3506 + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", 3507 + "dev": true, 3508 + "license": "MIT", 3509 + "engines": { 3510 + "node": ">= 0.4" 3511 + }, 3512 + "funding": { 3513 + "url": "https://github.com/sponsors/ljharb" 3514 + } 3515 + }, 3516 + "node_modules/is-negative-zero": { 3517 + "version": "2.0.3", 3518 + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", 3519 + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", 3520 + "dev": true, 3521 + "license": "MIT", 3522 + "engines": { 3523 + "node": ">= 0.4" 3524 + }, 3525 + "funding": { 3526 + "url": "https://github.com/sponsors/ljharb" 3527 + } 3528 + }, 3529 + "node_modules/is-number-object": { 3530 + "version": "1.1.1", 3531 + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", 3532 + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", 3533 + "dev": true, 3534 + "license": "MIT", 3535 + "dependencies": { 3536 + "call-bound": "^1.0.3", 3537 + "has-tostringtag": "^1.0.2" 3538 + }, 3539 + "engines": { 3540 + "node": ">= 0.4" 3541 + }, 3542 + "funding": { 3543 + "url": "https://github.com/sponsors/ljharb" 3544 + } 3545 + }, 3546 + "node_modules/is-regex": { 3547 + "version": "1.2.1", 3548 + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", 3549 + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", 3550 + "dev": true, 3551 + "license": "MIT", 3552 + "dependencies": { 3553 + "call-bound": "^1.0.2", 3554 + "gopd": "^1.2.0", 3555 + "has-tostringtag": "^1.0.2", 3556 + "hasown": "^2.0.2" 3557 + }, 3558 + "engines": { 3559 + "node": ">= 0.4" 3560 + }, 3561 + "funding": { 3562 + "url": "https://github.com/sponsors/ljharb" 3563 + } 3564 + }, 3565 + "node_modules/is-set": { 3566 + "version": "2.0.3", 3567 + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", 3568 + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", 3569 + "dev": true, 3570 + "license": "MIT", 3571 + "engines": { 3572 + "node": ">= 0.4" 3573 + }, 3574 + "funding": { 3575 + "url": "https://github.com/sponsors/ljharb" 3576 + } 3577 + }, 3578 + "node_modules/is-shared-array-buffer": { 3579 + "version": "1.0.4", 3580 + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", 3581 + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", 3582 + "dev": true, 3583 + "license": "MIT", 3584 + "dependencies": { 3585 + "call-bound": "^1.0.3" 3586 + }, 3587 + "engines": { 3588 + "node": ">= 0.4" 3589 + }, 3590 + "funding": { 3591 + "url": "https://github.com/sponsors/ljharb" 3592 + } 3593 + }, 3594 + "node_modules/is-string": { 3595 + "version": "1.1.1", 3596 + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", 3597 + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", 3598 + "dev": true, 3599 + "license": "MIT", 3600 + "dependencies": { 3601 + "call-bound": "^1.0.3", 3602 + "has-tostringtag": "^1.0.2" 3603 + }, 3604 + "engines": { 3605 + "node": ">= 0.4" 3606 + }, 3607 + "funding": { 3608 + "url": "https://github.com/sponsors/ljharb" 3609 + } 3610 + }, 3611 + "node_modules/is-symbol": { 3612 + "version": "1.1.1", 3613 + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", 3614 + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", 3615 + "dev": true, 3616 + "license": "MIT", 3617 + "dependencies": { 3618 + "call-bound": "^1.0.2", 3619 + "has-symbols": "^1.1.0", 3620 + "safe-regex-test": "^1.1.0" 3621 + }, 3622 + "engines": { 3623 + "node": ">= 0.4" 3624 + }, 3625 + "funding": { 3626 + "url": "https://github.com/sponsors/ljharb" 3627 + } 3628 + }, 3629 + "node_modules/is-typed-array": { 3630 + "version": "1.1.15", 3631 + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", 3632 + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", 3633 + "dev": true, 3634 + "license": "MIT", 3635 + "dependencies": { 3636 + "which-typed-array": "^1.1.16" 3637 + }, 3638 + "engines": { 3639 + "node": ">= 0.4" 3640 + }, 3641 + "funding": { 3642 + "url": "https://github.com/sponsors/ljharb" 3643 + } 3644 + }, 3645 + "node_modules/is-weakmap": { 3646 + "version": "2.0.2", 3647 + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", 3648 + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", 3649 + "dev": true, 3650 + "license": "MIT", 3651 + "engines": { 3652 + "node": ">= 0.4" 3653 + }, 3654 + "funding": { 3655 + "url": "https://github.com/sponsors/ljharb" 3656 + } 3657 + }, 3658 + "node_modules/is-weakref": { 3659 + "version": "1.1.1", 3660 + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", 3661 + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", 3662 + "dev": true, 3663 + "license": "MIT", 3664 + "dependencies": { 3665 + "call-bound": "^1.0.3" 3666 + }, 3667 + "engines": { 3668 + "node": ">= 0.4" 3669 + }, 3670 + "funding": { 3671 + "url": "https://github.com/sponsors/ljharb" 3672 + } 3673 + }, 3674 + "node_modules/is-weakset": { 3675 + "version": "2.0.4", 3676 + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", 3677 + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", 3678 + "dev": true, 3679 + "license": "MIT", 3680 + "dependencies": { 3681 + "call-bound": "^1.0.3", 3682 + "get-intrinsic": "^1.2.6" 3683 + }, 3684 + "engines": { 3685 + "node": ">= 0.4" 3686 + }, 3687 + "funding": { 3688 + "url": "https://github.com/sponsors/ljharb" 3689 + } 3690 + }, 3691 + "node_modules/isarray": { 3692 + "version": "2.0.5", 3693 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 3694 + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 3695 + "dev": true, 3696 + "license": "MIT" 3697 + }, 3698 + "node_modules/isexe": { 3699 + "version": "2.0.0", 3700 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 3701 + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 3702 + "dev": true, 3703 + "license": "ISC" 3704 + }, 3705 + "node_modules/iterator.prototype": { 3706 + "version": "1.1.5", 3707 + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", 3708 + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", 3709 + "dev": true, 3710 + "license": "MIT", 3711 + "dependencies": { 3712 + "define-data-property": "^1.1.4", 3713 + "es-object-atoms": "^1.0.0", 3714 + "get-intrinsic": "^1.2.6", 3715 + "get-proto": "^1.0.0", 3716 + "has-symbols": "^1.1.0", 3717 + "set-function-name": "^2.0.2" 3718 + }, 3719 + "engines": { 3720 + "node": ">= 0.4" 3721 + } 3722 + }, 3723 + "node_modules/js-tokens": { 3724 + "version": "4.0.0", 3725 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 3726 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 3727 + "dev": true, 3728 + "license": "MIT" 3729 + }, 3730 + "node_modules/js-yaml": { 3731 + "version": "4.1.1", 3732 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", 3733 + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", 3734 + "dev": true, 3735 + "license": "MIT", 3736 + "dependencies": { 3737 + "argparse": "^2.0.1" 3738 + }, 3739 + "bin": { 3740 + "js-yaml": "bin/js-yaml.js" 3741 + } 3742 + }, 3743 + "node_modules/jsesc": { 3744 + "version": "3.1.0", 3745 + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 3746 + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 3747 + "dev": true, 3748 + "license": "MIT", 3749 + "bin": { 3750 + "jsesc": "bin/jsesc" 3751 + }, 3752 + "engines": { 3753 + "node": ">=6" 3754 + } 3755 + }, 3756 + "node_modules/json-buffer": { 3757 + "version": "3.0.1", 3758 + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 3759 + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 3760 + "dev": true, 3761 + "license": "MIT" 3762 + }, 3763 + "node_modules/json-schema-traverse": { 3764 + "version": "0.4.1", 3765 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 3766 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 3767 + "dev": true, 3768 + "license": "MIT" 3769 + }, 3770 + "node_modules/json-stable-stringify-without-jsonify": { 3771 + "version": "1.0.1", 3772 + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 3773 + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 3774 + "dev": true, 3775 + "license": "MIT" 3776 + }, 3777 + "node_modules/json5": { 3778 + "version": "2.2.3", 3779 + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 3780 + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 3781 + "dev": true, 3782 + "license": "MIT", 3783 + "bin": { 3784 + "json5": "lib/cli.js" 3785 + }, 3786 + "engines": { 3787 + "node": ">=6" 3788 + } 3789 + }, 3790 + "node_modules/jsx-ast-utils": { 3791 + "version": "3.3.5", 3792 + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", 3793 + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", 3794 + "dev": true, 3795 + "license": "MIT", 3796 + "dependencies": { 3797 + "array-includes": "^3.1.6", 3798 + "array.prototype.flat": "^1.3.1", 3799 + "object.assign": "^4.1.4", 3800 + "object.values": "^1.1.6" 3801 + }, 3802 + "engines": { 3803 + "node": ">=4.0" 3804 + } 3805 + }, 3806 + "node_modules/keyv": { 3807 + "version": "4.5.4", 3808 + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 3809 + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 3810 + "dev": true, 3811 + "license": "MIT", 3812 + "dependencies": { 3813 + "json-buffer": "3.0.1" 3814 + } 3815 + }, 3816 + "node_modules/levn": { 3817 + "version": "0.4.1", 3818 + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 3819 + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 3820 + "dev": true, 3821 + "license": "MIT", 3822 + "dependencies": { 3823 + "prelude-ls": "^1.2.1", 3824 + "type-check": "~0.4.0" 3825 + }, 3826 + "engines": { 3827 + "node": ">= 0.8.0" 3828 + } 3829 + }, 3830 + "node_modules/locate-path": { 3831 + "version": "6.0.0", 3832 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 3833 + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 3834 + "dev": true, 3835 + "license": "MIT", 3836 + "dependencies": { 3837 + "p-locate": "^5.0.0" 3838 + }, 3839 + "engines": { 3840 + "node": ">=10" 3841 + }, 3842 + "funding": { 3843 + "url": "https://github.com/sponsors/sindresorhus" 3844 + } 3845 + }, 3846 + "node_modules/lodash.merge": { 3847 + "version": "4.6.2", 3848 + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 3849 + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 3850 + "dev": true, 3851 + "license": "MIT" 3852 + }, 3853 + "node_modules/loose-envify": { 3854 + "version": "1.4.0", 3855 + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 3856 + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 3857 + "dev": true, 3858 + "license": "MIT", 3859 + "dependencies": { 3860 + "js-tokens": "^3.0.0 || ^4.0.0" 3861 + }, 3862 + "bin": { 3863 + "loose-envify": "cli.js" 3864 + } 3865 + }, 3866 + "node_modules/lru-cache": { 3867 + "version": "5.1.1", 3868 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 3869 + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 3870 + "dev": true, 3871 + "license": "ISC", 3872 + "dependencies": { 3873 + "yallist": "^3.0.2" 3874 + } 3875 + }, 3876 + "node_modules/math-intrinsics": { 3877 + "version": "1.1.0", 3878 + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 3879 + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 3880 + "dev": true, 3881 + "license": "MIT", 3882 + "engines": { 3883 + "node": ">= 0.4" 3884 + } 3885 + }, 3886 + "node_modules/minimatch": { 3887 + "version": "3.1.2", 3888 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 3889 + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 3890 + "dev": true, 3891 + "license": "ISC", 3892 + "dependencies": { 3893 + "brace-expansion": "^1.1.7" 3894 + }, 3895 + "engines": { 3896 + "node": "*" 3897 + } 3898 + }, 3899 + "node_modules/ms": { 3900 + "version": "2.1.3", 3901 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 3902 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 3903 + "dev": true, 3904 + "license": "MIT" 3905 + }, 3906 + "node_modules/nanoid": { 3907 + "version": "3.3.11", 3908 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 3909 + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 3910 + "dev": true, 3911 + "funding": [ 3912 + { 3913 + "type": "github", 3914 + "url": "https://github.com/sponsors/ai" 3915 + } 3916 + ], 3917 + "license": "MIT", 3918 + "bin": { 3919 + "nanoid": "bin/nanoid.cjs" 3920 + }, 3921 + "engines": { 3922 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 3923 + } 3924 + }, 3925 + "node_modules/natural-compare": { 3926 + "version": "1.4.0", 3927 + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 3928 + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 3929 + "dev": true, 3930 + "license": "MIT" 3931 + }, 3932 + "node_modules/node-exports-info": { 3933 + "version": "1.6.0", 3934 + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", 3935 + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", 3936 + "dev": true, 3937 + "license": "MIT", 3938 + "dependencies": { 3939 + "array.prototype.flatmap": "^1.3.3", 3940 + "es-errors": "^1.3.0", 3941 + "object.entries": "^1.1.9", 3942 + "semver": "^6.3.1" 3943 + }, 3944 + "engines": { 3945 + "node": ">= 0.4" 3946 + }, 3947 + "funding": { 3948 + "url": "https://github.com/sponsors/ljharb" 3949 + } 3950 + }, 3951 + "node_modules/node-releases": { 3952 + "version": "2.0.27", 3953 + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", 3954 + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", 3955 + "dev": true, 3956 + "license": "MIT" 3957 + }, 3958 + "node_modules/object-assign": { 3959 + "version": "4.1.1", 3960 + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 3961 + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 3962 + "dev": true, 3963 + "license": "MIT", 3964 + "engines": { 3965 + "node": ">=0.10.0" 3966 + } 3967 + }, 3968 + "node_modules/object-inspect": { 3969 + "version": "1.13.4", 3970 + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", 3971 + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", 3972 + "dev": true, 3973 + "license": "MIT", 3974 + "engines": { 3975 + "node": ">= 0.4" 3976 + }, 3977 + "funding": { 3978 + "url": "https://github.com/sponsors/ljharb" 3979 + } 3980 + }, 3981 + "node_modules/object-keys": { 3982 + "version": "1.1.1", 3983 + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 3984 + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 3985 + "dev": true, 3986 + "license": "MIT", 3987 + "engines": { 3988 + "node": ">= 0.4" 3989 + } 3990 + }, 3991 + "node_modules/object.assign": { 3992 + "version": "4.1.7", 3993 + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", 3994 + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", 3995 + "dev": true, 3996 + "license": "MIT", 3997 + "dependencies": { 3998 + "call-bind": "^1.0.8", 3999 + "call-bound": "^1.0.3", 4000 + "define-properties": "^1.2.1", 4001 + "es-object-atoms": "^1.0.0", 4002 + "has-symbols": "^1.1.0", 4003 + "object-keys": "^1.1.1" 4004 + }, 4005 + "engines": { 4006 + "node": ">= 0.4" 4007 + }, 4008 + "funding": { 4009 + "url": "https://github.com/sponsors/ljharb" 4010 + } 4011 + }, 4012 + "node_modules/object.entries": { 4013 + "version": "1.1.9", 4014 + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", 4015 + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", 4016 + "dev": true, 4017 + "license": "MIT", 4018 + "dependencies": { 4019 + "call-bind": "^1.0.8", 4020 + "call-bound": "^1.0.4", 4021 + "define-properties": "^1.2.1", 4022 + "es-object-atoms": "^1.1.1" 4023 + }, 4024 + "engines": { 4025 + "node": ">= 0.4" 4026 + } 4027 + }, 4028 + "node_modules/object.fromentries": { 4029 + "version": "2.0.8", 4030 + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", 4031 + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", 4032 + "dev": true, 4033 + "license": "MIT", 4034 + "dependencies": { 4035 + "call-bind": "^1.0.7", 4036 + "define-properties": "^1.2.1", 4037 + "es-abstract": "^1.23.2", 4038 + "es-object-atoms": "^1.0.0" 4039 + }, 4040 + "engines": { 4041 + "node": ">= 0.4" 4042 + }, 4043 + "funding": { 4044 + "url": "https://github.com/sponsors/ljharb" 4045 + } 4046 + }, 4047 + "node_modules/object.values": { 4048 + "version": "1.2.1", 4049 + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", 4050 + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", 4051 + "dev": true, 4052 + "license": "MIT", 4053 + "dependencies": { 4054 + "call-bind": "^1.0.8", 4055 + "call-bound": "^1.0.3", 4056 + "define-properties": "^1.2.1", 4057 + "es-object-atoms": "^1.0.0" 4058 + }, 4059 + "engines": { 4060 + "node": ">= 0.4" 4061 + }, 4062 + "funding": { 4063 + "url": "https://github.com/sponsors/ljharb" 4064 + } 4065 + }, 4066 + "node_modules/optionator": { 4067 + "version": "0.9.4", 4068 + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 4069 + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 4070 + "dev": true, 4071 + "license": "MIT", 4072 + "dependencies": { 4073 + "deep-is": "^0.1.3", 4074 + "fast-levenshtein": "^2.0.6", 4075 + "levn": "^0.4.1", 4076 + "prelude-ls": "^1.2.1", 4077 + "type-check": "^0.4.0", 4078 + "word-wrap": "^1.2.5" 4079 + }, 4080 + "engines": { 4081 + "node": ">= 0.8.0" 4082 + } 4083 + }, 4084 + "node_modules/own-keys": { 4085 + "version": "1.0.1", 4086 + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", 4087 + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", 4088 + "dev": true, 4089 + "license": "MIT", 4090 + "dependencies": { 4091 + "get-intrinsic": "^1.2.6", 4092 + "object-keys": "^1.1.1", 4093 + "safe-push-apply": "^1.0.0" 4094 + }, 4095 + "engines": { 4096 + "node": ">= 0.4" 4097 + }, 4098 + "funding": { 4099 + "url": "https://github.com/sponsors/ljharb" 4100 + } 4101 + }, 4102 + "node_modules/p-limit": { 4103 + "version": "3.1.0", 4104 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 4105 + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 4106 + "dev": true, 4107 + "license": "MIT", 4108 + "dependencies": { 4109 + "yocto-queue": "^0.1.0" 4110 + }, 4111 + "engines": { 4112 + "node": ">=10" 4113 + }, 4114 + "funding": { 4115 + "url": "https://github.com/sponsors/sindresorhus" 4116 + } 4117 + }, 4118 + "node_modules/p-locate": { 4119 + "version": "5.0.0", 4120 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 4121 + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 4122 + "dev": true, 4123 + "license": "MIT", 4124 + "dependencies": { 4125 + "p-limit": "^3.0.2" 4126 + }, 4127 + "engines": { 4128 + "node": ">=10" 4129 + }, 4130 + "funding": { 4131 + "url": "https://github.com/sponsors/sindresorhus" 4132 + } 4133 + }, 4134 + "node_modules/parent-module": { 4135 + "version": "1.0.1", 4136 + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 4137 + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 4138 + "dev": true, 4139 + "license": "MIT", 4140 + "dependencies": { 4141 + "callsites": "^3.0.0" 4142 + }, 4143 + "engines": { 4144 + "node": ">=6" 4145 + } 4146 + }, 4147 + "node_modules/path-exists": { 4148 + "version": "4.0.0", 4149 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 4150 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 4151 + "dev": true, 4152 + "license": "MIT", 4153 + "engines": { 4154 + "node": ">=8" 4155 + } 4156 + }, 4157 + "node_modules/path-key": { 4158 + "version": "3.1.1", 4159 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 4160 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 4161 + "dev": true, 4162 + "license": "MIT", 4163 + "engines": { 4164 + "node": ">=8" 4165 + } 4166 + }, 4167 + "node_modules/path-parse": { 4168 + "version": "1.0.7", 4169 + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 4170 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 4171 + "dev": true, 4172 + "license": "MIT" 4173 + }, 4174 + "node_modules/picocolors": { 4175 + "version": "1.1.1", 4176 + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 4177 + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 4178 + "dev": true, 4179 + "license": "ISC" 4180 + }, 4181 + "node_modules/picomatch": { 4182 + "version": "4.0.3", 4183 + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 4184 + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 4185 + "dev": true, 4186 + "license": "MIT", 4187 + "engines": { 4188 + "node": ">=12" 4189 + }, 4190 + "funding": { 4191 + "url": "https://github.com/sponsors/jonschlinkert" 4192 + } 4193 + }, 4194 + "node_modules/possible-typed-array-names": { 4195 + "version": "1.1.0", 4196 + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", 4197 + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", 4198 + "dev": true, 4199 + "license": "MIT", 4200 + "engines": { 4201 + "node": ">= 0.4" 4202 + } 4203 + }, 4204 + "node_modules/postcss": { 4205 + "version": "8.5.6", 4206 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", 4207 + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", 4208 + "dev": true, 4209 + "funding": [ 4210 + { 4211 + "type": "opencollective", 4212 + "url": "https://opencollective.com/postcss/" 106 4213 }, 107 - "node_modules/@babel/generator": { 108 - "version": "7.27.5", 109 - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", 110 - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", 111 - "dev": true, 112 - "license": "MIT", 113 - "dependencies": { 114 - "@babel/parser": "^7.27.5", 115 - "@babel/types": "^7.27.3", 116 - "@jridgewell/gen-mapping": "^0.3.5", 117 - "@jridgewell/trace-mapping": "^0.3.25", 118 - "jsesc": "^3.0.2" 119 - }, 120 - "engines": { 121 - "node": ">=6.9.0" 122 - } 4214 + { 4215 + "type": "tidelift", 4216 + "url": "https://tidelift.com/funding/github/npm/postcss" 123 4217 }, 124 - "node_modules/@babel/helper-compilation-targets": { 125 - "version": "7.27.2", 126 - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", 127 - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", 128 - "dev": true, 129 - "license": "MIT", 130 - "dependencies": { 131 - "@babel/compat-data": "^7.27.2", 132 - "@babel/helper-validator-option": "^7.27.1", 133 - "browserslist": "^4.24.0", 134 - "lru-cache": "^5.1.1", 135 - "semver": "^6.3.1" 136 - }, 137 - "engines": { 138 - "node": ">=6.9.0" 139 - } 4218 + { 4219 + "type": "github", 4220 + "url": "https://github.com/sponsors/ai" 4221 + } 4222 + ], 4223 + "license": "MIT", 4224 + "dependencies": { 4225 + "nanoid": "^3.3.11", 4226 + "picocolors": "^1.1.1", 4227 + "source-map-js": "^1.2.1" 4228 + }, 4229 + "engines": { 4230 + "node": "^10 || ^12 || >=14" 4231 + } 4232 + }, 4233 + "node_modules/prelude-ls": { 4234 + "version": "1.2.1", 4235 + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 4236 + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 4237 + "dev": true, 4238 + "license": "MIT", 4239 + "engines": { 4240 + "node": ">= 0.8.0" 4241 + } 4242 + }, 4243 + "node_modules/prettier": { 4244 + "version": "3.8.1", 4245 + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", 4246 + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", 4247 + "dev": true, 4248 + "license": "MIT", 4249 + "bin": { 4250 + "prettier": "bin/prettier.cjs" 4251 + }, 4252 + "engines": { 4253 + "node": ">=14" 4254 + }, 4255 + "funding": { 4256 + "url": "https://github.com/prettier/prettier?sponsor=1" 4257 + } 4258 + }, 4259 + "node_modules/prop-types": { 4260 + "version": "15.8.1", 4261 + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 4262 + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 4263 + "dev": true, 4264 + "license": "MIT", 4265 + "dependencies": { 4266 + "loose-envify": "^1.4.0", 4267 + "object-assign": "^4.1.1", 4268 + "react-is": "^16.13.1" 4269 + } 4270 + }, 4271 + "node_modules/punycode": { 4272 + "version": "2.3.1", 4273 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 4274 + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 4275 + "dev": true, 4276 + "license": "MIT", 4277 + "engines": { 4278 + "node": ">=6" 4279 + } 4280 + }, 4281 + "node_modules/react": { 4282 + "version": "19.2.4", 4283 + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", 4284 + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", 4285 + "license": "MIT", 4286 + "engines": { 4287 + "node": ">=0.10.0" 4288 + } 4289 + }, 4290 + "node_modules/react-dom": { 4291 + "version": "19.2.4", 4292 + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", 4293 + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", 4294 + "license": "MIT", 4295 + "dependencies": { 4296 + "scheduler": "^0.27.0" 4297 + }, 4298 + "peerDependencies": { 4299 + "react": "^19.2.4" 4300 + } 4301 + }, 4302 + "node_modules/react-is": { 4303 + "version": "16.13.1", 4304 + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 4305 + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 4306 + "dev": true, 4307 + "license": "MIT" 4308 + }, 4309 + "node_modules/react-refresh": { 4310 + "version": "0.18.0", 4311 + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", 4312 + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", 4313 + "dev": true, 4314 + "license": "MIT", 4315 + "engines": { 4316 + "node": ">=0.10.0" 4317 + } 4318 + }, 4319 + "node_modules/reflect.getprototypeof": { 4320 + "version": "1.0.10", 4321 + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", 4322 + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", 4323 + "dev": true, 4324 + "license": "MIT", 4325 + "dependencies": { 4326 + "call-bind": "^1.0.8", 4327 + "define-properties": "^1.2.1", 4328 + "es-abstract": "^1.23.9", 4329 + "es-errors": "^1.3.0", 4330 + "es-object-atoms": "^1.0.0", 4331 + "get-intrinsic": "^1.2.7", 4332 + "get-proto": "^1.0.1", 4333 + "which-builtin-type": "^1.2.1" 4334 + }, 4335 + "engines": { 4336 + "node": ">= 0.4" 4337 + }, 4338 + "funding": { 4339 + "url": "https://github.com/sponsors/ljharb" 4340 + } 4341 + }, 4342 + "node_modules/regexp.prototype.flags": { 4343 + "version": "1.5.4", 4344 + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", 4345 + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", 4346 + "dev": true, 4347 + "license": "MIT", 4348 + "dependencies": { 4349 + "call-bind": "^1.0.8", 4350 + "define-properties": "^1.2.1", 4351 + "es-errors": "^1.3.0", 4352 + "get-proto": "^1.0.1", 4353 + "gopd": "^1.2.0", 4354 + "set-function-name": "^2.0.2" 4355 + }, 4356 + "engines": { 4357 + "node": ">= 0.4" 4358 + }, 4359 + "funding": { 4360 + "url": "https://github.com/sponsors/ljharb" 4361 + } 4362 + }, 4363 + "node_modules/resolve": { 4364 + "version": "2.0.0-next.6", 4365 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", 4366 + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", 4367 + "dev": true, 4368 + "license": "MIT", 4369 + "dependencies": { 4370 + "es-errors": "^1.3.0", 4371 + "is-core-module": "^2.16.1", 4372 + "node-exports-info": "^1.6.0", 4373 + "object-keys": "^1.1.1", 4374 + "path-parse": "^1.0.7", 4375 + "supports-preserve-symlinks-flag": "^1.0.0" 4376 + }, 4377 + "bin": { 4378 + "resolve": "bin/resolve" 4379 + }, 4380 + "engines": { 4381 + "node": ">= 0.4" 4382 + }, 4383 + "funding": { 4384 + "url": "https://github.com/sponsors/ljharb" 4385 + } 4386 + }, 4387 + "node_modules/resolve-from": { 4388 + "version": "4.0.0", 4389 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 4390 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 4391 + "dev": true, 4392 + "license": "MIT", 4393 + "engines": { 4394 + "node": ">=4" 4395 + } 4396 + }, 4397 + "node_modules/rollup": { 4398 + "version": "4.57.1", 4399 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", 4400 + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", 4401 + "dev": true, 4402 + "license": "MIT", 4403 + "dependencies": { 4404 + "@types/estree": "1.0.8" 4405 + }, 4406 + "bin": { 4407 + "rollup": "dist/bin/rollup" 4408 + }, 4409 + "engines": { 4410 + "node": ">=18.0.0", 4411 + "npm": ">=8.0.0" 4412 + }, 4413 + "optionalDependencies": { 4414 + "@rollup/rollup-android-arm-eabi": "4.57.1", 4415 + "@rollup/rollup-android-arm64": "4.57.1", 4416 + "@rollup/rollup-darwin-arm64": "4.57.1", 4417 + "@rollup/rollup-darwin-x64": "4.57.1", 4418 + "@rollup/rollup-freebsd-arm64": "4.57.1", 4419 + "@rollup/rollup-freebsd-x64": "4.57.1", 4420 + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", 4421 + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", 4422 + "@rollup/rollup-linux-arm64-gnu": "4.57.1", 4423 + "@rollup/rollup-linux-arm64-musl": "4.57.1", 4424 + "@rollup/rollup-linux-loong64-gnu": "4.57.1", 4425 + "@rollup/rollup-linux-loong64-musl": "4.57.1", 4426 + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", 4427 + "@rollup/rollup-linux-ppc64-musl": "4.57.1", 4428 + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", 4429 + "@rollup/rollup-linux-riscv64-musl": "4.57.1", 4430 + "@rollup/rollup-linux-s390x-gnu": "4.57.1", 4431 + "@rollup/rollup-linux-x64-gnu": "4.57.1", 4432 + "@rollup/rollup-linux-x64-musl": "4.57.1", 4433 + "@rollup/rollup-openbsd-x64": "4.57.1", 4434 + "@rollup/rollup-openharmony-arm64": "4.57.1", 4435 + "@rollup/rollup-win32-arm64-msvc": "4.57.1", 4436 + "@rollup/rollup-win32-ia32-msvc": "4.57.1", 4437 + "@rollup/rollup-win32-x64-gnu": "4.57.1", 4438 + "@rollup/rollup-win32-x64-msvc": "4.57.1", 4439 + "fsevents": "~2.3.2" 4440 + } 4441 + }, 4442 + "node_modules/safe-array-concat": { 4443 + "version": "1.1.3", 4444 + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", 4445 + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", 4446 + "dev": true, 4447 + "license": "MIT", 4448 + "dependencies": { 4449 + "call-bind": "^1.0.8", 4450 + "call-bound": "^1.0.2", 4451 + "get-intrinsic": "^1.2.6", 4452 + "has-symbols": "^1.1.0", 4453 + "isarray": "^2.0.5" 4454 + }, 4455 + "engines": { 4456 + "node": ">=0.4" 4457 + }, 4458 + "funding": { 4459 + "url": "https://github.com/sponsors/ljharb" 4460 + } 4461 + }, 4462 + "node_modules/safe-push-apply": { 4463 + "version": "1.0.0", 4464 + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", 4465 + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", 4466 + "dev": true, 4467 + "license": "MIT", 4468 + "dependencies": { 4469 + "es-errors": "^1.3.0", 4470 + "isarray": "^2.0.5" 4471 + }, 4472 + "engines": { 4473 + "node": ">= 0.4" 4474 + }, 4475 + "funding": { 4476 + "url": "https://github.com/sponsors/ljharb" 4477 + } 4478 + }, 4479 + "node_modules/safe-regex-test": { 4480 + "version": "1.1.0", 4481 + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", 4482 + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", 4483 + "dev": true, 4484 + "license": "MIT", 4485 + "dependencies": { 4486 + "call-bound": "^1.0.2", 4487 + "es-errors": "^1.3.0", 4488 + "is-regex": "^1.2.1" 4489 + }, 4490 + "engines": { 4491 + "node": ">= 0.4" 4492 + }, 4493 + "funding": { 4494 + "url": "https://github.com/sponsors/ljharb" 4495 + } 4496 + }, 4497 + "node_modules/scheduler": { 4498 + "version": "0.27.0", 4499 + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", 4500 + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", 4501 + "license": "MIT" 4502 + }, 4503 + "node_modules/semver": { 4504 + "version": "6.3.1", 4505 + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 4506 + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 4507 + "dev": true, 4508 + "license": "ISC", 4509 + "bin": { 4510 + "semver": "bin/semver.js" 4511 + } 4512 + }, 4513 + "node_modules/set-function-length": { 4514 + "version": "1.2.2", 4515 + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 4516 + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 4517 + "dev": true, 4518 + "license": "MIT", 4519 + "dependencies": { 4520 + "define-data-property": "^1.1.4", 4521 + "es-errors": "^1.3.0", 4522 + "function-bind": "^1.1.2", 4523 + "get-intrinsic": "^1.2.4", 4524 + "gopd": "^1.0.1", 4525 + "has-property-descriptors": "^1.0.2" 4526 + }, 4527 + "engines": { 4528 + "node": ">= 0.4" 4529 + } 4530 + }, 4531 + "node_modules/set-function-name": { 4532 + "version": "2.0.2", 4533 + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", 4534 + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", 4535 + "dev": true, 4536 + "license": "MIT", 4537 + "dependencies": { 4538 + "define-data-property": "^1.1.4", 4539 + "es-errors": "^1.3.0", 4540 + "functions-have-names": "^1.2.3", 4541 + "has-property-descriptors": "^1.0.2" 4542 + }, 4543 + "engines": { 4544 + "node": ">= 0.4" 4545 + } 4546 + }, 4547 + "node_modules/set-proto": { 4548 + "version": "1.0.0", 4549 + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", 4550 + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", 4551 + "dev": true, 4552 + "license": "MIT", 4553 + "dependencies": { 4554 + "dunder-proto": "^1.0.1", 4555 + "es-errors": "^1.3.0", 4556 + "es-object-atoms": "^1.0.0" 4557 + }, 4558 + "engines": { 4559 + "node": ">= 0.4" 4560 + } 4561 + }, 4562 + "node_modules/shebang-command": { 4563 + "version": "2.0.0", 4564 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 4565 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 4566 + "dev": true, 4567 + "license": "MIT", 4568 + "dependencies": { 4569 + "shebang-regex": "^3.0.0" 4570 + }, 4571 + "engines": { 4572 + "node": ">=8" 4573 + } 4574 + }, 4575 + "node_modules/shebang-regex": { 4576 + "version": "3.0.0", 4577 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 4578 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 4579 + "dev": true, 4580 + "license": "MIT", 4581 + "engines": { 4582 + "node": ">=8" 4583 + } 4584 + }, 4585 + "node_modules/side-channel": { 4586 + "version": "1.1.0", 4587 + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", 4588 + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 4589 + "dev": true, 4590 + "license": "MIT", 4591 + "dependencies": { 4592 + "es-errors": "^1.3.0", 4593 + "object-inspect": "^1.13.3", 4594 + "side-channel-list": "^1.0.0", 4595 + "side-channel-map": "^1.0.1", 4596 + "side-channel-weakmap": "^1.0.2" 4597 + }, 4598 + "engines": { 4599 + "node": ">= 0.4" 4600 + }, 4601 + "funding": { 4602 + "url": "https://github.com/sponsors/ljharb" 4603 + } 4604 + }, 4605 + "node_modules/side-channel-list": { 4606 + "version": "1.0.0", 4607 + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", 4608 + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 4609 + "dev": true, 4610 + "license": "MIT", 4611 + "dependencies": { 4612 + "es-errors": "^1.3.0", 4613 + "object-inspect": "^1.13.3" 4614 + }, 4615 + "engines": { 4616 + "node": ">= 0.4" 4617 + }, 4618 + "funding": { 4619 + "url": "https://github.com/sponsors/ljharb" 4620 + } 4621 + }, 4622 + "node_modules/side-channel-map": { 4623 + "version": "1.0.1", 4624 + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", 4625 + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 4626 + "dev": true, 4627 + "license": "MIT", 4628 + "dependencies": { 4629 + "call-bound": "^1.0.2", 4630 + "es-errors": "^1.3.0", 4631 + "get-intrinsic": "^1.2.5", 4632 + "object-inspect": "^1.13.3" 4633 + }, 4634 + "engines": { 4635 + "node": ">= 0.4" 4636 + }, 4637 + "funding": { 4638 + "url": "https://github.com/sponsors/ljharb" 4639 + } 4640 + }, 4641 + "node_modules/side-channel-weakmap": { 4642 + "version": "1.0.2", 4643 + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", 4644 + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 4645 + "dev": true, 4646 + "license": "MIT", 4647 + "dependencies": { 4648 + "call-bound": "^1.0.2", 4649 + "es-errors": "^1.3.0", 4650 + "get-intrinsic": "^1.2.5", 4651 + "object-inspect": "^1.13.3", 4652 + "side-channel-map": "^1.0.1" 4653 + }, 4654 + "engines": { 4655 + "node": ">= 0.4" 4656 + }, 4657 + "funding": { 4658 + "url": "https://github.com/sponsors/ljharb" 4659 + } 4660 + }, 4661 + "node_modules/source-map-js": { 4662 + "version": "1.2.1", 4663 + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 4664 + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 4665 + "dev": true, 4666 + "license": "BSD-3-Clause", 4667 + "engines": { 4668 + "node": ">=0.10.0" 4669 + } 4670 + }, 4671 + "node_modules/stop-iteration-iterator": { 4672 + "version": "1.1.0", 4673 + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", 4674 + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", 4675 + "dev": true, 4676 + "license": "MIT", 4677 + "dependencies": { 4678 + "es-errors": "^1.3.0", 4679 + "internal-slot": "^1.1.0" 4680 + }, 4681 + "engines": { 4682 + "node": ">= 0.4" 4683 + } 4684 + }, 4685 + "node_modules/string.prototype.matchall": { 4686 + "version": "4.0.12", 4687 + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", 4688 + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", 4689 + "dev": true, 4690 + "license": "MIT", 4691 + "dependencies": { 4692 + "call-bind": "^1.0.8", 4693 + "call-bound": "^1.0.3", 4694 + "define-properties": "^1.2.1", 4695 + "es-abstract": "^1.23.6", 4696 + "es-errors": "^1.3.0", 4697 + "es-object-atoms": "^1.0.0", 4698 + "get-intrinsic": "^1.2.6", 4699 + "gopd": "^1.2.0", 4700 + "has-symbols": "^1.1.0", 4701 + "internal-slot": "^1.1.0", 4702 + "regexp.prototype.flags": "^1.5.3", 4703 + "set-function-name": "^2.0.2", 4704 + "side-channel": "^1.1.0" 4705 + }, 4706 + "engines": { 4707 + "node": ">= 0.4" 4708 + }, 4709 + "funding": { 4710 + "url": "https://github.com/sponsors/ljharb" 4711 + } 4712 + }, 4713 + "node_modules/string.prototype.repeat": { 4714 + "version": "1.0.0", 4715 + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", 4716 + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", 4717 + "dev": true, 4718 + "license": "MIT", 4719 + "dependencies": { 4720 + "define-properties": "^1.1.3", 4721 + "es-abstract": "^1.17.5" 4722 + } 4723 + }, 4724 + "node_modules/string.prototype.trim": { 4725 + "version": "1.2.10", 4726 + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", 4727 + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", 4728 + "dev": true, 4729 + "license": "MIT", 4730 + "dependencies": { 4731 + "call-bind": "^1.0.8", 4732 + "call-bound": "^1.0.2", 4733 + "define-data-property": "^1.1.4", 4734 + "define-properties": "^1.2.1", 4735 + "es-abstract": "^1.23.5", 4736 + "es-object-atoms": "^1.0.0", 4737 + "has-property-descriptors": "^1.0.2" 4738 + }, 4739 + "engines": { 4740 + "node": ">= 0.4" 4741 + }, 4742 + "funding": { 4743 + "url": "https://github.com/sponsors/ljharb" 4744 + } 4745 + }, 4746 + "node_modules/string.prototype.trimend": { 4747 + "version": "1.0.9", 4748 + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", 4749 + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", 4750 + "dev": true, 4751 + "license": "MIT", 4752 + "dependencies": { 4753 + "call-bind": "^1.0.8", 4754 + "call-bound": "^1.0.2", 4755 + "define-properties": "^1.2.1", 4756 + "es-object-atoms": "^1.0.0" 4757 + }, 4758 + "engines": { 4759 + "node": ">= 0.4" 4760 + }, 4761 + "funding": { 4762 + "url": "https://github.com/sponsors/ljharb" 4763 + } 4764 + }, 4765 + "node_modules/string.prototype.trimstart": { 4766 + "version": "1.0.8", 4767 + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", 4768 + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", 4769 + "dev": true, 4770 + "license": "MIT", 4771 + "dependencies": { 4772 + "call-bind": "^1.0.7", 4773 + "define-properties": "^1.2.1", 4774 + "es-object-atoms": "^1.0.0" 4775 + }, 4776 + "engines": { 4777 + "node": ">= 0.4" 4778 + }, 4779 + "funding": { 4780 + "url": "https://github.com/sponsors/ljharb" 4781 + } 4782 + }, 4783 + "node_modules/strip-json-comments": { 4784 + "version": "3.1.1", 4785 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 4786 + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 4787 + "dev": true, 4788 + "license": "MIT", 4789 + "engines": { 4790 + "node": ">=8" 4791 + }, 4792 + "funding": { 4793 + "url": "https://github.com/sponsors/sindresorhus" 4794 + } 4795 + }, 4796 + "node_modules/supports-color": { 4797 + "version": "7.2.0", 4798 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 4799 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 4800 + "dev": true, 4801 + "license": "MIT", 4802 + "dependencies": { 4803 + "has-flag": "^4.0.0" 4804 + }, 4805 + "engines": { 4806 + "node": ">=8" 4807 + } 4808 + }, 4809 + "node_modules/supports-preserve-symlinks-flag": { 4810 + "version": "1.0.0", 4811 + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 4812 + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 4813 + "dev": true, 4814 + "license": "MIT", 4815 + "engines": { 4816 + "node": ">= 0.4" 4817 + }, 4818 + "funding": { 4819 + "url": "https://github.com/sponsors/ljharb" 4820 + } 4821 + }, 4822 + "node_modules/swr": { 4823 + "version": "2.4.0", 4824 + "resolved": "https://registry.npmjs.org/swr/-/swr-2.4.0.tgz", 4825 + "integrity": "sha512-sUlC20T8EOt1pHmDiqueUWMmRRX03W7w5YxovWX7VR2KHEPCTMly85x05vpkP5i6Bu4h44ePSMD9Tc+G2MItFw==", 4826 + "license": "MIT", 4827 + "dependencies": { 4828 + "dequal": "^2.0.3", 4829 + "use-sync-external-store": "^1.6.0" 4830 + }, 4831 + "peerDependencies": { 4832 + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 4833 + } 4834 + }, 4835 + "node_modules/tinyglobby": { 4836 + "version": "0.2.15", 4837 + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", 4838 + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", 4839 + "dev": true, 4840 + "license": "MIT", 4841 + "dependencies": { 4842 + "fdir": "^6.5.0", 4843 + "picomatch": "^4.0.3" 4844 + }, 4845 + "engines": { 4846 + "node": ">=12.0.0" 4847 + }, 4848 + "funding": { 4849 + "url": "https://github.com/sponsors/SuperchupuDev" 4850 + } 4851 + }, 4852 + "node_modules/ts-api-utils": { 4853 + "version": "2.4.0", 4854 + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", 4855 + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", 4856 + "dev": true, 4857 + "license": "MIT", 4858 + "engines": { 4859 + "node": ">=18.12" 4860 + }, 4861 + "peerDependencies": { 4862 + "typescript": ">=4.8.4" 4863 + } 4864 + }, 4865 + "node_modules/type-check": { 4866 + "version": "0.4.0", 4867 + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 4868 + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 4869 + "dev": true, 4870 + "license": "MIT", 4871 + "dependencies": { 4872 + "prelude-ls": "^1.2.1" 4873 + }, 4874 + "engines": { 4875 + "node": ">= 0.8.0" 4876 + } 4877 + }, 4878 + "node_modules/typed-array-buffer": { 4879 + "version": "1.0.3", 4880 + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", 4881 + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", 4882 + "dev": true, 4883 + "license": "MIT", 4884 + "dependencies": { 4885 + "call-bound": "^1.0.3", 4886 + "es-errors": "^1.3.0", 4887 + "is-typed-array": "^1.1.14" 4888 + }, 4889 + "engines": { 4890 + "node": ">= 0.4" 4891 + } 4892 + }, 4893 + "node_modules/typed-array-byte-length": { 4894 + "version": "1.0.3", 4895 + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", 4896 + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", 4897 + "dev": true, 4898 + "license": "MIT", 4899 + "dependencies": { 4900 + "call-bind": "^1.0.8", 4901 + "for-each": "^0.3.3", 4902 + "gopd": "^1.2.0", 4903 + "has-proto": "^1.2.0", 4904 + "is-typed-array": "^1.1.14" 4905 + }, 4906 + "engines": { 4907 + "node": ">= 0.4" 4908 + }, 4909 + "funding": { 4910 + "url": "https://github.com/sponsors/ljharb" 4911 + } 4912 + }, 4913 + "node_modules/typed-array-byte-offset": { 4914 + "version": "1.0.4", 4915 + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", 4916 + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", 4917 + "dev": true, 4918 + "license": "MIT", 4919 + "dependencies": { 4920 + "available-typed-arrays": "^1.0.7", 4921 + "call-bind": "^1.0.8", 4922 + "for-each": "^0.3.3", 4923 + "gopd": "^1.2.0", 4924 + "has-proto": "^1.2.0", 4925 + "is-typed-array": "^1.1.15", 4926 + "reflect.getprototypeof": "^1.0.9" 4927 + }, 4928 + "engines": { 4929 + "node": ">= 0.4" 4930 + }, 4931 + "funding": { 4932 + "url": "https://github.com/sponsors/ljharb" 4933 + } 4934 + }, 4935 + "node_modules/typed-array-length": { 4936 + "version": "1.0.7", 4937 + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", 4938 + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", 4939 + "dev": true, 4940 + "license": "MIT", 4941 + "dependencies": { 4942 + "call-bind": "^1.0.7", 4943 + "for-each": "^0.3.3", 4944 + "gopd": "^1.0.1", 4945 + "is-typed-array": "^1.1.13", 4946 + "possible-typed-array-names": "^1.0.0", 4947 + "reflect.getprototypeof": "^1.0.6" 4948 + }, 4949 + "engines": { 4950 + "node": ">= 0.4" 4951 + }, 4952 + "funding": { 4953 + "url": "https://github.com/sponsors/ljharb" 4954 + } 4955 + }, 4956 + "node_modules/typescript": { 4957 + "version": "5.9.3", 4958 + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", 4959 + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", 4960 + "dev": true, 4961 + "license": "Apache-2.0", 4962 + "bin": { 4963 + "tsc": "bin/tsc", 4964 + "tsserver": "bin/tsserver" 4965 + }, 4966 + "engines": { 4967 + "node": ">=14.17" 4968 + } 4969 + }, 4970 + "node_modules/typescript-eslint": { 4971 + "version": "8.56.0", 4972 + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.0.tgz", 4973 + "integrity": "sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg==", 4974 + "dev": true, 4975 + "license": "MIT", 4976 + "dependencies": { 4977 + "@typescript-eslint/eslint-plugin": "8.56.0", 4978 + "@typescript-eslint/parser": "8.56.0", 4979 + "@typescript-eslint/typescript-estree": "8.56.0", 4980 + "@typescript-eslint/utils": "8.56.0" 4981 + }, 4982 + "engines": { 4983 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 4984 + }, 4985 + "funding": { 4986 + "type": "opencollective", 4987 + "url": "https://opencollective.com/typescript-eslint" 4988 + }, 4989 + "peerDependencies": { 4990 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", 4991 + "typescript": ">=4.8.4 <6.0.0" 4992 + } 4993 + }, 4994 + "node_modules/unbox-primitive": { 4995 + "version": "1.1.0", 4996 + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", 4997 + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", 4998 + "dev": true, 4999 + "license": "MIT", 5000 + "dependencies": { 5001 + "call-bound": "^1.0.3", 5002 + "has-bigints": "^1.0.2", 5003 + "has-symbols": "^1.1.0", 5004 + "which-boxed-primitive": "^1.1.1" 5005 + }, 5006 + "engines": { 5007 + "node": ">= 0.4" 5008 + }, 5009 + "funding": { 5010 + "url": "https://github.com/sponsors/ljharb" 5011 + } 5012 + }, 5013 + "node_modules/undici-types": { 5014 + "version": "7.16.0", 5015 + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", 5016 + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", 5017 + "dev": true, 5018 + "license": "MIT" 5019 + }, 5020 + "node_modules/update-browserslist-db": { 5021 + "version": "1.2.3", 5022 + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", 5023 + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", 5024 + "dev": true, 5025 + "funding": [ 5026 + { 5027 + "type": "opencollective", 5028 + "url": "https://opencollective.com/browserslist" 140 5029 }, 141 - "node_modules/@babel/helper-module-imports": { 142 - "version": "7.27.1", 143 - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", 144 - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", 145 - "dev": true, 146 - "license": "MIT", 147 - "dependencies": { 148 - "@babel/traverse": "^7.27.1", 149 - "@babel/types": "^7.27.1" 150 - }, 151 - "engines": { 152 - "node": ">=6.9.0" 153 - } 5030 + { 5031 + "type": "tidelift", 5032 + "url": "https://tidelift.com/funding/github/npm/browserslist" 154 5033 }, 155 - "node_modules/@babel/helper-module-transforms": { 156 - "version": "7.27.3", 157 - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", 158 - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", 159 - "dev": true, 160 - "license": "MIT", 161 - "dependencies": { 162 - "@babel/helper-module-imports": "^7.27.1", 163 - "@babel/helper-validator-identifier": "^7.27.1", 164 - "@babel/traverse": "^7.27.3" 165 - }, 166 - "engines": { 167 - "node": ">=6.9.0" 168 - }, 169 - "peerDependencies": { 170 - "@babel/core": "^7.0.0" 171 - } 5034 + { 5035 + "type": "github", 5036 + "url": "https://github.com/sponsors/ai" 5037 + } 5038 + ], 5039 + "license": "MIT", 5040 + "dependencies": { 5041 + "escalade": "^3.2.0", 5042 + "picocolors": "^1.1.1" 5043 + }, 5044 + "bin": { 5045 + "update-browserslist-db": "cli.js" 5046 + }, 5047 + "peerDependencies": { 5048 + "browserslist": ">= 4.21.0" 5049 + } 5050 + }, 5051 + "node_modules/uri-js": { 5052 + "version": "4.4.1", 5053 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 5054 + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 5055 + "dev": true, 5056 + "license": "BSD-2-Clause", 5057 + "dependencies": { 5058 + "punycode": "^2.1.0" 5059 + } 5060 + }, 5061 + "node_modules/use-sync-external-store": { 5062 + "version": "1.6.0", 5063 + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", 5064 + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", 5065 + "license": "MIT", 5066 + "peerDependencies": { 5067 + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 5068 + } 5069 + }, 5070 + "node_modules/vite": { 5071 + "version": "7.3.1", 5072 + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", 5073 + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", 5074 + "dev": true, 5075 + "license": "MIT", 5076 + "dependencies": { 5077 + "esbuild": "^0.27.0", 5078 + "fdir": "^6.5.0", 5079 + "picomatch": "^4.0.3", 5080 + "postcss": "^8.5.6", 5081 + "rollup": "^4.43.0", 5082 + "tinyglobby": "^0.2.15" 5083 + }, 5084 + "bin": { 5085 + "vite": "bin/vite.js" 5086 + }, 5087 + "engines": { 5088 + "node": "^20.19.0 || >=22.12.0" 5089 + }, 5090 + "funding": { 5091 + "url": "https://github.com/vitejs/vite?sponsor=1" 5092 + }, 5093 + "optionalDependencies": { 5094 + "fsevents": "~2.3.3" 5095 + }, 5096 + "peerDependencies": { 5097 + "@types/node": "^20.19.0 || >=22.12.0", 5098 + "jiti": ">=1.21.0", 5099 + "less": "^4.0.0", 5100 + "lightningcss": "^1.21.0", 5101 + "sass": "^1.70.0", 5102 + "sass-embedded": "^1.70.0", 5103 + "stylus": ">=0.54.8", 5104 + "sugarss": "^5.0.0", 5105 + "terser": "^5.16.0", 5106 + "tsx": "^4.8.1", 5107 + "yaml": "^2.4.2" 5108 + }, 5109 + "peerDependenciesMeta": { 5110 + "@types/node": { 5111 + "optional": true 172 5112 }, 173 - "node_modules/@babel/helper-plugin-utils": { 174 - "version": "7.27.1", 175 - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", 176 - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", 177 - "dev": true, 178 - "license": "MIT", 179 - "engines": { 180 - "node": ">=6.9.0" 181 - } 5113 + "jiti": { 5114 + "optional": true 182 5115 }, 183 - "node_modules/@babel/helper-string-parser": { 184 - "version": "7.27.1", 185 - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", 186 - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", 187 - "dev": true, 188 - "license": "MIT", 189 - "engines": { 190 - "node": ">=6.9.0" 191 - } 5116 + "less": { 5117 + "optional": true 192 5118 }, 193 - "node_modules/@babel/helper-validator-identifier": { 194 - "version": "7.27.1", 195 - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", 196 - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", 197 - "dev": true, 198 - "license": "MIT", 199 - "engines": { 200 - "node": ">=6.9.0" 201 - } 5119 + "lightningcss": { 5120 + "optional": true 202 5121 }, 203 - "node_modules/@babel/helper-validator-option": { 204 - "version": "7.27.1", 205 - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", 206 - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", 207 - "dev": true, 208 - "license": "MIT", 209 - "engines": { 210 - "node": ">=6.9.0" 211 - } 5122 + "sass": { 5123 + "optional": true 212 5124 }, 213 - "node_modules/@babel/helpers": { 214 - "version": "7.27.6", 215 - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", 216 - "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", 217 - "dev": true, 218 - "license": "MIT", 219 - "dependencies": { 220 - "@babel/template": "^7.27.2", 221 - "@babel/types": "^7.27.6" 222 - }, 223 - "engines": { 224 - "node": ">=6.9.0" 225 - } 5125 + "sass-embedded": { 5126 + "optional": true 226 5127 }, 227 - "node_modules/@babel/parser": { 228 - "version": "7.27.5", 229 - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", 230 - "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", 231 - "dev": true, 232 - "license": "MIT", 233 - "dependencies": { 234 - "@babel/types": "^7.27.3" 235 - }, 236 - "bin": { 237 - "parser": "bin/babel-parser.js" 238 - }, 239 - "engines": { 240 - "node": ">=6.0.0" 241 - } 5128 + "stylus": { 5129 + "optional": true 242 5130 }, 243 - "node_modules/@babel/plugin-transform-react-jsx-self": { 244 - "version": "7.27.1", 245 - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", 246 - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", 247 - "dev": true, 248 - "license": "MIT", 249 - "dependencies": { 250 - "@babel/helper-plugin-utils": "^7.27.1" 251 - }, 252 - "engines": { 253 - "node": ">=6.9.0" 254 - }, 255 - "peerDependencies": { 256 - "@babel/core": "^7.0.0-0" 257 - } 258 - }, 259 - "node_modules/@babel/plugin-transform-react-jsx-source": { 260 - "version": "7.27.1", 261 - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", 262 - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", 263 - "dev": true, 264 - "license": "MIT", 265 - "dependencies": { 266 - "@babel/helper-plugin-utils": "^7.27.1" 267 - }, 268 - "engines": { 269 - "node": ">=6.9.0" 270 - }, 271 - "peerDependencies": { 272 - "@babel/core": "^7.0.0-0" 273 - } 274 - }, 275 - "node_modules/@babel/template": { 276 - "version": "7.27.2", 277 - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", 278 - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", 279 - "dev": true, 280 - "license": "MIT", 281 - "dependencies": { 282 - "@babel/code-frame": "^7.27.1", 283 - "@babel/parser": "^7.27.2", 284 - "@babel/types": "^7.27.1" 285 - }, 286 - "engines": { 287 - "node": ">=6.9.0" 288 - } 289 - }, 290 - "node_modules/@babel/traverse": { 291 - "version": "7.27.4", 292 - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", 293 - "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", 294 - "dev": true, 295 - "license": "MIT", 296 - "dependencies": { 297 - "@babel/code-frame": "^7.27.1", 298 - "@babel/generator": "^7.27.3", 299 - "@babel/parser": "^7.27.4", 300 - "@babel/template": "^7.27.2", 301 - "@babel/types": "^7.27.3", 302 - "debug": "^4.3.1", 303 - "globals": "^11.1.0" 304 - }, 305 - "engines": { 306 - "node": ">=6.9.0" 307 - } 308 - }, 309 - "node_modules/@babel/traverse/node_modules/globals": { 310 - "version": "11.12.0", 311 - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 312 - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 313 - "dev": true, 314 - "license": "MIT", 315 - "engines": { 316 - "node": ">=4" 317 - } 318 - }, 319 - "node_modules/@babel/types": { 320 - "version": "7.27.6", 321 - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", 322 - "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", 323 - "dev": true, 324 - "license": "MIT", 325 - "dependencies": { 326 - "@babel/helper-string-parser": "^7.27.1", 327 - "@babel/helper-validator-identifier": "^7.27.1" 328 - }, 329 - "engines": { 330 - "node": ">=6.9.0" 331 - } 332 - }, 333 - "node_modules/@esbuild/aix-ppc64": { 334 - "version": "0.25.5", 335 - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", 336 - "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", 337 - "cpu": [ 338 - "ppc64" 339 - ], 340 - "dev": true, 341 - "license": "MIT", 342 - "optional": true, 343 - "os": [ 344 - "aix" 345 - ], 346 - "engines": { 347 - "node": ">=18" 348 - } 349 - }, 350 - "node_modules/@esbuild/android-arm": { 351 - "version": "0.25.5", 352 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", 353 - "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", 354 - "cpu": [ 355 - "arm" 356 - ], 357 - "dev": true, 358 - "license": "MIT", 359 - "optional": true, 360 - "os": [ 361 - "android" 362 - ], 363 - "engines": { 364 - "node": ">=18" 365 - } 366 - }, 367 - "node_modules/@esbuild/android-arm64": { 368 - "version": "0.25.5", 369 - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", 370 - "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", 371 - "cpu": [ 372 - "arm64" 373 - ], 374 - "dev": true, 375 - "license": "MIT", 376 - "optional": true, 377 - "os": [ 378 - "android" 379 - ], 380 - "engines": { 381 - "node": ">=18" 382 - } 383 - }, 384 - "node_modules/@esbuild/android-x64": { 385 - "version": "0.25.5", 386 - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", 387 - "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", 388 - "cpu": [ 389 - "x64" 390 - ], 391 - "dev": true, 392 - "license": "MIT", 393 - "optional": true, 394 - "os": [ 395 - "android" 396 - ], 397 - "engines": { 398 - "node": ">=18" 399 - } 400 - }, 401 - "node_modules/@esbuild/darwin-arm64": { 402 - "version": "0.25.5", 403 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", 404 - "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", 405 - "cpu": [ 406 - "arm64" 407 - ], 408 - "dev": true, 409 - "license": "MIT", 410 - "optional": true, 411 - "os": [ 412 - "darwin" 413 - ], 414 - "engines": { 415 - "node": ">=18" 416 - } 417 - }, 418 - "node_modules/@esbuild/darwin-x64": { 419 - "version": "0.25.5", 420 - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", 421 - "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", 422 - "cpu": [ 423 - "x64" 424 - ], 425 - "dev": true, 426 - "license": "MIT", 427 - "optional": true, 428 - "os": [ 429 - "darwin" 430 - ], 431 - "engines": { 432 - "node": ">=18" 433 - } 5131 + "sugarss": { 5132 + "optional": true 434 5133 }, 435 - "node_modules/@esbuild/freebsd-arm64": { 436 - "version": "0.25.5", 437 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", 438 - "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", 439 - "cpu": [ 440 - "arm64" 441 - ], 442 - "dev": true, 443 - "license": "MIT", 444 - "optional": true, 445 - "os": [ 446 - "freebsd" 447 - ], 448 - "engines": { 449 - "node": ">=18" 450 - } 5134 + "terser": { 5135 + "optional": true 451 5136 }, 452 - "node_modules/@esbuild/freebsd-x64": { 453 - "version": "0.25.5", 454 - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", 455 - "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", 456 - "cpu": [ 457 - "x64" 458 - ], 459 - "dev": true, 460 - "license": "MIT", 461 - "optional": true, 462 - "os": [ 463 - "freebsd" 464 - ], 465 - "engines": { 466 - "node": ">=18" 467 - } 5137 + "tsx": { 5138 + "optional": true 468 5139 }, 469 - "node_modules/@esbuild/linux-arm": { 470 - "version": "0.25.5", 471 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", 472 - "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", 473 - "cpu": [ 474 - "arm" 475 - ], 476 - "dev": true, 477 - "license": "MIT", 478 - "optional": true, 479 - "os": [ 480 - "linux" 481 - ], 482 - "engines": { 483 - "node": ">=18" 484 - } 485 - }, 486 - "node_modules/@esbuild/linux-arm64": { 487 - "version": "0.25.5", 488 - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", 489 - "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", 490 - "cpu": [ 491 - "arm64" 492 - ], 493 - "dev": true, 494 - "license": "MIT", 495 - "optional": true, 496 - "os": [ 497 - "linux" 498 - ], 499 - "engines": { 500 - "node": ">=18" 501 - } 502 - }, 503 - "node_modules/@esbuild/linux-ia32": { 504 - "version": "0.25.5", 505 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", 506 - "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", 507 - "cpu": [ 508 - "ia32" 509 - ], 510 - "dev": true, 511 - "license": "MIT", 512 - "optional": true, 513 - "os": [ 514 - "linux" 515 - ], 516 - "engines": { 517 - "node": ">=18" 518 - } 519 - }, 520 - "node_modules/@esbuild/linux-loong64": { 521 - "version": "0.25.5", 522 - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", 523 - "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", 524 - "cpu": [ 525 - "loong64" 526 - ], 527 - "dev": true, 528 - "license": "MIT", 529 - "optional": true, 530 - "os": [ 531 - "linux" 532 - ], 533 - "engines": { 534 - "node": ">=18" 535 - } 536 - }, 537 - "node_modules/@esbuild/linux-mips64el": { 538 - "version": "0.25.5", 539 - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", 540 - "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", 541 - "cpu": [ 542 - "mips64el" 543 - ], 544 - "dev": true, 545 - "license": "MIT", 546 - "optional": true, 547 - "os": [ 548 - "linux" 549 - ], 550 - "engines": { 551 - "node": ">=18" 552 - } 553 - }, 554 - "node_modules/@esbuild/linux-ppc64": { 555 - "version": "0.25.5", 556 - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", 557 - "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", 558 - "cpu": [ 559 - "ppc64" 560 - ], 561 - "dev": true, 562 - "license": "MIT", 563 - "optional": true, 564 - "os": [ 565 - "linux" 566 - ], 567 - "engines": { 568 - "node": ">=18" 569 - } 570 - }, 571 - "node_modules/@esbuild/linux-riscv64": { 572 - "version": "0.25.5", 573 - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", 574 - "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", 575 - "cpu": [ 576 - "riscv64" 577 - ], 578 - "dev": true, 579 - "license": "MIT", 580 - "optional": true, 581 - "os": [ 582 - "linux" 583 - ], 584 - "engines": { 585 - "node": ">=18" 586 - } 587 - }, 588 - "node_modules/@esbuild/linux-s390x": { 589 - "version": "0.25.5", 590 - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", 591 - "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", 592 - "cpu": [ 593 - "s390x" 594 - ], 595 - "dev": true, 596 - "license": "MIT", 597 - "optional": true, 598 - "os": [ 599 - "linux" 600 - ], 601 - "engines": { 602 - "node": ">=18" 603 - } 604 - }, 605 - "node_modules/@esbuild/linux-x64": { 606 - "version": "0.25.5", 607 - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", 608 - "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", 609 - "cpu": [ 610 - "x64" 611 - ], 612 - "dev": true, 613 - "license": "MIT", 614 - "optional": true, 615 - "os": [ 616 - "linux" 617 - ], 618 - "engines": { 619 - "node": ">=18" 620 - } 621 - }, 622 - "node_modules/@esbuild/netbsd-arm64": { 623 - "version": "0.25.5", 624 - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", 625 - "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", 626 - "cpu": [ 627 - "arm64" 628 - ], 629 - "dev": true, 630 - "license": "MIT", 631 - "optional": true, 632 - "os": [ 633 - "netbsd" 634 - ], 635 - "engines": { 636 - "node": ">=18" 637 - } 638 - }, 639 - "node_modules/@esbuild/netbsd-x64": { 640 - "version": "0.25.5", 641 - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", 642 - "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", 643 - "cpu": [ 644 - "x64" 645 - ], 646 - "dev": true, 647 - "license": "MIT", 648 - "optional": true, 649 - "os": [ 650 - "netbsd" 651 - ], 652 - "engines": { 653 - "node": ">=18" 654 - } 655 - }, 656 - "node_modules/@esbuild/openbsd-arm64": { 657 - "version": "0.25.5", 658 - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", 659 - "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", 660 - "cpu": [ 661 - "arm64" 662 - ], 663 - "dev": true, 664 - "license": "MIT", 665 - "optional": true, 666 - "os": [ 667 - "openbsd" 668 - ], 669 - "engines": { 670 - "node": ">=18" 671 - } 672 - }, 673 - "node_modules/@esbuild/openbsd-x64": { 674 - "version": "0.25.5", 675 - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", 676 - "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", 677 - "cpu": [ 678 - "x64" 679 - ], 680 - "dev": true, 681 - "license": "MIT", 682 - "optional": true, 683 - "os": [ 684 - "openbsd" 685 - ], 686 - "engines": { 687 - "node": ">=18" 688 - } 689 - }, 690 - "node_modules/@esbuild/sunos-x64": { 691 - "version": "0.25.5", 692 - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", 693 - "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", 694 - "cpu": [ 695 - "x64" 696 - ], 697 - "dev": true, 698 - "license": "MIT", 699 - "optional": true, 700 - "os": [ 701 - "sunos" 702 - ], 703 - "engines": { 704 - "node": ">=18" 705 - } 706 - }, 707 - "node_modules/@esbuild/win32-arm64": { 708 - "version": "0.25.5", 709 - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", 710 - "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", 711 - "cpu": [ 712 - "arm64" 713 - ], 714 - "dev": true, 715 - "license": "MIT", 716 - "optional": true, 717 - "os": [ 718 - "win32" 719 - ], 720 - "engines": { 721 - "node": ">=18" 722 - } 723 - }, 724 - "node_modules/@esbuild/win32-ia32": { 725 - "version": "0.25.5", 726 - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", 727 - "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", 728 - "cpu": [ 729 - "ia32" 730 - ], 731 - "dev": true, 732 - "license": "MIT", 733 - "optional": true, 734 - "os": [ 735 - "win32" 736 - ], 737 - "engines": { 738 - "node": ">=18" 739 - } 740 - }, 741 - "node_modules/@esbuild/win32-x64": { 742 - "version": "0.25.5", 743 - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", 744 - "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", 745 - "cpu": [ 746 - "x64" 747 - ], 748 - "dev": true, 749 - "license": "MIT", 750 - "optional": true, 751 - "os": [ 752 - "win32" 753 - ], 754 - "engines": { 755 - "node": ">=18" 756 - } 757 - }, 758 - "node_modules/@eslint-community/eslint-utils": { 759 - "version": "4.7.0", 760 - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", 761 - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", 762 - "dev": true, 763 - "license": "MIT", 764 - "dependencies": { 765 - "eslint-visitor-keys": "^3.4.3" 766 - }, 767 - "engines": { 768 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 769 - }, 770 - "funding": { 771 - "url": "https://opencollective.com/eslint" 772 - }, 773 - "peerDependencies": { 774 - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 775 - } 776 - }, 777 - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 778 - "version": "3.4.3", 779 - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 780 - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 781 - "dev": true, 782 - "license": "Apache-2.0", 783 - "engines": { 784 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 785 - }, 786 - "funding": { 787 - "url": "https://opencollective.com/eslint" 788 - } 789 - }, 790 - "node_modules/@eslint-community/regexpp": { 791 - "version": "4.12.1", 792 - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 793 - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 794 - "dev": true, 795 - "license": "MIT", 796 - "engines": { 797 - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 798 - } 799 - }, 800 - "node_modules/@eslint/config-array": { 801 - "version": "0.20.1", 802 - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", 803 - "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", 804 - "dev": true, 805 - "license": "Apache-2.0", 806 - "dependencies": { 807 - "@eslint/object-schema": "^2.1.6", 808 - "debug": "^4.3.1", 809 - "minimatch": "^3.1.2" 810 - }, 811 - "engines": { 812 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 813 - } 814 - }, 815 - "node_modules/@eslint/config-helpers": { 816 - "version": "0.2.3", 817 - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz", 818 - "integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==", 819 - "dev": true, 820 - "license": "Apache-2.0", 821 - "engines": { 822 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 823 - } 824 - }, 825 - "node_modules/@eslint/core": { 826 - "version": "0.14.0", 827 - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", 828 - "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", 829 - "dev": true, 830 - "license": "Apache-2.0", 831 - "dependencies": { 832 - "@types/json-schema": "^7.0.15" 833 - }, 834 - "engines": { 835 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 836 - } 837 - }, 838 - "node_modules/@eslint/eslintrc": { 839 - "version": "3.3.1", 840 - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", 841 - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", 842 - "dev": true, 843 - "license": "MIT", 844 - "dependencies": { 845 - "ajv": "^6.12.4", 846 - "debug": "^4.3.2", 847 - "espree": "^10.0.1", 848 - "globals": "^14.0.0", 849 - "ignore": "^5.2.0", 850 - "import-fresh": "^3.2.1", 851 - "js-yaml": "^4.1.0", 852 - "minimatch": "^3.1.2", 853 - "strip-json-comments": "^3.1.1" 854 - }, 855 - "engines": { 856 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 857 - }, 858 - "funding": { 859 - "url": "https://opencollective.com/eslint" 860 - } 861 - }, 862 - "node_modules/@eslint/eslintrc/node_modules/globals": { 863 - "version": "14.0.0", 864 - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 865 - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 866 - "dev": true, 867 - "license": "MIT", 868 - "engines": { 869 - "node": ">=18" 870 - }, 871 - "funding": { 872 - "url": "https://github.com/sponsors/sindresorhus" 873 - } 874 - }, 875 - "node_modules/@eslint/js": { 876 - "version": "9.29.0", 877 - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz", 878 - "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==", 879 - "dev": true, 880 - "license": "MIT", 881 - "engines": { 882 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 883 - }, 884 - "funding": { 885 - "url": "https://eslint.org/donate" 886 - } 887 - }, 888 - "node_modules/@eslint/object-schema": { 889 - "version": "2.1.6", 890 - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", 891 - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", 892 - "dev": true, 893 - "license": "Apache-2.0", 894 - "engines": { 895 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 896 - } 897 - }, 898 - "node_modules/@eslint/plugin-kit": { 899 - "version": "0.3.2", 900 - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.2.tgz", 901 - "integrity": "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==", 902 - "dev": true, 903 - "license": "Apache-2.0", 904 - "dependencies": { 905 - "@eslint/core": "^0.15.0", 906 - "levn": "^0.4.1" 907 - }, 908 - "engines": { 909 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 910 - } 911 - }, 912 - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { 913 - "version": "0.15.0", 914 - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.0.tgz", 915 - "integrity": "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==", 916 - "dev": true, 917 - "license": "Apache-2.0", 918 - "dependencies": { 919 - "@types/json-schema": "^7.0.15" 920 - }, 921 - "engines": { 922 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 923 - } 924 - }, 925 - "node_modules/@humanfs/core": { 926 - "version": "0.19.1", 927 - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", 928 - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", 929 - "dev": true, 930 - "license": "Apache-2.0", 931 - "engines": { 932 - "node": ">=18.18.0" 933 - } 934 - }, 935 - "node_modules/@humanfs/node": { 936 - "version": "0.16.6", 937 - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", 938 - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", 939 - "dev": true, 940 - "license": "Apache-2.0", 941 - "dependencies": { 942 - "@humanfs/core": "^0.19.1", 943 - "@humanwhocodes/retry": "^0.3.0" 944 - }, 945 - "engines": { 946 - "node": ">=18.18.0" 947 - } 948 - }, 949 - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { 950 - "version": "0.3.1", 951 - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", 952 - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", 953 - "dev": true, 954 - "license": "Apache-2.0", 955 - "engines": { 956 - "node": ">=18.18" 957 - }, 958 - "funding": { 959 - "type": "github", 960 - "url": "https://github.com/sponsors/nzakas" 961 - } 962 - }, 963 - "node_modules/@humanwhocodes/module-importer": { 964 - "version": "1.0.1", 965 - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 966 - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 967 - "dev": true, 968 - "license": "Apache-2.0", 969 - "engines": { 970 - "node": ">=12.22" 971 - }, 972 - "funding": { 973 - "type": "github", 974 - "url": "https://github.com/sponsors/nzakas" 975 - } 976 - }, 977 - "node_modules/@humanwhocodes/retry": { 978 - "version": "0.4.3", 979 - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", 980 - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", 981 - "dev": true, 982 - "license": "Apache-2.0", 983 - "engines": { 984 - "node": ">=18.18" 985 - }, 986 - "funding": { 987 - "type": "github", 988 - "url": "https://github.com/sponsors/nzakas" 989 - } 990 - }, 991 - "node_modules/@jridgewell/gen-mapping": { 992 - "version": "0.3.8", 993 - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 994 - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 995 - "dev": true, 996 - "license": "MIT", 997 - "dependencies": { 998 - "@jridgewell/set-array": "^1.2.1", 999 - "@jridgewell/sourcemap-codec": "^1.4.10", 1000 - "@jridgewell/trace-mapping": "^0.3.24" 1001 - }, 1002 - "engines": { 1003 - "node": ">=6.0.0" 1004 - } 1005 - }, 1006 - "node_modules/@jridgewell/resolve-uri": { 1007 - "version": "3.1.2", 1008 - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 1009 - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 1010 - "dev": true, 1011 - "license": "MIT", 1012 - "engines": { 1013 - "node": ">=6.0.0" 1014 - } 1015 - }, 1016 - "node_modules/@jridgewell/set-array": { 1017 - "version": "1.2.1", 1018 - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 1019 - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 1020 - "dev": true, 1021 - "license": "MIT", 1022 - "engines": { 1023 - "node": ">=6.0.0" 1024 - } 1025 - }, 1026 - "node_modules/@jridgewell/sourcemap-codec": { 1027 - "version": "1.5.0", 1028 - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 1029 - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 1030 - "dev": true, 1031 - "license": "MIT" 1032 - }, 1033 - "node_modules/@jridgewell/trace-mapping": { 1034 - "version": "0.3.25", 1035 - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 1036 - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 1037 - "dev": true, 1038 - "license": "MIT", 1039 - "dependencies": { 1040 - "@jridgewell/resolve-uri": "^3.1.0", 1041 - "@jridgewell/sourcemap-codec": "^1.4.14" 1042 - } 1043 - }, 1044 - "node_modules/@nodelib/fs.scandir": { 1045 - "version": "2.1.5", 1046 - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 1047 - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 1048 - "dev": true, 1049 - "license": "MIT", 1050 - "dependencies": { 1051 - "@nodelib/fs.stat": "2.0.5", 1052 - "run-parallel": "^1.1.9" 1053 - }, 1054 - "engines": { 1055 - "node": ">= 8" 1056 - } 1057 - }, 1058 - "node_modules/@nodelib/fs.stat": { 1059 - "version": "2.0.5", 1060 - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 1061 - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 1062 - "dev": true, 1063 - "license": "MIT", 1064 - "engines": { 1065 - "node": ">= 8" 1066 - } 1067 - }, 1068 - "node_modules/@nodelib/fs.walk": { 1069 - "version": "1.2.8", 1070 - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 1071 - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 1072 - "dev": true, 1073 - "license": "MIT", 1074 - "dependencies": { 1075 - "@nodelib/fs.scandir": "2.1.5", 1076 - "fastq": "^1.6.0" 1077 - }, 1078 - "engines": { 1079 - "node": ">= 8" 1080 - } 1081 - }, 1082 - "node_modules/@rolldown/pluginutils": { 1083 - "version": "1.0.0-beta.19", 1084 - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", 1085 - "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", 1086 - "dev": true, 1087 - "license": "MIT" 1088 - }, 1089 - "node_modules/@rollup/rollup-android-arm-eabi": { 1090 - "version": "4.44.0", 1091 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.0.tgz", 1092 - "integrity": "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==", 1093 - "cpu": [ 1094 - "arm" 1095 - ], 1096 - "dev": true, 1097 - "license": "MIT", 1098 - "optional": true, 1099 - "os": [ 1100 - "android" 1101 - ] 1102 - }, 1103 - "node_modules/@rollup/rollup-android-arm64": { 1104 - "version": "4.44.0", 1105 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.0.tgz", 1106 - "integrity": "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==", 1107 - "cpu": [ 1108 - "arm64" 1109 - ], 1110 - "dev": true, 1111 - "license": "MIT", 1112 - "optional": true, 1113 - "os": [ 1114 - "android" 1115 - ] 1116 - }, 1117 - "node_modules/@rollup/rollup-darwin-arm64": { 1118 - "version": "4.44.0", 1119 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.0.tgz", 1120 - "integrity": "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==", 1121 - "cpu": [ 1122 - "arm64" 1123 - ], 1124 - "dev": true, 1125 - "license": "MIT", 1126 - "optional": true, 1127 - "os": [ 1128 - "darwin" 1129 - ] 1130 - }, 1131 - "node_modules/@rollup/rollup-darwin-x64": { 1132 - "version": "4.44.0", 1133 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.0.tgz", 1134 - "integrity": "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==", 1135 - "cpu": [ 1136 - "x64" 1137 - ], 1138 - "dev": true, 1139 - "license": "MIT", 1140 - "optional": true, 1141 - "os": [ 1142 - "darwin" 1143 - ] 1144 - }, 1145 - "node_modules/@rollup/rollup-freebsd-arm64": { 1146 - "version": "4.44.0", 1147 - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.0.tgz", 1148 - "integrity": "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==", 1149 - "cpu": [ 1150 - "arm64" 1151 - ], 1152 - "dev": true, 1153 - "license": "MIT", 1154 - "optional": true, 1155 - "os": [ 1156 - "freebsd" 1157 - ] 1158 - }, 1159 - "node_modules/@rollup/rollup-freebsd-x64": { 1160 - "version": "4.44.0", 1161 - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.0.tgz", 1162 - "integrity": "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==", 1163 - "cpu": [ 1164 - "x64" 1165 - ], 1166 - "dev": true, 1167 - "license": "MIT", 1168 - "optional": true, 1169 - "os": [ 1170 - "freebsd" 1171 - ] 1172 - }, 1173 - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 1174 - "version": "4.44.0", 1175 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.0.tgz", 1176 - "integrity": "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==", 1177 - "cpu": [ 1178 - "arm" 1179 - ], 1180 - "dev": true, 1181 - "license": "MIT", 1182 - "optional": true, 1183 - "os": [ 1184 - "linux" 1185 - ] 1186 - }, 1187 - "node_modules/@rollup/rollup-linux-arm-musleabihf": { 1188 - "version": "4.44.0", 1189 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.0.tgz", 1190 - "integrity": "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==", 1191 - "cpu": [ 1192 - "arm" 1193 - ], 1194 - "dev": true, 1195 - "license": "MIT", 1196 - "optional": true, 1197 - "os": [ 1198 - "linux" 1199 - ] 1200 - }, 1201 - "node_modules/@rollup/rollup-linux-arm64-gnu": { 1202 - "version": "4.44.0", 1203 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.0.tgz", 1204 - "integrity": "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==", 1205 - "cpu": [ 1206 - "arm64" 1207 - ], 1208 - "dev": true, 1209 - "license": "MIT", 1210 - "optional": true, 1211 - "os": [ 1212 - "linux" 1213 - ] 1214 - }, 1215 - "node_modules/@rollup/rollup-linux-arm64-musl": { 1216 - "version": "4.44.0", 1217 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.0.tgz", 1218 - "integrity": "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==", 1219 - "cpu": [ 1220 - "arm64" 1221 - ], 1222 - "dev": true, 1223 - "license": "MIT", 1224 - "optional": true, 1225 - "os": [ 1226 - "linux" 1227 - ] 1228 - }, 1229 - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 1230 - "version": "4.44.0", 1231 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.0.tgz", 1232 - "integrity": "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==", 1233 - "cpu": [ 1234 - "loong64" 1235 - ], 1236 - "dev": true, 1237 - "license": "MIT", 1238 - "optional": true, 1239 - "os": [ 1240 - "linux" 1241 - ] 1242 - }, 1243 - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 1244 - "version": "4.44.0", 1245 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.0.tgz", 1246 - "integrity": "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==", 1247 - "cpu": [ 1248 - "ppc64" 1249 - ], 1250 - "dev": true, 1251 - "license": "MIT", 1252 - "optional": true, 1253 - "os": [ 1254 - "linux" 1255 - ] 1256 - }, 1257 - "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1258 - "version": "4.44.0", 1259 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.0.tgz", 1260 - "integrity": "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==", 1261 - "cpu": [ 1262 - "riscv64" 1263 - ], 1264 - "dev": true, 1265 - "license": "MIT", 1266 - "optional": true, 1267 - "os": [ 1268 - "linux" 1269 - ] 1270 - }, 1271 - "node_modules/@rollup/rollup-linux-riscv64-musl": { 1272 - "version": "4.44.0", 1273 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.0.tgz", 1274 - "integrity": "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==", 1275 - "cpu": [ 1276 - "riscv64" 1277 - ], 1278 - "dev": true, 1279 - "license": "MIT", 1280 - "optional": true, 1281 - "os": [ 1282 - "linux" 1283 - ] 1284 - }, 1285 - "node_modules/@rollup/rollup-linux-s390x-gnu": { 1286 - "version": "4.44.0", 1287 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.0.tgz", 1288 - "integrity": "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==", 1289 - "cpu": [ 1290 - "s390x" 1291 - ], 1292 - "dev": true, 1293 - "license": "MIT", 1294 - "optional": true, 1295 - "os": [ 1296 - "linux" 1297 - ] 1298 - }, 1299 - "node_modules/@rollup/rollup-linux-x64-gnu": { 1300 - "version": "4.44.0", 1301 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.0.tgz", 1302 - "integrity": "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==", 1303 - "cpu": [ 1304 - "x64" 1305 - ], 1306 - "dev": true, 1307 - "license": "MIT", 1308 - "optional": true, 1309 - "os": [ 1310 - "linux" 1311 - ] 1312 - }, 1313 - "node_modules/@rollup/rollup-linux-x64-musl": { 1314 - "version": "4.44.0", 1315 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.0.tgz", 1316 - "integrity": "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==", 1317 - "cpu": [ 1318 - "x64" 1319 - ], 1320 - "dev": true, 1321 - "license": "MIT", 1322 - "optional": true, 1323 - "os": [ 1324 - "linux" 1325 - ] 1326 - }, 1327 - "node_modules/@rollup/rollup-win32-arm64-msvc": { 1328 - "version": "4.44.0", 1329 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.0.tgz", 1330 - "integrity": "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==", 1331 - "cpu": [ 1332 - "arm64" 1333 - ], 1334 - "dev": true, 1335 - "license": "MIT", 1336 - "optional": true, 1337 - "os": [ 1338 - "win32" 1339 - ] 1340 - }, 1341 - "node_modules/@rollup/rollup-win32-ia32-msvc": { 1342 - "version": "4.44.0", 1343 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.0.tgz", 1344 - "integrity": "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==", 1345 - "cpu": [ 1346 - "ia32" 1347 - ], 1348 - "dev": true, 1349 - "license": "MIT", 1350 - "optional": true, 1351 - "os": [ 1352 - "win32" 1353 - ] 1354 - }, 1355 - "node_modules/@rollup/rollup-win32-x64-msvc": { 1356 - "version": "4.44.0", 1357 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.0.tgz", 1358 - "integrity": "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==", 1359 - "cpu": [ 1360 - "x64" 1361 - ], 1362 - "dev": true, 1363 - "license": "MIT", 1364 - "optional": true, 1365 - "os": [ 1366 - "win32" 1367 - ] 1368 - }, 1369 - "node_modules/@tauri-apps/api": { 1370 - "version": "2.5.0", 1371 - "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.5.0.tgz", 1372 - "integrity": "sha512-Ldux4ip+HGAcPUmuLT8EIkk6yafl5vK0P0c0byzAKzxJh7vxelVtdPONjfgTm96PbN24yjZNESY8CKo8qniluA==", 1373 - "license": "Apache-2.0 OR MIT", 1374 - "funding": { 1375 - "type": "opencollective", 1376 - "url": "https://opencollective.com/tauri" 1377 - } 1378 - }, 1379 - "node_modules/@tauri-apps/plugin-dialog": { 1380 - "version": "2.2.2", 1381 - "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.2.2.tgz", 1382 - "integrity": "sha512-Pm9qnXQq8ZVhAMFSEPwxvh+nWb2mk7LASVlNEHYaksHvcz8P6+ElR5U5dNL9Ofrm+uwhh1/gYKWswK8JJJAh6A==", 1383 - "license": "MIT OR Apache-2.0", 1384 - "dependencies": { 1385 - "@tauri-apps/api": "^2.0.0" 1386 - } 1387 - }, 1388 - "node_modules/@tauri-apps/plugin-geolocation": { 1389 - "version": "2.2.5", 1390 - "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-geolocation/-/plugin-geolocation-2.2.5.tgz", 1391 - "integrity": "sha512-sBQQyxdNnSHIiFwSxTO52kRiPdQsec1pvaD5g1lXX8NjPOQNN3ujPWM5Fq81eubdrkhCHoNrWAfd9ix7sxLrRA==", 1392 - "license": "MIT OR Apache-2.0", 1393 - "dependencies": { 1394 - "@tauri-apps/api": "^2.0.0" 1395 - } 1396 - }, 1397 - "node_modules/@tauri-apps/plugin-log": { 1398 - "version": "2.5.0", 1399 - "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-log/-/plugin-log-2.5.0.tgz", 1400 - "integrity": "sha512-ZMq6aZbezMk/rqXopu7tQse9ljQhUTt5cje4nAQ8LumIu6dgN8QseonbuPd198toUNj3tvWTxVR8/lBemG64tw==", 1401 - "license": "MIT OR Apache-2.0", 1402 - "dependencies": { 1403 - "@tauri-apps/api": "^2.0.0" 1404 - } 1405 - }, 1406 - "node_modules/@tauri-apps/plugin-notification": { 1407 - "version": "2.2.3", 1408 - "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-notification/-/plugin-notification-2.2.3.tgz", 1409 - "integrity": "sha512-IlMdSVFsrKg0eIHBloFFosnWbbz6JdwBywfZrYZnE1+acgXvNS3T1YB5w9R6UXw+KKQ94ODBu7JF7a1YUiAK6A==", 1410 - "license": "MIT OR Apache-2.0", 1411 - "dependencies": { 1412 - "@tauri-apps/api": "^2.0.0" 1413 - } 1414 - }, 1415 - "node_modules/@tauri-apps/plugin-opener": { 1416 - "version": "2.3.0", 1417 - "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-opener/-/plugin-opener-2.3.0.tgz", 1418 - "integrity": "sha512-yAbauwp8BCHIhhA48NN8rEf6OtfZBPCgTOCa10gmtoVCpmic5Bq+1Ba7C+NZOjogedkSiV7hAotjYnnbUVmYrw==", 1419 - "license": "MIT OR Apache-2.0", 1420 - "dependencies": { 1421 - "@tauri-apps/api": "^2.0.0" 1422 - } 1423 - }, 1424 - "node_modules/@types/babel__core": { 1425 - "version": "7.20.5", 1426 - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", 1427 - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", 1428 - "dev": true, 1429 - "license": "MIT", 1430 - "dependencies": { 1431 - "@babel/parser": "^7.20.7", 1432 - "@babel/types": "^7.20.7", 1433 - "@types/babel__generator": "*", 1434 - "@types/babel__template": "*", 1435 - "@types/babel__traverse": "*" 1436 - } 1437 - }, 1438 - "node_modules/@types/babel__generator": { 1439 - "version": "7.27.0", 1440 - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", 1441 - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", 1442 - "dev": true, 1443 - "license": "MIT", 1444 - "dependencies": { 1445 - "@babel/types": "^7.0.0" 1446 - } 1447 - }, 1448 - "node_modules/@types/babel__template": { 1449 - "version": "7.4.4", 1450 - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", 1451 - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", 1452 - "dev": true, 1453 - "license": "MIT", 1454 - "dependencies": { 1455 - "@babel/parser": "^7.1.0", 1456 - "@babel/types": "^7.0.0" 1457 - } 1458 - }, 1459 - "node_modules/@types/babel__traverse": { 1460 - "version": "7.20.7", 1461 - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", 1462 - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", 1463 - "dev": true, 1464 - "license": "MIT", 1465 - "dependencies": { 1466 - "@babel/types": "^7.20.7" 1467 - } 1468 - }, 1469 - "node_modules/@types/estree": { 1470 - "version": "1.0.8", 1471 - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", 1472 - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", 1473 - "dev": true, 1474 - "license": "MIT" 1475 - }, 1476 - "node_modules/@types/json-schema": { 1477 - "version": "7.0.15", 1478 - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 1479 - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 1480 - "dev": true, 1481 - "license": "MIT" 1482 - }, 1483 - "node_modules/@types/node": { 1484 - "version": "24.0.3", 1485 - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", 1486 - "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==", 1487 - "dev": true, 1488 - "license": "MIT", 1489 - "dependencies": { 1490 - "undici-types": "~7.8.0" 1491 - } 1492 - }, 1493 - "node_modules/@types/react": { 1494 - "version": "19.1.8", 1495 - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz", 1496 - "integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==", 1497 - "dev": true, 1498 - "license": "MIT", 1499 - "dependencies": { 1500 - "csstype": "^3.0.2" 1501 - } 1502 - }, 1503 - "node_modules/@types/react-dom": { 1504 - "version": "19.1.6", 1505 - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz", 1506 - "integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==", 1507 - "dev": true, 1508 - "license": "MIT", 1509 - "peerDependencies": { 1510 - "@types/react": "^19.0.0" 1511 - } 1512 - }, 1513 - "node_modules/@typescript-eslint/eslint-plugin": { 1514 - "version": "8.35.0", 1515 - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.0.tgz", 1516 - "integrity": "sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg==", 1517 - "dev": true, 1518 - "license": "MIT", 1519 - "dependencies": { 1520 - "@eslint-community/regexpp": "^4.10.0", 1521 - "@typescript-eslint/scope-manager": "8.35.0", 1522 - "@typescript-eslint/type-utils": "8.35.0", 1523 - "@typescript-eslint/utils": "8.35.0", 1524 - "@typescript-eslint/visitor-keys": "8.35.0", 1525 - "graphemer": "^1.4.0", 1526 - "ignore": "^7.0.0", 1527 - "natural-compare": "^1.4.0", 1528 - "ts-api-utils": "^2.1.0" 1529 - }, 1530 - "engines": { 1531 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1532 - }, 1533 - "funding": { 1534 - "type": "opencollective", 1535 - "url": "https://opencollective.com/typescript-eslint" 1536 - }, 1537 - "peerDependencies": { 1538 - "@typescript-eslint/parser": "^8.35.0", 1539 - "eslint": "^8.57.0 || ^9.0.0", 1540 - "typescript": ">=4.8.4 <5.9.0" 1541 - } 1542 - }, 1543 - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { 1544 - "version": "7.0.5", 1545 - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", 1546 - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", 1547 - "dev": true, 1548 - "license": "MIT", 1549 - "engines": { 1550 - "node": ">= 4" 1551 - } 1552 - }, 1553 - "node_modules/@typescript-eslint/parser": { 1554 - "version": "8.35.0", 1555 - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.0.tgz", 1556 - "integrity": "sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA==", 1557 - "dev": true, 1558 - "license": "MIT", 1559 - "dependencies": { 1560 - "@typescript-eslint/scope-manager": "8.35.0", 1561 - "@typescript-eslint/types": "8.35.0", 1562 - "@typescript-eslint/typescript-estree": "8.35.0", 1563 - "@typescript-eslint/visitor-keys": "8.35.0", 1564 - "debug": "^4.3.4" 1565 - }, 1566 - "engines": { 1567 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1568 - }, 1569 - "funding": { 1570 - "type": "opencollective", 1571 - "url": "https://opencollective.com/typescript-eslint" 1572 - }, 1573 - "peerDependencies": { 1574 - "eslint": "^8.57.0 || ^9.0.0", 1575 - "typescript": ">=4.8.4 <5.9.0" 1576 - } 1577 - }, 1578 - "node_modules/@typescript-eslint/project-service": { 1579 - "version": "8.35.0", 1580 - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.0.tgz", 1581 - "integrity": "sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ==", 1582 - "dev": true, 1583 - "license": "MIT", 1584 - "dependencies": { 1585 - "@typescript-eslint/tsconfig-utils": "^8.35.0", 1586 - "@typescript-eslint/types": "^8.35.0", 1587 - "debug": "^4.3.4" 1588 - }, 1589 - "engines": { 1590 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1591 - }, 1592 - "funding": { 1593 - "type": "opencollective", 1594 - "url": "https://opencollective.com/typescript-eslint" 1595 - }, 1596 - "peerDependencies": { 1597 - "typescript": ">=4.8.4 <5.9.0" 1598 - } 1599 - }, 1600 - "node_modules/@typescript-eslint/scope-manager": { 1601 - "version": "8.35.0", 1602 - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.0.tgz", 1603 - "integrity": "sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA==", 1604 - "dev": true, 1605 - "license": "MIT", 1606 - "dependencies": { 1607 - "@typescript-eslint/types": "8.35.0", 1608 - "@typescript-eslint/visitor-keys": "8.35.0" 1609 - }, 1610 - "engines": { 1611 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1612 - }, 1613 - "funding": { 1614 - "type": "opencollective", 1615 - "url": "https://opencollective.com/typescript-eslint" 1616 - } 1617 - }, 1618 - "node_modules/@typescript-eslint/tsconfig-utils": { 1619 - "version": "8.35.0", 1620 - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.0.tgz", 1621 - "integrity": "sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA==", 1622 - "dev": true, 1623 - "license": "MIT", 1624 - "engines": { 1625 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1626 - }, 1627 - "funding": { 1628 - "type": "opencollective", 1629 - "url": "https://opencollective.com/typescript-eslint" 1630 - }, 1631 - "peerDependencies": { 1632 - "typescript": ">=4.8.4 <5.9.0" 1633 - } 1634 - }, 1635 - "node_modules/@typescript-eslint/type-utils": { 1636 - "version": "8.35.0", 1637 - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.0.tgz", 1638 - "integrity": "sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA==", 1639 - "dev": true, 1640 - "license": "MIT", 1641 - "dependencies": { 1642 - "@typescript-eslint/typescript-estree": "8.35.0", 1643 - "@typescript-eslint/utils": "8.35.0", 1644 - "debug": "^4.3.4", 1645 - "ts-api-utils": "^2.1.0" 1646 - }, 1647 - "engines": { 1648 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1649 - }, 1650 - "funding": { 1651 - "type": "opencollective", 1652 - "url": "https://opencollective.com/typescript-eslint" 1653 - }, 1654 - "peerDependencies": { 1655 - "eslint": "^8.57.0 || ^9.0.0", 1656 - "typescript": ">=4.8.4 <5.9.0" 1657 - } 1658 - }, 1659 - "node_modules/@typescript-eslint/types": { 1660 - "version": "8.35.0", 1661 - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.0.tgz", 1662 - "integrity": "sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ==", 1663 - "dev": true, 1664 - "license": "MIT", 1665 - "engines": { 1666 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1667 - }, 1668 - "funding": { 1669 - "type": "opencollective", 1670 - "url": "https://opencollective.com/typescript-eslint" 1671 - } 1672 - }, 1673 - "node_modules/@typescript-eslint/typescript-estree": { 1674 - "version": "8.35.0", 1675 - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.0.tgz", 1676 - "integrity": "sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w==", 1677 - "dev": true, 1678 - "license": "MIT", 1679 - "dependencies": { 1680 - "@typescript-eslint/project-service": "8.35.0", 1681 - "@typescript-eslint/tsconfig-utils": "8.35.0", 1682 - "@typescript-eslint/types": "8.35.0", 1683 - "@typescript-eslint/visitor-keys": "8.35.0", 1684 - "debug": "^4.3.4", 1685 - "fast-glob": "^3.3.2", 1686 - "is-glob": "^4.0.3", 1687 - "minimatch": "^9.0.4", 1688 - "semver": "^7.6.0", 1689 - "ts-api-utils": "^2.1.0" 1690 - }, 1691 - "engines": { 1692 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1693 - }, 1694 - "funding": { 1695 - "type": "opencollective", 1696 - "url": "https://opencollective.com/typescript-eslint" 1697 - }, 1698 - "peerDependencies": { 1699 - "typescript": ">=4.8.4 <5.9.0" 1700 - } 1701 - }, 1702 - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { 1703 - "version": "2.0.2", 1704 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", 1705 - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", 1706 - "dev": true, 1707 - "license": "MIT", 1708 - "dependencies": { 1709 - "balanced-match": "^1.0.0" 1710 - } 1711 - }, 1712 - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { 1713 - "version": "9.0.5", 1714 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1715 - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1716 - "dev": true, 1717 - "license": "ISC", 1718 - "dependencies": { 1719 - "brace-expansion": "^2.0.1" 1720 - }, 1721 - "engines": { 1722 - "node": ">=16 || 14 >=14.17" 1723 - }, 1724 - "funding": { 1725 - "url": "https://github.com/sponsors/isaacs" 1726 - } 1727 - }, 1728 - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { 1729 - "version": "7.7.2", 1730 - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", 1731 - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 1732 - "dev": true, 1733 - "license": "ISC", 1734 - "bin": { 1735 - "semver": "bin/semver.js" 1736 - }, 1737 - "engines": { 1738 - "node": ">=10" 1739 - } 1740 - }, 1741 - "node_modules/@typescript-eslint/utils": { 1742 - "version": "8.35.0", 1743 - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.0.tgz", 1744 - "integrity": "sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg==", 1745 - "dev": true, 1746 - "license": "MIT", 1747 - "dependencies": { 1748 - "@eslint-community/eslint-utils": "^4.7.0", 1749 - "@typescript-eslint/scope-manager": "8.35.0", 1750 - "@typescript-eslint/types": "8.35.0", 1751 - "@typescript-eslint/typescript-estree": "8.35.0" 1752 - }, 1753 - "engines": { 1754 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1755 - }, 1756 - "funding": { 1757 - "type": "opencollective", 1758 - "url": "https://opencollective.com/typescript-eslint" 1759 - }, 1760 - "peerDependencies": { 1761 - "eslint": "^8.57.0 || ^9.0.0", 1762 - "typescript": ">=4.8.4 <5.9.0" 1763 - } 1764 - }, 1765 - "node_modules/@typescript-eslint/visitor-keys": { 1766 - "version": "8.35.0", 1767 - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.0.tgz", 1768 - "integrity": "sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g==", 1769 - "dev": true, 1770 - "license": "MIT", 1771 - "dependencies": { 1772 - "@typescript-eslint/types": "8.35.0", 1773 - "eslint-visitor-keys": "^4.2.1" 1774 - }, 1775 - "engines": { 1776 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1777 - }, 1778 - "funding": { 1779 - "type": "opencollective", 1780 - "url": "https://opencollective.com/typescript-eslint" 1781 - } 1782 - }, 1783 - "node_modules/@vitejs/plugin-react": { 1784 - "version": "4.6.0", 1785 - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz", 1786 - "integrity": "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ==", 1787 - "dev": true, 1788 - "license": "MIT", 1789 - "dependencies": { 1790 - "@babel/core": "^7.27.4", 1791 - "@babel/plugin-transform-react-jsx-self": "^7.27.1", 1792 - "@babel/plugin-transform-react-jsx-source": "^7.27.1", 1793 - "@rolldown/pluginutils": "1.0.0-beta.19", 1794 - "@types/babel__core": "^7.20.5", 1795 - "react-refresh": "^0.17.0" 1796 - }, 1797 - "engines": { 1798 - "node": "^14.18.0 || >=16.0.0" 1799 - }, 1800 - "peerDependencies": { 1801 - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" 1802 - } 1803 - }, 1804 - "node_modules/acorn": { 1805 - "version": "8.15.0", 1806 - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", 1807 - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", 1808 - "dev": true, 1809 - "license": "MIT", 1810 - "bin": { 1811 - "acorn": "bin/acorn" 1812 - }, 1813 - "engines": { 1814 - "node": ">=0.4.0" 1815 - } 1816 - }, 1817 - "node_modules/acorn-jsx": { 1818 - "version": "5.3.2", 1819 - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 1820 - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 1821 - "dev": true, 1822 - "license": "MIT", 1823 - "peerDependencies": { 1824 - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 1825 - } 1826 - }, 1827 - "node_modules/ajv": { 1828 - "version": "6.12.6", 1829 - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 1830 - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 1831 - "dev": true, 1832 - "license": "MIT", 1833 - "dependencies": { 1834 - "fast-deep-equal": "^3.1.1", 1835 - "fast-json-stable-stringify": "^2.0.0", 1836 - "json-schema-traverse": "^0.4.1", 1837 - "uri-js": "^4.2.2" 1838 - }, 1839 - "funding": { 1840 - "type": "github", 1841 - "url": "https://github.com/sponsors/epoberezkin" 1842 - } 1843 - }, 1844 - "node_modules/ansi-styles": { 1845 - "version": "4.3.0", 1846 - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1847 - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1848 - "dev": true, 1849 - "license": "MIT", 1850 - "dependencies": { 1851 - "color-convert": "^2.0.1" 1852 - }, 1853 - "engines": { 1854 - "node": ">=8" 1855 - }, 1856 - "funding": { 1857 - "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1858 - } 1859 - }, 1860 - "node_modules/argparse": { 1861 - "version": "2.0.1", 1862 - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 1863 - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 1864 - "dev": true, 1865 - "license": "Python-2.0" 1866 - }, 1867 - "node_modules/array-buffer-byte-length": { 1868 - "version": "1.0.2", 1869 - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", 1870 - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", 1871 - "dev": true, 1872 - "license": "MIT", 1873 - "dependencies": { 1874 - "call-bound": "^1.0.3", 1875 - "is-array-buffer": "^3.0.5" 1876 - }, 1877 - "engines": { 1878 - "node": ">= 0.4" 1879 - }, 1880 - "funding": { 1881 - "url": "https://github.com/sponsors/ljharb" 1882 - } 1883 - }, 1884 - "node_modules/array-includes": { 1885 - "version": "3.1.9", 1886 - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", 1887 - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", 1888 - "dev": true, 1889 - "license": "MIT", 1890 - "dependencies": { 1891 - "call-bind": "^1.0.8", 1892 - "call-bound": "^1.0.4", 1893 - "define-properties": "^1.2.1", 1894 - "es-abstract": "^1.24.0", 1895 - "es-object-atoms": "^1.1.1", 1896 - "get-intrinsic": "^1.3.0", 1897 - "is-string": "^1.1.1", 1898 - "math-intrinsics": "^1.1.0" 1899 - }, 1900 - "engines": { 1901 - "node": ">= 0.4" 1902 - }, 1903 - "funding": { 1904 - "url": "https://github.com/sponsors/ljharb" 1905 - } 1906 - }, 1907 - "node_modules/array.prototype.findlast": { 1908 - "version": "1.2.5", 1909 - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", 1910 - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", 1911 - "dev": true, 1912 - "license": "MIT", 1913 - "dependencies": { 1914 - "call-bind": "^1.0.7", 1915 - "define-properties": "^1.2.1", 1916 - "es-abstract": "^1.23.2", 1917 - "es-errors": "^1.3.0", 1918 - "es-object-atoms": "^1.0.0", 1919 - "es-shim-unscopables": "^1.0.2" 1920 - }, 1921 - "engines": { 1922 - "node": ">= 0.4" 1923 - }, 1924 - "funding": { 1925 - "url": "https://github.com/sponsors/ljharb" 1926 - } 1927 - }, 1928 - "node_modules/array.prototype.flat": { 1929 - "version": "1.3.3", 1930 - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", 1931 - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", 1932 - "dev": true, 1933 - "license": "MIT", 1934 - "dependencies": { 1935 - "call-bind": "^1.0.8", 1936 - "define-properties": "^1.2.1", 1937 - "es-abstract": "^1.23.5", 1938 - "es-shim-unscopables": "^1.0.2" 1939 - }, 1940 - "engines": { 1941 - "node": ">= 0.4" 1942 - }, 1943 - "funding": { 1944 - "url": "https://github.com/sponsors/ljharb" 1945 - } 1946 - }, 1947 - "node_modules/array.prototype.flatmap": { 1948 - "version": "1.3.3", 1949 - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", 1950 - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", 1951 - "dev": true, 1952 - "license": "MIT", 1953 - "dependencies": { 1954 - "call-bind": "^1.0.8", 1955 - "define-properties": "^1.2.1", 1956 - "es-abstract": "^1.23.5", 1957 - "es-shim-unscopables": "^1.0.2" 1958 - }, 1959 - "engines": { 1960 - "node": ">= 0.4" 1961 - }, 1962 - "funding": { 1963 - "url": "https://github.com/sponsors/ljharb" 1964 - } 1965 - }, 1966 - "node_modules/array.prototype.tosorted": { 1967 - "version": "1.1.4", 1968 - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", 1969 - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", 1970 - "dev": true, 1971 - "license": "MIT", 1972 - "dependencies": { 1973 - "call-bind": "^1.0.7", 1974 - "define-properties": "^1.2.1", 1975 - "es-abstract": "^1.23.3", 1976 - "es-errors": "^1.3.0", 1977 - "es-shim-unscopables": "^1.0.2" 1978 - }, 1979 - "engines": { 1980 - "node": ">= 0.4" 1981 - } 1982 - }, 1983 - "node_modules/arraybuffer.prototype.slice": { 1984 - "version": "1.0.4", 1985 - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", 1986 - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", 1987 - "dev": true, 1988 - "license": "MIT", 1989 - "dependencies": { 1990 - "array-buffer-byte-length": "^1.0.1", 1991 - "call-bind": "^1.0.8", 1992 - "define-properties": "^1.2.1", 1993 - "es-abstract": "^1.23.5", 1994 - "es-errors": "^1.3.0", 1995 - "get-intrinsic": "^1.2.6", 1996 - "is-array-buffer": "^3.0.4" 1997 - }, 1998 - "engines": { 1999 - "node": ">= 0.4" 2000 - }, 2001 - "funding": { 2002 - "url": "https://github.com/sponsors/ljharb" 2003 - } 2004 - }, 2005 - "node_modules/async-function": { 2006 - "version": "1.0.0", 2007 - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", 2008 - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", 2009 - "dev": true, 2010 - "license": "MIT", 2011 - "engines": { 2012 - "node": ">= 0.4" 2013 - } 2014 - }, 2015 - "node_modules/available-typed-arrays": { 2016 - "version": "1.0.7", 2017 - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", 2018 - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", 2019 - "dev": true, 2020 - "license": "MIT", 2021 - "dependencies": { 2022 - "possible-typed-array-names": "^1.0.0" 2023 - }, 2024 - "engines": { 2025 - "node": ">= 0.4" 2026 - }, 2027 - "funding": { 2028 - "url": "https://github.com/sponsors/ljharb" 2029 - } 2030 - }, 2031 - "node_modules/balanced-match": { 2032 - "version": "1.0.2", 2033 - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 2034 - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 2035 - "dev": true, 2036 - "license": "MIT" 2037 - }, 2038 - "node_modules/brace-expansion": { 2039 - "version": "1.1.12", 2040 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", 2041 - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", 2042 - "dev": true, 2043 - "license": "MIT", 2044 - "dependencies": { 2045 - "balanced-match": "^1.0.0", 2046 - "concat-map": "0.0.1" 2047 - } 2048 - }, 2049 - "node_modules/braces": { 2050 - "version": "3.0.3", 2051 - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 2052 - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 2053 - "dev": true, 2054 - "license": "MIT", 2055 - "dependencies": { 2056 - "fill-range": "^7.1.1" 2057 - }, 2058 - "engines": { 2059 - "node": ">=8" 2060 - } 2061 - }, 2062 - "node_modules/browserslist": { 2063 - "version": "4.25.0", 2064 - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", 2065 - "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", 2066 - "dev": true, 2067 - "funding": [ 2068 - { 2069 - "type": "opencollective", 2070 - "url": "https://opencollective.com/browserslist" 2071 - }, 2072 - { 2073 - "type": "tidelift", 2074 - "url": "https://tidelift.com/funding/github/npm/browserslist" 2075 - }, 2076 - { 2077 - "type": "github", 2078 - "url": "https://github.com/sponsors/ai" 2079 - } 2080 - ], 2081 - "license": "MIT", 2082 - "dependencies": { 2083 - "caniuse-lite": "^1.0.30001718", 2084 - "electron-to-chromium": "^1.5.160", 2085 - "node-releases": "^2.0.19", 2086 - "update-browserslist-db": "^1.1.3" 2087 - }, 2088 - "bin": { 2089 - "browserslist": "cli.js" 2090 - }, 2091 - "engines": { 2092 - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 2093 - } 2094 - }, 2095 - "node_modules/call-bind": { 2096 - "version": "1.0.8", 2097 - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", 2098 - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", 2099 - "dev": true, 2100 - "license": "MIT", 2101 - "dependencies": { 2102 - "call-bind-apply-helpers": "^1.0.0", 2103 - "es-define-property": "^1.0.0", 2104 - "get-intrinsic": "^1.2.4", 2105 - "set-function-length": "^1.2.2" 2106 - }, 2107 - "engines": { 2108 - "node": ">= 0.4" 2109 - }, 2110 - "funding": { 2111 - "url": "https://github.com/sponsors/ljharb" 2112 - } 2113 - }, 2114 - "node_modules/call-bind-apply-helpers": { 2115 - "version": "1.0.2", 2116 - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 2117 - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 2118 - "dev": true, 2119 - "license": "MIT", 2120 - "dependencies": { 2121 - "es-errors": "^1.3.0", 2122 - "function-bind": "^1.1.2" 2123 - }, 2124 - "engines": { 2125 - "node": ">= 0.4" 2126 - } 2127 - }, 2128 - "node_modules/call-bound": { 2129 - "version": "1.0.4", 2130 - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", 2131 - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 2132 - "dev": true, 2133 - "license": "MIT", 2134 - "dependencies": { 2135 - "call-bind-apply-helpers": "^1.0.2", 2136 - "get-intrinsic": "^1.3.0" 2137 - }, 2138 - "engines": { 2139 - "node": ">= 0.4" 2140 - }, 2141 - "funding": { 2142 - "url": "https://github.com/sponsors/ljharb" 2143 - } 2144 - }, 2145 - "node_modules/callsites": { 2146 - "version": "3.1.0", 2147 - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 2148 - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 2149 - "dev": true, 2150 - "license": "MIT", 2151 - "engines": { 2152 - "node": ">=6" 2153 - } 2154 - }, 2155 - "node_modules/caniuse-lite": { 2156 - "version": "1.0.30001724", 2157 - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz", 2158 - "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==", 2159 - "dev": true, 2160 - "funding": [ 2161 - { 2162 - "type": "opencollective", 2163 - "url": "https://opencollective.com/browserslist" 2164 - }, 2165 - { 2166 - "type": "tidelift", 2167 - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 2168 - }, 2169 - { 2170 - "type": "github", 2171 - "url": "https://github.com/sponsors/ai" 2172 - } 2173 - ], 2174 - "license": "CC-BY-4.0" 2175 - }, 2176 - "node_modules/chalk": { 2177 - "version": "4.1.2", 2178 - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 2179 - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 2180 - "dev": true, 2181 - "license": "MIT", 2182 - "dependencies": { 2183 - "ansi-styles": "^4.1.0", 2184 - "supports-color": "^7.1.0" 2185 - }, 2186 - "engines": { 2187 - "node": ">=10" 2188 - }, 2189 - "funding": { 2190 - "url": "https://github.com/chalk/chalk?sponsor=1" 2191 - } 2192 - }, 2193 - "node_modules/color-convert": { 2194 - "version": "2.0.1", 2195 - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2196 - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2197 - "dev": true, 2198 - "license": "MIT", 2199 - "dependencies": { 2200 - "color-name": "~1.1.4" 2201 - }, 2202 - "engines": { 2203 - "node": ">=7.0.0" 2204 - } 2205 - }, 2206 - "node_modules/color-name": { 2207 - "version": "1.1.4", 2208 - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2209 - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2210 - "dev": true, 2211 - "license": "MIT" 2212 - }, 2213 - "node_modules/concat-map": { 2214 - "version": "0.0.1", 2215 - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 2216 - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 2217 - "dev": true, 2218 - "license": "MIT" 2219 - }, 2220 - "node_modules/convert-source-map": { 2221 - "version": "2.0.0", 2222 - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 2223 - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 2224 - "dev": true, 2225 - "license": "MIT" 2226 - }, 2227 - "node_modules/cross-spawn": { 2228 - "version": "7.0.6", 2229 - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 2230 - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 2231 - "dev": true, 2232 - "license": "MIT", 2233 - "dependencies": { 2234 - "path-key": "^3.1.0", 2235 - "shebang-command": "^2.0.0", 2236 - "which": "^2.0.1" 2237 - }, 2238 - "engines": { 2239 - "node": ">= 8" 2240 - } 2241 - }, 2242 - "node_modules/csstype": { 2243 - "version": "3.1.3", 2244 - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 2245 - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 2246 - "dev": true, 2247 - "license": "MIT" 2248 - }, 2249 - "node_modules/data-view-buffer": { 2250 - "version": "1.0.2", 2251 - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", 2252 - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", 2253 - "dev": true, 2254 - "license": "MIT", 2255 - "dependencies": { 2256 - "call-bound": "^1.0.3", 2257 - "es-errors": "^1.3.0", 2258 - "is-data-view": "^1.0.2" 2259 - }, 2260 - "engines": { 2261 - "node": ">= 0.4" 2262 - }, 2263 - "funding": { 2264 - "url": "https://github.com/sponsors/ljharb" 2265 - } 2266 - }, 2267 - "node_modules/data-view-byte-length": { 2268 - "version": "1.0.2", 2269 - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", 2270 - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", 2271 - "dev": true, 2272 - "license": "MIT", 2273 - "dependencies": { 2274 - "call-bound": "^1.0.3", 2275 - "es-errors": "^1.3.0", 2276 - "is-data-view": "^1.0.2" 2277 - }, 2278 - "engines": { 2279 - "node": ">= 0.4" 2280 - }, 2281 - "funding": { 2282 - "url": "https://github.com/sponsors/inspect-js" 2283 - } 2284 - }, 2285 - "node_modules/data-view-byte-offset": { 2286 - "version": "1.0.1", 2287 - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", 2288 - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", 2289 - "dev": true, 2290 - "license": "MIT", 2291 - "dependencies": { 2292 - "call-bound": "^1.0.2", 2293 - "es-errors": "^1.3.0", 2294 - "is-data-view": "^1.0.1" 2295 - }, 2296 - "engines": { 2297 - "node": ">= 0.4" 2298 - }, 2299 - "funding": { 2300 - "url": "https://github.com/sponsors/ljharb" 2301 - } 2302 - }, 2303 - "node_modules/debug": { 2304 - "version": "4.4.1", 2305 - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 2306 - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 2307 - "dev": true, 2308 - "license": "MIT", 2309 - "dependencies": { 2310 - "ms": "^2.1.3" 2311 - }, 2312 - "engines": { 2313 - "node": ">=6.0" 2314 - }, 2315 - "peerDependenciesMeta": { 2316 - "supports-color": { 2317 - "optional": true 2318 - } 2319 - } 2320 - }, 2321 - "node_modules/deep-is": { 2322 - "version": "0.1.4", 2323 - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 2324 - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 2325 - "dev": true, 2326 - "license": "MIT" 2327 - }, 2328 - "node_modules/define-data-property": { 2329 - "version": "1.1.4", 2330 - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 2331 - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 2332 - "dev": true, 2333 - "license": "MIT", 2334 - "dependencies": { 2335 - "es-define-property": "^1.0.0", 2336 - "es-errors": "^1.3.0", 2337 - "gopd": "^1.0.1" 2338 - }, 2339 - "engines": { 2340 - "node": ">= 0.4" 2341 - }, 2342 - "funding": { 2343 - "url": "https://github.com/sponsors/ljharb" 2344 - } 2345 - }, 2346 - "node_modules/define-properties": { 2347 - "version": "1.2.1", 2348 - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", 2349 - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", 2350 - "dev": true, 2351 - "license": "MIT", 2352 - "dependencies": { 2353 - "define-data-property": "^1.0.1", 2354 - "has-property-descriptors": "^1.0.0", 2355 - "object-keys": "^1.1.1" 2356 - }, 2357 - "engines": { 2358 - "node": ">= 0.4" 2359 - }, 2360 - "funding": { 2361 - "url": "https://github.com/sponsors/ljharb" 2362 - } 2363 - }, 2364 - "node_modules/dequal": { 2365 - "version": "2.0.3", 2366 - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", 2367 - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", 2368 - "license": "MIT", 2369 - "engines": { 2370 - "node": ">=6" 2371 - } 2372 - }, 2373 - "node_modules/doctrine": { 2374 - "version": "2.1.0", 2375 - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 2376 - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 2377 - "dev": true, 2378 - "license": "Apache-2.0", 2379 - "dependencies": { 2380 - "esutils": "^2.0.2" 2381 - }, 2382 - "engines": { 2383 - "node": ">=0.10.0" 2384 - } 2385 - }, 2386 - "node_modules/dunder-proto": { 2387 - "version": "1.0.1", 2388 - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 2389 - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 2390 - "dev": true, 2391 - "license": "MIT", 2392 - "dependencies": { 2393 - "call-bind-apply-helpers": "^1.0.1", 2394 - "es-errors": "^1.3.0", 2395 - "gopd": "^1.2.0" 2396 - }, 2397 - "engines": { 2398 - "node": ">= 0.4" 2399 - } 2400 - }, 2401 - "node_modules/electron-to-chromium": { 2402 - "version": "1.5.172", 2403 - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.172.tgz", 2404 - "integrity": "sha512-fnKW9dGgmBfsebbYognQSv0CGGLFH1a5iV9EDYTBwmAQn+whbzHbLFlC+3XbHc8xaNtpO0etm8LOcRXs1qMRkQ==", 2405 - "dev": true, 2406 - "license": "ISC" 2407 - }, 2408 - "node_modules/es-abstract": { 2409 - "version": "1.24.0", 2410 - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", 2411 - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", 2412 - "dev": true, 2413 - "license": "MIT", 2414 - "dependencies": { 2415 - "array-buffer-byte-length": "^1.0.2", 2416 - "arraybuffer.prototype.slice": "^1.0.4", 2417 - "available-typed-arrays": "^1.0.7", 2418 - "call-bind": "^1.0.8", 2419 - "call-bound": "^1.0.4", 2420 - "data-view-buffer": "^1.0.2", 2421 - "data-view-byte-length": "^1.0.2", 2422 - "data-view-byte-offset": "^1.0.1", 2423 - "es-define-property": "^1.0.1", 2424 - "es-errors": "^1.3.0", 2425 - "es-object-atoms": "^1.1.1", 2426 - "es-set-tostringtag": "^2.1.0", 2427 - "es-to-primitive": "^1.3.0", 2428 - "function.prototype.name": "^1.1.8", 2429 - "get-intrinsic": "^1.3.0", 2430 - "get-proto": "^1.0.1", 2431 - "get-symbol-description": "^1.1.0", 2432 - "globalthis": "^1.0.4", 2433 - "gopd": "^1.2.0", 2434 - "has-property-descriptors": "^1.0.2", 2435 - "has-proto": "^1.2.0", 2436 - "has-symbols": "^1.1.0", 2437 - "hasown": "^2.0.2", 2438 - "internal-slot": "^1.1.0", 2439 - "is-array-buffer": "^3.0.5", 2440 - "is-callable": "^1.2.7", 2441 - "is-data-view": "^1.0.2", 2442 - "is-negative-zero": "^2.0.3", 2443 - "is-regex": "^1.2.1", 2444 - "is-set": "^2.0.3", 2445 - "is-shared-array-buffer": "^1.0.4", 2446 - "is-string": "^1.1.1", 2447 - "is-typed-array": "^1.1.15", 2448 - "is-weakref": "^1.1.1", 2449 - "math-intrinsics": "^1.1.0", 2450 - "object-inspect": "^1.13.4", 2451 - "object-keys": "^1.1.1", 2452 - "object.assign": "^4.1.7", 2453 - "own-keys": "^1.0.1", 2454 - "regexp.prototype.flags": "^1.5.4", 2455 - "safe-array-concat": "^1.1.3", 2456 - "safe-push-apply": "^1.0.0", 2457 - "safe-regex-test": "^1.1.0", 2458 - "set-proto": "^1.0.0", 2459 - "stop-iteration-iterator": "^1.1.0", 2460 - "string.prototype.trim": "^1.2.10", 2461 - "string.prototype.trimend": "^1.0.9", 2462 - "string.prototype.trimstart": "^1.0.8", 2463 - "typed-array-buffer": "^1.0.3", 2464 - "typed-array-byte-length": "^1.0.3", 2465 - "typed-array-byte-offset": "^1.0.4", 2466 - "typed-array-length": "^1.0.7", 2467 - "unbox-primitive": "^1.1.0", 2468 - "which-typed-array": "^1.1.19" 2469 - }, 2470 - "engines": { 2471 - "node": ">= 0.4" 2472 - }, 2473 - "funding": { 2474 - "url": "https://github.com/sponsors/ljharb" 2475 - } 2476 - }, 2477 - "node_modules/es-define-property": { 2478 - "version": "1.0.1", 2479 - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 2480 - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 2481 - "dev": true, 2482 - "license": "MIT", 2483 - "engines": { 2484 - "node": ">= 0.4" 2485 - } 2486 - }, 2487 - "node_modules/es-errors": { 2488 - "version": "1.3.0", 2489 - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 2490 - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 2491 - "dev": true, 2492 - "license": "MIT", 2493 - "engines": { 2494 - "node": ">= 0.4" 2495 - } 2496 - }, 2497 - "node_modules/es-iterator-helpers": { 2498 - "version": "1.2.1", 2499 - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", 2500 - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", 2501 - "dev": true, 2502 - "license": "MIT", 2503 - "dependencies": { 2504 - "call-bind": "^1.0.8", 2505 - "call-bound": "^1.0.3", 2506 - "define-properties": "^1.2.1", 2507 - "es-abstract": "^1.23.6", 2508 - "es-errors": "^1.3.0", 2509 - "es-set-tostringtag": "^2.0.3", 2510 - "function-bind": "^1.1.2", 2511 - "get-intrinsic": "^1.2.6", 2512 - "globalthis": "^1.0.4", 2513 - "gopd": "^1.2.0", 2514 - "has-property-descriptors": "^1.0.2", 2515 - "has-proto": "^1.2.0", 2516 - "has-symbols": "^1.1.0", 2517 - "internal-slot": "^1.1.0", 2518 - "iterator.prototype": "^1.1.4", 2519 - "safe-array-concat": "^1.1.3" 2520 - }, 2521 - "engines": { 2522 - "node": ">= 0.4" 2523 - } 2524 - }, 2525 - "node_modules/es-object-atoms": { 2526 - "version": "1.1.1", 2527 - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 2528 - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 2529 - "dev": true, 2530 - "license": "MIT", 2531 - "dependencies": { 2532 - "es-errors": "^1.3.0" 2533 - }, 2534 - "engines": { 2535 - "node": ">= 0.4" 2536 - } 2537 - }, 2538 - "node_modules/es-set-tostringtag": { 2539 - "version": "2.1.0", 2540 - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", 2541 - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", 2542 - "dev": true, 2543 - "license": "MIT", 2544 - "dependencies": { 2545 - "es-errors": "^1.3.0", 2546 - "get-intrinsic": "^1.2.6", 2547 - "has-tostringtag": "^1.0.2", 2548 - "hasown": "^2.0.2" 2549 - }, 2550 - "engines": { 2551 - "node": ">= 0.4" 2552 - } 2553 - }, 2554 - "node_modules/es-shim-unscopables": { 2555 - "version": "1.1.0", 2556 - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", 2557 - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", 2558 - "dev": true, 2559 - "license": "MIT", 2560 - "dependencies": { 2561 - "hasown": "^2.0.2" 2562 - }, 2563 - "engines": { 2564 - "node": ">= 0.4" 2565 - } 2566 - }, 2567 - "node_modules/es-to-primitive": { 2568 - "version": "1.3.0", 2569 - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", 2570 - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", 2571 - "dev": true, 2572 - "license": "MIT", 2573 - "dependencies": { 2574 - "is-callable": "^1.2.7", 2575 - "is-date-object": "^1.0.5", 2576 - "is-symbol": "^1.0.4" 2577 - }, 2578 - "engines": { 2579 - "node": ">= 0.4" 2580 - }, 2581 - "funding": { 2582 - "url": "https://github.com/sponsors/ljharb" 2583 - } 2584 - }, 2585 - "node_modules/esbuild": { 2586 - "version": "0.25.5", 2587 - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", 2588 - "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", 2589 - "dev": true, 2590 - "hasInstallScript": true, 2591 - "license": "MIT", 2592 - "bin": { 2593 - "esbuild": "bin/esbuild" 2594 - }, 2595 - "engines": { 2596 - "node": ">=18" 2597 - }, 2598 - "optionalDependencies": { 2599 - "@esbuild/aix-ppc64": "0.25.5", 2600 - "@esbuild/android-arm": "0.25.5", 2601 - "@esbuild/android-arm64": "0.25.5", 2602 - "@esbuild/android-x64": "0.25.5", 2603 - "@esbuild/darwin-arm64": "0.25.5", 2604 - "@esbuild/darwin-x64": "0.25.5", 2605 - "@esbuild/freebsd-arm64": "0.25.5", 2606 - "@esbuild/freebsd-x64": "0.25.5", 2607 - "@esbuild/linux-arm": "0.25.5", 2608 - "@esbuild/linux-arm64": "0.25.5", 2609 - "@esbuild/linux-ia32": "0.25.5", 2610 - "@esbuild/linux-loong64": "0.25.5", 2611 - "@esbuild/linux-mips64el": "0.25.5", 2612 - "@esbuild/linux-ppc64": "0.25.5", 2613 - "@esbuild/linux-riscv64": "0.25.5", 2614 - "@esbuild/linux-s390x": "0.25.5", 2615 - "@esbuild/linux-x64": "0.25.5", 2616 - "@esbuild/netbsd-arm64": "0.25.5", 2617 - "@esbuild/netbsd-x64": "0.25.5", 2618 - "@esbuild/openbsd-arm64": "0.25.5", 2619 - "@esbuild/openbsd-x64": "0.25.5", 2620 - "@esbuild/sunos-x64": "0.25.5", 2621 - "@esbuild/win32-arm64": "0.25.5", 2622 - "@esbuild/win32-ia32": "0.25.5", 2623 - "@esbuild/win32-x64": "0.25.5" 2624 - } 2625 - }, 2626 - "node_modules/escalade": { 2627 - "version": "3.2.0", 2628 - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 2629 - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 2630 - "dev": true, 2631 - "license": "MIT", 2632 - "engines": { 2633 - "node": ">=6" 2634 - } 2635 - }, 2636 - "node_modules/escape-string-regexp": { 2637 - "version": "4.0.0", 2638 - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 2639 - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 2640 - "dev": true, 2641 - "license": "MIT", 2642 - "engines": { 2643 - "node": ">=10" 2644 - }, 2645 - "funding": { 2646 - "url": "https://github.com/sponsors/sindresorhus" 2647 - } 2648 - }, 2649 - "node_modules/eslint": { 2650 - "version": "9.29.0", 2651 - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", 2652 - "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", 2653 - "dev": true, 2654 - "license": "MIT", 2655 - "dependencies": { 2656 - "@eslint-community/eslint-utils": "^4.2.0", 2657 - "@eslint-community/regexpp": "^4.12.1", 2658 - "@eslint/config-array": "^0.20.1", 2659 - "@eslint/config-helpers": "^0.2.1", 2660 - "@eslint/core": "^0.14.0", 2661 - "@eslint/eslintrc": "^3.3.1", 2662 - "@eslint/js": "9.29.0", 2663 - "@eslint/plugin-kit": "^0.3.1", 2664 - "@humanfs/node": "^0.16.6", 2665 - "@humanwhocodes/module-importer": "^1.0.1", 2666 - "@humanwhocodes/retry": "^0.4.2", 2667 - "@types/estree": "^1.0.6", 2668 - "@types/json-schema": "^7.0.15", 2669 - "ajv": "^6.12.4", 2670 - "chalk": "^4.0.0", 2671 - "cross-spawn": "^7.0.6", 2672 - "debug": "^4.3.2", 2673 - "escape-string-regexp": "^4.0.0", 2674 - "eslint-scope": "^8.4.0", 2675 - "eslint-visitor-keys": "^4.2.1", 2676 - "espree": "^10.4.0", 2677 - "esquery": "^1.5.0", 2678 - "esutils": "^2.0.2", 2679 - "fast-deep-equal": "^3.1.3", 2680 - "file-entry-cache": "^8.0.0", 2681 - "find-up": "^5.0.0", 2682 - "glob-parent": "^6.0.2", 2683 - "ignore": "^5.2.0", 2684 - "imurmurhash": "^0.1.4", 2685 - "is-glob": "^4.0.0", 2686 - "json-stable-stringify-without-jsonify": "^1.0.1", 2687 - "lodash.merge": "^4.6.2", 2688 - "minimatch": "^3.1.2", 2689 - "natural-compare": "^1.4.0", 2690 - "optionator": "^0.9.3" 2691 - }, 2692 - "bin": { 2693 - "eslint": "bin/eslint.js" 2694 - }, 2695 - "engines": { 2696 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2697 - }, 2698 - "funding": { 2699 - "url": "https://eslint.org/donate" 2700 - }, 2701 - "peerDependencies": { 2702 - "jiti": "*" 2703 - }, 2704 - "peerDependenciesMeta": { 2705 - "jiti": { 2706 - "optional": true 2707 - } 2708 - } 2709 - }, 2710 - "node_modules/eslint-plugin-react": { 2711 - "version": "7.37.5", 2712 - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", 2713 - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", 2714 - "dev": true, 2715 - "license": "MIT", 2716 - "dependencies": { 2717 - "array-includes": "^3.1.8", 2718 - "array.prototype.findlast": "^1.2.5", 2719 - "array.prototype.flatmap": "^1.3.3", 2720 - "array.prototype.tosorted": "^1.1.4", 2721 - "doctrine": "^2.1.0", 2722 - "es-iterator-helpers": "^1.2.1", 2723 - "estraverse": "^5.3.0", 2724 - "hasown": "^2.0.2", 2725 - "jsx-ast-utils": "^2.4.1 || ^3.0.0", 2726 - "minimatch": "^3.1.2", 2727 - "object.entries": "^1.1.9", 2728 - "object.fromentries": "^2.0.8", 2729 - "object.values": "^1.2.1", 2730 - "prop-types": "^15.8.1", 2731 - "resolve": "^2.0.0-next.5", 2732 - "semver": "^6.3.1", 2733 - "string.prototype.matchall": "^4.0.12", 2734 - "string.prototype.repeat": "^1.0.0" 2735 - }, 2736 - "engines": { 2737 - "node": ">=4" 2738 - }, 2739 - "peerDependencies": { 2740 - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" 2741 - } 2742 - }, 2743 - "node_modules/eslint-plugin-react-hooks": { 2744 - "version": "5.2.0", 2745 - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", 2746 - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", 2747 - "dev": true, 2748 - "license": "MIT", 2749 - "engines": { 2750 - "node": ">=10" 2751 - }, 2752 - "peerDependencies": { 2753 - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" 2754 - } 2755 - }, 2756 - "node_modules/eslint-scope": { 2757 - "version": "8.4.0", 2758 - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", 2759 - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", 2760 - "dev": true, 2761 - "license": "BSD-2-Clause", 2762 - "dependencies": { 2763 - "esrecurse": "^4.3.0", 2764 - "estraverse": "^5.2.0" 2765 - }, 2766 - "engines": { 2767 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2768 - }, 2769 - "funding": { 2770 - "url": "https://opencollective.com/eslint" 2771 - } 2772 - }, 2773 - "node_modules/eslint-visitor-keys": { 2774 - "version": "4.2.1", 2775 - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", 2776 - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", 2777 - "dev": true, 2778 - "license": "Apache-2.0", 2779 - "engines": { 2780 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2781 - }, 2782 - "funding": { 2783 - "url": "https://opencollective.com/eslint" 2784 - } 2785 - }, 2786 - "node_modules/espree": { 2787 - "version": "10.4.0", 2788 - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", 2789 - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", 2790 - "dev": true, 2791 - "license": "BSD-2-Clause", 2792 - "dependencies": { 2793 - "acorn": "^8.15.0", 2794 - "acorn-jsx": "^5.3.2", 2795 - "eslint-visitor-keys": "^4.2.1" 2796 - }, 2797 - "engines": { 2798 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 2799 - }, 2800 - "funding": { 2801 - "url": "https://opencollective.com/eslint" 2802 - } 2803 - }, 2804 - "node_modules/esquery": { 2805 - "version": "1.6.0", 2806 - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 2807 - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 2808 - "dev": true, 2809 - "license": "BSD-3-Clause", 2810 - "dependencies": { 2811 - "estraverse": "^5.1.0" 2812 - }, 2813 - "engines": { 2814 - "node": ">=0.10" 2815 - } 2816 - }, 2817 - "node_modules/esrecurse": { 2818 - "version": "4.3.0", 2819 - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 2820 - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 2821 - "dev": true, 2822 - "license": "BSD-2-Clause", 2823 - "dependencies": { 2824 - "estraverse": "^5.2.0" 2825 - }, 2826 - "engines": { 2827 - "node": ">=4.0" 2828 - } 2829 - }, 2830 - "node_modules/estraverse": { 2831 - "version": "5.3.0", 2832 - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 2833 - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 2834 - "dev": true, 2835 - "license": "BSD-2-Clause", 2836 - "engines": { 2837 - "node": ">=4.0" 2838 - } 2839 - }, 2840 - "node_modules/esutils": { 2841 - "version": "2.0.3", 2842 - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 2843 - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 2844 - "dev": true, 2845 - "license": "BSD-2-Clause", 2846 - "engines": { 2847 - "node": ">=0.10.0" 2848 - } 2849 - }, 2850 - "node_modules/fast-deep-equal": { 2851 - "version": "3.1.3", 2852 - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 2853 - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 2854 - "dev": true, 2855 - "license": "MIT" 2856 - }, 2857 - "node_modules/fast-glob": { 2858 - "version": "3.3.3", 2859 - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 2860 - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 2861 - "dev": true, 2862 - "license": "MIT", 2863 - "dependencies": { 2864 - "@nodelib/fs.stat": "^2.0.2", 2865 - "@nodelib/fs.walk": "^1.2.3", 2866 - "glob-parent": "^5.1.2", 2867 - "merge2": "^1.3.0", 2868 - "micromatch": "^4.0.8" 2869 - }, 2870 - "engines": { 2871 - "node": ">=8.6.0" 2872 - } 2873 - }, 2874 - "node_modules/fast-glob/node_modules/glob-parent": { 2875 - "version": "5.1.2", 2876 - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2877 - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2878 - "dev": true, 2879 - "license": "ISC", 2880 - "dependencies": { 2881 - "is-glob": "^4.0.1" 2882 - }, 2883 - "engines": { 2884 - "node": ">= 6" 2885 - } 2886 - }, 2887 - "node_modules/fast-json-stable-stringify": { 2888 - "version": "2.1.0", 2889 - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 2890 - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 2891 - "dev": true, 2892 - "license": "MIT" 2893 - }, 2894 - "node_modules/fast-levenshtein": { 2895 - "version": "2.0.6", 2896 - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 2897 - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 2898 - "dev": true, 2899 - "license": "MIT" 2900 - }, 2901 - "node_modules/fastq": { 2902 - "version": "1.19.1", 2903 - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", 2904 - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", 2905 - "dev": true, 2906 - "license": "ISC", 2907 - "dependencies": { 2908 - "reusify": "^1.0.4" 2909 - } 2910 - }, 2911 - "node_modules/file-entry-cache": { 2912 - "version": "8.0.0", 2913 - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 2914 - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 2915 - "dev": true, 2916 - "license": "MIT", 2917 - "dependencies": { 2918 - "flat-cache": "^4.0.0" 2919 - }, 2920 - "engines": { 2921 - "node": ">=16.0.0" 2922 - } 2923 - }, 2924 - "node_modules/fill-range": { 2925 - "version": "7.1.1", 2926 - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 2927 - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 2928 - "dev": true, 2929 - "license": "MIT", 2930 - "dependencies": { 2931 - "to-regex-range": "^5.0.1" 2932 - }, 2933 - "engines": { 2934 - "node": ">=8" 2935 - } 2936 - }, 2937 - "node_modules/find-up": { 2938 - "version": "5.0.0", 2939 - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 2940 - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 2941 - "dev": true, 2942 - "license": "MIT", 2943 - "dependencies": { 2944 - "locate-path": "^6.0.0", 2945 - "path-exists": "^4.0.0" 2946 - }, 2947 - "engines": { 2948 - "node": ">=10" 2949 - }, 2950 - "funding": { 2951 - "url": "https://github.com/sponsors/sindresorhus" 2952 - } 2953 - }, 2954 - "node_modules/flat-cache": { 2955 - "version": "4.0.1", 2956 - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 2957 - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 2958 - "dev": true, 2959 - "license": "MIT", 2960 - "dependencies": { 2961 - "flatted": "^3.2.9", 2962 - "keyv": "^4.5.4" 2963 - }, 2964 - "engines": { 2965 - "node": ">=16" 2966 - } 2967 - }, 2968 - "node_modules/flatted": { 2969 - "version": "3.3.3", 2970 - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", 2971 - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", 2972 - "dev": true, 2973 - "license": "ISC" 2974 - }, 2975 - "node_modules/for-each": { 2976 - "version": "0.3.5", 2977 - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", 2978 - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", 2979 - "dev": true, 2980 - "license": "MIT", 2981 - "dependencies": { 2982 - "is-callable": "^1.2.7" 2983 - }, 2984 - "engines": { 2985 - "node": ">= 0.4" 2986 - }, 2987 - "funding": { 2988 - "url": "https://github.com/sponsors/ljharb" 2989 - } 2990 - }, 2991 - "node_modules/fsevents": { 2992 - "version": "2.3.3", 2993 - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 2994 - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 2995 - "dev": true, 2996 - "hasInstallScript": true, 2997 - "license": "MIT", 2998 - "optional": true, 2999 - "os": [ 3000 - "darwin" 3001 - ], 3002 - "engines": { 3003 - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 3004 - } 3005 - }, 3006 - "node_modules/function-bind": { 3007 - "version": "1.1.2", 3008 - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 3009 - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 3010 - "dev": true, 3011 - "license": "MIT", 3012 - "funding": { 3013 - "url": "https://github.com/sponsors/ljharb" 3014 - } 3015 - }, 3016 - "node_modules/function.prototype.name": { 3017 - "version": "1.1.8", 3018 - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", 3019 - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", 3020 - "dev": true, 3021 - "license": "MIT", 3022 - "dependencies": { 3023 - "call-bind": "^1.0.8", 3024 - "call-bound": "^1.0.3", 3025 - "define-properties": "^1.2.1", 3026 - "functions-have-names": "^1.2.3", 3027 - "hasown": "^2.0.2", 3028 - "is-callable": "^1.2.7" 3029 - }, 3030 - "engines": { 3031 - "node": ">= 0.4" 3032 - }, 3033 - "funding": { 3034 - "url": "https://github.com/sponsors/ljharb" 3035 - } 3036 - }, 3037 - "node_modules/functions-have-names": { 3038 - "version": "1.2.3", 3039 - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 3040 - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 3041 - "dev": true, 3042 - "license": "MIT", 3043 - "funding": { 3044 - "url": "https://github.com/sponsors/ljharb" 3045 - } 3046 - }, 3047 - "node_modules/gensync": { 3048 - "version": "1.0.0-beta.2", 3049 - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 3050 - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 3051 - "dev": true, 3052 - "license": "MIT", 3053 - "engines": { 3054 - "node": ">=6.9.0" 3055 - } 3056 - }, 3057 - "node_modules/get-intrinsic": { 3058 - "version": "1.3.0", 3059 - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 3060 - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 3061 - "dev": true, 3062 - "license": "MIT", 3063 - "dependencies": { 3064 - "call-bind-apply-helpers": "^1.0.2", 3065 - "es-define-property": "^1.0.1", 3066 - "es-errors": "^1.3.0", 3067 - "es-object-atoms": "^1.1.1", 3068 - "function-bind": "^1.1.2", 3069 - "get-proto": "^1.0.1", 3070 - "gopd": "^1.2.0", 3071 - "has-symbols": "^1.1.0", 3072 - "hasown": "^2.0.2", 3073 - "math-intrinsics": "^1.1.0" 3074 - }, 3075 - "engines": { 3076 - "node": ">= 0.4" 3077 - }, 3078 - "funding": { 3079 - "url": "https://github.com/sponsors/ljharb" 3080 - } 3081 - }, 3082 - "node_modules/get-proto": { 3083 - "version": "1.0.1", 3084 - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 3085 - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 3086 - "dev": true, 3087 - "license": "MIT", 3088 - "dependencies": { 3089 - "dunder-proto": "^1.0.1", 3090 - "es-object-atoms": "^1.0.0" 3091 - }, 3092 - "engines": { 3093 - "node": ">= 0.4" 3094 - } 3095 - }, 3096 - "node_modules/get-symbol-description": { 3097 - "version": "1.1.0", 3098 - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", 3099 - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", 3100 - "dev": true, 3101 - "license": "MIT", 3102 - "dependencies": { 3103 - "call-bound": "^1.0.3", 3104 - "es-errors": "^1.3.0", 3105 - "get-intrinsic": "^1.2.6" 3106 - }, 3107 - "engines": { 3108 - "node": ">= 0.4" 3109 - }, 3110 - "funding": { 3111 - "url": "https://github.com/sponsors/ljharb" 3112 - } 3113 - }, 3114 - "node_modules/glob-parent": { 3115 - "version": "6.0.2", 3116 - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 3117 - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 3118 - "dev": true, 3119 - "license": "ISC", 3120 - "dependencies": { 3121 - "is-glob": "^4.0.3" 3122 - }, 3123 - "engines": { 3124 - "node": ">=10.13.0" 3125 - } 3126 - }, 3127 - "node_modules/globals": { 3128 - "version": "16.2.0", 3129 - "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", 3130 - "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", 3131 - "dev": true, 3132 - "license": "MIT", 3133 - "engines": { 3134 - "node": ">=18" 3135 - }, 3136 - "funding": { 3137 - "url": "https://github.com/sponsors/sindresorhus" 3138 - } 3139 - }, 3140 - "node_modules/globalthis": { 3141 - "version": "1.0.4", 3142 - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", 3143 - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", 3144 - "dev": true, 3145 - "license": "MIT", 3146 - "dependencies": { 3147 - "define-properties": "^1.2.1", 3148 - "gopd": "^1.0.1" 3149 - }, 3150 - "engines": { 3151 - "node": ">= 0.4" 3152 - }, 3153 - "funding": { 3154 - "url": "https://github.com/sponsors/ljharb" 3155 - } 3156 - }, 3157 - "node_modules/gopd": { 3158 - "version": "1.2.0", 3159 - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 3160 - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 3161 - "dev": true, 3162 - "license": "MIT", 3163 - "engines": { 3164 - "node": ">= 0.4" 3165 - }, 3166 - "funding": { 3167 - "url": "https://github.com/sponsors/ljharb" 3168 - } 3169 - }, 3170 - "node_modules/graphemer": { 3171 - "version": "1.4.0", 3172 - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 3173 - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 3174 - "dev": true, 3175 - "license": "MIT" 3176 - }, 3177 - "node_modules/has-bigints": { 3178 - "version": "1.1.0", 3179 - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", 3180 - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", 3181 - "dev": true, 3182 - "license": "MIT", 3183 - "engines": { 3184 - "node": ">= 0.4" 3185 - }, 3186 - "funding": { 3187 - "url": "https://github.com/sponsors/ljharb" 3188 - } 3189 - }, 3190 - "node_modules/has-flag": { 3191 - "version": "4.0.0", 3192 - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 3193 - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 3194 - "dev": true, 3195 - "license": "MIT", 3196 - "engines": { 3197 - "node": ">=8" 3198 - } 3199 - }, 3200 - "node_modules/has-property-descriptors": { 3201 - "version": "1.0.2", 3202 - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 3203 - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 3204 - "dev": true, 3205 - "license": "MIT", 3206 - "dependencies": { 3207 - "es-define-property": "^1.0.0" 3208 - }, 3209 - "funding": { 3210 - "url": "https://github.com/sponsors/ljharb" 3211 - } 3212 - }, 3213 - "node_modules/has-proto": { 3214 - "version": "1.2.0", 3215 - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", 3216 - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", 3217 - "dev": true, 3218 - "license": "MIT", 3219 - "dependencies": { 3220 - "dunder-proto": "^1.0.0" 3221 - }, 3222 - "engines": { 3223 - "node": ">= 0.4" 3224 - }, 3225 - "funding": { 3226 - "url": "https://github.com/sponsors/ljharb" 3227 - } 3228 - }, 3229 - "node_modules/has-symbols": { 3230 - "version": "1.1.0", 3231 - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 3232 - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 3233 - "dev": true, 3234 - "license": "MIT", 3235 - "engines": { 3236 - "node": ">= 0.4" 3237 - }, 3238 - "funding": { 3239 - "url": "https://github.com/sponsors/ljharb" 3240 - } 3241 - }, 3242 - "node_modules/has-tostringtag": { 3243 - "version": "1.0.2", 3244 - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", 3245 - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", 3246 - "dev": true, 3247 - "license": "MIT", 3248 - "dependencies": { 3249 - "has-symbols": "^1.0.3" 3250 - }, 3251 - "engines": { 3252 - "node": ">= 0.4" 3253 - }, 3254 - "funding": { 3255 - "url": "https://github.com/sponsors/ljharb" 3256 - } 3257 - }, 3258 - "node_modules/hasown": { 3259 - "version": "2.0.2", 3260 - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 3261 - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 3262 - "dev": true, 3263 - "license": "MIT", 3264 - "dependencies": { 3265 - "function-bind": "^1.1.2" 3266 - }, 3267 - "engines": { 3268 - "node": ">= 0.4" 3269 - } 3270 - }, 3271 - "node_modules/ignore": { 3272 - "version": "5.3.2", 3273 - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 3274 - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 3275 - "dev": true, 3276 - "license": "MIT", 3277 - "engines": { 3278 - "node": ">= 4" 3279 - } 3280 - }, 3281 - "node_modules/import-fresh": { 3282 - "version": "3.3.1", 3283 - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 3284 - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 3285 - "dev": true, 3286 - "license": "MIT", 3287 - "dependencies": { 3288 - "parent-module": "^1.0.0", 3289 - "resolve-from": "^4.0.0" 3290 - }, 3291 - "engines": { 3292 - "node": ">=6" 3293 - }, 3294 - "funding": { 3295 - "url": "https://github.com/sponsors/sindresorhus" 3296 - } 3297 - }, 3298 - "node_modules/imurmurhash": { 3299 - "version": "0.1.4", 3300 - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 3301 - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 3302 - "dev": true, 3303 - "license": "MIT", 3304 - "engines": { 3305 - "node": ">=0.8.19" 3306 - } 3307 - }, 3308 - "node_modules/internal-slot": { 3309 - "version": "1.1.0", 3310 - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", 3311 - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", 3312 - "dev": true, 3313 - "license": "MIT", 3314 - "dependencies": { 3315 - "es-errors": "^1.3.0", 3316 - "hasown": "^2.0.2", 3317 - "side-channel": "^1.1.0" 3318 - }, 3319 - "engines": { 3320 - "node": ">= 0.4" 3321 - } 3322 - }, 3323 - "node_modules/is-array-buffer": { 3324 - "version": "3.0.5", 3325 - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", 3326 - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", 3327 - "dev": true, 3328 - "license": "MIT", 3329 - "dependencies": { 3330 - "call-bind": "^1.0.8", 3331 - "call-bound": "^1.0.3", 3332 - "get-intrinsic": "^1.2.6" 3333 - }, 3334 - "engines": { 3335 - "node": ">= 0.4" 3336 - }, 3337 - "funding": { 3338 - "url": "https://github.com/sponsors/ljharb" 3339 - } 3340 - }, 3341 - "node_modules/is-async-function": { 3342 - "version": "2.1.1", 3343 - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", 3344 - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", 3345 - "dev": true, 3346 - "license": "MIT", 3347 - "dependencies": { 3348 - "async-function": "^1.0.0", 3349 - "call-bound": "^1.0.3", 3350 - "get-proto": "^1.0.1", 3351 - "has-tostringtag": "^1.0.2", 3352 - "safe-regex-test": "^1.1.0" 3353 - }, 3354 - "engines": { 3355 - "node": ">= 0.4" 3356 - }, 3357 - "funding": { 3358 - "url": "https://github.com/sponsors/ljharb" 3359 - } 3360 - }, 3361 - "node_modules/is-bigint": { 3362 - "version": "1.1.0", 3363 - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", 3364 - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", 3365 - "dev": true, 3366 - "license": "MIT", 3367 - "dependencies": { 3368 - "has-bigints": "^1.0.2" 3369 - }, 3370 - "engines": { 3371 - "node": ">= 0.4" 3372 - }, 3373 - "funding": { 3374 - "url": "https://github.com/sponsors/ljharb" 3375 - } 3376 - }, 3377 - "node_modules/is-boolean-object": { 3378 - "version": "1.2.2", 3379 - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", 3380 - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", 3381 - "dev": true, 3382 - "license": "MIT", 3383 - "dependencies": { 3384 - "call-bound": "^1.0.3", 3385 - "has-tostringtag": "^1.0.2" 3386 - }, 3387 - "engines": { 3388 - "node": ">= 0.4" 3389 - }, 3390 - "funding": { 3391 - "url": "https://github.com/sponsors/ljharb" 3392 - } 3393 - }, 3394 - "node_modules/is-callable": { 3395 - "version": "1.2.7", 3396 - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 3397 - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 3398 - "dev": true, 3399 - "license": "MIT", 3400 - "engines": { 3401 - "node": ">= 0.4" 3402 - }, 3403 - "funding": { 3404 - "url": "https://github.com/sponsors/ljharb" 3405 - } 3406 - }, 3407 - "node_modules/is-core-module": { 3408 - "version": "2.16.1", 3409 - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 3410 - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 3411 - "dev": true, 3412 - "license": "MIT", 3413 - "dependencies": { 3414 - "hasown": "^2.0.2" 3415 - }, 3416 - "engines": { 3417 - "node": ">= 0.4" 3418 - }, 3419 - "funding": { 3420 - "url": "https://github.com/sponsors/ljharb" 3421 - } 3422 - }, 3423 - "node_modules/is-data-view": { 3424 - "version": "1.0.2", 3425 - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", 3426 - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", 3427 - "dev": true, 3428 - "license": "MIT", 3429 - "dependencies": { 3430 - "call-bound": "^1.0.2", 3431 - "get-intrinsic": "^1.2.6", 3432 - "is-typed-array": "^1.1.13" 3433 - }, 3434 - "engines": { 3435 - "node": ">= 0.4" 3436 - }, 3437 - "funding": { 3438 - "url": "https://github.com/sponsors/ljharb" 3439 - } 3440 - }, 3441 - "node_modules/is-date-object": { 3442 - "version": "1.1.0", 3443 - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", 3444 - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", 3445 - "dev": true, 3446 - "license": "MIT", 3447 - "dependencies": { 3448 - "call-bound": "^1.0.2", 3449 - "has-tostringtag": "^1.0.2" 3450 - }, 3451 - "engines": { 3452 - "node": ">= 0.4" 3453 - }, 3454 - "funding": { 3455 - "url": "https://github.com/sponsors/ljharb" 3456 - } 3457 - }, 3458 - "node_modules/is-extglob": { 3459 - "version": "2.1.1", 3460 - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 3461 - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 3462 - "dev": true, 3463 - "license": "MIT", 3464 - "engines": { 3465 - "node": ">=0.10.0" 3466 - } 3467 - }, 3468 - "node_modules/is-finalizationregistry": { 3469 - "version": "1.1.1", 3470 - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", 3471 - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", 3472 - "dev": true, 3473 - "license": "MIT", 3474 - "dependencies": { 3475 - "call-bound": "^1.0.3" 3476 - }, 3477 - "engines": { 3478 - "node": ">= 0.4" 3479 - }, 3480 - "funding": { 3481 - "url": "https://github.com/sponsors/ljharb" 3482 - } 3483 - }, 3484 - "node_modules/is-generator-function": { 3485 - "version": "1.1.0", 3486 - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", 3487 - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", 3488 - "dev": true, 3489 - "license": "MIT", 3490 - "dependencies": { 3491 - "call-bound": "^1.0.3", 3492 - "get-proto": "^1.0.0", 3493 - "has-tostringtag": "^1.0.2", 3494 - "safe-regex-test": "^1.1.0" 3495 - }, 3496 - "engines": { 3497 - "node": ">= 0.4" 3498 - }, 3499 - "funding": { 3500 - "url": "https://github.com/sponsors/ljharb" 3501 - } 3502 - }, 3503 - "node_modules/is-glob": { 3504 - "version": "4.0.3", 3505 - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 3506 - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 3507 - "dev": true, 3508 - "license": "MIT", 3509 - "dependencies": { 3510 - "is-extglob": "^2.1.1" 3511 - }, 3512 - "engines": { 3513 - "node": ">=0.10.0" 3514 - } 3515 - }, 3516 - "node_modules/is-map": { 3517 - "version": "2.0.3", 3518 - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", 3519 - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", 3520 - "dev": true, 3521 - "license": "MIT", 3522 - "engines": { 3523 - "node": ">= 0.4" 3524 - }, 3525 - "funding": { 3526 - "url": "https://github.com/sponsors/ljharb" 3527 - } 3528 - }, 3529 - "node_modules/is-negative-zero": { 3530 - "version": "2.0.3", 3531 - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", 3532 - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", 3533 - "dev": true, 3534 - "license": "MIT", 3535 - "engines": { 3536 - "node": ">= 0.4" 3537 - }, 3538 - "funding": { 3539 - "url": "https://github.com/sponsors/ljharb" 3540 - } 3541 - }, 3542 - "node_modules/is-number": { 3543 - "version": "7.0.0", 3544 - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 3545 - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 3546 - "dev": true, 3547 - "license": "MIT", 3548 - "engines": { 3549 - "node": ">=0.12.0" 3550 - } 3551 - }, 3552 - "node_modules/is-number-object": { 3553 - "version": "1.1.1", 3554 - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", 3555 - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", 3556 - "dev": true, 3557 - "license": "MIT", 3558 - "dependencies": { 3559 - "call-bound": "^1.0.3", 3560 - "has-tostringtag": "^1.0.2" 3561 - }, 3562 - "engines": { 3563 - "node": ">= 0.4" 3564 - }, 3565 - "funding": { 3566 - "url": "https://github.com/sponsors/ljharb" 3567 - } 3568 - }, 3569 - "node_modules/is-regex": { 3570 - "version": "1.2.1", 3571 - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", 3572 - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", 3573 - "dev": true, 3574 - "license": "MIT", 3575 - "dependencies": { 3576 - "call-bound": "^1.0.2", 3577 - "gopd": "^1.2.0", 3578 - "has-tostringtag": "^1.0.2", 3579 - "hasown": "^2.0.2" 3580 - }, 3581 - "engines": { 3582 - "node": ">= 0.4" 3583 - }, 3584 - "funding": { 3585 - "url": "https://github.com/sponsors/ljharb" 3586 - } 3587 - }, 3588 - "node_modules/is-set": { 3589 - "version": "2.0.3", 3590 - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", 3591 - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", 3592 - "dev": true, 3593 - "license": "MIT", 3594 - "engines": { 3595 - "node": ">= 0.4" 3596 - }, 3597 - "funding": { 3598 - "url": "https://github.com/sponsors/ljharb" 3599 - } 3600 - }, 3601 - "node_modules/is-shared-array-buffer": { 3602 - "version": "1.0.4", 3603 - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", 3604 - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", 3605 - "dev": true, 3606 - "license": "MIT", 3607 - "dependencies": { 3608 - "call-bound": "^1.0.3" 3609 - }, 3610 - "engines": { 3611 - "node": ">= 0.4" 3612 - }, 3613 - "funding": { 3614 - "url": "https://github.com/sponsors/ljharb" 3615 - } 3616 - }, 3617 - "node_modules/is-string": { 3618 - "version": "1.1.1", 3619 - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", 3620 - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", 3621 - "dev": true, 3622 - "license": "MIT", 3623 - "dependencies": { 3624 - "call-bound": "^1.0.3", 3625 - "has-tostringtag": "^1.0.2" 3626 - }, 3627 - "engines": { 3628 - "node": ">= 0.4" 3629 - }, 3630 - "funding": { 3631 - "url": "https://github.com/sponsors/ljharb" 3632 - } 3633 - }, 3634 - "node_modules/is-symbol": { 3635 - "version": "1.1.1", 3636 - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", 3637 - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", 3638 - "dev": true, 3639 - "license": "MIT", 3640 - "dependencies": { 3641 - "call-bound": "^1.0.2", 3642 - "has-symbols": "^1.1.0", 3643 - "safe-regex-test": "^1.1.0" 3644 - }, 3645 - "engines": { 3646 - "node": ">= 0.4" 3647 - }, 3648 - "funding": { 3649 - "url": "https://github.com/sponsors/ljharb" 3650 - } 3651 - }, 3652 - "node_modules/is-typed-array": { 3653 - "version": "1.1.15", 3654 - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", 3655 - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", 3656 - "dev": true, 3657 - "license": "MIT", 3658 - "dependencies": { 3659 - "which-typed-array": "^1.1.16" 3660 - }, 3661 - "engines": { 3662 - "node": ">= 0.4" 3663 - }, 3664 - "funding": { 3665 - "url": "https://github.com/sponsors/ljharb" 3666 - } 3667 - }, 3668 - "node_modules/is-weakmap": { 3669 - "version": "2.0.2", 3670 - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", 3671 - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", 3672 - "dev": true, 3673 - "license": "MIT", 3674 - "engines": { 3675 - "node": ">= 0.4" 3676 - }, 3677 - "funding": { 3678 - "url": "https://github.com/sponsors/ljharb" 3679 - } 3680 - }, 3681 - "node_modules/is-weakref": { 3682 - "version": "1.1.1", 3683 - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", 3684 - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", 3685 - "dev": true, 3686 - "license": "MIT", 3687 - "dependencies": { 3688 - "call-bound": "^1.0.3" 3689 - }, 3690 - "engines": { 3691 - "node": ">= 0.4" 3692 - }, 3693 - "funding": { 3694 - "url": "https://github.com/sponsors/ljharb" 3695 - } 3696 - }, 3697 - "node_modules/is-weakset": { 3698 - "version": "2.0.4", 3699 - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", 3700 - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", 3701 - "dev": true, 3702 - "license": "MIT", 3703 - "dependencies": { 3704 - "call-bound": "^1.0.3", 3705 - "get-intrinsic": "^1.2.6" 3706 - }, 3707 - "engines": { 3708 - "node": ">= 0.4" 3709 - }, 3710 - "funding": { 3711 - "url": "https://github.com/sponsors/ljharb" 3712 - } 3713 - }, 3714 - "node_modules/isarray": { 3715 - "version": "2.0.5", 3716 - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 3717 - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 3718 - "dev": true, 3719 - "license": "MIT" 3720 - }, 3721 - "node_modules/isexe": { 3722 - "version": "2.0.0", 3723 - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 3724 - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 3725 - "dev": true, 3726 - "license": "ISC" 3727 - }, 3728 - "node_modules/iterator.prototype": { 3729 - "version": "1.1.5", 3730 - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", 3731 - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", 3732 - "dev": true, 3733 - "license": "MIT", 3734 - "dependencies": { 3735 - "define-data-property": "^1.1.4", 3736 - "es-object-atoms": "^1.0.0", 3737 - "get-intrinsic": "^1.2.6", 3738 - "get-proto": "^1.0.0", 3739 - "has-symbols": "^1.1.0", 3740 - "set-function-name": "^2.0.2" 3741 - }, 3742 - "engines": { 3743 - "node": ">= 0.4" 3744 - } 3745 - }, 3746 - "node_modules/js-tokens": { 3747 - "version": "4.0.0", 3748 - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 3749 - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 3750 - "dev": true, 3751 - "license": "MIT" 3752 - }, 3753 - "node_modules/js-yaml": { 3754 - "version": "4.1.0", 3755 - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 3756 - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 3757 - "dev": true, 3758 - "license": "MIT", 3759 - "dependencies": { 3760 - "argparse": "^2.0.1" 3761 - }, 3762 - "bin": { 3763 - "js-yaml": "bin/js-yaml.js" 3764 - } 3765 - }, 3766 - "node_modules/jsesc": { 3767 - "version": "3.1.0", 3768 - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 3769 - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 3770 - "dev": true, 3771 - "license": "MIT", 3772 - "bin": { 3773 - "jsesc": "bin/jsesc" 3774 - }, 3775 - "engines": { 3776 - "node": ">=6" 3777 - } 3778 - }, 3779 - "node_modules/json-buffer": { 3780 - "version": "3.0.1", 3781 - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 3782 - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 3783 - "dev": true, 3784 - "license": "MIT" 3785 - }, 3786 - "node_modules/json-schema-traverse": { 3787 - "version": "0.4.1", 3788 - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 3789 - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 3790 - "dev": true, 3791 - "license": "MIT" 3792 - }, 3793 - "node_modules/json-stable-stringify-without-jsonify": { 3794 - "version": "1.0.1", 3795 - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 3796 - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 3797 - "dev": true, 3798 - "license": "MIT" 3799 - }, 3800 - "node_modules/json5": { 3801 - "version": "2.2.3", 3802 - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 3803 - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 3804 - "dev": true, 3805 - "license": "MIT", 3806 - "bin": { 3807 - "json5": "lib/cli.js" 3808 - }, 3809 - "engines": { 3810 - "node": ">=6" 3811 - } 3812 - }, 3813 - "node_modules/jsx-ast-utils": { 3814 - "version": "3.3.5", 3815 - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", 3816 - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", 3817 - "dev": true, 3818 - "license": "MIT", 3819 - "dependencies": { 3820 - "array-includes": "^3.1.6", 3821 - "array.prototype.flat": "^1.3.1", 3822 - "object.assign": "^4.1.4", 3823 - "object.values": "^1.1.6" 3824 - }, 3825 - "engines": { 3826 - "node": ">=4.0" 3827 - } 3828 - }, 3829 - "node_modules/keyv": { 3830 - "version": "4.5.4", 3831 - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 3832 - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 3833 - "dev": true, 3834 - "license": "MIT", 3835 - "dependencies": { 3836 - "json-buffer": "3.0.1" 3837 - } 3838 - }, 3839 - "node_modules/levn": { 3840 - "version": "0.4.1", 3841 - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 3842 - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 3843 - "dev": true, 3844 - "license": "MIT", 3845 - "dependencies": { 3846 - "prelude-ls": "^1.2.1", 3847 - "type-check": "~0.4.0" 3848 - }, 3849 - "engines": { 3850 - "node": ">= 0.8.0" 3851 - } 3852 - }, 3853 - "node_modules/locate-path": { 3854 - "version": "6.0.0", 3855 - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 3856 - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 3857 - "dev": true, 3858 - "license": "MIT", 3859 - "dependencies": { 3860 - "p-locate": "^5.0.0" 3861 - }, 3862 - "engines": { 3863 - "node": ">=10" 3864 - }, 3865 - "funding": { 3866 - "url": "https://github.com/sponsors/sindresorhus" 3867 - } 3868 - }, 3869 - "node_modules/lodash.merge": { 3870 - "version": "4.6.2", 3871 - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 3872 - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 3873 - "dev": true, 3874 - "license": "MIT" 3875 - }, 3876 - "node_modules/loose-envify": { 3877 - "version": "1.4.0", 3878 - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 3879 - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 3880 - "dev": true, 3881 - "license": "MIT", 3882 - "dependencies": { 3883 - "js-tokens": "^3.0.0 || ^4.0.0" 3884 - }, 3885 - "bin": { 3886 - "loose-envify": "cli.js" 3887 - } 3888 - }, 3889 - "node_modules/lru-cache": { 3890 - "version": "5.1.1", 3891 - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 3892 - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 3893 - "dev": true, 3894 - "license": "ISC", 3895 - "dependencies": { 3896 - "yallist": "^3.0.2" 3897 - } 3898 - }, 3899 - "node_modules/math-intrinsics": { 3900 - "version": "1.1.0", 3901 - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 3902 - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 3903 - "dev": true, 3904 - "license": "MIT", 3905 - "engines": { 3906 - "node": ">= 0.4" 3907 - } 3908 - }, 3909 - "node_modules/merge2": { 3910 - "version": "1.4.1", 3911 - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 3912 - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 3913 - "dev": true, 3914 - "license": "MIT", 3915 - "engines": { 3916 - "node": ">= 8" 3917 - } 3918 - }, 3919 - "node_modules/micromatch": { 3920 - "version": "4.0.8", 3921 - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 3922 - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 3923 - "dev": true, 3924 - "license": "MIT", 3925 - "dependencies": { 3926 - "braces": "^3.0.3", 3927 - "picomatch": "^2.3.1" 3928 - }, 3929 - "engines": { 3930 - "node": ">=8.6" 3931 - } 3932 - }, 3933 - "node_modules/minimatch": { 3934 - "version": "3.1.2", 3935 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 3936 - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 3937 - "dev": true, 3938 - "license": "ISC", 3939 - "dependencies": { 3940 - "brace-expansion": "^1.1.7" 3941 - }, 3942 - "engines": { 3943 - "node": "*" 3944 - } 3945 - }, 3946 - "node_modules/ms": { 3947 - "version": "2.1.3", 3948 - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 3949 - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 3950 - "dev": true, 3951 - "license": "MIT" 3952 - }, 3953 - "node_modules/nanoid": { 3954 - "version": "3.3.11", 3955 - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 3956 - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 3957 - "dev": true, 3958 - "funding": [ 3959 - { 3960 - "type": "github", 3961 - "url": "https://github.com/sponsors/ai" 3962 - } 3963 - ], 3964 - "license": "MIT", 3965 - "bin": { 3966 - "nanoid": "bin/nanoid.cjs" 3967 - }, 3968 - "engines": { 3969 - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 3970 - } 3971 - }, 3972 - "node_modules/natural-compare": { 3973 - "version": "1.4.0", 3974 - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 3975 - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 3976 - "dev": true, 3977 - "license": "MIT" 3978 - }, 3979 - "node_modules/node-releases": { 3980 - "version": "2.0.19", 3981 - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", 3982 - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", 3983 - "dev": true, 3984 - "license": "MIT" 3985 - }, 3986 - "node_modules/object-assign": { 3987 - "version": "4.1.1", 3988 - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 3989 - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 3990 - "dev": true, 3991 - "license": "MIT", 3992 - "engines": { 3993 - "node": ">=0.10.0" 3994 - } 3995 - }, 3996 - "node_modules/object-inspect": { 3997 - "version": "1.13.4", 3998 - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", 3999 - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", 4000 - "dev": true, 4001 - "license": "MIT", 4002 - "engines": { 4003 - "node": ">= 0.4" 4004 - }, 4005 - "funding": { 4006 - "url": "https://github.com/sponsors/ljharb" 4007 - } 4008 - }, 4009 - "node_modules/object-keys": { 4010 - "version": "1.1.1", 4011 - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 4012 - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 4013 - "dev": true, 4014 - "license": "MIT", 4015 - "engines": { 4016 - "node": ">= 0.4" 4017 - } 4018 - }, 4019 - "node_modules/object.assign": { 4020 - "version": "4.1.7", 4021 - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", 4022 - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", 4023 - "dev": true, 4024 - "license": "MIT", 4025 - "dependencies": { 4026 - "call-bind": "^1.0.8", 4027 - "call-bound": "^1.0.3", 4028 - "define-properties": "^1.2.1", 4029 - "es-object-atoms": "^1.0.0", 4030 - "has-symbols": "^1.1.0", 4031 - "object-keys": "^1.1.1" 4032 - }, 4033 - "engines": { 4034 - "node": ">= 0.4" 4035 - }, 4036 - "funding": { 4037 - "url": "https://github.com/sponsors/ljharb" 4038 - } 4039 - }, 4040 - "node_modules/object.entries": { 4041 - "version": "1.1.9", 4042 - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", 4043 - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", 4044 - "dev": true, 4045 - "license": "MIT", 4046 - "dependencies": { 4047 - "call-bind": "^1.0.8", 4048 - "call-bound": "^1.0.4", 4049 - "define-properties": "^1.2.1", 4050 - "es-object-atoms": "^1.1.1" 4051 - }, 4052 - "engines": { 4053 - "node": ">= 0.4" 4054 - } 4055 - }, 4056 - "node_modules/object.fromentries": { 4057 - "version": "2.0.8", 4058 - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", 4059 - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", 4060 - "dev": true, 4061 - "license": "MIT", 4062 - "dependencies": { 4063 - "call-bind": "^1.0.7", 4064 - "define-properties": "^1.2.1", 4065 - "es-abstract": "^1.23.2", 4066 - "es-object-atoms": "^1.0.0" 4067 - }, 4068 - "engines": { 4069 - "node": ">= 0.4" 4070 - }, 4071 - "funding": { 4072 - "url": "https://github.com/sponsors/ljharb" 4073 - } 4074 - }, 4075 - "node_modules/object.values": { 4076 - "version": "1.2.1", 4077 - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", 4078 - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", 4079 - "dev": true, 4080 - "license": "MIT", 4081 - "dependencies": { 4082 - "call-bind": "^1.0.8", 4083 - "call-bound": "^1.0.3", 4084 - "define-properties": "^1.2.1", 4085 - "es-object-atoms": "^1.0.0" 4086 - }, 4087 - "engines": { 4088 - "node": ">= 0.4" 4089 - }, 4090 - "funding": { 4091 - "url": "https://github.com/sponsors/ljharb" 4092 - } 4093 - }, 4094 - "node_modules/optionator": { 4095 - "version": "0.9.4", 4096 - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 4097 - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 4098 - "dev": true, 4099 - "license": "MIT", 4100 - "dependencies": { 4101 - "deep-is": "^0.1.3", 4102 - "fast-levenshtein": "^2.0.6", 4103 - "levn": "^0.4.1", 4104 - "prelude-ls": "^1.2.1", 4105 - "type-check": "^0.4.0", 4106 - "word-wrap": "^1.2.5" 4107 - }, 4108 - "engines": { 4109 - "node": ">= 0.8.0" 4110 - } 4111 - }, 4112 - "node_modules/own-keys": { 4113 - "version": "1.0.1", 4114 - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", 4115 - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", 4116 - "dev": true, 4117 - "license": "MIT", 4118 - "dependencies": { 4119 - "get-intrinsic": "^1.2.6", 4120 - "object-keys": "^1.1.1", 4121 - "safe-push-apply": "^1.0.0" 4122 - }, 4123 - "engines": { 4124 - "node": ">= 0.4" 4125 - }, 4126 - "funding": { 4127 - "url": "https://github.com/sponsors/ljharb" 4128 - } 4129 - }, 4130 - "node_modules/p-limit": { 4131 - "version": "3.1.0", 4132 - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 4133 - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 4134 - "dev": true, 4135 - "license": "MIT", 4136 - "dependencies": { 4137 - "yocto-queue": "^0.1.0" 4138 - }, 4139 - "engines": { 4140 - "node": ">=10" 4141 - }, 4142 - "funding": { 4143 - "url": "https://github.com/sponsors/sindresorhus" 4144 - } 4145 - }, 4146 - "node_modules/p-locate": { 4147 - "version": "5.0.0", 4148 - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 4149 - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 4150 - "dev": true, 4151 - "license": "MIT", 4152 - "dependencies": { 4153 - "p-limit": "^3.0.2" 4154 - }, 4155 - "engines": { 4156 - "node": ">=10" 4157 - }, 4158 - "funding": { 4159 - "url": "https://github.com/sponsors/sindresorhus" 4160 - } 4161 - }, 4162 - "node_modules/parent-module": { 4163 - "version": "1.0.1", 4164 - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 4165 - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 4166 - "dev": true, 4167 - "license": "MIT", 4168 - "dependencies": { 4169 - "callsites": "^3.0.0" 4170 - }, 4171 - "engines": { 4172 - "node": ">=6" 4173 - } 4174 - }, 4175 - "node_modules/path-exists": { 4176 - "version": "4.0.0", 4177 - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 4178 - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 4179 - "dev": true, 4180 - "license": "MIT", 4181 - "engines": { 4182 - "node": ">=8" 4183 - } 4184 - }, 4185 - "node_modules/path-key": { 4186 - "version": "3.1.1", 4187 - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 4188 - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 4189 - "dev": true, 4190 - "license": "MIT", 4191 - "engines": { 4192 - "node": ">=8" 4193 - } 4194 - }, 4195 - "node_modules/path-parse": { 4196 - "version": "1.0.7", 4197 - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 4198 - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 4199 - "dev": true, 4200 - "license": "MIT" 4201 - }, 4202 - "node_modules/picocolors": { 4203 - "version": "1.1.1", 4204 - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 4205 - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 4206 - "dev": true, 4207 - "license": "ISC" 4208 - }, 4209 - "node_modules/picomatch": { 4210 - "version": "2.3.1", 4211 - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 4212 - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 4213 - "dev": true, 4214 - "license": "MIT", 4215 - "engines": { 4216 - "node": ">=8.6" 4217 - }, 4218 - "funding": { 4219 - "url": "https://github.com/sponsors/jonschlinkert" 4220 - } 4221 - }, 4222 - "node_modules/possible-typed-array-names": { 4223 - "version": "1.1.0", 4224 - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", 4225 - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", 4226 - "dev": true, 4227 - "license": "MIT", 4228 - "engines": { 4229 - "node": ">= 0.4" 4230 - } 4231 - }, 4232 - "node_modules/postcss": { 4233 - "version": "8.5.6", 4234 - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", 4235 - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", 4236 - "dev": true, 4237 - "funding": [ 4238 - { 4239 - "type": "opencollective", 4240 - "url": "https://opencollective.com/postcss/" 4241 - }, 4242 - { 4243 - "type": "tidelift", 4244 - "url": "https://tidelift.com/funding/github/npm/postcss" 4245 - }, 4246 - { 4247 - "type": "github", 4248 - "url": "https://github.com/sponsors/ai" 4249 - } 4250 - ], 4251 - "license": "MIT", 4252 - "dependencies": { 4253 - "nanoid": "^3.3.11", 4254 - "picocolors": "^1.1.1", 4255 - "source-map-js": "^1.2.1" 4256 - }, 4257 - "engines": { 4258 - "node": "^10 || ^12 || >=14" 4259 - } 4260 - }, 4261 - "node_modules/prelude-ls": { 4262 - "version": "1.2.1", 4263 - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 4264 - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 4265 - "dev": true, 4266 - "license": "MIT", 4267 - "engines": { 4268 - "node": ">= 0.8.0" 4269 - } 4270 - }, 4271 - "node_modules/prettier": { 4272 - "version": "3.6.0", 4273 - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.0.tgz", 4274 - "integrity": "sha512-ujSB9uXHJKzM/2GBuE0hBOUgC77CN3Bnpqa+g80bkv3T3A93wL/xlzDATHhnhkzifz/UE2SNOvmbTz5hSkDlHw==", 4275 - "dev": true, 4276 - "license": "MIT", 4277 - "bin": { 4278 - "prettier": "bin/prettier.cjs" 4279 - }, 4280 - "engines": { 4281 - "node": ">=14" 4282 - }, 4283 - "funding": { 4284 - "url": "https://github.com/prettier/prettier?sponsor=1" 4285 - } 4286 - }, 4287 - "node_modules/prop-types": { 4288 - "version": "15.8.1", 4289 - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", 4290 - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", 4291 - "dev": true, 4292 - "license": "MIT", 4293 - "dependencies": { 4294 - "loose-envify": "^1.4.0", 4295 - "object-assign": "^4.1.1", 4296 - "react-is": "^16.13.1" 4297 - } 4298 - }, 4299 - "node_modules/punycode": { 4300 - "version": "2.3.1", 4301 - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 4302 - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 4303 - "dev": true, 4304 - "license": "MIT", 4305 - "engines": { 4306 - "node": ">=6" 4307 - } 4308 - }, 4309 - "node_modules/queue-microtask": { 4310 - "version": "1.2.3", 4311 - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 4312 - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 4313 - "dev": true, 4314 - "funding": [ 4315 - { 4316 - "type": "github", 4317 - "url": "https://github.com/sponsors/feross" 4318 - }, 4319 - { 4320 - "type": "patreon", 4321 - "url": "https://www.patreon.com/feross" 4322 - }, 4323 - { 4324 - "type": "consulting", 4325 - "url": "https://feross.org/support" 4326 - } 4327 - ], 4328 - "license": "MIT" 4329 - }, 4330 - "node_modules/react": { 4331 - "version": "19.1.0", 4332 - "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", 4333 - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", 4334 - "license": "MIT", 4335 - "engines": { 4336 - "node": ">=0.10.0" 4337 - } 4338 - }, 4339 - "node_modules/react-dom": { 4340 - "version": "19.1.0", 4341 - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", 4342 - "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", 4343 - "license": "MIT", 4344 - "dependencies": { 4345 - "scheduler": "^0.26.0" 4346 - }, 4347 - "peerDependencies": { 4348 - "react": "^19.1.0" 4349 - } 4350 - }, 4351 - "node_modules/react-is": { 4352 - "version": "16.13.1", 4353 - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 4354 - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", 4355 - "dev": true, 4356 - "license": "MIT" 4357 - }, 4358 - "node_modules/react-refresh": { 4359 - "version": "0.17.0", 4360 - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", 4361 - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", 4362 - "dev": true, 4363 - "license": "MIT", 4364 - "engines": { 4365 - "node": ">=0.10.0" 4366 - } 4367 - }, 4368 - "node_modules/reflect.getprototypeof": { 4369 - "version": "1.0.10", 4370 - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", 4371 - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", 4372 - "dev": true, 4373 - "license": "MIT", 4374 - "dependencies": { 4375 - "call-bind": "^1.0.8", 4376 - "define-properties": "^1.2.1", 4377 - "es-abstract": "^1.23.9", 4378 - "es-errors": "^1.3.0", 4379 - "es-object-atoms": "^1.0.0", 4380 - "get-intrinsic": "^1.2.7", 4381 - "get-proto": "^1.0.1", 4382 - "which-builtin-type": "^1.2.1" 4383 - }, 4384 - "engines": { 4385 - "node": ">= 0.4" 4386 - }, 4387 - "funding": { 4388 - "url": "https://github.com/sponsors/ljharb" 4389 - } 4390 - }, 4391 - "node_modules/regexp.prototype.flags": { 4392 - "version": "1.5.4", 4393 - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", 4394 - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", 4395 - "dev": true, 4396 - "license": "MIT", 4397 - "dependencies": { 4398 - "call-bind": "^1.0.8", 4399 - "define-properties": "^1.2.1", 4400 - "es-errors": "^1.3.0", 4401 - "get-proto": "^1.0.1", 4402 - "gopd": "^1.2.0", 4403 - "set-function-name": "^2.0.2" 4404 - }, 4405 - "engines": { 4406 - "node": ">= 0.4" 4407 - }, 4408 - "funding": { 4409 - "url": "https://github.com/sponsors/ljharb" 4410 - } 4411 - }, 4412 - "node_modules/resolve": { 4413 - "version": "2.0.0-next.5", 4414 - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", 4415 - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", 4416 - "dev": true, 4417 - "license": "MIT", 4418 - "dependencies": { 4419 - "is-core-module": "^2.13.0", 4420 - "path-parse": "^1.0.7", 4421 - "supports-preserve-symlinks-flag": "^1.0.0" 4422 - }, 4423 - "bin": { 4424 - "resolve": "bin/resolve" 4425 - }, 4426 - "funding": { 4427 - "url": "https://github.com/sponsors/ljharb" 4428 - } 4429 - }, 4430 - "node_modules/resolve-from": { 4431 - "version": "4.0.0", 4432 - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 4433 - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 4434 - "dev": true, 4435 - "license": "MIT", 4436 - "engines": { 4437 - "node": ">=4" 4438 - } 4439 - }, 4440 - "node_modules/reusify": { 4441 - "version": "1.1.0", 4442 - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", 4443 - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", 4444 - "dev": true, 4445 - "license": "MIT", 4446 - "engines": { 4447 - "iojs": ">=1.0.0", 4448 - "node": ">=0.10.0" 4449 - } 4450 - }, 4451 - "node_modules/rollup": { 4452 - "version": "4.44.0", 4453 - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.0.tgz", 4454 - "integrity": "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==", 4455 - "dev": true, 4456 - "license": "MIT", 4457 - "dependencies": { 4458 - "@types/estree": "1.0.8" 4459 - }, 4460 - "bin": { 4461 - "rollup": "dist/bin/rollup" 4462 - }, 4463 - "engines": { 4464 - "node": ">=18.0.0", 4465 - "npm": ">=8.0.0" 4466 - }, 4467 - "optionalDependencies": { 4468 - "@rollup/rollup-android-arm-eabi": "4.44.0", 4469 - "@rollup/rollup-android-arm64": "4.44.0", 4470 - "@rollup/rollup-darwin-arm64": "4.44.0", 4471 - "@rollup/rollup-darwin-x64": "4.44.0", 4472 - "@rollup/rollup-freebsd-arm64": "4.44.0", 4473 - "@rollup/rollup-freebsd-x64": "4.44.0", 4474 - "@rollup/rollup-linux-arm-gnueabihf": "4.44.0", 4475 - "@rollup/rollup-linux-arm-musleabihf": "4.44.0", 4476 - "@rollup/rollup-linux-arm64-gnu": "4.44.0", 4477 - "@rollup/rollup-linux-arm64-musl": "4.44.0", 4478 - "@rollup/rollup-linux-loongarch64-gnu": "4.44.0", 4479 - "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0", 4480 - "@rollup/rollup-linux-riscv64-gnu": "4.44.0", 4481 - "@rollup/rollup-linux-riscv64-musl": "4.44.0", 4482 - "@rollup/rollup-linux-s390x-gnu": "4.44.0", 4483 - "@rollup/rollup-linux-x64-gnu": "4.44.0", 4484 - "@rollup/rollup-linux-x64-musl": "4.44.0", 4485 - "@rollup/rollup-win32-arm64-msvc": "4.44.0", 4486 - "@rollup/rollup-win32-ia32-msvc": "4.44.0", 4487 - "@rollup/rollup-win32-x64-msvc": "4.44.0", 4488 - "fsevents": "~2.3.2" 4489 - } 4490 - }, 4491 - "node_modules/run-parallel": { 4492 - "version": "1.2.0", 4493 - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 4494 - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 4495 - "dev": true, 4496 - "funding": [ 4497 - { 4498 - "type": "github", 4499 - "url": "https://github.com/sponsors/feross" 4500 - }, 4501 - { 4502 - "type": "patreon", 4503 - "url": "https://www.patreon.com/feross" 4504 - }, 4505 - { 4506 - "type": "consulting", 4507 - "url": "https://feross.org/support" 4508 - } 4509 - ], 4510 - "license": "MIT", 4511 - "dependencies": { 4512 - "queue-microtask": "^1.2.2" 4513 - } 4514 - }, 4515 - "node_modules/safe-array-concat": { 4516 - "version": "1.1.3", 4517 - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", 4518 - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", 4519 - "dev": true, 4520 - "license": "MIT", 4521 - "dependencies": { 4522 - "call-bind": "^1.0.8", 4523 - "call-bound": "^1.0.2", 4524 - "get-intrinsic": "^1.2.6", 4525 - "has-symbols": "^1.1.0", 4526 - "isarray": "^2.0.5" 4527 - }, 4528 - "engines": { 4529 - "node": ">=0.4" 4530 - }, 4531 - "funding": { 4532 - "url": "https://github.com/sponsors/ljharb" 4533 - } 4534 - }, 4535 - "node_modules/safe-push-apply": { 4536 - "version": "1.0.0", 4537 - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", 4538 - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", 4539 - "dev": true, 4540 - "license": "MIT", 4541 - "dependencies": { 4542 - "es-errors": "^1.3.0", 4543 - "isarray": "^2.0.5" 4544 - }, 4545 - "engines": { 4546 - "node": ">= 0.4" 4547 - }, 4548 - "funding": { 4549 - "url": "https://github.com/sponsors/ljharb" 4550 - } 4551 - }, 4552 - "node_modules/safe-regex-test": { 4553 - "version": "1.1.0", 4554 - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", 4555 - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", 4556 - "dev": true, 4557 - "license": "MIT", 4558 - "dependencies": { 4559 - "call-bound": "^1.0.2", 4560 - "es-errors": "^1.3.0", 4561 - "is-regex": "^1.2.1" 4562 - }, 4563 - "engines": { 4564 - "node": ">= 0.4" 4565 - }, 4566 - "funding": { 4567 - "url": "https://github.com/sponsors/ljharb" 4568 - } 4569 - }, 4570 - "node_modules/scheduler": { 4571 - "version": "0.26.0", 4572 - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", 4573 - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", 4574 - "license": "MIT" 4575 - }, 4576 - "node_modules/semver": { 4577 - "version": "6.3.1", 4578 - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 4579 - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 4580 - "dev": true, 4581 - "license": "ISC", 4582 - "bin": { 4583 - "semver": "bin/semver.js" 4584 - } 4585 - }, 4586 - "node_modules/set-function-length": { 4587 - "version": "1.2.2", 4588 - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 4589 - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 4590 - "dev": true, 4591 - "license": "MIT", 4592 - "dependencies": { 4593 - "define-data-property": "^1.1.4", 4594 - "es-errors": "^1.3.0", 4595 - "function-bind": "^1.1.2", 4596 - "get-intrinsic": "^1.2.4", 4597 - "gopd": "^1.0.1", 4598 - "has-property-descriptors": "^1.0.2" 4599 - }, 4600 - "engines": { 4601 - "node": ">= 0.4" 4602 - } 4603 - }, 4604 - "node_modules/set-function-name": { 4605 - "version": "2.0.2", 4606 - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", 4607 - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", 4608 - "dev": true, 4609 - "license": "MIT", 4610 - "dependencies": { 4611 - "define-data-property": "^1.1.4", 4612 - "es-errors": "^1.3.0", 4613 - "functions-have-names": "^1.2.3", 4614 - "has-property-descriptors": "^1.0.2" 4615 - }, 4616 - "engines": { 4617 - "node": ">= 0.4" 4618 - } 4619 - }, 4620 - "node_modules/set-proto": { 4621 - "version": "1.0.0", 4622 - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", 4623 - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", 4624 - "dev": true, 4625 - "license": "MIT", 4626 - "dependencies": { 4627 - "dunder-proto": "^1.0.1", 4628 - "es-errors": "^1.3.0", 4629 - "es-object-atoms": "^1.0.0" 4630 - }, 4631 - "engines": { 4632 - "node": ">= 0.4" 4633 - } 4634 - }, 4635 - "node_modules/shebang-command": { 4636 - "version": "2.0.0", 4637 - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 4638 - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 4639 - "dev": true, 4640 - "license": "MIT", 4641 - "dependencies": { 4642 - "shebang-regex": "^3.0.0" 4643 - }, 4644 - "engines": { 4645 - "node": ">=8" 4646 - } 4647 - }, 4648 - "node_modules/shebang-regex": { 4649 - "version": "3.0.0", 4650 - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 4651 - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 4652 - "dev": true, 4653 - "license": "MIT", 4654 - "engines": { 4655 - "node": ">=8" 4656 - } 4657 - }, 4658 - "node_modules/side-channel": { 4659 - "version": "1.1.0", 4660 - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", 4661 - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 4662 - "dev": true, 4663 - "license": "MIT", 4664 - "dependencies": { 4665 - "es-errors": "^1.3.0", 4666 - "object-inspect": "^1.13.3", 4667 - "side-channel-list": "^1.0.0", 4668 - "side-channel-map": "^1.0.1", 4669 - "side-channel-weakmap": "^1.0.2" 4670 - }, 4671 - "engines": { 4672 - "node": ">= 0.4" 4673 - }, 4674 - "funding": { 4675 - "url": "https://github.com/sponsors/ljharb" 4676 - } 4677 - }, 4678 - "node_modules/side-channel-list": { 4679 - "version": "1.0.0", 4680 - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", 4681 - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 4682 - "dev": true, 4683 - "license": "MIT", 4684 - "dependencies": { 4685 - "es-errors": "^1.3.0", 4686 - "object-inspect": "^1.13.3" 4687 - }, 4688 - "engines": { 4689 - "node": ">= 0.4" 4690 - }, 4691 - "funding": { 4692 - "url": "https://github.com/sponsors/ljharb" 4693 - } 4694 - }, 4695 - "node_modules/side-channel-map": { 4696 - "version": "1.0.1", 4697 - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", 4698 - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 4699 - "dev": true, 4700 - "license": "MIT", 4701 - "dependencies": { 4702 - "call-bound": "^1.0.2", 4703 - "es-errors": "^1.3.0", 4704 - "get-intrinsic": "^1.2.5", 4705 - "object-inspect": "^1.13.3" 4706 - }, 4707 - "engines": { 4708 - "node": ">= 0.4" 4709 - }, 4710 - "funding": { 4711 - "url": "https://github.com/sponsors/ljharb" 4712 - } 4713 - }, 4714 - "node_modules/side-channel-weakmap": { 4715 - "version": "1.0.2", 4716 - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", 4717 - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 4718 - "dev": true, 4719 - "license": "MIT", 4720 - "dependencies": { 4721 - "call-bound": "^1.0.2", 4722 - "es-errors": "^1.3.0", 4723 - "get-intrinsic": "^1.2.5", 4724 - "object-inspect": "^1.13.3", 4725 - "side-channel-map": "^1.0.1" 4726 - }, 4727 - "engines": { 4728 - "node": ">= 0.4" 4729 - }, 4730 - "funding": { 4731 - "url": "https://github.com/sponsors/ljharb" 4732 - } 4733 - }, 4734 - "node_modules/source-map-js": { 4735 - "version": "1.2.1", 4736 - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 4737 - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 4738 - "dev": true, 4739 - "license": "BSD-3-Clause", 4740 - "engines": { 4741 - "node": ">=0.10.0" 4742 - } 4743 - }, 4744 - "node_modules/stop-iteration-iterator": { 4745 - "version": "1.1.0", 4746 - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", 4747 - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", 4748 - "dev": true, 4749 - "license": "MIT", 4750 - "dependencies": { 4751 - "es-errors": "^1.3.0", 4752 - "internal-slot": "^1.1.0" 4753 - }, 4754 - "engines": { 4755 - "node": ">= 0.4" 4756 - } 4757 - }, 4758 - "node_modules/string.prototype.matchall": { 4759 - "version": "4.0.12", 4760 - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", 4761 - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", 4762 - "dev": true, 4763 - "license": "MIT", 4764 - "dependencies": { 4765 - "call-bind": "^1.0.8", 4766 - "call-bound": "^1.0.3", 4767 - "define-properties": "^1.2.1", 4768 - "es-abstract": "^1.23.6", 4769 - "es-errors": "^1.3.0", 4770 - "es-object-atoms": "^1.0.0", 4771 - "get-intrinsic": "^1.2.6", 4772 - "gopd": "^1.2.0", 4773 - "has-symbols": "^1.1.0", 4774 - "internal-slot": "^1.1.0", 4775 - "regexp.prototype.flags": "^1.5.3", 4776 - "set-function-name": "^2.0.2", 4777 - "side-channel": "^1.1.0" 4778 - }, 4779 - "engines": { 4780 - "node": ">= 0.4" 4781 - }, 4782 - "funding": { 4783 - "url": "https://github.com/sponsors/ljharb" 4784 - } 4785 - }, 4786 - "node_modules/string.prototype.repeat": { 4787 - "version": "1.0.0", 4788 - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", 4789 - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", 4790 - "dev": true, 4791 - "license": "MIT", 4792 - "dependencies": { 4793 - "define-properties": "^1.1.3", 4794 - "es-abstract": "^1.17.5" 4795 - } 4796 - }, 4797 - "node_modules/string.prototype.trim": { 4798 - "version": "1.2.10", 4799 - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", 4800 - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", 4801 - "dev": true, 4802 - "license": "MIT", 4803 - "dependencies": { 4804 - "call-bind": "^1.0.8", 4805 - "call-bound": "^1.0.2", 4806 - "define-data-property": "^1.1.4", 4807 - "define-properties": "^1.2.1", 4808 - "es-abstract": "^1.23.5", 4809 - "es-object-atoms": "^1.0.0", 4810 - "has-property-descriptors": "^1.0.2" 4811 - }, 4812 - "engines": { 4813 - "node": ">= 0.4" 4814 - }, 4815 - "funding": { 4816 - "url": "https://github.com/sponsors/ljharb" 4817 - } 4818 - }, 4819 - "node_modules/string.prototype.trimend": { 4820 - "version": "1.0.9", 4821 - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", 4822 - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", 4823 - "dev": true, 4824 - "license": "MIT", 4825 - "dependencies": { 4826 - "call-bind": "^1.0.8", 4827 - "call-bound": "^1.0.2", 4828 - "define-properties": "^1.2.1", 4829 - "es-object-atoms": "^1.0.0" 4830 - }, 4831 - "engines": { 4832 - "node": ">= 0.4" 4833 - }, 4834 - "funding": { 4835 - "url": "https://github.com/sponsors/ljharb" 4836 - } 4837 - }, 4838 - "node_modules/string.prototype.trimstart": { 4839 - "version": "1.0.8", 4840 - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", 4841 - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", 4842 - "dev": true, 4843 - "license": "MIT", 4844 - "dependencies": { 4845 - "call-bind": "^1.0.7", 4846 - "define-properties": "^1.2.1", 4847 - "es-object-atoms": "^1.0.0" 4848 - }, 4849 - "engines": { 4850 - "node": ">= 0.4" 4851 - }, 4852 - "funding": { 4853 - "url": "https://github.com/sponsors/ljharb" 4854 - } 4855 - }, 4856 - "node_modules/strip-json-comments": { 4857 - "version": "3.1.1", 4858 - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 4859 - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 4860 - "dev": true, 4861 - "license": "MIT", 4862 - "engines": { 4863 - "node": ">=8" 4864 - }, 4865 - "funding": { 4866 - "url": "https://github.com/sponsors/sindresorhus" 4867 - } 4868 - }, 4869 - "node_modules/supports-color": { 4870 - "version": "7.2.0", 4871 - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 4872 - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 4873 - "dev": true, 4874 - "license": "MIT", 4875 - "dependencies": { 4876 - "has-flag": "^4.0.0" 4877 - }, 4878 - "engines": { 4879 - "node": ">=8" 4880 - } 4881 - }, 4882 - "node_modules/supports-preserve-symlinks-flag": { 4883 - "version": "1.0.0", 4884 - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 4885 - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 4886 - "dev": true, 4887 - "license": "MIT", 4888 - "engines": { 4889 - "node": ">= 0.4" 4890 - }, 4891 - "funding": { 4892 - "url": "https://github.com/sponsors/ljharb" 4893 - } 4894 - }, 4895 - "node_modules/swr": { 4896 - "version": "2.3.3", 4897 - "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.3.tgz", 4898 - "integrity": "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==", 4899 - "license": "MIT", 4900 - "dependencies": { 4901 - "dequal": "^2.0.3", 4902 - "use-sync-external-store": "^1.4.0" 4903 - }, 4904 - "peerDependencies": { 4905 - "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 4906 - } 4907 - }, 4908 - "node_modules/tinyglobby": { 4909 - "version": "0.2.14", 4910 - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", 4911 - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", 4912 - "dev": true, 4913 - "license": "MIT", 4914 - "dependencies": { 4915 - "fdir": "^6.4.4", 4916 - "picomatch": "^4.0.2" 4917 - }, 4918 - "engines": { 4919 - "node": ">=12.0.0" 4920 - }, 4921 - "funding": { 4922 - "url": "https://github.com/sponsors/SuperchupuDev" 4923 - } 4924 - }, 4925 - "node_modules/tinyglobby/node_modules/fdir": { 4926 - "version": "6.4.6", 4927 - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", 4928 - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", 4929 - "dev": true, 4930 - "license": "MIT", 4931 - "peerDependencies": { 4932 - "picomatch": "^3 || ^4" 4933 - }, 4934 - "peerDependenciesMeta": { 4935 - "picomatch": { 4936 - "optional": true 4937 - } 4938 - } 4939 - }, 4940 - "node_modules/tinyglobby/node_modules/picomatch": { 4941 - "version": "4.0.2", 4942 - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 4943 - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 4944 - "dev": true, 4945 - "license": "MIT", 4946 - "engines": { 4947 - "node": ">=12" 4948 - }, 4949 - "funding": { 4950 - "url": "https://github.com/sponsors/jonschlinkert" 4951 - } 4952 - }, 4953 - "node_modules/to-regex-range": { 4954 - "version": "5.0.1", 4955 - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 4956 - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 4957 - "dev": true, 4958 - "license": "MIT", 4959 - "dependencies": { 4960 - "is-number": "^7.0.0" 4961 - }, 4962 - "engines": { 4963 - "node": ">=8.0" 4964 - } 4965 - }, 4966 - "node_modules/ts-api-utils": { 4967 - "version": "2.1.0", 4968 - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", 4969 - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", 4970 - "dev": true, 4971 - "license": "MIT", 4972 - "engines": { 4973 - "node": ">=18.12" 4974 - }, 4975 - "peerDependencies": { 4976 - "typescript": ">=4.8.4" 4977 - } 4978 - }, 4979 - "node_modules/type-check": { 4980 - "version": "0.4.0", 4981 - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 4982 - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 4983 - "dev": true, 4984 - "license": "MIT", 4985 - "dependencies": { 4986 - "prelude-ls": "^1.2.1" 4987 - }, 4988 - "engines": { 4989 - "node": ">= 0.8.0" 4990 - } 4991 - }, 4992 - "node_modules/typed-array-buffer": { 4993 - "version": "1.0.3", 4994 - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", 4995 - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", 4996 - "dev": true, 4997 - "license": "MIT", 4998 - "dependencies": { 4999 - "call-bound": "^1.0.3", 5000 - "es-errors": "^1.3.0", 5001 - "is-typed-array": "^1.1.14" 5002 - }, 5003 - "engines": { 5004 - "node": ">= 0.4" 5005 - } 5006 - }, 5007 - "node_modules/typed-array-byte-length": { 5008 - "version": "1.0.3", 5009 - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", 5010 - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", 5011 - "dev": true, 5012 - "license": "MIT", 5013 - "dependencies": { 5014 - "call-bind": "^1.0.8", 5015 - "for-each": "^0.3.3", 5016 - "gopd": "^1.2.0", 5017 - "has-proto": "^1.2.0", 5018 - "is-typed-array": "^1.1.14" 5019 - }, 5020 - "engines": { 5021 - "node": ">= 0.4" 5022 - }, 5023 - "funding": { 5024 - "url": "https://github.com/sponsors/ljharb" 5025 - } 5026 - }, 5027 - "node_modules/typed-array-byte-offset": { 5028 - "version": "1.0.4", 5029 - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", 5030 - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", 5031 - "dev": true, 5032 - "license": "MIT", 5033 - "dependencies": { 5034 - "available-typed-arrays": "^1.0.7", 5035 - "call-bind": "^1.0.8", 5036 - "for-each": "^0.3.3", 5037 - "gopd": "^1.2.0", 5038 - "has-proto": "^1.2.0", 5039 - "is-typed-array": "^1.1.15", 5040 - "reflect.getprototypeof": "^1.0.9" 5041 - }, 5042 - "engines": { 5043 - "node": ">= 0.4" 5044 - }, 5045 - "funding": { 5046 - "url": "https://github.com/sponsors/ljharb" 5047 - } 5048 - }, 5049 - "node_modules/typed-array-length": { 5050 - "version": "1.0.7", 5051 - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", 5052 - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", 5053 - "dev": true, 5054 - "license": "MIT", 5055 - "dependencies": { 5056 - "call-bind": "^1.0.7", 5057 - "for-each": "^0.3.3", 5058 - "gopd": "^1.0.1", 5059 - "is-typed-array": "^1.1.13", 5060 - "possible-typed-array-names": "^1.0.0", 5061 - "reflect.getprototypeof": "^1.0.6" 5062 - }, 5063 - "engines": { 5064 - "node": ">= 0.4" 5065 - }, 5066 - "funding": { 5067 - "url": "https://github.com/sponsors/ljharb" 5068 - } 5069 - }, 5070 - "node_modules/typescript": { 5071 - "version": "5.8.3", 5072 - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", 5073 - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 5074 - "dev": true, 5075 - "license": "Apache-2.0", 5076 - "bin": { 5077 - "tsc": "bin/tsc", 5078 - "tsserver": "bin/tsserver" 5079 - }, 5080 - "engines": { 5081 - "node": ">=14.17" 5082 - } 5083 - }, 5084 - "node_modules/typescript-eslint": { 5085 - "version": "8.35.0", 5086 - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.35.0.tgz", 5087 - "integrity": "sha512-uEnz70b7kBz6eg/j0Czy6K5NivaYopgxRjsnAJ2Fx5oTLo3wefTHIbL7AkQr1+7tJCRVpTs/wiM8JR/11Loq9A==", 5088 - "dev": true, 5089 - "license": "MIT", 5090 - "dependencies": { 5091 - "@typescript-eslint/eslint-plugin": "8.35.0", 5092 - "@typescript-eslint/parser": "8.35.0", 5093 - "@typescript-eslint/utils": "8.35.0" 5094 - }, 5095 - "engines": { 5096 - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 5097 - }, 5098 - "funding": { 5099 - "type": "opencollective", 5100 - "url": "https://opencollective.com/typescript-eslint" 5101 - }, 5102 - "peerDependencies": { 5103 - "eslint": "^8.57.0 || ^9.0.0", 5104 - "typescript": ">=4.8.4 <5.9.0" 5105 - } 5106 - }, 5107 - "node_modules/unbox-primitive": { 5108 - "version": "1.1.0", 5109 - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", 5110 - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", 5111 - "dev": true, 5112 - "license": "MIT", 5113 - "dependencies": { 5114 - "call-bound": "^1.0.3", 5115 - "has-bigints": "^1.0.2", 5116 - "has-symbols": "^1.1.0", 5117 - "which-boxed-primitive": "^1.1.1" 5118 - }, 5119 - "engines": { 5120 - "node": ">= 0.4" 5121 - }, 5122 - "funding": { 5123 - "url": "https://github.com/sponsors/ljharb" 5124 - } 5125 - }, 5126 - "node_modules/undici-types": { 5127 - "version": "7.8.0", 5128 - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", 5129 - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", 5130 - "dev": true, 5131 - "license": "MIT" 5132 - }, 5133 - "node_modules/update-browserslist-db": { 5134 - "version": "1.1.3", 5135 - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", 5136 - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", 5137 - "dev": true, 5138 - "funding": [ 5139 - { 5140 - "type": "opencollective", 5141 - "url": "https://opencollective.com/browserslist" 5142 - }, 5143 - { 5144 - "type": "tidelift", 5145 - "url": "https://tidelift.com/funding/github/npm/browserslist" 5146 - }, 5147 - { 5148 - "type": "github", 5149 - "url": "https://github.com/sponsors/ai" 5150 - } 5151 - ], 5152 - "license": "MIT", 5153 - "dependencies": { 5154 - "escalade": "^3.2.0", 5155 - "picocolors": "^1.1.1" 5156 - }, 5157 - "bin": { 5158 - "update-browserslist-db": "cli.js" 5159 - }, 5160 - "peerDependencies": { 5161 - "browserslist": ">= 4.21.0" 5162 - } 5163 - }, 5164 - "node_modules/uri-js": { 5165 - "version": "4.4.1", 5166 - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 5167 - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 5168 - "dev": true, 5169 - "license": "BSD-2-Clause", 5170 - "dependencies": { 5171 - "punycode": "^2.1.0" 5172 - } 5173 - }, 5174 - "node_modules/use-sync-external-store": { 5175 - "version": "1.5.0", 5176 - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", 5177 - "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", 5178 - "license": "MIT", 5179 - "peerDependencies": { 5180 - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" 5181 - } 5182 - }, 5183 - "node_modules/vite": { 5184 - "version": "6.3.5", 5185 - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", 5186 - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", 5187 - "dev": true, 5188 - "license": "MIT", 5189 - "dependencies": { 5190 - "esbuild": "^0.25.0", 5191 - "fdir": "^6.4.4", 5192 - "picomatch": "^4.0.2", 5193 - "postcss": "^8.5.3", 5194 - "rollup": "^4.34.9", 5195 - "tinyglobby": "^0.2.13" 5196 - }, 5197 - "bin": { 5198 - "vite": "bin/vite.js" 5199 - }, 5200 - "engines": { 5201 - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 5202 - }, 5203 - "funding": { 5204 - "url": "https://github.com/vitejs/vite?sponsor=1" 5205 - }, 5206 - "optionalDependencies": { 5207 - "fsevents": "~2.3.3" 5208 - }, 5209 - "peerDependencies": { 5210 - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 5211 - "jiti": ">=1.21.0", 5212 - "less": "*", 5213 - "lightningcss": "^1.21.0", 5214 - "sass": "*", 5215 - "sass-embedded": "*", 5216 - "stylus": "*", 5217 - "sugarss": "*", 5218 - "terser": "^5.16.0", 5219 - "tsx": "^4.8.1", 5220 - "yaml": "^2.4.2" 5221 - }, 5222 - "peerDependenciesMeta": { 5223 - "@types/node": { 5224 - "optional": true 5225 - }, 5226 - "jiti": { 5227 - "optional": true 5228 - }, 5229 - "less": { 5230 - "optional": true 5231 - }, 5232 - "lightningcss": { 5233 - "optional": true 5234 - }, 5235 - "sass": { 5236 - "optional": true 5237 - }, 5238 - "sass-embedded": { 5239 - "optional": true 5240 - }, 5241 - "stylus": { 5242 - "optional": true 5243 - }, 5244 - "sugarss": { 5245 - "optional": true 5246 - }, 5247 - "terser": { 5248 - "optional": true 5249 - }, 5250 - "tsx": { 5251 - "optional": true 5252 - }, 5253 - "yaml": { 5254 - "optional": true 5255 - } 5256 - } 5257 - }, 5258 - "node_modules/vite/node_modules/fdir": { 5259 - "version": "6.4.6", 5260 - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", 5261 - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", 5262 - "dev": true, 5263 - "license": "MIT", 5264 - "peerDependencies": { 5265 - "picomatch": "^3 || ^4" 5266 - }, 5267 - "peerDependenciesMeta": { 5268 - "picomatch": { 5269 - "optional": true 5270 - } 5271 - } 5272 - }, 5273 - "node_modules/vite/node_modules/picomatch": { 5274 - "version": "4.0.2", 5275 - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", 5276 - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", 5277 - "dev": true, 5278 - "license": "MIT", 5279 - "engines": { 5280 - "node": ">=12" 5281 - }, 5282 - "funding": { 5283 - "url": "https://github.com/sponsors/jonschlinkert" 5284 - } 5285 - }, 5286 - "node_modules/which": { 5287 - "version": "2.0.2", 5288 - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 5289 - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 5290 - "dev": true, 5291 - "license": "ISC", 5292 - "dependencies": { 5293 - "isexe": "^2.0.0" 5294 - }, 5295 - "bin": { 5296 - "node-which": "bin/node-which" 5297 - }, 5298 - "engines": { 5299 - "node": ">= 8" 5300 - } 5301 - }, 5302 - "node_modules/which-boxed-primitive": { 5303 - "version": "1.1.1", 5304 - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", 5305 - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", 5306 - "dev": true, 5307 - "license": "MIT", 5308 - "dependencies": { 5309 - "is-bigint": "^1.1.0", 5310 - "is-boolean-object": "^1.2.1", 5311 - "is-number-object": "^1.1.1", 5312 - "is-string": "^1.1.1", 5313 - "is-symbol": "^1.1.1" 5314 - }, 5315 - "engines": { 5316 - "node": ">= 0.4" 5317 - }, 5318 - "funding": { 5319 - "url": "https://github.com/sponsors/ljharb" 5320 - } 5321 - }, 5322 - "node_modules/which-builtin-type": { 5323 - "version": "1.2.1", 5324 - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", 5325 - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", 5326 - "dev": true, 5327 - "license": "MIT", 5328 - "dependencies": { 5329 - "call-bound": "^1.0.2", 5330 - "function.prototype.name": "^1.1.6", 5331 - "has-tostringtag": "^1.0.2", 5332 - "is-async-function": "^2.0.0", 5333 - "is-date-object": "^1.1.0", 5334 - "is-finalizationregistry": "^1.1.0", 5335 - "is-generator-function": "^1.0.10", 5336 - "is-regex": "^1.2.1", 5337 - "is-weakref": "^1.0.2", 5338 - "isarray": "^2.0.5", 5339 - "which-boxed-primitive": "^1.1.0", 5340 - "which-collection": "^1.0.2", 5341 - "which-typed-array": "^1.1.16" 5342 - }, 5343 - "engines": { 5344 - "node": ">= 0.4" 5345 - }, 5346 - "funding": { 5347 - "url": "https://github.com/sponsors/ljharb" 5348 - } 5349 - }, 5350 - "node_modules/which-collection": { 5351 - "version": "1.0.2", 5352 - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", 5353 - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", 5354 - "dev": true, 5355 - "license": "MIT", 5356 - "dependencies": { 5357 - "is-map": "^2.0.3", 5358 - "is-set": "^2.0.3", 5359 - "is-weakmap": "^2.0.2", 5360 - "is-weakset": "^2.0.3" 5361 - }, 5362 - "engines": { 5363 - "node": ">= 0.4" 5364 - }, 5365 - "funding": { 5366 - "url": "https://github.com/sponsors/ljharb" 5367 - } 5368 - }, 5369 - "node_modules/which-typed-array": { 5370 - "version": "1.1.19", 5371 - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", 5372 - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", 5373 - "dev": true, 5374 - "license": "MIT", 5375 - "dependencies": { 5376 - "available-typed-arrays": "^1.0.7", 5377 - "call-bind": "^1.0.8", 5378 - "call-bound": "^1.0.4", 5379 - "for-each": "^0.3.5", 5380 - "get-proto": "^1.0.1", 5381 - "gopd": "^1.2.0", 5382 - "has-tostringtag": "^1.0.2" 5383 - }, 5384 - "engines": { 5385 - "node": ">= 0.4" 5386 - }, 5387 - "funding": { 5388 - "url": "https://github.com/sponsors/ljharb" 5389 - } 5390 - }, 5391 - "node_modules/word-wrap": { 5392 - "version": "1.2.5", 5393 - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 5394 - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 5395 - "dev": true, 5396 - "license": "MIT", 5397 - "engines": { 5398 - "node": ">=0.10.0" 5399 - } 5400 - }, 5401 - "node_modules/yallist": { 5402 - "version": "3.1.1", 5403 - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 5404 - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 5405 - "dev": true, 5406 - "license": "ISC" 5407 - }, 5408 - "node_modules/yocto-queue": { 5409 - "version": "0.1.0", 5410 - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 5411 - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 5412 - "dev": true, 5413 - "license": "MIT", 5414 - "engines": { 5415 - "node": ">=10" 5416 - }, 5417 - "funding": { 5418 - "url": "https://github.com/sponsors/sindresorhus" 5419 - } 5140 + "yaml": { 5141 + "optional": true 5420 5142 } 5143 + } 5144 + }, 5145 + "node_modules/which": { 5146 + "version": "2.0.2", 5147 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 5148 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 5149 + "dev": true, 5150 + "license": "ISC", 5151 + "dependencies": { 5152 + "isexe": "^2.0.0" 5153 + }, 5154 + "bin": { 5155 + "node-which": "bin/node-which" 5156 + }, 5157 + "engines": { 5158 + "node": ">= 8" 5159 + } 5160 + }, 5161 + "node_modules/which-boxed-primitive": { 5162 + "version": "1.1.1", 5163 + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", 5164 + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", 5165 + "dev": true, 5166 + "license": "MIT", 5167 + "dependencies": { 5168 + "is-bigint": "^1.1.0", 5169 + "is-boolean-object": "^1.2.1", 5170 + "is-number-object": "^1.1.1", 5171 + "is-string": "^1.1.1", 5172 + "is-symbol": "^1.1.1" 5173 + }, 5174 + "engines": { 5175 + "node": ">= 0.4" 5176 + }, 5177 + "funding": { 5178 + "url": "https://github.com/sponsors/ljharb" 5179 + } 5180 + }, 5181 + "node_modules/which-builtin-type": { 5182 + "version": "1.2.1", 5183 + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", 5184 + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", 5185 + "dev": true, 5186 + "license": "MIT", 5187 + "dependencies": { 5188 + "call-bound": "^1.0.2", 5189 + "function.prototype.name": "^1.1.6", 5190 + "has-tostringtag": "^1.0.2", 5191 + "is-async-function": "^2.0.0", 5192 + "is-date-object": "^1.1.0", 5193 + "is-finalizationregistry": "^1.1.0", 5194 + "is-generator-function": "^1.0.10", 5195 + "is-regex": "^1.2.1", 5196 + "is-weakref": "^1.0.2", 5197 + "isarray": "^2.0.5", 5198 + "which-boxed-primitive": "^1.1.0", 5199 + "which-collection": "^1.0.2", 5200 + "which-typed-array": "^1.1.16" 5201 + }, 5202 + "engines": { 5203 + "node": ">= 0.4" 5204 + }, 5205 + "funding": { 5206 + "url": "https://github.com/sponsors/ljharb" 5207 + } 5208 + }, 5209 + "node_modules/which-collection": { 5210 + "version": "1.0.2", 5211 + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", 5212 + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", 5213 + "dev": true, 5214 + "license": "MIT", 5215 + "dependencies": { 5216 + "is-map": "^2.0.3", 5217 + "is-set": "^2.0.3", 5218 + "is-weakmap": "^2.0.2", 5219 + "is-weakset": "^2.0.3" 5220 + }, 5221 + "engines": { 5222 + "node": ">= 0.4" 5223 + }, 5224 + "funding": { 5225 + "url": "https://github.com/sponsors/ljharb" 5226 + } 5227 + }, 5228 + "node_modules/which-typed-array": { 5229 + "version": "1.1.20", 5230 + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", 5231 + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", 5232 + "dev": true, 5233 + "license": "MIT", 5234 + "dependencies": { 5235 + "available-typed-arrays": "^1.0.7", 5236 + "call-bind": "^1.0.8", 5237 + "call-bound": "^1.0.4", 5238 + "for-each": "^0.3.5", 5239 + "get-proto": "^1.0.1", 5240 + "gopd": "^1.2.0", 5241 + "has-tostringtag": "^1.0.2" 5242 + }, 5243 + "engines": { 5244 + "node": ">= 0.4" 5245 + }, 5246 + "funding": { 5247 + "url": "https://github.com/sponsors/ljharb" 5248 + } 5249 + }, 5250 + "node_modules/word-wrap": { 5251 + "version": "1.2.5", 5252 + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 5253 + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 5254 + "dev": true, 5255 + "license": "MIT", 5256 + "engines": { 5257 + "node": ">=0.10.0" 5258 + } 5259 + }, 5260 + "node_modules/yallist": { 5261 + "version": "3.1.1", 5262 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 5263 + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 5264 + "dev": true, 5265 + "license": "ISC" 5266 + }, 5267 + "node_modules/yocto-queue": { 5268 + "version": "0.1.0", 5269 + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 5270 + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 5271 + "dev": true, 5272 + "license": "MIT", 5273 + "engines": { 5274 + "node": ">=10" 5275 + }, 5276 + "funding": { 5277 + "url": "https://github.com/sponsors/sindresorhus" 5278 + } 5421 5279 } 5280 + } 5422 5281 }
+36 -36
frontend/package.json
··· 1 1 { 2 - "name": "manhunt-app", 3 - "private": true, 4 - "version": "0.1.0", 5 - "type": "module", 6 - "scripts": { 7 - "dev": "vite", 8 - "build": "tsc && vite build", 9 - "preview": "vite preview", 10 - "lint": "tsc && eslint --cache" 11 - }, 12 - "dependencies": { 13 - "@tauri-apps/api": "^2", 14 - "@tauri-apps/plugin-geolocation": "^2", 15 - "@tauri-apps/plugin-log": "^2", 16 - "@tauri-apps/plugin-notification": "^2", 17 - "@tauri-apps/plugin-opener": "^2", 18 - "@tauri-apps/plugin-dialog": "^2", 19 - "react": "^19", 20 - "react-dom": "^19", 21 - "swr": "^2.3.3" 22 - }, 23 - "devDependencies": { 24 - "@eslint/js": "^9", 25 - "@types/node": "^24.0.3", 26 - "@types/react": "^19", 27 - "@types/react-dom": "^19", 28 - "@vitejs/plugin-react": "^4", 29 - "eslint": "^9", 30 - "eslint-plugin-react": "^7", 31 - "eslint-plugin-react-hooks": "^5", 32 - "globals": "^16", 33 - "prettier": "^3", 34 - "typescript": "^5", 35 - "typescript-eslint": "^8", 36 - "vite": "^6" 37 - } 2 + "name": "manhunt-app", 3 + "private": true, 4 + "version": "0.1.0", 5 + "type": "module", 6 + "scripts": { 7 + "dev": "vite", 8 + "build": "tsc && vite build", 9 + "preview": "vite preview", 10 + "lint": "tsc && eslint --cache" 11 + }, 12 + "dependencies": { 13 + "@tauri-apps/api": "^2", 14 + "@tauri-apps/plugin-geolocation": "^2", 15 + "@tauri-apps/plugin-log": "^2", 16 + "@tauri-apps/plugin-notification": "^2", 17 + "@tauri-apps/plugin-opener": "^2", 18 + "@tauri-apps/plugin-dialog": "^2", 19 + "react": "^19", 20 + "react-dom": "^19", 21 + "swr": "^2" 22 + }, 23 + "devDependencies": { 24 + "@eslint/js": "^9.39.2", 25 + "@types/node": "^25.2.3", 26 + "@types/react": "^19", 27 + "@types/react-dom": "^19", 28 + "@vitejs/plugin-react": "^5.1.4", 29 + "eslint": "^9.39.2", 30 + "eslint-plugin-react": "^7", 31 + "eslint-plugin-react-hooks": "^5.2.0", 32 + "globals": "^17.3.0", 33 + "prettier": "^3", 34 + "typescript": "^5", 35 + "typescript-eslint": "^8", 36 + "vite": "^7" 37 + } 38 38 }
+1
frontend/src/bindings.ts
··· 156 156 export type AppGameHistory = { 157 157 history: GameHistory; 158 158 profiles: Partial<{ [key in string]: PlayerProfile }>; 159 + settings: GameSettings; 159 160 }; 160 161 export type AppScreen = "Setup" | "Menu" | "Lobby" | "Game" | "Replay"; 161 162 /**
+3 -3
justfile
··· 29 29 cargo fmt --check 30 30 cargo check 31 31 cargo clippy --fix --allow-dirty --allow-staged -- -D warnings 32 + cargo nextest run 32 33 33 34 # Run lint on the frontend 34 35 [working-directory('frontend')] ··· 36 37 npm run lint 37 38 38 39 # Export types from the backend to TypeScript bindings 39 - [working-directory('backend')] 40 40 export-types: 41 - cargo run --bin export-types ../frontend/src/bindings.ts 42 - prettier --write ../frontend/src/bindings.ts --config ../.prettierrc.yaml 41 + cargo run --bin export-types frontend/src/bindings.ts 42 + prettier --write frontend/src/bindings.ts --config .prettierrc.yaml 43 43 44 44 # Start the signaling server on localhost:3536 45 45 [working-directory('manhunt-signaling')]
+297
manhunt-app/src/lib.rs
··· 1 + mod history; 2 + mod location; 3 + mod profiles; 4 + mod state; 5 + 6 + use std::collections::HashMap; 7 + 8 + use log::LevelFilter; 9 + use manhunt_logic::{GameSettings, GameUiState, LobbyState, PlayerProfile, UtcDT}; 10 + use manhunt_transport::room_exists; 11 + use tauri::{AppHandle, Manager, State}; 12 + use tauri_specta::{ErrorHandlingMode, collect_commands, collect_events}; 13 + use tokio::sync::RwLock; 14 + use uuid::Uuid; 15 + 16 + use std::result::Result as StdResult; 17 + 18 + use crate::{ 19 + history::AppGameHistory, 20 + profiles::{read_profile_from_store, write_profile_to_store}, 21 + state::{AppScreen, AppState, AppStateHandle, ChangeScreen, GameStateUpdate, LobbyStateUpdate}, 22 + }; 23 + 24 + type Result<T = (), E = String> = StdResult<T, E>; 25 + 26 + // == GENERAL / FLOW COMMANDS == 27 + 28 + #[tauri::command] 29 + #[specta::specta] 30 + /// Get the screen the app should currently be on, returns [AppScreen] 31 + async fn get_current_screen(state: State<'_, AppStateHandle>) -> Result<AppScreen> { 32 + let state = state.read().await; 33 + Ok(match &*state { 34 + AppState::Setup => AppScreen::Setup, 35 + AppState::Menu(_player_profile) => AppScreen::Menu, 36 + AppState::Lobby(_lobby) => AppScreen::Lobby, 37 + AppState::Game(_game, _profiles) => AppScreen::Game, 38 + AppState::Replay(_) => AppScreen::Replay, 39 + }) 40 + } 41 + 42 + #[tauri::command] 43 + #[specta::specta] 44 + /// Quit a running game or leave a lobby 45 + async fn quit_to_menu(app: AppHandle, state: State<'_, AppStateHandle>) -> Result { 46 + let mut state = state.write().await; 47 + state.quit_to_menu(app).await; 48 + Ok(()) 49 + } 50 + 51 + // == AppState::Setup COMMANDS 52 + 53 + #[tauri::command] 54 + #[specta::specta] 55 + /// (Screen: Setup) Complete user setup and go to the menu screen 56 + async fn complete_setup( 57 + profile: PlayerProfile, 58 + app: AppHandle, 59 + state: State<'_, AppStateHandle>, 60 + ) -> Result { 61 + state.write().await.complete_setup(&app, profile) 62 + } 63 + 64 + // == AppState::Menu COMMANDS == 65 + 66 + #[tauri::command] 67 + #[specta::specta] 68 + /// (Screen: Menu) Get the user's player profile 69 + async fn get_profile(state: State<'_, AppStateHandle>) -> Result<PlayerProfile> { 70 + let state = state.read().await; 71 + let profile = state.get_menu()?; 72 + Ok(profile.clone()) 73 + } 74 + 75 + #[tauri::command] 76 + #[specta::specta] 77 + /// (Screen: Menu) Get a list of all previously played games, returns of list of DateTimes that represent when 78 + /// each game started, use this as a key 79 + fn list_game_histories(app: AppHandle) -> Result<Vec<UtcDT>> { 80 + AppGameHistory::ls_histories(&app) 81 + .map_err(|err| err.context("Failed to get game histories").to_string()) 82 + } 83 + 84 + #[tauri::command] 85 + #[specta::specta] 86 + /// (Screen: Menu) Go to the game replay screen to replay the game history specified by id 87 + async fn replay_game(id: UtcDT, app: AppHandle, state: State<'_, AppStateHandle>) -> Result { 88 + state.write().await.replay_game(&app, id) 89 + } 90 + 91 + #[tauri::command] 92 + #[specta::specta] 93 + /// (Screen: Menu) Check if a room code is valid to join, use this before starting a game 94 + /// for faster error checking. 95 + async fn check_room_code(code: &str) -> Result<bool> { 96 + room_exists(code).await.map_err(|err| err.to_string()) 97 + } 98 + 99 + #[tauri::command] 100 + #[specta::specta] 101 + /// (Screen: Menu) Update the player's profile and persist it 102 + async fn update_profile( 103 + new_profile: PlayerProfile, 104 + app: AppHandle, 105 + state: State<'_, AppStateHandle>, 106 + ) -> Result { 107 + write_profile_to_store(&app, new_profile.clone()); 108 + let mut state = state.write().await; 109 + let profile = state.get_menu_mut()?; 110 + *profile = new_profile; 111 + Ok(()) 112 + } 113 + 114 + #[tauri::command] 115 + #[specta::specta] 116 + /// (Screen: Menu) Start/Join a new lobby, set `join_code` to `null` to be host, 117 + /// set it to a join code to be a client. This triggers a screen change to [AppScreen::Lobby] 118 + async fn start_lobby( 119 + app: AppHandle, 120 + join_code: Option<String>, 121 + settings: GameSettings, 122 + state: State<'_, AppStateHandle>, 123 + ) -> Result { 124 + let mut state = state.write().await; 125 + state.start_lobby(join_code, app, settings).await; 126 + Ok(()) 127 + } 128 + 129 + // AppState::Lobby COMMANDS 130 + 131 + #[tauri::command] 132 + #[specta::specta] 133 + /// (Screen: Lobby) Get the current state of the lobby, call after receiving an update event 134 + async fn get_lobby_state(state: State<'_, AppStateHandle>) -> Result<LobbyState> { 135 + let lobby = state.read().await.get_lobby()?; 136 + Ok(lobby.clone_state().await) 137 + } 138 + 139 + #[tauri::command] 140 + #[specta::specta] 141 + /// (Screen: Lobby) Switch teams between seekers and hiders, returns the new [LobbyState] 142 + async fn switch_teams(seeker: bool, state: State<'_, AppStateHandle>) -> Result { 143 + let lobby = state.read().await.get_lobby()?; 144 + lobby.switch_teams(seeker).await; 145 + Ok(()) 146 + } 147 + 148 + #[tauri::command] 149 + #[specta::specta] 150 + /// (Screen: Lobby) HOST ONLY: Push new settings to everyone, does nothing on clients. Returns the 151 + /// new lobby state 152 + async fn host_update_settings(settings: GameSettings, state: State<'_, AppStateHandle>) -> Result { 153 + let lobby = state.read().await.get_lobby()?; 154 + lobby.update_settings(settings).await; 155 + Ok(()) 156 + } 157 + 158 + #[tauri::command] 159 + #[specta::specta] 160 + /// (Screen: Lobby) HOST ONLY: Start the game, stops anyone else from joining and switched screen 161 + /// to AppScreen::Game. 162 + async fn host_start_game(state: State<'_, AppStateHandle>) -> Result { 163 + state.read().await.get_lobby()?.start_game().await; 164 + Ok(()) 165 + } 166 + 167 + // AppScreen::Game COMMANDS 168 + 169 + #[tauri::command] 170 + #[specta::specta] 171 + /// (Screen: Game) Get all player profiles with display names and profile pictures for this game. 172 + /// This value will never change and is fairly expensive to clone, so please minimize calls to 173 + /// this command. 174 + async fn get_profiles(state: State<'_, AppStateHandle>) -> Result<HashMap<Uuid, PlayerProfile>> { 175 + state.read().await.get_profiles().cloned() 176 + } 177 + 178 + #[tauri::command] 179 + #[specta::specta] 180 + /// (Screen: Game) Get the current settings for this game. 181 + async fn get_game_settings(state: State<'_, AppStateHandle>) -> Result<GameSettings> { 182 + Ok(state.read().await.get_game()?.clone_settings().await) 183 + } 184 + 185 + #[tauri::command] 186 + #[specta::specta] 187 + /// (Screen: Game) Get the current state of the game. 188 + async fn get_game_state(state: State<'_, AppStateHandle>) -> Result<GameUiState> { 189 + Ok(state.read().await.get_game()?.get_ui_state().await) 190 + } 191 + 192 + #[tauri::command] 193 + #[specta::specta] 194 + /// (Screen: Game) Mark this player as caught, this player will become a seeker. Returns the new game state 195 + async fn mark_caught(state: State<'_, AppStateHandle>) -> Result { 196 + let game = state.read().await.get_game()?; 197 + game.mark_caught().await; 198 + Ok(()) 199 + } 200 + 201 + #[tauri::command] 202 + #[specta::specta] 203 + /// (Screen: Game) Grab a powerup on the map, this should be called when the user is *in range* of 204 + /// the powerup. Returns the new game state after rolling for the powerup 205 + async fn grab_powerup(state: State<'_, AppStateHandle>) -> Result { 206 + let game = state.read().await.get_game()?; 207 + game.get_powerup().await; 208 + Ok(()) 209 + } 210 + 211 + #[tauri::command] 212 + #[specta::specta] 213 + /// (Screen: Game) Use the currently held powerup in the player's held_powerup. Does nothing if the 214 + /// player has none. Returns the updated game state 215 + async fn activate_powerup(state: State<'_, AppStateHandle>) -> Result { 216 + let game = state.read().await.get_game()?; 217 + game.use_powerup().await; 218 + Ok(()) 219 + } 220 + 221 + // AppState::Replay COMMANDS 222 + 223 + #[tauri::command] 224 + #[specta::specta] 225 + /// (Screen: Replay) Get the game history that's currently being replayed. Try to limit calls to 226 + /// this 227 + async fn get_current_replay_history(state: State<'_, AppStateHandle>) -> Result<AppGameHistory> { 228 + state.read().await.get_replay() 229 + } 230 + 231 + pub fn mk_specta() -> tauri_specta::Builder { 232 + tauri_specta::Builder::<tauri::Wry>::new() 233 + .error_handling(ErrorHandlingMode::Throw) 234 + .commands(collect_commands![ 235 + start_lobby, 236 + get_profile, 237 + quit_to_menu, 238 + get_current_screen, 239 + update_profile, 240 + get_lobby_state, 241 + host_update_settings, 242 + switch_teams, 243 + host_start_game, 244 + mark_caught, 245 + grab_powerup, 246 + activate_powerup, 247 + check_room_code, 248 + get_profiles, 249 + replay_game, 250 + list_game_histories, 251 + get_current_replay_history, 252 + get_game_settings, 253 + get_game_state, 254 + complete_setup, 255 + ]) 256 + .events(collect_events![ 257 + ChangeScreen, 258 + GameStateUpdate, 259 + LobbyStateUpdate 260 + ]) 261 + } 262 + 263 + #[cfg_attr(mobile, tauri::mobile_entry_point)] 264 + pub fn run() { 265 + let state = RwLock::new(AppState::Setup); 266 + 267 + let builder = mk_specta(); 268 + 269 + tauri::Builder::default() 270 + .plugin(tauri_plugin_dialog::init()) 271 + .plugin(tauri_plugin_notification::init()) 272 + .plugin( 273 + tauri_plugin_log::Builder::new() 274 + .level(LevelFilter::Debug) 275 + .build(), 276 + ) 277 + .plugin(tauri_plugin_opener::init()) 278 + .plugin(tauri_plugin_geolocation::init()) 279 + .plugin(tauri_plugin_store::Builder::default().build()) 280 + .invoke_handler(builder.invoke_handler()) 281 + .manage(state) 282 + .setup(move |app| { 283 + builder.mount_events(app); 284 + 285 + let handle = app.handle().clone(); 286 + tauri::async_runtime::spawn(async move { 287 + if let Some(profile) = read_profile_from_store(&handle) { 288 + let state_handle = handle.state::<AppStateHandle>(); 289 + let mut state = state_handle.write().await; 290 + *state = AppState::Menu(profile); 291 + } 292 + }); 293 + Ok(()) 294 + }) 295 + .run(tauri::generate_context!()) 296 + .expect("error while running tauri application"); 297 + }
+300
manhunt-app/src/state.rs
··· 1 + use std::{collections::HashMap, marker::PhantomData, sync::Arc, time::Duration}; 2 + 3 + use anyhow::Context; 4 + use log::{error, info, warn}; 5 + use manhunt_logic::{ 6 + Game as BaseGame, GameSettings, Lobby as BaseLobby, PlayerProfile, StartGameInfo, 7 + StateUpdateSender, UtcDT, 8 + }; 9 + use manhunt_transport::{MatchboxTransport, request_room_code}; 10 + use serde::{Deserialize, Serialize}; 11 + use tauri::{AppHandle, Manager}; 12 + use tauri_plugin_dialog::{DialogExt, MessageDialogKind}; 13 + use tauri_specta::Event; 14 + use tokio::sync::RwLock; 15 + use uuid::Uuid; 16 + 17 + use crate::{ 18 + Result, 19 + history::AppGameHistory, 20 + location::TauriLocation, 21 + profiles::{read_profile_from_store, write_profile_to_store}, 22 + }; 23 + 24 + /// The state of the game has changed 25 + #[derive(Serialize, Deserialize, Clone, Default, Debug, specta::Type, tauri_specta::Event)] 26 + pub struct GameStateUpdate; 27 + 28 + /// The state of the lobby has changed 29 + #[derive(Serialize, Deserialize, Clone, Default, Debug, specta::Type, tauri_specta::Event)] 30 + pub struct LobbyStateUpdate; 31 + 32 + pub struct TauriStateUpdateSender<E: Clone + Default + Event + Serialize>( 33 + AppHandle, 34 + PhantomData<E>, 35 + ); 36 + 37 + impl<E: Serialize + Clone + Default + Event> TauriStateUpdateSender<E> { 38 + fn new(app: &AppHandle) -> Self { 39 + Self(app.clone(), PhantomData) 40 + } 41 + } 42 + 43 + impl<E: Serialize + Clone + Default + Event> StateUpdateSender for TauriStateUpdateSender<E> { 44 + fn send_update(&self) { 45 + if let Err(why) = E::default().emit(&self.0) { 46 + error!("Error sending Game state update to UI: {why:?}"); 47 + } 48 + } 49 + } 50 + 51 + type Game = BaseGame<TauriLocation, MatchboxTransport, TauriStateUpdateSender<GameStateUpdate>>; 52 + type Lobby = BaseLobby<MatchboxTransport, TauriStateUpdateSender<LobbyStateUpdate>>; 53 + 54 + pub enum AppState { 55 + Setup, 56 + Menu(PlayerProfile), 57 + Lobby(Arc<Lobby>), 58 + Game(Arc<Game>, HashMap<Uuid, PlayerProfile>), 59 + Replay(AppGameHistory), 60 + } 61 + 62 + #[derive(Serialize, Deserialize, specta::Type, Debug, Clone, Eq, PartialEq)] 63 + pub enum AppScreen { 64 + Setup, 65 + Menu, 66 + Lobby, 67 + Game, 68 + Replay, 69 + } 70 + 71 + pub type AppStateHandle = RwLock<AppState>; 72 + 73 + const GAME_TICK_RATE: Duration = Duration::from_secs(1); 74 + 75 + /// The app is changing screens, contains the screen it's switching to 76 + #[derive(Serialize, Deserialize, Clone, Debug, specta::Type, tauri_specta::Event)] 77 + pub struct ChangeScreen(AppScreen); 78 + 79 + fn error_dialog(app: &AppHandle, msg: &str) { 80 + app.dialog() 81 + .message(msg) 82 + .kind(MessageDialogKind::Error) 83 + .show(|_| {}); 84 + } 85 + 86 + impl AppState { 87 + pub async fn start_game(&mut self, app: AppHandle, start: StartGameInfo) { 88 + if let AppState::Lobby(lobby) = self { 89 + let transport = lobby.clone_transport(); 90 + let profiles = lobby.clone_profiles().await; 91 + let location = TauriLocation::new(app.clone()); 92 + let state_updates = TauriStateUpdateSender::new(&app); 93 + let game = Arc::new(Game::new( 94 + GAME_TICK_RATE, 95 + start, 96 + transport, 97 + location, 98 + state_updates, 99 + )); 100 + *self = AppState::Game(game.clone(), profiles.clone()); 101 + Self::game_loop(app.clone(), game, profiles); 102 + Self::emit_screen_change(&app, AppScreen::Game); 103 + } 104 + } 105 + 106 + fn game_loop(app: AppHandle, game: Arc<Game>, profiles: HashMap<Uuid, PlayerProfile>) { 107 + tokio::spawn(async move { 108 + let res = game.main_loop().await; 109 + let state_handle = app.state::<AppStateHandle>(); 110 + let mut state = state_handle.write().await; 111 + match res { 112 + Ok(Some(history)) => { 113 + let history = 114 + AppGameHistory::new(history, profiles, game.clone_settings().await); 115 + if let Err(why) = history.save_history(&app) { 116 + error!("Failed to save game history: {why:?}"); 117 + error_dialog(&app, "Failed to save the history of this game"); 118 + } 119 + state.quit_to_menu(app.clone()).await; 120 + } 121 + Ok(None) => { 122 + info!("User quit game"); 123 + } 124 + Err(why) => { 125 + error!("Game Error: {why:?}"); 126 + app.dialog() 127 + .message(format!("Connection Error: {why}")) 128 + .kind(MessageDialogKind::Error) 129 + .show(|_| {}); 130 + state.quit_to_menu(app.clone()).await; 131 + } 132 + } 133 + }); 134 + } 135 + 136 + pub fn get_menu(&self) -> Result<&PlayerProfile> { 137 + match self { 138 + AppState::Menu(player_profile) => Ok(player_profile), 139 + _ => Err("Not on menu screen".to_string()), 140 + } 141 + } 142 + 143 + pub fn get_menu_mut(&mut self) -> Result<&mut PlayerProfile> { 144 + match self { 145 + AppState::Menu(player_profile) => Ok(player_profile), 146 + _ => Err("Not on menu screen".to_string()), 147 + } 148 + } 149 + 150 + pub fn get_lobby(&self) -> Result<Arc<Lobby>> { 151 + if let AppState::Lobby(lobby) = self { 152 + Ok(lobby.clone()) 153 + } else { 154 + Err("Not on lobby screen".to_string()) 155 + } 156 + } 157 + 158 + pub fn get_game(&self) -> Result<Arc<Game>> { 159 + if let AppState::Game(game, _) = self { 160 + Ok(game.clone()) 161 + } else { 162 + Err("Not on game screen".to_string()) 163 + } 164 + } 165 + 166 + pub fn get_profiles(&self) -> Result<&HashMap<Uuid, PlayerProfile>> { 167 + if let AppState::Game(_, profiles) = self { 168 + Ok(profiles) 169 + } else { 170 + Err("Not on game screen".to_string()) 171 + } 172 + } 173 + 174 + pub fn get_replay(&self) -> Result<AppGameHistory> { 175 + if let AppState::Replay(history) = self { 176 + Ok(history.clone()) 177 + } else { 178 + Err("Not on replay screen".to_string()) 179 + } 180 + } 181 + 182 + fn emit_screen_change(app: &AppHandle, screen: AppScreen) { 183 + if let Err(why) = ChangeScreen(screen).emit(app) { 184 + warn!("Error emitting screen change: {why:?}"); 185 + } 186 + } 187 + 188 + pub fn complete_setup(&mut self, app: &AppHandle, profile: PlayerProfile) -> Result { 189 + if let AppState::Setup = self { 190 + write_profile_to_store(app, profile.clone()); 191 + *self = AppState::Menu(profile); 192 + Self::emit_screen_change(app, AppScreen::Menu); 193 + Ok(()) 194 + } else { 195 + Err("Must be on the Setup screen".to_string()) 196 + } 197 + } 198 + 199 + pub fn replay_game(&mut self, app: &AppHandle, id: UtcDT) -> Result { 200 + if let AppState::Menu(_) = self { 201 + let history = AppGameHistory::get_history(app, id) 202 + .context("Failed to read history") 203 + .map_err(|e| e.to_string())?; 204 + *self = AppState::Replay(history); 205 + Self::emit_screen_change(app, AppScreen::Replay); 206 + Ok(()) 207 + } else { 208 + Err("Not on menu screen".to_string()) 209 + } 210 + } 211 + 212 + fn lobby_loop(app: AppHandle, lobby: Arc<Lobby>) { 213 + tokio::spawn(async move { 214 + let res = lobby.main_loop().await; 215 + let app_game = app.clone(); 216 + let state_handle = app.state::<AppStateHandle>(); 217 + let mut state = state_handle.write().await; 218 + match res { 219 + Ok(Some(start)) => { 220 + info!("Starting Game"); 221 + state.start_game(app_game, start).await; 222 + } 223 + Ok(None) => { 224 + info!("User quit lobby"); 225 + } 226 + Err(why) => { 227 + error!("Lobby Error: {why}"); 228 + error_dialog(&app_game, &format!("Error joining the lobby: {why}")); 229 + state.quit_to_menu(app_game).await; 230 + } 231 + } 232 + }); 233 + } 234 + 235 + pub async fn start_lobby( 236 + &mut self, 237 + join_code: Option<String>, 238 + app: AppHandle, 239 + settings: GameSettings, 240 + ) { 241 + if let AppState::Menu(profile) = self { 242 + let host = join_code.is_none(); 243 + let room_code = if let Some(code) = join_code { 244 + code.to_ascii_uppercase() 245 + } else { 246 + match request_room_code().await { 247 + Ok(code) => code, 248 + Err(why) => { 249 + error_dialog(&app, &format!("Couldn't create a lobby\n\n{why:?}")); 250 + return; 251 + } 252 + } 253 + }; 254 + let state_updates = TauriStateUpdateSender::<LobbyStateUpdate>::new(&app); 255 + let lobby = 256 + Lobby::new(&room_code, host, profile.clone(), settings, state_updates).await; 257 + match lobby { 258 + Ok(lobby) => { 259 + *self = AppState::Lobby(lobby.clone()); 260 + Self::lobby_loop(app.clone(), lobby); 261 + Self::emit_screen_change(&app, AppScreen::Lobby); 262 + } 263 + Err(why) => { 264 + error_dialog( 265 + &app, 266 + &format!("Couldn't connect you to the lobby\n\n{why:?}"), 267 + ); 268 + } 269 + } 270 + } 271 + } 272 + 273 + pub async fn quit_to_menu(&mut self, app: AppHandle) { 274 + let profile = match self { 275 + AppState::Setup => None, 276 + AppState::Menu(_) => { 277 + warn!("Already on menu!"); 278 + return; 279 + } 280 + AppState::Lobby(lobby) => { 281 + lobby.quit_lobby().await; 282 + read_profile_from_store(&app) 283 + } 284 + AppState::Game(game, _) => { 285 + game.quit_game().await; 286 + read_profile_from_store(&app) 287 + } 288 + AppState::Replay(_) => read_profile_from_store(&app), 289 + }; 290 + let screen = if let Some(profile) = profile { 291 + *self = AppState::Menu(profile); 292 + AppScreen::Menu 293 + } else { 294 + *self = AppState::Setup; 295 + AppScreen::Setup 296 + }; 297 + 298 + Self::emit_screen_change(&app, screen); 299 + } 300 + }
+8 -7
manhunt-logic/Cargo.toml
··· 4 4 edition = "2024" 5 5 6 6 [dependencies] 7 - anyhow = "1.0.98" 8 - chrono = { version = "0.4.41", features = ["serde", "now"] } 9 - rand = { version = "0.9.1", features = ["thread_rng"] } 10 - rand_chacha = "0.9.0" 11 - serde = { version = "1.0.219", features = ["derive"] } 7 + anyhow = "1.0.101" 8 + chrono = { version = "0.4.43", features = ["serde", "now"] } 9 + rand = { version = "0.10.0", features = ["thread_rng"] } 10 + rand_chacha = "0.10.0" 11 + serde = { version = "1.0.228", features = ["derive"] } 12 12 specta = { version = "=2.0.0-rc.22", features = ["uuid", "chrono", "derive"] } 13 - tokio = { version = "1.45.1", features = ["macros", "rt", "sync", "time"] } 14 - uuid = { version = "1.17.0", features = ["serde", "v4"] } 13 + tokio = { version = "1.49.0", features = ["macros", "rt", "sync", "time", "test-util"] } 14 + tokio-util = "0.7.18" 15 + uuid = { version = "1.21.0", features = ["serde", "v4"] }
+155 -94
manhunt-logic/src/game.rs
··· 1 1 use anyhow::bail; 2 2 use chrono::{DateTime, Utc}; 3 3 use std::{sync::Arc, time::Duration}; 4 + use tokio_util::sync::CancellationToken; 4 5 use uuid::Uuid; 5 6 6 - use tokio::{sync::RwLock, time::MissedTickBehavior}; 7 + use tokio::sync::{RwLock, RwLockWriteGuard}; 7 8 8 9 use crate::StartGameInfo; 9 10 use crate::{prelude::*, transport::TransportMessage}; ··· 35 36 location: L, 36 37 state_update_sender: S, 37 38 interval: Duration, 39 + cancel: CancellationToken, 38 40 } 39 41 40 42 impl<L: LocationService, T: Transport, S: StateUpdateSender> Game<L, T, S> { ··· 57 59 interval, 58 60 state: RwLock::new(state), 59 61 state_update_sender, 62 + cancel: CancellationToken::new(), 60 63 } 61 64 } 62 65 ··· 71 74 state.remove_ping(id); 72 75 // TODO: Maybe reroll for new powerups (specifically seeker ones) instead of just erasing it 73 76 state.use_powerup(); 74 - 75 - self.send_event(GameEvent::PlayerCaught(state.id)).await; 77 + drop(state); 78 + self.send_event(GameEvent::PlayerCaught(id)).await; 76 79 } 77 80 78 81 pub async fn clone_settings(&self) -> GameSettings { ··· 250 253 false 251 254 } 252 255 256 + pub async fn quit_game(&self) { 257 + self.cancel.cancel(); 258 + } 259 + 253 260 #[cfg(test)] 254 - pub async fn force_tick(&self, now: UtcDT) { 255 - let mut state = self.state.write().await; 256 - self.tick(&mut state, now).await; 261 + fn get_now() -> UtcDT { 262 + let fake = tokio::time::Instant::now(); 263 + let real = std::time::Instant::now(); 264 + Utc::now() + (fake.into_std().duration_since(real) + Duration::from_secs(1)) 257 265 } 258 266 259 - pub async fn quit_game(&self) { 260 - self.transport.disconnect().await; 267 + #[cfg(not(test))] 268 + fn get_now() -> UtcDT { 269 + Utc::now() 261 270 } 262 271 263 272 /// Main loop of the game, handles ticking and receiving messages from [Transport]. 264 273 pub async fn main_loop(&self) -> Result<Option<GameHistory>> { 265 274 let mut interval = tokio::time::interval(self.interval); 266 275 267 - interval.set_missed_tick_behavior(MissedTickBehavior::Delay); 276 + // interval.set_missed_tick_behavior(MissedTickBehavior::Delay); 268 277 269 278 let res = 'game: loop { 270 279 tokio::select! { 271 280 biased; 272 281 282 + _ = self.cancel.cancelled() => { 283 + break 'game Ok(None); 284 + } 285 + 273 286 messages = self.transport.receive_messages() => { 274 287 let mut state = self.state.write().await; 275 288 for (id, msg) in messages { ··· 286 299 287 300 _ = interval.tick() => { 288 301 let mut state = self.state.write().await; 289 - let should_break = self.tick(&mut state, Utc::now()).await; 302 + let should_break = self.tick(&mut state, Self::get_now()).await; 290 303 291 304 if should_break { 292 305 let history = state.as_game_history(); ··· 300 313 301 314 res 302 315 } 316 + 317 + pub async fn lock_state(&self) -> RwLockWriteGuard<'_, GameState> { 318 + self.state.write().await 319 + } 303 320 } 304 321 305 322 #[cfg(test)] ··· 313 330 }; 314 331 315 332 use super::*; 316 - use tokio::{task::yield_now, test}; 333 + use tokio::{sync::oneshot, task::yield_now, test}; 317 334 318 335 type TestGame = Game<MockLocation, MockTransport, DummySender>; 319 336 337 + type EndRecv = oneshot::Receiver<Result<Option<GameHistory>>>; 338 + 320 339 struct MockMatch { 321 340 uuids: Vec<Uuid>, 322 - games: HashMap<u32, Arc<TestGame>>, 341 + games: Vec<Arc<TestGame>>, 323 342 settings: GameSettings, 324 - mock_now: UtcDT, 325 343 } 326 344 327 - const INTERVAL: Duration = Duration::from_secs(u64::MAX); 345 + const INTERVAL: Duration = Duration::from_secs(600000); 328 346 329 347 impl MockMatch { 330 348 pub fn new(settings: GameSettings, players: u32, seekers: u32) -> Self { 349 + tokio::time::pause(); 331 350 let (uuids, transports) = MockTransport::create_mesh(players); 332 351 333 352 let initial_caught_state = (0..players) ··· 336 355 337 356 let games = transports 338 357 .into_iter() 339 - .enumerate() 340 - .map(|(id, transport)| { 358 + .map(|transport| { 341 359 let location = MockLocation; 342 360 let start_info = StartGameInfo { 343 361 initial_caught_state: initial_caught_state.clone(), ··· 351 369 DummySender, 352 370 ); 353 371 354 - (id as u32, Arc::new(game)) 372 + Arc::new(game) 355 373 }) 356 - .collect::<HashMap<_, _>>(); 374 + .collect(); 357 375 358 376 Self { 359 377 settings, 360 378 games, 361 379 uuids, 362 - mock_now: Utc::now(), 363 380 } 364 381 } 365 382 366 - pub async fn start(&self) { 367 - for game in self.games.values() { 383 + pub async fn start(&self) -> Vec<EndRecv> { 384 + let mut recvs = Vec::with_capacity(self.games.len()); 385 + for game in self.games.iter() { 368 386 let game = game.clone(); 387 + let (send, recv) = oneshot::channel(); 388 + recvs.push(recv); 369 389 tokio::spawn(async move { 370 - game.main_loop().await.expect("Game Start Fail"); 390 + let res = game.main_loop().await; 391 + send.send(res).expect("Failed to send"); 371 392 }); 372 393 yield_now().await; 373 394 } 374 - } 375 - 376 - pub async fn pass_time(&mut self, d: Duration) { 377 - self.mock_now += d; 395 + recvs 378 396 } 379 397 380 - pub async fn assert_all_states(&self, f: impl Fn(&GameState)) { 381 - for game in self.games.values() { 398 + pub async fn assert_all_states(&self, f: impl Fn(usize, &GameState)) { 399 + for (i, game) in self.games.iter().enumerate() { 382 400 let state = game.state.read().await; 383 - f(&state); 401 + f(i, &state); 384 402 } 385 403 } 386 404 387 - pub fn game(&self, id: u32) -> &TestGame { 388 - self.games.get(&id).as_ref().unwrap() 405 + pub fn assert_all_transports_disconnected(&self) { 406 + for game in self.games.iter() { 407 + assert!( 408 + game.transport.is_disconnected(), 409 + "Game {} is still connected", 410 + game.transport.self_id() 411 + ); 412 + } 389 413 } 390 414 391 415 pub async fn wait_for_seekers(&mut self) { 392 416 let hiding_time = Duration::from_secs(self.settings.hiding_time_seconds as u64 + 1); 393 - self.mock_now += hiding_time; 417 + 418 + tokio::time::sleep(hiding_time).await; 394 419 395 420 self.tick().await; 396 421 397 - self.assert_all_states(|s| { 398 - assert!(s.seekers_released()); 422 + self.assert_all_states(|i, s| { 423 + assert!(s.seekers_released(), "Seekers not released on game {i}"); 399 424 }) 400 425 .await; 401 426 } 402 427 403 - async fn tick_all(&self, now: UtcDT) { 404 - for game in self.games.values() { 405 - game.force_tick(now).await; 428 + pub async fn wait_for_transports(&self) { 429 + for game in self.games.iter() { 430 + game.transport.wait_for_queue_empty().await; 406 431 } 407 432 } 408 433 409 434 pub async fn tick(&self) { 410 - self.tick_all(self.mock_now).await; 435 + tokio::time::sleep(INTERVAL + Duration::from_secs(1)).await; 436 + self.wait_for_transports().await; 411 437 yield_now().await; 412 438 } 413 439 } ··· 436 462 // 2 players, one is a seeker 437 463 let mut mat = MockMatch::new(settings, 2, 1); 438 464 439 - mat.start().await; 465 + let recvs = mat.start().await; 440 466 441 467 mat.wait_for_seekers().await; 442 468 443 - mat.game(1).mark_caught().await; 469 + mat.games[1].mark_caught().await; 444 470 445 - mat.tick().await; 471 + mat.wait_for_transports().await; 446 472 447 - mat.assert_all_states(|s| { 473 + mat.assert_all_states(|i, s| { 448 474 assert_eq!( 449 475 s.get_caught(mat.uuids[1]), 450 476 Some(true), 451 - "Game {} sees player 1 as not caught", 452 - s.id 477 + "Game {i} sees player 1 as not caught", 453 478 ); 454 479 }) 455 480 .await; 456 481 457 - // Extra tick for post-game syncing 482 + // Tick to process game end 483 + mat.tick().await; 484 + 485 + mat.assert_all_states(|i, s| { 486 + assert!(s.game_ended(), "Game {i} has not ended"); 487 + }) 488 + .await; 489 + 490 + // Tick for post-game sync 458 491 mat.tick().await; 459 492 460 - mat.assert_all_states(|s| assert!(s.game_ended(), "Game {} has not ended", s.id)) 461 - .await; 493 + mat.assert_all_transports_disconnected(); 494 + 495 + for (i, recv) in recvs.into_iter().enumerate() { 496 + let res = recv.await.expect("Failed to recv"); 497 + match res { 498 + Ok(Some(hist)) => { 499 + assert!(!hist.locations.is_empty(), "Game {i} has no locations"); 500 + assert!(!hist.events.is_empty(), "Game {i} has no event"); 501 + } 502 + Ok(None) => { 503 + panic!("Game {i} exited without a history (did not end via post game sync)"); 504 + } 505 + Err(why) => { 506 + panic!("Game {i} encountered error: {why:?}"); 507 + } 508 + } 509 + } 462 510 } 463 511 464 512 #[test] ··· 472 520 473 521 mat.wait_for_seekers().await; 474 522 475 - mat.assert_all_states(|s| { 523 + mat.assert_all_states(|i, s| { 476 524 for id in 0..4 { 477 525 let ping = s.get_ping(mat.uuids[id]); 478 526 if id == 0 { 479 527 assert!( 480 528 ping.is_none(), 481 - "Game 0 is a seeker and shouldn't be pinged (in {})", 482 - s.id 529 + "Game {i} has a ping for 0, despite them being a seeker", 483 530 ); 484 531 } else { 485 532 assert!( 486 533 ping.is_some(), 487 - "Game {} is a hider and should be pinged (in {})", 488 - id, 489 - s.id 534 + "Game {i} doesn't have a ping for {id}, despite them being a hider", 490 535 ); 491 536 } 492 537 } 493 538 }) 494 539 .await; 495 540 496 - mat.game(1).mark_caught().await; 541 + mat.games[1].mark_caught().await; 497 542 498 543 mat.tick().await; 499 544 500 - mat.assert_all_states(|s| { 545 + mat.assert_all_states(|i, s| { 501 546 for id in 0..4 { 502 547 let ping = s.get_ping(mat.uuids[id]); 503 548 if id <= 1 { 504 549 assert!( 505 550 ping.is_none(), 506 - "Game {} is a seeker and shouldn't be pinged (in {})", 507 - id, 508 - s.id 551 + "Game {i} has a ping for {id}, despite them being a seeker", 509 552 ); 510 553 } else { 511 554 assert!( 512 555 ping.is_some(), 513 - "Game {} is a hider and should be pinged (in {})", 514 - id, 515 - s.id 556 + "Game {i} doesn't have a ping for {id}, despite them being a hider", 516 557 ); 517 558 } 518 559 } ··· 539 580 mat.start().await; 540 581 mat.tick().await; 541 582 mat.wait_for_seekers().await; 542 - mat.pass_time(Duration::from_secs(60)).await; 583 + tokio::time::sleep(Duration::from_secs(60)).await; 543 584 mat.tick().await; 544 585 545 - let game = mat.game(0); 586 + let game = mat.games[0].clone(); 546 587 let state = game.state.read().await; 547 588 let location = state.powerup_location().expect("Powerup didn't spawn"); 548 589 549 590 drop(state); 550 591 551 - mat.assert_all_states(|s| { 592 + mat.assert_all_states(|i, s| { 552 593 assert_eq!( 553 594 s.powerup_location(), 554 595 Some(location), 555 - "Game {} has a different location than 0", 556 - s.id 596 + "Game {i} has a different location than 0", 557 597 ); 558 598 }) 559 599 .await; ··· 562 602 #[test] 563 603 async fn test_powerup_ping_seeker_as_you() { 564 604 let mut settings = mk_settings(); 565 - settings.ping_minutes_interval = 0; 605 + settings.ping_minutes_interval = 1; 566 606 let mut mat = MockMatch::new(settings, 2, 1); 567 607 568 608 mat.start().await; 569 609 mat.wait_for_seekers().await; 570 610 571 - let game = mat.game(1); 611 + mat.tick().await; 612 + 613 + tokio::time::sleep(Duration::from_secs(60)).await; 614 + 615 + let game = mat.games[1].clone(); 572 616 let mut state = game.state.write().await; 573 617 state.force_set_powerup(PowerUpType::PingSeeker); 574 618 drop(state); 575 619 576 620 mat.tick().await; 577 621 578 - mat.assert_all_states(|s| { 622 + mat.assert_all_states(|i, s| { 579 623 if let Some(ping) = s.get_ping(mat.uuids[1]) { 580 624 assert_eq!( 581 625 ping.real_player, mat.uuids[0], 582 - "Ping for 1 is not truly 0 (in {})", 583 - s.id 626 + "Game {i} has a ping for 1, but it wasn't from 0" 584 627 ); 585 628 } else { 586 - panic!("No ping for 1 (in {})", s.id); 629 + panic!("Game {i} has no ping for 1"); 587 630 } 588 631 }) 589 632 .await; ··· 591 634 592 635 #[test] 593 636 async fn test_powerup_ping_random_hider() { 594 - let settings = mk_settings(); 637 + let mut settings = mk_settings(); 638 + settings.ping_minutes_interval = u32::MAX; 595 639 596 640 let mut mat = MockMatch::new(settings, 3, 1); 597 641 598 642 mat.start().await; 599 643 mat.wait_for_seekers().await; 600 644 601 - let game = mat.game(1); 645 + let game = mat.games[1].clone(); 602 646 let mut state = game.state.write().await; 603 647 state.force_set_powerup(PowerUpType::ForcePingOther); 604 648 drop(state); ··· 606 650 game.use_powerup().await; 607 651 mat.tick().await; 608 652 609 - mat.assert_all_states(|s| { 610 - // Player 0 is a seeker, player 1 user the powerup, so 2 is the only one that should 611 - // could have pinged 612 - assert!(s.get_ping(mat.uuids[2]).is_some()); 613 - assert!(s.get_ping(mat.uuids[0]).is_none()); 614 - assert!(s.get_ping(mat.uuids[1]).is_none()); 653 + mat.assert_all_states(|i, s| { 654 + // Player 0 is a seeker, player 1 used the powerup, so 2 is the only one that should 655 + // have pinged 656 + assert!( 657 + s.get_ping(mat.uuids[2]).is_some(), 658 + "Ping 2 is not present in game {i}" 659 + ); 660 + assert!( 661 + s.get_ping(mat.uuids[0]).is_none(), 662 + "Ping 0 is present in game {i}" 663 + ); 664 + assert!( 665 + s.get_ping(mat.uuids[1]).is_none(), 666 + "Ping 1 is present in game {i}" 667 + ); 615 668 }) 616 669 .await; 617 670 } ··· 624 677 625 678 mat.start().await; 626 679 627 - let game = mat.game(3); 680 + mat.tick().await; 681 + 682 + let game = mat.games[3].clone(); 628 683 let mut state = game.state.write().await; 629 684 state.force_set_powerup(PowerUpType::PingAllSeekers); 630 685 drop(state); 631 686 632 687 game.use_powerup().await; 688 + // One tick to send out the ForcePing 689 + mat.tick().await; 690 + // One tick to for the seekers to reply 633 691 mat.tick().await; 634 692 635 - mat.assert_all_states(|s| { 693 + mat.assert_all_states(|i, s| { 636 694 for id in 0..3 { 637 695 assert!( 638 - s.get_caught(mat.uuids[id]).is_some(), 639 - "Player {} should be pinged due to the powerup (in {})", 640 - id, 641 - s.id 696 + &s.get_ping(mat.uuids[id]).is_some(), 697 + "Game {i} does not have a ping for {id}, despite the powerup being active", 642 698 ); 643 699 } 644 700 }) ··· 650 706 let settings = mk_settings(); 651 707 let mat = MockMatch::new(settings, 4, 1); 652 708 653 - mat.start().await; 709 + let mut recvs = mat.start().await; 654 710 655 - let game = mat.game(2); 711 + let game = mat.games[2].clone(); 712 + let id = game.state.read().await.id; 713 + 656 714 game.quit_game().await; 657 - let id = game.state.read().await.id; 715 + let res = recvs.swap_remove(2).await.expect("Failed to recv"); 716 + assert!(res.is_ok_and(|o| o.is_none()), "2 did not exit cleanly"); 717 + assert!( 718 + game.transport.is_disconnected(), 719 + "2's transport is not disconnected" 720 + ); 658 721 659 722 mat.tick().await; 660 723 661 - mat.assert_all_states(|s| { 724 + mat.assert_all_states(|i, s| { 662 725 if s.id != id { 663 726 assert!( 664 727 s.get_ping(id).is_none(), 665 - "Game {} has not removed 2 from pings", 666 - s.id 728 + "Game {i} has not removed 2 from pings", 667 729 ); 668 730 assert!( 669 731 s.get_caught(id).is_none(), 670 - "Game {} has not removed 2 from caught state", 671 - s.id 732 + "Game {i} has not removed 2 from caught state", 672 733 ); 673 734 } 674 735 })
+5 -8
manhunt-logic/src/game_state.rs
··· 2 2 3 3 use chrono::Utc; 4 4 use rand::{ 5 - distr::{Bernoulli, Distribution}, 6 - seq::{IndexedRandom, IteratorRandom}, 7 - Rng, SeedableRng, 5 + RngExt, SeedableRng, distr::{Bernoulli, Distribution}, seq::{IndexedRandom, IteratorRandom} 8 6 }; 9 7 use rand_chacha::ChaCha20Rng; 10 8 use serde::{Deserialize, Serialize}; ··· 336 334 self.held_powerup = choice; 337 335 } 338 336 339 - #[cfg(test)] 340 - pub fn force_set_powerup(&mut self, typ: PowerUpType) { 341 - self.held_powerup = Some(typ); 337 + pub fn force_set_powerup(&mut self, powerup_type: PowerUpType) { 338 + self.held_powerup = Some(powerup_type); 342 339 } 343 340 344 341 pub fn peek_powerup(&self) -> Option<&PowerUpType> { ··· 416 413 my_id: Uuid, 417 414 pub game_started: UtcDT, 418 415 game_ended: UtcDT, 419 - events: Vec<(UtcDT, GameEvent)>, 420 - locations: Vec<(Uuid, Vec<(UtcDT, Location)>)>, 416 + pub events: Vec<(UtcDT, GameEvent)>, 417 + pub locations: Vec<(Uuid, Vec<(UtcDT, Location)>)>, 421 418 } 422 419 423 420 /// Subset of [GameState] that is meant to be sent to a UI frontend
+2 -1
manhunt-logic/src/lib.rs
··· 10 10 mod tests; 11 11 mod transport; 12 12 13 - pub use game::{Game, StateUpdateSender}; 13 + pub use game::{Game, StateUpdateSender, UtcDT}; 14 14 pub use game_events::GameEvent; 15 15 pub use game_state::{GameHistory, GameUiState}; 16 16 pub use lobby::{Lobby, LobbyMessage, LobbyState, StartGameInfo}; 17 17 pub use location::{Location, LocationService}; 18 + pub use powerups::PowerUpType; 18 19 pub use profile::PlayerProfile; 19 20 pub use settings::GameSettings; 20 21 pub use transport::{MsgPair, Transport, TransportMessage};
+366 -18
manhunt-logic/src/lobby.rs
··· 3 3 use anyhow::anyhow; 4 4 use serde::{Deserialize, Serialize}; 5 5 use tokio::sync::Mutex; 6 + use tokio_util::sync::CancellationToken; 6 7 use uuid::Uuid; 7 8 8 9 use crate::{ ··· 31 32 PlayerSwitch(Uuid, bool), 32 33 } 33 34 34 - #[derive(Clone, Serialize, Deserialize, specta::Type)] 35 + #[derive(Debug, Clone, Serialize, Deserialize, specta::Type)] 35 36 pub struct LobbyState { 36 37 profiles: HashMap<Uuid, PlayerProfile>, 37 38 join_code: String, ··· 48 49 state: Mutex<LobbyState>, 49 50 transport: Arc<T>, 50 51 state_updates: U, 52 + cancel: CancellationToken, 51 53 } 52 54 53 55 impl<T: Transport, U: StateUpdateSender> Lobby<T, U> { 54 56 pub async fn new( 55 57 join_code: &str, 56 - host: bool, 58 + is_host: bool, 57 59 profile: PlayerProfile, 58 60 settings: GameSettings, 59 61 state_updates: U, 60 62 ) -> Result<Arc<Self>> { 61 - let transport = T::initialize(join_code, host) 63 + let transport = T::initialize(join_code, is_host) 62 64 .await 63 65 .context("Failed to connect to lobby")?; 64 66 65 - let self_id = transport.self_id(); 67 + let lobby = Arc::new(Self::new_with_transport( 68 + join_code, 69 + is_host, 70 + profile, 71 + settings, 72 + state_updates, 73 + transport, 74 + )); 66 75 67 - let lobby = Arc::new(Self { 76 + Ok(lobby) 77 + } 78 + 79 + pub fn new_with_transport( 80 + join_code: &str, 81 + is_host: bool, 82 + profile: PlayerProfile, 83 + settings: GameSettings, 84 + state_updates: U, 85 + transport: Arc<T>, 86 + ) -> Self { 87 + let self_id = transport.self_id(); 88 + Self { 68 89 transport, 69 90 state_updates, 70 - is_host: host, 91 + is_host, 92 + cancel: CancellationToken::new(), 71 93 join_code: join_code.to_string(), 72 94 state: Mutex::new(LobbyState { 73 95 teams: HashMap::from_iter([(self_id, false)]), 74 96 join_code: join_code.to_string(), 75 97 profiles: HashMap::from_iter([(self_id, profile)]), 76 98 self_id, 77 - is_host: host, 99 + is_host, 78 100 settings, 79 101 }), 80 - }); 81 - 82 - Ok(lobby) 102 + } 83 103 } 84 104 85 105 fn emit_state_update(&self) { ··· 134 154 .await 135 155 .map(|start_game| Ok(Some(start_game))), 136 156 TransportMessage::PeerConnect(peer) => { 137 - let mut state = self.state.lock().await; 138 - state.teams.insert(peer, false); 157 + let state = self.state.lock().await; 139 158 let id = state.self_id; 140 159 let msg = LobbyMessage::PlayerSync(id, state.profiles[&id].clone()); 160 + let msg2 = LobbyMessage::PlayerSwitch(id, state.teams[&id]); 141 161 drop(state); 142 162 self.send_transport_message(Some(peer), msg).await; 163 + self.send_transport_message(Some(peer), msg2).await; 143 164 if self.is_host { 144 165 let state = self.state.lock().await; 145 166 let msg = LobbyMessage::HostPush(state.settings.clone()); ··· 163 184 let res = 'lobby: loop { 164 185 self.emit_state_update(); 165 186 166 - let msgs = self.transport.receive_messages().await; 187 + tokio::select! { 188 + biased; 167 189 168 - for (peer, msg) in msgs { 169 - if let Some(res) = self.handle_message(peer, msg).await { 170 - break 'lobby res; 190 + msgs = self.transport.receive_messages() => { 191 + for (peer, msg) in msgs { 192 + if let Some(res) = self.handle_message(peer, msg).await { 193 + break 'lobby res; 194 + } 195 + } 196 + } 197 + 198 + _ = self.cancel.cancelled() => { 199 + break Ok(None); 171 200 } 172 201 } 173 202 }; 174 203 175 - if res.is_err() { 204 + if let Ok(None) | Err(_) = res { 176 205 self.transport.disconnect().await; 177 206 } 178 207 ··· 234 263 } 235 264 236 265 pub async fn quit_lobby(&self) { 237 - self.transport.disconnect().await; 266 + self.cancel.cancel(); 267 + } 268 + } 269 + 270 + #[cfg(test)] 271 + mod tests { 272 + use super::*; 273 + use std::sync::Arc; 274 + use tokio::{sync::oneshot, task::yield_now, test}; 275 + 276 + use crate::tests::{DummySender, MockTransport}; 277 + 278 + type MockLobby = Lobby<MockTransport, DummySender>; 279 + 280 + type CompleteRecv = oneshot::Receiver<Result<Option<StartGameInfo>>>; 281 + 282 + struct MockLobbyPool { 283 + uuids: Vec<Uuid>, 284 + lobbies: Vec<Arc<MockLobby>>, 285 + } 286 + 287 + impl MockLobbyPool { 288 + pub fn new(num_players: u32) -> Self { 289 + let settings = GameSettings::default(); 290 + let (uuids, transports) = MockTransport::create_mesh(num_players); 291 + 292 + let lobbies = transports 293 + .into_iter() 294 + .enumerate() 295 + .map(|(i, transport)| { 296 + let profile = PlayerProfile { 297 + display_name: format!("Lobby {i} ({})", uuids[i]), 298 + pfp_base64: None, 299 + }; 300 + 301 + Arc::new(MockLobby::new_with_transport( 302 + "aaa", 303 + i == 0, 304 + profile, 305 + settings.clone(), 306 + DummySender, 307 + Arc::new(transport), 308 + )) 309 + }) 310 + .collect(); 311 + 312 + Self { uuids, lobbies } 313 + } 314 + 315 + pub async fn wait(&self) { 316 + for lobby in self.lobbies.iter() { 317 + lobby.transport.wait_for_queue_empty().await; 318 + } 319 + yield_now().await; 320 + } 321 + 322 + pub async fn start_all_loops(&self) -> Vec<CompleteRecv> { 323 + let mut recv_set = Vec::with_capacity(self.lobbies.len()); 324 + for lobby in self.lobbies.iter() { 325 + let lobby = lobby.clone(); 326 + let (send, recv) = oneshot::channel(); 327 + recv_set.push(recv); 328 + tokio::spawn(async move { 329 + let res = lobby.main_loop().await; 330 + send.send(res).ok(); 331 + }); 332 + } 333 + recv_set 334 + } 335 + 336 + pub async fn player_join(&self, i: usize) { 337 + self.lobbies[i].transport.fake_join().await; 338 + } 339 + 340 + pub async fn assert_state(&self, i: usize, f: impl Fn(&LobbyState)) { 341 + let state = self.lobbies[i].state.lock().await; 342 + f(&state); 343 + } 344 + 345 + pub async fn assert_all_states(&self, f: impl Fn(usize, &LobbyState)) { 346 + for (i, lobby) in self.lobbies.iter().enumerate() { 347 + let state = lobby.state.lock().await; 348 + f(i, &state); 349 + } 350 + } 351 + } 352 + 353 + #[test] 354 + async fn test_joins() { 355 + let mat = MockLobbyPool::new(3); 356 + 357 + mat.start_all_loops().await; 358 + 359 + mat.player_join(0).await; 360 + mat.player_join(1).await; 361 + 362 + mat.wait().await; 363 + 364 + for i in 0..=1 { 365 + for j in 0..=1 { 366 + mat.assert_state(i, |s| { 367 + assert!( 368 + s.teams.contains_key(&mat.uuids[j]), 369 + "{i} doesn't have {j}'s uuid in teams" 370 + ); 371 + assert!( 372 + s.profiles.contains_key(&mat.uuids[j]), 373 + "{i} doesn't have {j}'s uuid in profiles" 374 + ); 375 + }) 376 + .await; 377 + } 378 + } 379 + 380 + mat.lobbies[0].switch_teams(true).await; 381 + 382 + mat.wait().await; 383 + 384 + mat.player_join(2).await; 385 + 386 + mat.wait().await; 387 + 388 + mat.assert_all_states(|i, s| { 389 + for j in 0..=2 { 390 + assert!( 391 + s.teams.contains_key(&mat.uuids[j]), 392 + "{i} doesn't have {j}'s uuid in teams" 393 + ); 394 + assert!( 395 + s.profiles.contains_key(&mat.uuids[j]), 396 + "{i} doesn't have {j}'s uuid in profiles" 397 + ); 398 + assert_eq!( 399 + s.teams.get(&mat.uuids[0]).copied(), 400 + Some(true), 401 + "{i} doesn't see 0 as a seeker" 402 + ) 403 + } 404 + }) 405 + .await; 406 + } 407 + 408 + #[test] 409 + async fn test_team_switch() { 410 + let mat = MockLobbyPool::new(3); 411 + 412 + mat.start_all_loops().await; 413 + 414 + mat.lobbies[2].switch_teams(true).await; 415 + 416 + mat.wait().await; 417 + 418 + mat.assert_all_states(|i, s| { 419 + assert_eq!( 420 + s.teams.get(&mat.uuids[2]).copied(), 421 + Some(true), 422 + "{i} ({}) does not see 2 as a seeker", 423 + mat.uuids[i] 424 + ); 425 + }) 426 + .await; 427 + } 428 + 429 + #[test] 430 + async fn test_update_settings() { 431 + let mat = MockLobbyPool::new(2); 432 + 433 + mat.start_all_loops().await; 434 + 435 + let mut settings = GameSettings::default(); 436 + const UPDATED_ID: u32 = 284829; 437 + settings.hiding_time_seconds = UPDATED_ID; 438 + 439 + mat.lobbies[0].update_settings(settings).await; 440 + 441 + mat.wait().await; 442 + 443 + mat.assert_all_states(|i, s| { 444 + assert_eq!( 445 + s.settings.hiding_time_seconds, UPDATED_ID, 446 + "{i} ({}) did not get updated settings", 447 + mat.uuids[i] 448 + ) 449 + }) 450 + .await; 451 + } 452 + 453 + #[test] 454 + async fn test_update_settings_not_host() { 455 + let mat = MockLobbyPool::new(2); 456 + 457 + mat.start_all_loops().await; 458 + 459 + let mut settings = GameSettings::default(); 460 + let target = settings.hiding_time_seconds; 461 + const UPDATED_ID: u32 = 284829; 462 + settings.hiding_time_seconds = UPDATED_ID; 463 + 464 + mat.lobbies[1].update_settings(settings).await; 465 + 466 + mat.wait().await; 467 + 468 + mat.assert_all_states(|i, s| { 469 + assert_eq!( 470 + s.settings.hiding_time_seconds, target, 471 + "{i} ({}) updated settings despite 1 not being host", 472 + mat.uuids[i] 473 + ) 474 + }) 475 + .await; 476 + } 477 + 478 + #[test] 479 + async fn test_game_start() { 480 + let mat = MockLobbyPool::new(4); 481 + 482 + let recvs = mat.start_all_loops().await; 483 + 484 + for i in 0..3 { 485 + mat.player_join(i).await; 486 + } 487 + 488 + mat.lobbies[2].switch_teams(true).await; 489 + 490 + let settings = GameSettings { 491 + hiding_time_seconds: 45, 492 + ..Default::default() 493 + }; 494 + 495 + mat.lobbies[0].update_settings(settings).await; 496 + 497 + mat.lobbies[3].quit_lobby().await; 498 + 499 + mat.wait().await; 500 + 501 + mat.lobbies[0].start_game().await; 502 + 503 + mat.wait().await; 504 + 505 + for (i, recv) in recvs.into_iter().enumerate() { 506 + let res = recv.await.expect("Failed to recv"); 507 + match res { 508 + Ok(Some(StartGameInfo { 509 + settings, 510 + initial_caught_state, 511 + })) => { 512 + assert_eq!( 513 + settings.hiding_time_seconds, 45, 514 + "Lobby {i} does not match pushed settings" 515 + ); 516 + assert_eq!( 517 + initial_caught_state.len(), 518 + 3, 519 + "Lobby {i} does not have 3 entries in caught state" 520 + ); 521 + assert_eq!( 522 + initial_caught_state.get(&mat.uuids[2]).copied(), 523 + Some(true), 524 + "Lobby {i} does not see 2 as a seeker" 525 + ); 526 + assert!( 527 + initial_caught_state.keys().all(|id| *id != mat.uuids[3]), 528 + "Lobby {i} still has a disconnected player saved in caught state" 529 + ); 530 + let profiles = mat.lobbies[i].clone_profiles().await; 531 + assert_eq!( 532 + profiles.len(), 533 + 3, 534 + "Lobby {i} does not have 3 entries in profiles" 535 + ); 536 + assert!( 537 + profiles.keys().all(|id| *id != mat.uuids[3]), 538 + "Lobby {i} still has a disconnected player saved in profiles" 539 + ); 540 + } 541 + Ok(None) => { 542 + if i != 3 { 543 + panic!("Lobby {i} did not exit with start info"); 544 + } 545 + } 546 + Err(why) => { 547 + panic!("Lobby {i} had an error: {why:?}"); 548 + } 549 + } 550 + } 551 + } 552 + 553 + #[test] 554 + async fn test_drop_player() { 555 + let mat = MockLobbyPool::new(3); 556 + 557 + let mut recvs = mat.start_all_loops().await; 558 + 559 + mat.lobbies[1].quit_lobby().await; 560 + 561 + let res = recvs.swap_remove(1).await.expect("Failed to recv"); 562 + assert!(res.is_ok_and(|o| o.is_none()), "1 did not quit gracefully"); 563 + 564 + mat.wait().await; 565 + 566 + assert!( 567 + mat.lobbies[1].transport.is_disconnected(), 568 + "1 is not disconnected" 569 + ); 570 + 571 + let id = mat.uuids[1]; 572 + 573 + mat.assert_all_states(|i, s| { 574 + if mat.uuids[i] != id { 575 + assert!( 576 + !s.teams.contains_key(&id), 577 + "{i} has not been removed 1 from teams" 578 + ); 579 + assert!( 580 + !s.profiles.contains_key(&id), 581 + "{i} has not been removed 1 from profiles" 582 + ); 583 + } 584 + }) 585 + .await; 238 586 } 239 587 }
+2 -2
manhunt-logic/src/profile.rs
··· 2 2 3 3 #[derive(Clone, Default, Debug, Serialize, Deserialize, specta::Type)] 4 4 pub struct PlayerProfile { 5 - display_name: String, 6 - pfp_base64: Option<String>, 5 + pub display_name: String, 6 + pub pfp_base64: Option<String>, 7 7 }
+35 -12
manhunt-logic/src/tests.rs
··· 1 1 use std::{collections::HashMap, sync::Arc}; 2 2 3 - use tokio::sync::{Mutex, mpsc}; 3 + use tokio::{ 4 + sync::{Mutex, mpsc}, 5 + task::yield_now, 6 + }; 4 7 use uuid::Uuid; 5 8 6 9 use crate::{ ··· 24 27 .map(|_| uuid::Uuid::new_v4()) 25 28 .collect::<Vec<_>>(); 26 29 let channels = (0..players) 27 - .map(|_| tokio::sync::mpsc::channel(10)) 30 + .map(|_| tokio::sync::mpsc::channel(20)) 28 31 .collect::<Vec<_>>(); 29 32 let txs = channels 30 33 .iter() ··· 41 44 (uuids, transports) 42 45 } 43 46 47 + pub async fn wait_for_queue_empty(&self) { 48 + // println!("Waiting for {} queue to empty", self.id); 49 + loop { 50 + let all_empty = self 51 + .txs 52 + .values() 53 + .all(|tx| tx.is_closed() || tx.capacity() == tx.max_capacity()); 54 + 55 + if all_empty { 56 + break; 57 + } else { 58 + yield_now().await; 59 + } 60 + } 61 + } 62 + 63 + pub async fn fake_join(&self) { 64 + self.send_message(TransportMessage::PeerConnect(self.id)) 65 + .await; 66 + } 67 + 68 + pub fn is_disconnected(&self) -> bool { 69 + self.txs[&self.id].is_closed() 70 + } 71 + 44 72 fn new(id: Uuid, rx: GameEventRx, txs: HashMap<Uuid, GameEventTx>) -> Self { 45 73 Self { 46 74 id, ··· 63 91 async fn disconnect(&self) { 64 92 self.send_message(TransportMessage::PeerDisconnect(self.id)) 65 93 .await; 94 + let mut rx = self.rx.lock().await; 95 + rx.close(); 66 96 } 67 97 68 98 async fn receive_messages(&self) -> impl Iterator<Item = MsgPair> { ··· 74 104 75 105 async fn send_message(&self, msg: TransportMessage) { 76 106 for (_id, tx) in self.txs.iter().filter(|(id, _)| **id != self.id) { 77 - tx.send((Some(self.id), msg.clone())) 78 - .await 79 - .expect("Failed to send msg"); 107 + tx.send((Some(self.id), msg.clone())).await.ok(); 80 108 } 81 109 } 82 110 83 111 async fn send_message_single(&self, peer: Uuid, msg: TransportMessage) { 84 112 if let Some(tx) = self.txs.get(&peer) { 85 - tx.send((Some(self.id), msg)) 86 - .await 87 - .expect("Failed to send msg"); 113 + tx.send((Some(self.id), msg)).await.ok(); 88 114 } 89 115 } 90 116 91 117 async fn send_self(&self, msg: TransportMessage) { 92 - self.txs[&self.id] 93 - .send((Some(self.id), msg)) 94 - .await 95 - .expect("Failed to send msg"); 118 + self.txs[&self.id].send((Some(self.id), msg)).await.ok(); 96 119 } 97 120 98 121 fn self_id(&self) -> Uuid {
+12 -14
manhunt-signaling/Cargo.toml
··· 2 2 name = "manhunt-signaling" 3 3 version = "0.1.0" 4 4 edition = "2024" 5 - default-run = "manhunt-signaling" 6 - 7 - [[bin]] 8 - name = "manhunt-signaling" 9 - path = "main.rs" 10 5 11 6 [dependencies] 12 - anyhow = "1.0.98" 13 - async-trait = "0.1.88" 14 - axum = { version = "0.8.4", features = ["ws"] } 15 - colog = "1.3.0" 16 - futures = "0.3.31" 17 - log = "0.4.27" 18 - matchbox_protocol = "0.12.0" 19 - matchbox_signaling = "0.12.0" 20 - tokio = { version = "1.45.1", features = ["macros"] } 7 + anyhow = "1.0.101" 8 + async-trait = "0.1.89" 9 + axum = { version = "0.8.8", features = ["ws"] } 10 + colog = "1.4.0" 11 + futures = "0.3.32" 12 + log = "0.4.29" 13 + matchbox_protocol = "0.14.0" 14 + matchbox_signaling = "0.14.0" 15 + rand = { version = "0.10.0", features = ["thread_rng"] } 16 + tokio = { version = "1.49.0", features = ["macros"] } 17 + tokio-util = "0.7.18" 18 + uuid = "1.21.0"
-333
manhunt-signaling/main.rs
··· 1 - use async_trait::async_trait; 2 - use axum::{ 3 - Error as AxumError, 4 - extract::{Path, ws::Message}, 5 - http::StatusCode, 6 - response::IntoResponse, 7 - routing::{get, post}, 8 - }; 9 - use futures::StreamExt; 10 - use log::{debug, error, info, warn}; 11 - use matchbox_protocol::{JsonPeerEvent, PeerId, PeerRequest}; 12 - use matchbox_signaling::{ 13 - ClientRequestError, NoCallbacks, SignalingError, SignalingServerBuilder, SignalingState, 14 - SignalingTopology, WsStateMeta, 15 - common_logic::{self, StateObj, parse_request}, 16 - }; 17 - 18 - use anyhow::Context; 19 - use std::{ 20 - collections::{HashMap, HashSet}, 21 - net::{IpAddr, Ipv4Addr, SocketAddr}, 22 - result::Result as StdResult, 23 - }; 24 - use tokio::sync::mpsc::UnboundedSender; 25 - 26 - type Result<T = (), E = anyhow::Error> = StdResult<T, E>; 27 - 28 - type RoomId = String; 29 - type Sender = UnboundedSender<Result<Message, AxumError>>; 30 - 31 - #[derive(Debug, Clone)] 32 - struct Match { 33 - pub open_lobby: bool, 34 - pub players: HashSet<PeerId>, 35 - } 36 - 37 - #[derive(Debug, Clone)] 38 - struct Peer { 39 - pub room: RoomId, 40 - sender: Sender, 41 - } 42 - 43 - impl Match { 44 - pub fn new() -> Self { 45 - Self { 46 - open_lobby: true, 47 - players: HashSet::with_capacity(10), 48 - } 49 - } 50 - } 51 - 52 - #[derive(Default, Debug, Clone)] 53 - struct ServerState { 54 - waiting_clients: StateObj<HashMap<SocketAddr, RoomId>>, 55 - queued_clients: StateObj<HashMap<PeerId, RoomId>>, 56 - matches: StateObj<HashMap<RoomId, Match>>, 57 - clients: StateObj<HashMap<PeerId, Peer>>, 58 - } 59 - 60 - impl SignalingState for ServerState {} 61 - 62 - impl ServerState { 63 - fn add_client(&mut self, origin: SocketAddr, code: RoomId) { 64 - self.waiting_clients 65 - .lock() 66 - .unwrap() 67 - .insert(origin, code.clone()); 68 - } 69 - 70 - pub fn room_is_open(&self, room_id: &RoomId) -> bool { 71 - self.matches 72 - .lock() 73 - .unwrap() 74 - .get(room_id) 75 - .is_some_and(|m| m.open_lobby) 76 - } 77 - 78 - /// Mark a match as started, disallowing others from joining 79 - pub fn mark_started(&mut self, room: &RoomId) { 80 - if let Some(mat) = self.matches.lock().unwrap().get_mut(room) { 81 - mat.open_lobby = false; 82 - } 83 - } 84 - 85 - /// Create a new room with the given code, should be called when someone wants to host a game. 86 - /// Returns false if a room with that code already exists. 87 - pub fn create_room(&mut self, origin: SocketAddr, code: RoomId) -> bool { 88 - let mut matches = self.matches.lock().unwrap(); 89 - if matches.contains_key(&code) { 90 - false 91 - } else { 92 - matches.insert(code.clone(), Match::new()); 93 - drop(matches); 94 - self.add_client(origin, code); 95 - true 96 - } 97 - } 98 - 99 - /// Try to join a room by a code, returns `true` if successful 100 - pub fn try_join_room(&mut self, origin: SocketAddr, code: RoomId) -> bool { 101 - if self.room_is_open(&code) { 102 - self.waiting_clients.lock().unwrap().insert(origin, code); 103 - true 104 - } else { 105 - false 106 - } 107 - } 108 - 109 - /// Assign a peer an id 110 - pub fn assign_peer_id(&mut self, origin: SocketAddr, peer_id: PeerId) { 111 - let target_room = self 112 - .waiting_clients 113 - .lock() 114 - .unwrap() 115 - .remove(&origin) 116 - .expect("origin not waiting?"); 117 - 118 - self.queued_clients 119 - .lock() 120 - .unwrap() 121 - .insert(peer_id, target_room); 122 - } 123 - 124 - /// Add a peer to a room, returns other peers in the match currently 125 - pub fn add_peer(&mut self, peer_id: PeerId, sender: Sender) -> Vec<PeerId> { 126 - let target_room = self 127 - .queued_clients 128 - .lock() 129 - .unwrap() 130 - .remove(&peer_id) 131 - .expect("peer not waiting?"); 132 - let mut matches = self.matches.lock().unwrap(); 133 - let mat = matches.get_mut(&target_room).expect("Room not found?"); 134 - let peers = mat.players.iter().copied().collect::<Vec<_>>(); 135 - mat.players.insert(peer_id); 136 - drop(matches); 137 - let peer = Peer { 138 - room: target_room, 139 - sender, 140 - }; 141 - self.clients.lock().unwrap().insert(peer_id, peer); 142 - peers 143 - } 144 - 145 - /// Disconnect a peer from a room. Automatically deletes the room if no peers remain. Returns 146 - /// the removed peer and the set of other peers in the room that need to be notified 147 - pub fn remove_peer(&mut self, peer_id: PeerId) -> Option<Vec<PeerId>> { 148 - let removed_peer = self.clients.lock().unwrap().remove(&peer_id)?; 149 - let other_peers = self 150 - .matches 151 - .lock() 152 - .unwrap() 153 - .get_mut(&removed_peer.room) 154 - .map(|m| { 155 - m.players.remove(&peer_id); 156 - m.players.iter().copied().collect::<Vec<_>>() 157 - }) 158 - .unwrap_or_default(); 159 - 160 - if other_peers.is_empty() { 161 - self.matches.lock().unwrap().remove(&removed_peer.room); 162 - } 163 - 164 - Some(other_peers) 165 - } 166 - 167 - pub fn try_send(&self, peer: PeerId, msg: Message) -> Result<(), SignalingError> { 168 - self.clients 169 - .lock() 170 - .unwrap() 171 - .get(&peer) 172 - .ok_or(SignalingError::UnknownPeer) 173 - .and_then(|peer| common_logic::try_send(&peer.sender, msg)) 174 - } 175 - } 176 - 177 - #[derive(Default, Debug)] 178 - struct ServerTopology; 179 - 180 - #[async_trait] 181 - impl SignalingTopology<NoCallbacks, ServerState> for ServerTopology { 182 - async fn state_machine(upgrade: WsStateMeta<NoCallbacks, ServerState>) { 183 - let WsStateMeta { 184 - peer_id, 185 - sender, 186 - mut receiver, 187 - mut state, 188 - .. 189 - } = upgrade; 190 - 191 - let other_peers = state.add_peer(peer_id, sender.clone()); 192 - 193 - let msg = Message::Text(JsonPeerEvent::NewPeer(peer_id).to_string().into()); 194 - 195 - for other_id in other_peers { 196 - if let Err(why) = state.try_send(other_id, msg.clone()) { 197 - error!("Failed to publish new peer event to {other_id}: {why:?}"); 198 - } 199 - } 200 - 201 - while let Some(req) = receiver.next().await { 202 - let req = match parse_request(req) { 203 - Ok(req) => req, 204 - Err(e) => match e { 205 - ClientRequestError::Axum(e) => { 206 - warn!("Peer {peer_id} encountered Axum error: {e:?}. Disconnecting..."); 207 - break; 208 - } 209 - ClientRequestError::Close => { 210 - info!("Peer {peer_id} closed connection"); 211 - break; 212 - } 213 - ClientRequestError::Json(_) | ClientRequestError::UnsupportedType(_) => { 214 - error!("Error parsing request from {peer_id}: {e:?}"); 215 - continue; // Recoverable, although may mean bad state? 216 - } 217 - }, 218 - }; 219 - 220 - if let PeerRequest::Signal { receiver, data } = req { 221 - let msg = Message::Text( 222 - JsonPeerEvent::Signal { 223 - sender: peer_id, 224 - data, 225 - } 226 - .to_string() 227 - .into(), 228 - ); 229 - if let Err(why) = state.try_send(receiver, msg) { 230 - error!("Error sending signaling message from {peer_id} to {receiver}: {why:?}"); 231 - } 232 - } // Other variant, PeerRequest::KeepAlive is just for a heartbeat, do nothing 233 - } 234 - 235 - info!("Peer {peer_id} disconnected"); 236 - 237 - let msg = Message::Text(JsonPeerEvent::PeerLeft(peer_id).to_string().into()); 238 - if let Some(other_peers) = state.remove_peer(peer_id) { 239 - for other_id in other_peers { 240 - if let Err(why) = state.try_send(other_id, msg.clone()) { 241 - warn!("Failed to alert {other_id} that {peer_id} has disconnected: {why:?}"); 242 - } 243 - } 244 - } else { 245 - warn!("Trying to remove peer {peer_id}, which doesn't exist?"); 246 - } 247 - } 248 - } 249 - 250 - #[tokio::main] 251 - async fn main() -> Result { 252 - colog::init(); 253 - 254 - let args = std::env::args().collect::<Vec<_>>(); 255 - let socket_addr = args 256 - .get(1) 257 - .map(|raw_binding| raw_binding.parse::<SocketAddr>()) 258 - .transpose() 259 - .context("Invalid socket addr passed")? 260 - .unwrap_or(SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), 3536)); 261 - 262 - let mut state = ServerState::default(); 263 - 264 - let server = SignalingServerBuilder::new(socket_addr, ServerTopology, state.clone()) 265 - .on_connection_request({ 266 - let mut state = state.clone(); 267 - move |connection| { 268 - info!("{} is requesting to connect", connection.origin); 269 - debug!("Connection meta: {connection:?}"); 270 - 271 - let err = if let Some(room_code) = connection.path.clone() { 272 - let is_host = connection.query_params.contains_key("create"); 273 - if is_host { 274 - if state.create_room(connection.origin, room_code) { 275 - None 276 - } else { 277 - Some(StatusCode::CONFLICT) 278 - } 279 - } else if state.try_join_room(connection.origin, room_code) { 280 - None 281 - } else { 282 - Some(StatusCode::NOT_FOUND) 283 - } 284 - } else { 285 - Some(StatusCode::BAD_REQUEST) 286 - }; 287 - 288 - if let Some(status) = err { 289 - Err(status.into_response()) 290 - } else { 291 - Ok(true) 292 - } 293 - } 294 - }) 295 - .mutate_router({ 296 - let state = state.clone(); 297 - move |router| { 298 - let mut state2 = state.clone(); 299 - router 300 - .route( 301 - "/room_exists/{id}", 302 - get(move |Path(room_id): Path<String>| async move { 303 - if state.room_is_open(&room_id) { 304 - StatusCode::OK 305 - } else { 306 - StatusCode::NOT_FOUND 307 - } 308 - }), 309 - ) 310 - .route( 311 - "/mark_started/{id}", 312 - post(move |Path(room_id): Path<String>| async move { 313 - state2.mark_started(&room_id); 314 - StatusCode::OK 315 - }), 316 - ) 317 - } 318 - }) 319 - .on_id_assignment({ 320 - move |(socket, id)| { 321 - info!("Assigning id {id} to {socket}"); 322 - state.assign_peer_id(socket, id); 323 - } 324 - }) 325 - .build(); 326 - 327 - info!( 328 - "Starting manhunt signaling server {}", 329 - env!("CARGO_PKG_VERSION") 330 - ); 331 - 332 - server.serve().await.context("Error while running server") 333 - }
+109
manhunt-signaling/src/main.rs
··· 1 + mod state; 2 + mod topology; 3 + 4 + use axum::{ 5 + extract::Path, 6 + http::StatusCode, 7 + response::IntoResponse, 8 + routing::{get, post}, 9 + }; 10 + use log::{debug, info}; 11 + use matchbox_signaling::SignalingServerBuilder; 12 + 13 + use anyhow::Context; 14 + use std::{ 15 + net::{IpAddr, Ipv4Addr, SocketAddr}, 16 + result::Result as StdResult, 17 + }; 18 + 19 + use state::ServerState; 20 + use topology::ServerTopology; 21 + 22 + type Result<T = (), E = anyhow::Error> = StdResult<T, E>; 23 + 24 + #[tokio::main] 25 + async fn main() -> Result { 26 + colog::init(); 27 + 28 + let args = std::env::args().collect::<Vec<_>>(); 29 + let socket_addr = args 30 + .get(1) 31 + .map(|raw_binding| raw_binding.parse::<SocketAddr>()) 32 + .transpose() 33 + .context("Invalid socket addr passed")? 34 + .unwrap_or(SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), 3536)); 35 + 36 + let mut state = ServerState::default(); 37 + 38 + let server = SignalingServerBuilder::new(socket_addr, ServerTopology, state.clone()) 39 + .on_connection_request({ 40 + let mut state = state.clone(); 41 + move |connection| { 42 + info!("{} is requesting to connect", connection.origin); 43 + debug!("Connection meta: {connection:?}"); 44 + 45 + let err = if let Some(room_code) = connection.path.clone() { 46 + let create = connection.query_params.contains_key("create"); 47 + match state.handle_room(create, connection.origin, room_code) { 48 + Ok(_) => None, 49 + Err(err) => Some(err.into()), 50 + } 51 + } else { 52 + Some(StatusCode::BAD_REQUEST) 53 + }; 54 + 55 + if let Some(status) = err { 56 + Err(status.into_response()) 57 + } else { 58 + Ok(true) 59 + } 60 + } 61 + }) 62 + .mutate_router({ 63 + let state = state.clone(); 64 + move |router| { 65 + let mut state2 = state.clone(); 66 + let state3 = state.clone(); 67 + router 68 + .route( 69 + "/room_exists/{id}", 70 + get(move |Path(room_id): Path<String>| async move { 71 + if state.room_is_open(&room_id) { 72 + StatusCode::OK 73 + } else { 74 + StatusCode::NOT_FOUND 75 + } 76 + }), 77 + ) 78 + .route( 79 + "/mark_started/{id}", 80 + post(move |Path(room_id): Path<String>| async move { 81 + state2.mark_started(&room_id); 82 + StatusCode::OK 83 + }), 84 + ) 85 + .route( 86 + "/gen_code", 87 + get(move || async move { 88 + state3 89 + .generate_room_code() 90 + .map_err(|_| StatusCode::CONFLICT) 91 + }), 92 + ) 93 + } 94 + }) 95 + .on_id_assignment({ 96 + move |(socket, id)| { 97 + info!("Assigning id {id} to {socket}"); 98 + state.assign_peer_id(socket, id); 99 + } 100 + }) 101 + .build(); 102 + 103 + info!( 104 + "Starting manhunt signaling server {}", 105 + env!("CARGO_PKG_VERSION") 106 + ); 107 + 108 + server.serve().await.context("Error while running server") 109 + }
+529
manhunt-signaling/src/state.rs
··· 1 + use std::{ 2 + collections::{HashMap, HashSet}, 3 + net::SocketAddr, 4 + }; 5 + 6 + use axum::{Error as AxumError, extract::ws::Message, http::StatusCode}; 7 + use matchbox_protocol::PeerId; 8 + use matchbox_signaling::{ 9 + SignalingError, SignalingState, 10 + common_logic::{self, StateObj}, 11 + }; 12 + use rand::{rngs::ThreadRng, seq::IndexedRandom}; 13 + use tokio::sync::mpsc::UnboundedSender; 14 + use tokio_util::sync::CancellationToken; 15 + 16 + pub type RoomId = String; 17 + pub type Sender = UnboundedSender<Result<Message, AxumError>>; 18 + 19 + #[derive(Debug, Clone)] 20 + struct Match { 21 + pub open_lobby: bool, 22 + cancel: CancellationToken, 23 + pub players: HashSet<PeerId>, 24 + } 25 + 26 + #[derive(Debug, Clone)] 27 + struct Peer { 28 + pub room: RoomId, 29 + sender: Sender, 30 + } 31 + 32 + impl Match { 33 + pub fn new() -> Self { 34 + Self { 35 + open_lobby: true, 36 + cancel: CancellationToken::new(), 37 + players: HashSet::with_capacity(10), 38 + } 39 + } 40 + } 41 + 42 + #[derive(Default, Debug, Clone)] 43 + pub struct ServerState { 44 + waiting_clients: StateObj<HashMap<SocketAddr, (RoomId, bool)>>, 45 + queued_clients: StateObj<HashMap<PeerId, (RoomId, bool)>>, 46 + matches: StateObj<HashMap<RoomId, Match>>, 47 + clients: StateObj<HashMap<PeerId, Peer>>, 48 + } 49 + 50 + impl SignalingState for ServerState {} 51 + 52 + #[derive(Debug, Clone, Copy, PartialEq, Eq)] 53 + pub enum RoomError { 54 + /// Room already exists 55 + Exists, 56 + /// Room was not found 57 + NotFound, 58 + } 59 + 60 + impl From<RoomError> for StatusCode { 61 + fn from(val: RoomError) -> Self { 62 + match val { 63 + RoomError::Exists => StatusCode::CONFLICT, 64 + RoomError::NotFound => StatusCode::NOT_FOUND, 65 + } 66 + } 67 + } 68 + 69 + const ROOM_CODE_CHAR_POOL: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 70 + const ROOM_CODE_LEN: usize = 6; 71 + const MAX_ROOM_TRIES: usize = 25; 72 + 73 + #[derive(Debug, Default, Clone, Copy)] 74 + pub struct NoRoomsError; 75 + 76 + impl ServerState { 77 + fn random_room_code(rng: &mut ThreadRng) -> RoomId { 78 + ROOM_CODE_CHAR_POOL 79 + .sample(rng, ROOM_CODE_LEN) 80 + .copied() 81 + .map(char::from) 82 + .collect() 83 + } 84 + 85 + fn check_room_taken(&self, code: &RoomId) -> bool { 86 + self.matches.lock().unwrap().contains_key(code) 87 + } 88 + 89 + pub fn generate_room_code(&self) -> Result<RoomId, NoRoomsError> { 90 + let mut rng = rand::rng(); 91 + for _ in 0..MAX_ROOM_TRIES { 92 + let code = Self::random_room_code(&mut rng); 93 + 94 + if !self.check_room_taken(&code) { 95 + return Ok(code); 96 + } 97 + } 98 + Err(NoRoomsError) 99 + } 100 + 101 + fn add_client(&mut self, origin: SocketAddr, code: RoomId, host: bool) { 102 + self.waiting_clients 103 + .lock() 104 + .unwrap() 105 + .insert(origin, (code.clone(), host)); 106 + } 107 + 108 + pub fn room_is_open(&self, room_id: &str) -> bool { 109 + self.matches 110 + .lock() 111 + .unwrap() 112 + .get(room_id) 113 + .is_some_and(|m| m.open_lobby) 114 + } 115 + 116 + /// Mark a match as started, disallowing others from joining 117 + pub fn mark_started(&mut self, room: &RoomId) { 118 + if let Some(mat) = self.matches.lock().unwrap().get_mut(room) { 119 + mat.open_lobby = false; 120 + } 121 + } 122 + 123 + /// Create a new room with the given code, should be called when someone wants to host a game. 124 + /// Returns false if a room with that code already exists. 125 + fn create_room(&mut self, origin: SocketAddr, code: RoomId) -> bool { 126 + let mut matches = self.matches.lock().unwrap(); 127 + if matches.contains_key(&code) { 128 + false 129 + } else { 130 + matches.insert(code.clone(), Match::new()); 131 + drop(matches); 132 + self.add_client(origin, code, true); 133 + true 134 + } 135 + } 136 + 137 + /// Try to join a room by a code, returns `true` if successful 138 + fn try_join_room(&mut self, origin: SocketAddr, code: RoomId) -> bool { 139 + if self.room_is_open(&code) { 140 + self.waiting_clients 141 + .lock() 142 + .unwrap() 143 + .insert(origin, (code, false)); 144 + true 145 + } else { 146 + false 147 + } 148 + } 149 + 150 + /// Try to create / join a room 151 + pub fn handle_room( 152 + &mut self, 153 + create: bool, 154 + origin: SocketAddr, 155 + code: RoomId, 156 + ) -> Result<(), RoomError> { 157 + match create { 158 + true => match self.create_room(origin, code) { 159 + true => Ok(()), 160 + false => Err(RoomError::Exists), 161 + }, 162 + false => match self.try_join_room(origin, code) { 163 + true => Ok(()), 164 + false => Err(RoomError::NotFound), 165 + }, 166 + } 167 + } 168 + 169 + /// Assign a peer an id 170 + pub fn assign_peer_id(&mut self, origin: SocketAddr, peer_id: PeerId) { 171 + let target_room = self 172 + .waiting_clients 173 + .lock() 174 + .unwrap() 175 + .remove(&origin) 176 + .expect("origin not waiting?"); 177 + 178 + self.queued_clients 179 + .lock() 180 + .unwrap() 181 + .insert(peer_id, target_room); 182 + } 183 + 184 + /// Add a peer to a room, returns other peers in the match currently 185 + pub fn add_peer( 186 + &mut self, 187 + peer_id: PeerId, 188 + sender: Sender, 189 + ) -> (bool, CancellationToken, Vec<PeerId>) { 190 + let (target_room, host) = self 191 + .queued_clients 192 + .lock() 193 + .unwrap() 194 + .remove(&peer_id) 195 + .expect("peer not waiting?"); 196 + let mut matches = self.matches.lock().unwrap(); 197 + let mat = matches.get_mut(&target_room).expect("Room not found?"); 198 + let peers = mat.players.iter().copied().collect::<Vec<_>>(); 199 + mat.players.insert(peer_id); 200 + let cancel = mat.cancel.clone(); 201 + drop(matches); 202 + let peer = Peer { 203 + room: target_room, 204 + sender, 205 + }; 206 + self.clients.lock().unwrap().insert(peer_id, peer); 207 + (host, cancel, peers) 208 + } 209 + 210 + /// Disconnect a peer from a room. Automatically deletes the room if no peers remain. Returns 211 + /// the removed peer and the set of other peers in the room that need to be notified 212 + pub fn remove_peer(&mut self, peer_id: PeerId, host: bool) -> Option<Vec<PeerId>> { 213 + let removed_peer = self.clients.lock().unwrap().remove(&peer_id)?; 214 + 215 + let mut matches = self.matches.lock().unwrap(); 216 + 217 + let other_peers = matches 218 + .get_mut(&removed_peer.room) 219 + .map(|m| { 220 + m.players.remove(&peer_id); 221 + m.players.iter().copied().collect::<Vec<_>>() 222 + }) 223 + .unwrap_or_default(); 224 + 225 + if host { 226 + if let Some(mat) = matches.get_mut(&removed_peer.room).filter(|m| m.open_lobby) { 227 + // If we're host, disconnect everyone else 228 + mat.open_lobby = false; 229 + mat.cancel.cancel(); 230 + } 231 + } 232 + 233 + if other_peers.is_empty() { 234 + matches.remove(&removed_peer.room); 235 + } 236 + 237 + Some(other_peers) 238 + } 239 + 240 + pub fn try_send(&self, peer: PeerId, msg: Message) -> Result<(), SignalingError> { 241 + self.clients 242 + .lock() 243 + .unwrap() 244 + .get(&peer) 245 + .ok_or(SignalingError::UnknownPeer) 246 + .and_then(|peer| common_logic::try_send(&peer.sender, msg)) 247 + } 248 + } 249 + 250 + #[cfg(test)] 251 + mod tests { 252 + use std::net::{IpAddr, Ipv4Addr}; 253 + 254 + use uuid::Uuid; 255 + 256 + use super::*; 257 + 258 + const fn origin(p: u16) -> SocketAddr { 259 + SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), p) 260 + } 261 + 262 + const fn peer(p: u16) -> PeerId { 263 + PeerId(Uuid::from_u128(p as u128)) 264 + } 265 + 266 + fn dummy_sender() -> Sender { 267 + let (s, _) = tokio::sync::mpsc::unbounded_channel(); 268 + s 269 + } 270 + 271 + fn handle_assign_add(state: &mut ServerState, create: bool, code: &str, p: u16) { 272 + state 273 + .handle_room(create, origin(p), code.to_string()) 274 + .expect("Failed to handle room"); 275 + state.assign_peer_id(origin(p), peer(p)); 276 + state.add_peer(peer(p), dummy_sender()); 277 + } 278 + 279 + fn quick_create(state: &mut ServerState, code: &str, p: u16) { 280 + handle_assign_add(state, true, code, p); 281 + } 282 + 283 + fn quick_join(state: &mut ServerState, code: &str, p: u16) { 284 + handle_assign_add(state, false, code, p); 285 + } 286 + 287 + #[test] 288 + fn test_add_waiting_host() { 289 + let mut state = ServerState::default(); 290 + 291 + let code = "aaa"; 292 + 293 + state 294 + .handle_room(true, origin(1), code.to_string()) 295 + .expect("Could not create room"); 296 + assert_eq!( 297 + *state.waiting_clients.lock().unwrap(), 298 + HashMap::from_iter([(origin(1), (code.to_string(), true))]) 299 + ); 300 + assert!(state.room_is_open(code)) 301 + } 302 + 303 + #[test] 304 + fn test_add_waiting_player() { 305 + let mut state = ServerState::default(); 306 + 307 + let code = "aaaa"; 308 + 309 + quick_create(&mut state, code, 1); 310 + 311 + state 312 + .handle_room(false, origin(2), code.to_string()) 313 + .expect("Failed to join room"); 314 + assert_eq!( 315 + *state.waiting_clients.lock().unwrap(), 316 + HashMap::from_iter([(origin(2), (code.to_string(), false))]) 317 + ); 318 + } 319 + 320 + #[test] 321 + fn test_assign_id() { 322 + let mut state = ServerState::default(); 323 + 324 + let code = "aaa"; 325 + 326 + state 327 + .handle_room(true, origin(1), code.to_string()) 328 + .expect("Could not create room"); 329 + 330 + state.assign_peer_id(origin(1), peer(1)); 331 + 332 + assert!(state.waiting_clients.lock().unwrap().is_empty()); 333 + assert_eq!( 334 + *state.queued_clients.lock().unwrap(), 335 + HashMap::from_iter([(peer(1), (code.to_string(), true))]), 336 + ) 337 + } 338 + 339 + #[test] 340 + fn test_add_peer() { 341 + let mut state = ServerState::default(); 342 + 343 + let code = "aaa"; 344 + 345 + state 346 + .handle_room(true, origin(1), code.to_string()) 347 + .expect("Could not create room"); 348 + 349 + state.assign_peer_id(origin(1), peer(1)); 350 + 351 + let (_, _, others) = state.add_peer(peer(1), dummy_sender()); 352 + 353 + assert!(state.waiting_clients.lock().unwrap().is_empty()); 354 + assert!(state.queued_clients.lock().unwrap().is_empty()); 355 + assert!(others.is_empty()); 356 + assert!( 357 + state 358 + .clients 359 + .lock() 360 + .unwrap() 361 + .get(&peer(1)) 362 + .is_some_and(|p| p.room == code) 363 + ); 364 + assert!( 365 + state 366 + .matches 367 + .lock() 368 + .unwrap() 369 + .get(&code.to_string()) 370 + .is_some_and(|m| m.players.contains(&peer(1))) 371 + ); 372 + } 373 + 374 + #[test] 375 + fn test_join_add_peer() { 376 + let mut state = ServerState::default(); 377 + 378 + let code = "abcd"; 379 + 380 + quick_create(&mut state, code, 1); 381 + 382 + state 383 + .handle_room(false, origin(2), code.to_string()) 384 + .expect("Failed to join"); 385 + state.assign_peer_id(origin(2), peer(2)); 386 + 387 + let (_, _, others) = state.add_peer(peer(2), dummy_sender()); 388 + 389 + assert_eq!(others, vec![peer(1)]); 390 + assert!( 391 + state 392 + .clients 393 + .lock() 394 + .unwrap() 395 + .get(&peer(2)) 396 + .is_some_and(|p| p.room == code) 397 + ); 398 + assert!( 399 + state 400 + .matches 401 + .lock() 402 + .unwrap() 403 + .get(&code.to_string()) 404 + .is_some_and(|m| m.players.contains(&peer(1)) && m.players.contains(&peer(2))) 405 + ); 406 + } 407 + 408 + #[test] 409 + fn test_player_leave() { 410 + let mut state = ServerState::default(); 411 + 412 + let code = "asdfasdfasdfasdf"; 413 + 414 + quick_create(&mut state, code, 1); 415 + quick_join(&mut state, code, 2); 416 + 417 + let others = state.remove_peer(peer(2), false); 418 + 419 + assert_eq!(others, Some(vec![peer(1)])); 420 + assert!( 421 + state 422 + .matches 423 + .lock() 424 + .unwrap() 425 + .get(&code.to_string()) 426 + .is_some_and(|m| m.players.contains(&peer(1)) && !m.players.contains(&peer(2))) 427 + ); 428 + assert!(!state.clients.lock().unwrap().contains_key(&peer(2))); 429 + } 430 + 431 + #[test] 432 + fn test_player_leave_only_one() { 433 + let mut state = ServerState::default(); 434 + 435 + let code = "asdfasdfasdfasdf"; 436 + 437 + quick_create(&mut state, code, 1); 438 + 439 + let others = state.remove_peer(peer(1), true); 440 + 441 + assert!(others.is_some_and(|v| v.is_empty())); 442 + assert!(state.matches.lock().unwrap().is_empty()); 443 + assert!(state.clients.lock().unwrap().is_empty()); 444 + } 445 + 446 + #[test] 447 + fn test_host_leave_with_players() { 448 + let mut state = ServerState::default(); 449 + 450 + let code = "asdfasdfasdfasdf"; 451 + 452 + quick_create(&mut state, code, 1); 453 + quick_join(&mut state, code, 2); 454 + 455 + let others = state.remove_peer(peer(1), true); 456 + 457 + assert_eq!(others, Some(vec![peer(2)])); 458 + let matches = state.matches.lock().unwrap(); 459 + let mat = &matches[&code.to_string()]; 460 + assert!(mat.cancel.is_cancelled()); 461 + assert!(!mat.open_lobby); 462 + } 463 + 464 + #[test] 465 + fn test_host_leave_with_players_but_started() { 466 + let mut state = ServerState::default(); 467 + 468 + let code = "asdfasdfasdfasdf"; 469 + 470 + quick_create(&mut state, code, 1); 471 + quick_join(&mut state, code, 2); 472 + 473 + state.mark_started(&code.to_string()); 474 + 475 + let others = state.remove_peer(peer(1), true); 476 + 477 + assert_eq!(others, Some(vec![peer(2)])); 478 + let matches = state.matches.lock().unwrap(); 479 + let mat = &matches[&code.to_string()]; 480 + assert!(!mat.cancel.is_cancelled()); 481 + assert!(!mat.open_lobby); 482 + } 483 + 484 + #[test] 485 + fn test_join_no_match() { 486 + let mut state = ServerState::default(); 487 + 488 + let code = "asdfasdf"; 489 + 490 + let res = state.handle_room(false, origin(1), code.to_string()); 491 + assert_eq!(res, Err(RoomError::NotFound)); 492 + } 493 + 494 + #[test] 495 + fn test_create_exists() { 496 + let mut state = ServerState::default(); 497 + 498 + let code = "cdf"; 499 + 500 + quick_create(&mut state, code, 1); 501 + 502 + let res = state.handle_room(true, origin(2), code.to_string()); 503 + assert_eq!(res, Err(RoomError::Exists)); 504 + } 505 + 506 + #[test] 507 + fn test_join_started() { 508 + let mut state = ServerState::default(); 509 + 510 + let code = "qwerty"; 511 + 512 + quick_create(&mut state, code, 1); 513 + quick_join(&mut state, code, 2); 514 + 515 + state.mark_started(&code.to_string()); 516 + 517 + assert!( 518 + state 519 + .matches 520 + .lock() 521 + .unwrap() 522 + .get(&code.to_string()) 523 + .is_some_and(|m| !m.open_lobby) 524 + ); 525 + 526 + let res = state.handle_room(false, origin(3), code.to_string()); 527 + assert_eq!(res, Err(RoomError::NotFound)); 528 + } 529 + }
+99
manhunt-signaling/src/topology.rs
··· 1 + use async_trait::async_trait; 2 + use axum::extract::ws::Message; 3 + use futures::StreamExt; 4 + use log::{error, info, warn}; 5 + use matchbox_protocol::{JsonPeerEvent, PeerRequest}; 6 + use matchbox_signaling::{ 7 + ClientRequestError, NoCallbacks, SignalingTopology, WsStateMeta, common_logic::parse_request, 8 + }; 9 + 10 + use crate::state::ServerState; 11 + 12 + #[derive(Default, Debug)] 13 + pub struct ServerTopology; 14 + 15 + #[async_trait] 16 + impl SignalingTopology<NoCallbacks, ServerState> for ServerTopology { 17 + async fn state_machine(upgrade: WsStateMeta<NoCallbacks, ServerState>) { 18 + let WsStateMeta { 19 + peer_id, 20 + sender, 21 + mut receiver, 22 + mut state, 23 + .. 24 + } = upgrade; 25 + 26 + let (host, cancel, other_peers) = state.add_peer(peer_id, sender.clone()); 27 + 28 + let msg = Message::Text(JsonPeerEvent::NewPeer(peer_id).to_string().into()); 29 + 30 + for other_id in other_peers { 31 + if let Err(why) = state.try_send(other_id, msg.clone()) { 32 + error!("Failed to publish new peer event to {other_id}: {why:?}"); 33 + } 34 + } 35 + 36 + loop { 37 + let next_msg = tokio::select! { 38 + biased; 39 + 40 + _ = cancel.cancelled() => { 41 + info!("Disconnecting {peer_id} due to host disconnect"); 42 + break; 43 + } 44 + 45 + next = receiver.next() => { 46 + if let Some(next) = next { 47 + parse_request(next) 48 + } else { 49 + info!("Peer {peer_id} has disconnected"); 50 + break; 51 + } 52 + } 53 + }; 54 + 55 + let req = match next_msg { 56 + Ok(req) => req, 57 + Err(e) => match e { 58 + ClientRequestError::Axum(e) => { 59 + warn!("Peer {peer_id} encountered Axum error: {e:?}. Disconnecting..."); 60 + break; 61 + } 62 + ClientRequestError::Close => { 63 + info!("Peer {peer_id} closed connection"); 64 + break; 65 + } 66 + ClientRequestError::Json(_) | ClientRequestError::UnsupportedType(_) => { 67 + error!("Error parsing request from {peer_id}: {e:?}"); 68 + continue; // Recoverable, although may mean bad state? 69 + } 70 + }, 71 + }; 72 + 73 + if let PeerRequest::Signal { receiver, data } = req { 74 + let msg = Message::Text( 75 + JsonPeerEvent::Signal { 76 + sender: peer_id, 77 + data, 78 + } 79 + .to_string() 80 + .into(), 81 + ); 82 + if let Err(why) = state.try_send(receiver, msg) { 83 + error!("Error sending signaling message from {peer_id} to {receiver}: {why:?}"); 84 + } 85 + } // Other variant, PeerRequest::KeepAlive is just for a heartbeat, do nothing 86 + } 87 + 88 + let msg = Message::Text(JsonPeerEvent::PeerLeft(peer_id).to_string().into()); 89 + if let Some(other_peers) = state.remove_peer(peer_id, host) { 90 + for other_id in other_peers { 91 + if let Err(why) = state.try_send(other_id, msg.clone()) { 92 + warn!("Failed to alert {other_id} that {peer_id} has disconnected: {why:?}"); 93 + } 94 + } 95 + } else { 96 + warn!("Trying to remove peer {peer_id}, which doesn't exist?"); 97 + } 98 + } 99 + }
+26
manhunt-testing/Cargo.toml
··· 1 + [package] 2 + name = "manhunt-testing" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [lib] 7 + name = "manhunt_test_shared" 8 + path = "src/lib.rs" 9 + 10 + [[bin]] 11 + name = "manhunt-test-daemon" 12 + path = "src/daemon.rs" 13 + 14 + [[bin]] 15 + name = "manhunt-test-driver" 16 + path = "src/driver.rs" 17 + 18 + [dependencies] 19 + anyhow = "1.0.101" 20 + clap = { version = "4.5.59", features = ["derive"] } 21 + interprocess = { version = "2.3.1", features = ["tokio"] } 22 + manhunt-logic = { version = "0.1.0", path = "../manhunt-logic" } 23 + manhunt-transport = { version = "0.1.0", path = "../manhunt-transport" } 24 + serde = { version = "1.0.228", features = ["derive"] } 25 + serde_json = "1.0.149" 26 + tokio = { version = "1.49.0", features = ["macros", "sync", "time", "rt", "test-util", "signal"] }
+329
manhunt-testing/src/daemon.rs
··· 1 + #![allow(clippy::result_large_err)] 2 + 3 + use manhunt_logic::{ 4 + Game as BaseGame, GameSettings, Lobby as BaseLobby, Location, LocationService, PlayerProfile, 5 + StartGameInfo, StateUpdateSender, 6 + }; 7 + use manhunt_test_shared::*; 8 + use manhunt_transport::{MatchboxTransport, request_room_code}; 9 + use std::{sync::Arc, time::Duration}; 10 + use tokio::{ 11 + io::{AsyncBufReadExt, AsyncWriteExt, BufReader}, 12 + sync::{Mutex, mpsc}, 13 + }; 14 + 15 + struct DummyLocationService; 16 + 17 + impl LocationService for DummyLocationService { 18 + fn get_loc(&self) -> Option<manhunt_logic::Location> { 19 + Some(Location { 20 + lat: 0.0, 21 + long: 0.0, 22 + heading: None, 23 + }) 24 + } 25 + } 26 + 27 + struct UpdateSender(mpsc::Sender<()>); 28 + 29 + impl StateUpdateSender for UpdateSender { 30 + fn send_update(&self) { 31 + let tx = self.0.clone(); 32 + tokio::spawn(async move { 33 + tx.send(()).await.expect("Failed to send"); 34 + }); 35 + } 36 + } 37 + 38 + type Game = BaseGame<DummyLocationService, MatchboxTransport, UpdateSender>; 39 + type Lobby = BaseLobby<MatchboxTransport, UpdateSender>; 40 + 41 + #[derive(Default)] 42 + enum DaemonScreen { 43 + #[default] 44 + PreConnect, 45 + Lobby(Arc<Lobby>), 46 + Game(Arc<Game>), 47 + } 48 + 49 + impl DaemonScreen { 50 + pub fn as_update(&self) -> ScreenUpdate { 51 + match self { 52 + Self::PreConnect => ScreenUpdate::PreConnect, 53 + Self::Game(_) => ScreenUpdate::Game, 54 + Self::Lobby(_) => ScreenUpdate::Lobby, 55 + } 56 + } 57 + } 58 + 59 + type StateHandle = Arc<Mutex<DaemonState>>; 60 + 61 + struct DaemonState { 62 + screen: DaemonScreen, 63 + profile: PlayerProfile, 64 + responses: mpsc::Sender<TestingResponse>, 65 + updates: (mpsc::Sender<()>, Mutex<mpsc::Receiver<()>>), 66 + } 67 + 68 + impl DaemonState { 69 + pub fn new(name: impl Into<String>, responses: mpsc::Sender<TestingResponse>) -> Self { 70 + tokio::time::pause(); 71 + let screen = DaemonScreen::default(); 72 + let (tx, rx) = mpsc::channel(2); 73 + Self { 74 + screen, 75 + responses, 76 + profile: PlayerProfile { 77 + display_name: name.into(), 78 + pfp_base64: None, 79 + }, 80 + updates: (tx, Mutex::new(rx)), 81 + } 82 + } 83 + 84 + async fn change_screen(&mut self, new_screen: DaemonScreen) { 85 + let update = new_screen.as_update(); 86 + self.screen = new_screen; 87 + self.push_resp(update).await; 88 + } 89 + 90 + async fn lobby_loop(&self, handle: StateHandle) { 91 + if let DaemonScreen::Lobby(lobby) = &self.screen { 92 + let lobby = lobby.clone(); 93 + tokio::spawn(async move { 94 + let res = lobby.main_loop().await; 95 + let handle2 = handle.clone(); 96 + let mut state = handle.lock().await; 97 + match res { 98 + Ok(Some(start)) => { 99 + state.start_game(handle2, start).await; 100 + } 101 + Ok(None) => { 102 + state.change_screen(DaemonScreen::PreConnect).await; 103 + } 104 + Err(why) => { 105 + state.push_resp(why).await; 106 + state.change_screen(DaemonScreen::PreConnect).await; 107 + } 108 + } 109 + }); 110 + } 111 + } 112 + 113 + async fn game_loop(&self, handle: StateHandle) { 114 + if let DaemonScreen::Game(game) = &self.screen { 115 + let game = game.clone(); 116 + tokio::spawn(async move { 117 + let res = game.main_loop().await; 118 + let mut state = handle.lock().await; 119 + match res { 120 + Ok(Some(history)) => { 121 + state.push_resp(history).await; 122 + } 123 + Ok(None) => {} 124 + Err(why) => { 125 + state.push_resp(why).await; 126 + } 127 + } 128 + state.change_screen(DaemonScreen::PreConnect).await; 129 + }); 130 + } 131 + } 132 + 133 + async fn push_resp(&self, resp: impl Into<TestingResponse>) { 134 + self.responses 135 + .send(resp.into()) 136 + .await 137 + .expect("Failed to push response"); 138 + } 139 + 140 + fn sender(&self) -> UpdateSender { 141 + UpdateSender(self.updates.0.clone()) 142 + } 143 + 144 + const INTERVAL: Duration = Duration::from_secs(1); 145 + 146 + async fn start_game(&mut self, handle: StateHandle, start: StartGameInfo) { 147 + if let DaemonScreen::Lobby(lobby) = &self.screen { 148 + let transport = lobby.clone_transport(); 149 + let updates = self.sender(); 150 + let location = DummyLocationService; 151 + 152 + let game = Game::new(Self::INTERVAL, start, transport, location, updates); 153 + 154 + self.change_screen(DaemonScreen::Game(Arc::new(game))).await; 155 + self.game_loop(handle).await; 156 + } 157 + } 158 + 159 + pub async fn create_lobby(&mut self, handle: StateHandle, settings: GameSettings) -> Result { 160 + let sender = self.sender(); 161 + 162 + let code = request_room_code() 163 + .await 164 + .context("Failed to get room code")?; 165 + 166 + let lobby = Lobby::new(&code, true, self.profile.clone(), settings, sender) 167 + .await 168 + .context("Failed to start lobby")?; 169 + 170 + self.change_screen(DaemonScreen::Lobby(lobby)).await; 171 + self.lobby_loop(handle).await; 172 + 173 + Ok(()) 174 + } 175 + 176 + pub async fn join_lobby(&mut self, handle: StateHandle, code: &str) -> Result { 177 + let sender = self.sender(); 178 + // TODO: Lobby should not require this on join, use an [Option]? 179 + let settings = GameSettings::default(); 180 + 181 + let lobby = Lobby::new(code, false, self.profile.clone(), settings, sender) 182 + .await 183 + .context("Failed to join lobby")?; 184 + 185 + self.change_screen(DaemonScreen::Lobby(lobby)).await; 186 + self.lobby_loop(handle).await; 187 + 188 + Ok(()) 189 + } 190 + 191 + fn assert_screen(&self, expected: ScreenUpdate) -> Result<(), TestingResponse> { 192 + if self.screen.as_update() == expected { 193 + Ok(()) 194 + } else { 195 + Err(TestingResponse::WrongScreen) 196 + } 197 + } 198 + 199 + async fn process_lobby_req(&mut self, req: LobbyRequest) { 200 + if let DaemonScreen::Lobby(lobby) = &self.screen { 201 + let lobby = lobby.clone(); 202 + match req { 203 + LobbyRequest::SwitchTeams(seeker) => lobby.switch_teams(seeker).await, 204 + LobbyRequest::HostStartGame => lobby.start_game().await, 205 + LobbyRequest::HostUpdateSettings(game_settings) => { 206 + lobby.update_settings(game_settings).await 207 + } 208 + LobbyRequest::Leave => lobby.quit_lobby().await, 209 + } 210 + } 211 + } 212 + 213 + async fn process_game_req(&mut self, req: GameRequest) { 214 + if let DaemonScreen::Game(game) = &self.screen { 215 + let game = game.clone(); 216 + match req { 217 + GameRequest::NextTick => tokio::time::sleep(Self::INTERVAL).await, 218 + GameRequest::MarkCaught => game.mark_caught().await, 219 + GameRequest::GetPowerup => game.get_powerup().await, 220 + GameRequest::UsePowerup => game.use_powerup().await, 221 + GameRequest::ForcePowerup(power_up_type) => { 222 + let mut state = game.lock_state().await; 223 + state.force_set_powerup(power_up_type); 224 + } 225 + GameRequest::Quit => game.quit_game().await, 226 + } 227 + } 228 + } 229 + 230 + pub async fn process_req( 231 + &mut self, 232 + handle: StateHandle, 233 + req: TestingRequest, 234 + ) -> Result<(), TestingResponse> { 235 + match req { 236 + TestingRequest::StartLobby(game_settings) => { 237 + self.assert_screen(ScreenUpdate::PreConnect)?; 238 + self.create_lobby(handle, game_settings).await?; 239 + } 240 + TestingRequest::JoinLobby(code) => { 241 + self.assert_screen(ScreenUpdate::PreConnect)?; 242 + self.join_lobby(handle, &code).await?; 243 + } 244 + TestingRequest::LobbyReq(lobby_request) => { 245 + self.assert_screen(ScreenUpdate::Lobby)?; 246 + self.process_lobby_req(lobby_request).await; 247 + } 248 + TestingRequest::GameReq(game_request) => { 249 + self.assert_screen(ScreenUpdate::Game)?; 250 + self.process_game_req(game_request).await; 251 + } 252 + } 253 + Ok(()) 254 + } 255 + } 256 + 257 + use interprocess::local_socket::{ListenerOptions, tokio::prelude::*}; 258 + 259 + const CLI_MSG: &str = "Usage: manhunt-test-daemon SOCKET_NAME PLAYER_NAME"; 260 + 261 + #[tokio::main(flavor = "current_thread")] 262 + pub async fn main() -> Result { 263 + let args = std::env::args().collect::<Vec<_>>(); 264 + let raw_socket_name = args.get(1).cloned().expect(CLI_MSG); 265 + let player_name = args.get(2).cloned().expect(CLI_MSG); 266 + let socket_name = get_socket_name(raw_socket_name)?; 267 + let opts = ListenerOptions::new().name(socket_name); 268 + let listener = opts.create_tokio().context("Failed to bind to socket")?; 269 + let (resp_tx, mut resp_rx) = mpsc::channel::<TestingResponse>(40); 270 + 271 + let handle = Arc::new(Mutex::new(DaemonState::new(player_name, resp_tx))); 272 + 273 + eprintln!("Testing Daemon Ready"); 274 + 275 + 'server: loop { 276 + let res = tokio::select! { 277 + res = listener.accept() => { 278 + res 279 + }, 280 + Ok(_) = tokio::signal::ctrl_c() => { 281 + break 'server; 282 + } 283 + }; 284 + 285 + match res { 286 + Ok(stream) => { 287 + let mut recv = BufReader::new(&stream); 288 + let mut send = &stream; 289 + 290 + let mut buffer = String::with_capacity(256); 291 + 292 + loop { 293 + tokio::select! { 294 + Ok(_) = tokio::signal::ctrl_c() => { 295 + break 'server; 296 + } 297 + res = recv.read_line(&mut buffer) => { 298 + match res { 299 + Ok(0) => { 300 + break; 301 + } 302 + Ok(_amnt) => { 303 + let req = serde_json::from_str(&buffer).expect("Failed to parse"); 304 + buffer.clear(); 305 + let handle2 = handle.clone(); 306 + let mut state = handle.lock().await; 307 + if let Err(resp) = state.process_req(handle2, req).await { 308 + let encoded = serde_json::to_vec(&resp).expect("Failed to encode"); 309 + send.write_all(&encoded).await.expect("Failed to send"); 310 + } 311 + } 312 + Err(why) => { 313 + eprintln!("Read Error: {why:?}"); 314 + } 315 + } 316 + } 317 + Some(resp) = resp_rx.recv() => { 318 + let encoded = serde_json::to_vec(&resp).expect("Failed to encode"); 319 + send.write_all(&encoded).await.expect("Failed to send"); 320 + } 321 + } 322 + } 323 + } 324 + Err(why) => eprintln!("Error from connection: {why:?}"), 325 + } 326 + } 327 + 328 + Ok(()) 329 + }
+99
manhunt-testing/src/driver.rs
··· 1 + use clap::{Parser, Subcommand, ValueEnum}; 2 + use interprocess::local_socket::{tokio::Stream, traits::tokio::Stream as _}; 3 + use manhunt_logic::PowerUpType; 4 + use manhunt_test_shared::{get_socket_name, prelude::*}; 5 + 6 + #[derive(Parser)] 7 + struct Cli { 8 + /// Path to the UNIX domain socket the test daemon is listening on 9 + socket: String, 10 + 11 + #[command(subcommand)] 12 + command: Commands, 13 + } 14 + 15 + #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, ValueEnum)] 16 + enum Role { 17 + Seeker, 18 + Hider, 19 + } 20 + 21 + #[derive(Subcommand)] 22 + enum LobbyCommand { 23 + /// Switch teams between seekers and hiders 24 + SwitchTeams { 25 + /// The role you want to become 26 + #[arg(value_enum)] 27 + role: Role, 28 + }, 29 + /// (Host) Sync game settings to players 30 + SyncSettings, 31 + /// (Host) Start the game for everyone 32 + StartGame, 33 + /// Quit to the main menu 34 + Quit, 35 + } 36 + 37 + #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, ValueEnum)] 38 + enum PowerUpTypeValue { 39 + PingSeeker, 40 + PingAllSeekers, 41 + ForcePingOther, 42 + } 43 + 44 + impl From<PowerUpTypeValue> for PowerUpType { 45 + fn from(value: PowerUpTypeValue) -> Self { 46 + match value { 47 + PowerUpTypeValue::PingSeeker => PowerUpType::PingSeeker, 48 + PowerUpTypeValue::PingAllSeekers => PowerUpType::PingAllSeekers, 49 + PowerUpTypeValue::ForcePingOther => PowerUpType::ForcePingOther, 50 + } 51 + } 52 + } 53 + 54 + #[derive(Subcommand)] 55 + enum GameCommand { 56 + /// Mark the local player as caught for everyone 57 + MarkCaught, 58 + /// Get a currently available powerup 59 + GetPowerup, 60 + /// Use the held powerup of the local player 61 + UsePowerup, 62 + /// Force set the held powerup to the given type 63 + ForcePowerup { 64 + #[arg(value_enum)] 65 + ptype: PowerUpTypeValue, 66 + }, 67 + /// Quit the game 68 + Quit, 69 + } 70 + 71 + #[derive(Subcommand)] 72 + enum Commands { 73 + /// Create a lobby 74 + Create, 75 + /// Join a lobby 76 + Join { 77 + /// The join code for the lobby 78 + join_code: String, 79 + }, 80 + /// Execute a command in an active lobby 81 + #[command(subcommand)] 82 + Lobby(LobbyCommand), 83 + /// Execute a command in an active game 84 + #[command(subcommand)] 85 + Game(GameCommand), 86 + } 87 + 88 + #[tokio::main] 89 + async fn main() -> Result { 90 + let cli = Cli::parse(); 91 + 92 + let socket_name = get_socket_name(cli.socket.clone()).context("Failed to get socket name")?; 93 + 94 + let _stream = Stream::connect(socket_name) 95 + .await 96 + .context("Failed to connect to socket")?; 97 + 98 + Ok(()) 99 + }
+126
manhunt-testing/src/lib.rs
··· 1 + use interprocess::local_socket::{GenericNamespaced, Name, ToNsName}; 2 + use manhunt_logic::{GameHistory, GameSettings, GameUiState, LobbyState, PowerUpType}; 3 + use serde::{Deserialize, Serialize}; 4 + 5 + pub mod prelude { 6 + pub use anyhow::{Context, anyhow, bail}; 7 + pub type Result<T = (), E = anyhow::Error> = std::result::Result<T, E>; 8 + } 9 + 10 + pub use prelude::*; 11 + 12 + pub fn get_socket_name(base_name: String) -> Result<Name<'static>> { 13 + base_name 14 + .to_ns_name::<GenericNamespaced>() 15 + .context("Failed to parse socket name") 16 + } 17 + 18 + #[derive(Debug, Clone, Serialize, Deserialize)] 19 + pub enum LobbyRequest { 20 + SwitchTeams(bool), 21 + HostStartGame, 22 + HostUpdateSettings(GameSettings), 23 + Leave, 24 + } 25 + 26 + #[derive(Debug, Clone, Serialize, Deserialize)] 27 + pub enum GameRequest { 28 + NextTick, 29 + MarkCaught, 30 + GetPowerup, 31 + UsePowerup, 32 + ForcePowerup(PowerUpType), 33 + Quit, 34 + } 35 + 36 + #[derive(Debug, Clone, Serialize, Deserialize)] 37 + pub enum TestingRequest { 38 + StartLobby(GameSettings), 39 + JoinLobby(String), 40 + LobbyReq(LobbyRequest), 41 + GameReq(GameRequest), 42 + } 43 + 44 + impl From<LobbyRequest> for TestingRequest { 45 + fn from(val: LobbyRequest) -> Self { 46 + TestingRequest::LobbyReq(val) 47 + } 48 + } 49 + 50 + impl From<GameRequest> for TestingRequest { 51 + fn from(val: GameRequest) -> Self { 52 + TestingRequest::GameReq(val) 53 + } 54 + } 55 + 56 + impl TryInto<LobbyRequest> for TestingRequest { 57 + type Error = TestingResponse; 58 + 59 + fn try_into(self) -> Result<LobbyRequest, Self::Error> { 60 + if let Self::LobbyReq(lr) = self { 61 + Ok(lr) 62 + } else { 63 + Err(TestingResponse::WrongScreen) 64 + } 65 + } 66 + } 67 + 68 + impl TryInto<GameRequest> for TestingRequest { 69 + type Error = TestingResponse; 70 + 71 + fn try_into(self) -> Result<GameRequest, Self::Error> { 72 + if let Self::GameReq(gr) = self { 73 + Ok(gr) 74 + } else { 75 + Err(TestingResponse::WrongScreen) 76 + } 77 + } 78 + } 79 + 80 + #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] 81 + pub enum ScreenUpdate { 82 + PreConnect, 83 + Lobby, 84 + Game, 85 + } 86 + 87 + #[derive(Debug, Clone, Serialize, Deserialize)] 88 + pub enum TestingResponse { 89 + Complete, 90 + ScreenChanged(ScreenUpdate), 91 + LobbyStateUpdate(LobbyState), 92 + GameStateUpdate(GameUiState), 93 + GameOver(GameHistory), 94 + WrongScreen, 95 + Error(String), 96 + } 97 + 98 + impl From<GameHistory> for TestingResponse { 99 + fn from(val: GameHistory) -> Self { 100 + TestingResponse::GameOver(val) 101 + } 102 + } 103 + 104 + impl From<anyhow::Error> for TestingResponse { 105 + fn from(value: anyhow::Error) -> Self { 106 + TestingResponse::Error(value.to_string()) 107 + } 108 + } 109 + 110 + impl From<ScreenUpdate> for TestingResponse { 111 + fn from(val: ScreenUpdate) -> Self { 112 + TestingResponse::ScreenChanged(val) 113 + } 114 + } 115 + 116 + impl From<LobbyState> for TestingResponse { 117 + fn from(val: LobbyState) -> Self { 118 + TestingResponse::LobbyStateUpdate(val) 119 + } 120 + } 121 + 122 + impl From<GameUiState> for TestingResponse { 123 + fn from(val: GameUiState) -> Self { 124 + TestingResponse::GameStateUpdate(val) 125 + } 126 + }
+13 -13
manhunt-transport/Cargo.toml
··· 4 4 edition = "2024" 5 5 6 6 [dependencies] 7 - anyhow = "1.0.98" 8 - futures = "0.3.31" 9 - log = "0.4.27" 10 - matchbox_protocol = "0.12.0" 11 - matchbox_socket = "0.12.0" 12 - rmp-serde = "1.3.0" 13 - serde = { version = "1.0.219", features = ["derive"] } 14 - tokio = { version = "1.45.1", features = ["macros", "sync", "time", "rt"] } 15 - tokio-util = "0.7.15" 16 - uuid = { version = "1.17.0", features = ["serde"] } 7 + anyhow = "1.0.101" 8 + futures = "0.3.32" 9 + log = "0.4.29" 10 + matchbox_protocol = "0.14.0" 11 + matchbox_socket = "0.14.0" 12 + rmp-serde = "1.3.1" 13 + serde = { version = "1.0.228", features = ["derive"] } 14 + tokio = { version = "1.49.0", features = ["macros", "sync", "time", "rt"] } 15 + tokio-util = "0.7.18" 16 + uuid = { version = "1.21.0", features = ["serde"] } 17 17 manhunt-logic = { version = "0.1.0", path = "../manhunt-logic" } 18 - rand = { version = "0.9.1", features = ["thread_rng"] } 19 - reqwest = { version = "0.12.20", default-features = false, features = ["charset", "http2", "rustls-tls", "system-proxy"] } 20 - const-str = "0.6.2" 18 + rand = { version = "0.10.0", features = ["thread_rng"] } 19 + reqwest = { version = "0.13.2", default-features = false, features = ["charset", "http2", "default-tls", "system-proxy"] } 20 + const-str = "1.1.0"
+1 -1
manhunt-transport/src/lib.rs
··· 3 3 mod server; 4 4 5 5 pub use matchbox::MatchboxTransport; 6 - pub use server::{generate_join_code, room_exists}; 6 + pub use server::{request_room_code, room_exists};
+731 -120
manhunt-transport/src/matchbox.rs
··· 1 - use std::{pin::Pin, sync::Arc, time::Duration}; 1 + use std::{collections::HashSet, marker::PhantomData, pin::Pin, sync::Arc}; 2 2 3 3 use anyhow::{Context, anyhow}; 4 - use futures::FutureExt; 5 - use log::error; 4 + use futures::{ 5 + SinkExt, Stream, StreamExt, 6 + channel::mpsc::{UnboundedReceiver, UnboundedSender}, 7 + }; 8 + use log::{error, info}; 6 9 use matchbox_socket::{Error as SocketError, PeerId, PeerState, WebRtcSocket}; 7 10 use tokio::{ 8 11 sync::{Mutex, mpsc}, ··· 19 22 type MsgPair = (Option<Uuid>, TransportMessage); 20 23 type Queue = QueuePair<MsgPair>; 21 24 22 - pub struct MatchboxTransport { 25 + pub struct MatchboxTransport<S: SocketImpl = WebRtcSocket> { 23 26 my_id: Uuid, 24 27 incoming: Queue, 25 - outgoing: Queue, 28 + all_peers: Mutex<HashSet<Uuid>>, 29 + msg_sender: UnboundedSender<MatchboxMsgPair>, 26 30 cancel_token: CancellationToken, 31 + phantom: PhantomData<S>, 27 32 } 28 33 29 34 type LoopFutRes = Result<(), SocketError>; 30 35 36 + type MatchboxMsgPair = (PeerId, Box<[u8]>); 37 + type MatchboxSender = UnboundedSender<MatchboxMsgPair>; 38 + type MatchboxReceiver = UnboundedReceiver<MatchboxMsgPair>; 39 + type MatchboxChannel = (MatchboxSender, MatchboxReceiver); 40 + 31 41 fn map_socket_error(err: SocketError) -> anyhow::Error { 32 42 match err { 33 43 SocketError::ConnectionFailed(e) => anyhow!("Connection to server failed: {e:?}"), ··· 35 45 } 36 46 } 37 47 38 - impl MatchboxTransport { 39 - pub async fn new(join_code: &str, is_host: bool) -> Result<Arc<Self>> { 40 - let (itx, irx) = mpsc::channel(15); 41 - let (otx, orx) = mpsc::channel(15); 48 + type FutPin<T> = Pin<Box<dyn Future<Output = T> + Send>>; 49 + type MessageLoopFuture = FutPin<LoopFutRes>; 50 + type PeerMsg = (PeerId, PeerState); 42 51 52 + pub trait SocketImpl: Unpin + Send + Sync + Sized + Stream<Item = PeerMsg> { 53 + fn new(room_url: &str) -> (Self, MessageLoopFuture); 54 + fn get_id(&mut self) -> Option<PeerId>; 55 + fn take_channel(&mut self) -> MatchboxChannel; 56 + } 57 + 58 + impl SocketImpl for WebRtcSocket { 59 + fn new(room_url: &str) -> (Self, MessageLoopFuture) { 60 + Self::new_reliable(room_url) 61 + } 62 + 63 + fn get_id(&mut self) -> Option<PeerId> { 64 + self.id() 65 + } 66 + 67 + fn take_channel(&mut self) -> MatchboxChannel { 68 + self.take_channel(0).expect("Failed to get channel").split() 69 + } 70 + } 71 + 72 + impl<S: SocketImpl + 'static> MatchboxTransport<S> { 73 + pub async fn new(join_code: &str, is_host: bool) -> Result<Arc<Self>> { 43 74 let ws_url = server::room_url(join_code, is_host); 75 + let (socket, loop_fut) = S::new(&ws_url); 76 + Self::from_socket_and_loop_fut(socket, loop_fut).await 77 + } 44 78 45 - let (mut socket, mut loop_fut) = WebRtcSocket::new_reliable(&ws_url); 79 + async fn from_socket_and_loop_fut( 80 + mut socket: S, 81 + mut loop_fut: MessageLoopFuture, 82 + ) -> Result<Arc<Self>> { 83 + let (itx, irx) = mpsc::channel(15); 84 + let (mtx, mrx) = socket.take_channel(); 46 85 47 86 let res = loop { 48 87 tokio::select! { 49 88 id = Self::wait_for_id(&mut socket) => { 50 89 if let Some(id) = id { 51 - break Ok(id); 90 + break Ok(id); 52 91 } 53 92 }, 54 93 res = &mut loop_fut => { ··· 66 105 let transport = Arc::new(Self { 67 106 my_id, 68 107 incoming: (itx, Mutex::new(irx)), 69 - outgoing: (otx, Mutex::new(orx)), 108 + all_peers: Mutex::new(HashSet::with_capacity(5)), 109 + msg_sender: mtx.clone(), 70 110 cancel_token: CancellationToken::new(), 111 + phantom: PhantomData, 71 112 }); 72 113 73 114 tokio::spawn({ 74 115 let transport = transport.clone(); 75 116 async move { 76 - transport.main_loop(socket, loop_fut).await; 117 + transport.main_loop(socket, loop_fut, mrx).await; 77 118 } 78 119 }); 79 120 80 121 Ok(transport) 81 122 } 82 123 Err(why) => { 124 + drop(mrx); 125 + drop(mtx); 83 126 drop(socket); 84 - loop_fut.await.context("While disconnecting")?; 85 127 Err(why) 86 128 } 87 129 } 88 130 } 89 131 90 - async fn wait_for_id(socket: &mut WebRtcSocket) -> Option<Uuid> { 91 - if let Some(id) = socket.id() { 132 + async fn wait_for_id(socket: &mut S) -> Option<Uuid> { 133 + if let Some(id) = socket.get_id() { 92 134 Some(id.0) 93 135 } else { 94 136 yield_now().await; ··· 104 146 .expect("Failed to push to incoming queue"); 105 147 } 106 148 107 - async fn push_many_incoming(&self, msgs: Vec<MsgPair>) { 108 - let senders = self 109 - .incoming 110 - .0 111 - .reserve_many(msgs.len()) 112 - .await 113 - .expect("Failed to reserve in incoming queue"); 114 - 115 - for (sender, msg) in senders.into_iter().zip(msgs.into_iter()) { 116 - sender.send(msg); 117 - } 118 - } 119 - 120 149 async fn main_loop( 121 150 &self, 122 - mut socket: WebRtcSocket, 123 - loop_fut: Pin<Box<dyn Future<Output = LoopFutRes> + Send + 'static>>, 151 + mut socket: S, 152 + loop_fut: MessageLoopFuture, 153 + mut mrx: UnboundedReceiver<MatchboxMsgPair>, 124 154 ) { 125 - let loop_fut = async { 126 - let msg = match loop_fut.await { 127 - Ok(_) => TransportMessage::Disconnected, 128 - Err(e) => { 129 - let msg = map_socket_error(e).to_string(); 130 - TransportMessage::Error(msg) 131 - } 132 - }; 133 - self.push_incoming(None, msg).await; 134 - } 135 - .fuse(); 136 - 137 155 tokio::pin!(loop_fut); 138 - 139 - let mut interval = tokio::time::interval(Duration::from_secs(1)); 140 - 141 - let mut outgoing_rx = self.outgoing.1.lock().await; 142 - const MAX_MSG_SEND: usize = 30; 143 - let mut message_buffer = Vec::with_capacity(MAX_MSG_SEND); 144 - 145 156 let mut packet_handler = PacketHandler::default(); 146 157 147 - loop { 148 - self.handle_peers(&mut socket).await; 149 - 150 - self.handle_recv(&mut socket, &mut packet_handler).await; 158 + info!("Starting transport loop"); 151 159 160 + let (should_await, msg) = loop { 152 161 tokio::select! { 153 162 biased; 154 163 164 + res = &mut loop_fut => { 165 + info!("Transport-initiated disconnect"); 166 + break (false, match res { 167 + Ok(_) => TransportMessage::Disconnected, 168 + Err(e) => { 169 + let msg = map_socket_error(e).to_string(); 170 + TransportMessage::Error(msg) 171 + } 172 + }); 173 + } 174 + 155 175 _ = self.cancel_token.cancelled() => { 156 - break; 176 + info!("Logic-initiated disconnect"); 177 + break (true, TransportMessage::Disconnected); 157 178 } 158 179 159 - _ = &mut loop_fut => { 160 - break; 180 + Some((peer, state)) = socket.next() => { 181 + info!("Handling peer {peer}: {state:?}"); 182 + self.handle_peer(peer, state).await; 161 183 } 162 184 163 - _ = outgoing_rx.recv_many(&mut message_buffer, MAX_MSG_SEND) => { 164 - let peers = socket.connected_peers().collect::<Vec<_>>(); 165 - self.handle_send(&mut socket, &peers, &mut message_buffer).await; 185 + Some(data) = mrx.next() => { 186 + info!("Handling new packet from {}", data.0); 187 + self.handle_recv(data, &mut packet_handler).await; 166 188 } 167 189 168 - _ = interval.tick() => { 169 - continue; 170 - } 190 + 191 + } 192 + }; 193 + 194 + self.push_incoming(Some(self.my_id), msg).await; 195 + 196 + self.msg_sender.close_channel(); 197 + self.incoming.1.lock().await.close(); 198 + drop(mrx); 199 + drop(socket); 200 + if should_await { 201 + if let Err(why) = loop_fut.await { 202 + error!("Failed to await after disconnect: {why:?}"); 171 203 } 172 204 } 205 + info!("Transport disconnected"); 173 206 } 174 207 175 - async fn handle_peers(&self, socket: &mut WebRtcSocket) { 176 - for (peer, state) in socket.update_peers() { 177 - let msg = match state { 178 - PeerState::Connected => TransportMessage::PeerConnect(peer.0), 179 - PeerState::Disconnected => TransportMessage::PeerDisconnect(peer.0), 180 - }; 181 - self.push_incoming(Some(peer.0), msg).await; 182 - } 208 + async fn handle_peer(&self, peer: PeerId, state: PeerState) { 209 + let mut all_peers = self.all_peers.lock().await; 210 + let msg = match state { 211 + PeerState::Connected => { 212 + all_peers.insert(peer.0); 213 + TransportMessage::PeerConnect(peer.0) 214 + } 215 + PeerState::Disconnected => { 216 + all_peers.remove(&peer.0); 217 + TransportMessage::PeerDisconnect(peer.0) 218 + } 219 + }; 220 + drop(all_peers); 221 + self.push_incoming(Some(peer.0), msg).await; 183 222 } 184 223 185 - async fn handle_send( 224 + async fn handle_recv( 186 225 &self, 187 - socket: &mut WebRtcSocket, 188 - all_peers: &[PeerId], 189 - messages: &mut Vec<MsgPair>, 226 + (PeerId(peer), packet): MatchboxMsgPair, 227 + handler: &mut PacketHandler, 190 228 ) { 191 - let encoded_messages = messages.drain(..).filter_map(|(id, msg)| { 192 - match PacketHandler::message_to_packets(&msg) { 193 - Ok(packets) => Some((id, packets)), 194 - Err(why) => { 195 - error!("Error encoding message to packets: {why:?}"); 196 - None 197 - } 229 + match handler.consume_packet(peer, packet.into_vec()) { 230 + Ok(Some(msg)) => { 231 + self.push_incoming(Some(peer), msg).await; 198 232 } 199 - }); 233 + Ok(None) => { 234 + // Non complete message 235 + } 236 + Err(why) => { 237 + error!("Error receiving message: {why}"); 238 + } 239 + } 240 + } 200 241 201 - let channel = socket.channel_mut(0); 242 + pub async fn send_transport_message(&self, peer: Option<Uuid>, msg: TransportMessage) { 243 + let mut tx = self.msg_sender.clone(); 202 244 203 - for (peer, packets) in encoded_messages { 204 - if let Some(peer) = peer { 205 - for packet in packets { 206 - channel.send(packet.into_boxed_slice(), PeerId(peer)); 207 - } 208 - } else { 209 - for packet in packets { 210 - let boxed = packet.into_boxed_slice(); 211 - for peer in all_peers { 212 - channel.send(boxed.clone(), *peer); 245 + match PacketHandler::message_to_packets(&msg) { 246 + Ok(packets) => { 247 + if let Some(peer) = peer { 248 + let mut stream = futures::stream::iter( 249 + packets 250 + .into_iter() 251 + .map(|p| Ok((PeerId(peer), p.into_boxed_slice()))), 252 + ); 253 + if let Err(why) = tx.send_all(&mut stream).await { 254 + error!("Error sending packet: {why}"); 255 + } 256 + } else { 257 + let all_peers = self.all_peers.lock().await; 258 + for peer in all_peers.iter().copied() { 259 + let packets = packets.clone(); 260 + let mut stream = futures::stream::iter( 261 + packets 262 + .into_iter() 263 + .map(|p| Ok((PeerId(peer), p.into_boxed_slice()))), 264 + ); 265 + if let Err(why) = tx.send_all(&mut stream).await { 266 + error!("Error sending packet: {why}"); 267 + } 213 268 } 214 269 } 215 270 } 271 + Err(why) => { 272 + error!("Error encoding message: {why}"); 273 + } 216 274 } 217 275 } 218 276 219 - async fn handle_recv(&self, socket: &mut WebRtcSocket, handler: &mut PacketHandler) { 220 - let data = socket.channel_mut(0).receive(); 221 - let messages = data 222 - .into_iter() 223 - .filter_map( 224 - |(peer, bytes)| match handler.consume_packet(peer.0, bytes.into_vec()) { 225 - Ok(msg) => msg.map(|msg| (Some(peer.0), msg)), 226 - Err(why) => { 227 - error!("Error receiving message: {why}"); 228 - None 229 - } 230 - }, 231 - ) 232 - .collect(); 233 - self.push_many_incoming(messages).await; 277 + pub async fn recv_transport_messages(&self) -> Vec<MsgPair> { 278 + let mut incoming_rx = self.incoming.1.lock().await; 279 + let mut buffer = Vec::with_capacity(60); 280 + incoming_rx.recv_many(&mut buffer, 60).await; 281 + buffer 234 282 } 235 283 236 - pub async fn send_transport_message(&self, peer: Option<Uuid>, msg: TransportMessage) { 237 - self.outgoing 238 - .0 239 - .send((peer, msg)) 284 + #[cfg(test)] 285 + pub async fn force_recv_msg(&self) -> MsgPair { 286 + self.incoming 287 + .1 288 + .lock() 289 + .await 290 + .recv() 240 291 .await 241 - .expect("Failed to add to outgoing queue"); 292 + .expect("No messages") 242 293 } 243 294 244 - pub async fn recv_transport_messages(&self) -> Vec<MsgPair> { 245 - let mut incoming_rx = self.incoming.1.lock().await; 246 - let mut buffer = Vec::with_capacity(60); 247 - incoming_rx.recv_many(&mut buffer, 60).await; 248 - buffer 295 + #[cfg(test)] 296 + pub async fn assert_no_incoming(&self) { 297 + assert!(self.incoming.1.lock().await.is_empty()); 249 298 } 250 299 251 300 pub fn cancel(&self) { ··· 253 302 } 254 303 } 255 304 256 - impl Transport for MatchboxTransport { 305 + impl<S: SocketImpl + 'static> Transport for MatchboxTransport<S> { 257 306 fn self_id(&self) -> Uuid { 258 307 self.my_id 259 308 } ··· 292 341 Self::new(code, host).await 293 342 } 294 343 } 344 + 345 + #[cfg(test)] 346 + mod tests { 347 + 348 + use futures::{ 349 + channel::{mpsc, oneshot}, 350 + lock::Mutex as FutMutex, 351 + }; 352 + use manhunt_logic::{GameEvent, LobbyMessage, PlayerProfile}; 353 + use matchbox_socket::SignalingError; 354 + 355 + use super::*; 356 + use tokio::test; 357 + 358 + use std::{collections::HashMap, sync::Mutex as StdMutex, time::Duration}; 359 + 360 + type PeerRx = UnboundedReceiver<PeerMsg>; 361 + type PeerTx = UnboundedSender<PeerMsg>; 362 + type IdHandle = Arc<StdMutex<Option<PeerId>>>; 363 + 364 + struct MockSocket { 365 + peer_recv: PeerRx, 366 + id: IdHandle, 367 + channel: Option<MatchboxChannel>, 368 + cancel: CancellationToken, 369 + } 370 + 371 + impl MockSocket { 372 + pub fn new( 373 + peer_recv: PeerRx, 374 + channel: MatchboxChannel, 375 + id: IdHandle, 376 + ) -> ( 377 + Self, 378 + MessageLoopFuture, 379 + oneshot::Sender<LoopFutRes>, 380 + CancellationToken, 381 + ) { 382 + let (stop_tx, stop_rx) = oneshot::channel(); 383 + let cancel = CancellationToken::new(); 384 + let sock = Self { 385 + peer_recv, 386 + channel: Some(channel), 387 + id, 388 + cancel: cancel.clone(), 389 + }; 390 + 391 + let fut = Box::pin(async move { stop_rx.await.expect("Failed to recv") }); 392 + 393 + (sock, fut, stop_tx, cancel) 394 + } 395 + } 396 + 397 + impl Drop for MockSocket { 398 + fn drop(&mut self) { 399 + self.cancel.cancel(); 400 + } 401 + } 402 + 403 + impl Stream for MockSocket { 404 + type Item = (PeerId, PeerState); 405 + 406 + fn poll_next( 407 + self: Pin<&mut Self>, 408 + cx: &mut std::task::Context<'_>, 409 + ) -> std::task::Poll<Option<Self::Item>> { 410 + let mut peer_state_rx = Pin::new(&mut self.get_mut().peer_recv); 411 + peer_state_rx.as_mut().poll_next(cx) 412 + } 413 + } 414 + 415 + impl SocketImpl for MockSocket { 416 + fn new(_room_url: &str) -> (Self, MessageLoopFuture) { 417 + unreachable!("Tests should use [MatchboxTransport::from_socket_and_loop_fut]") 418 + } 419 + 420 + fn get_id(&mut self) -> Option<PeerId> { 421 + *self.id.lock().unwrap() 422 + } 423 + 424 + fn take_channel(&mut self) -> (MatchboxSender, MatchboxReceiver) { 425 + self.channel.take().expect("Channel already taken") 426 + } 427 + } 428 + 429 + type MatchboxTransport = super::MatchboxTransport<MockSocket>; 430 + 431 + struct WaitingPeer { 432 + incoming: MatchboxSender, 433 + outgoing: MatchboxReceiver, 434 + peer_tx: PeerTx, 435 + intended_id: PeerId, 436 + id_handle: IdHandle, 437 + disconnect: oneshot::Sender<LoopFutRes>, 438 + client_cancel: CancellationToken, 439 + } 440 + 441 + #[derive(Default, Debug)] 442 + struct MockSignaling { 443 + peers: HashMap< 444 + PeerId, 445 + ( 446 + PeerTx, 447 + oneshot::Sender<LoopFutRes>, 448 + CancellationToken, 449 + CancellationToken, 450 + ), 451 + >, 452 + senders: Arc<FutMutex<HashMap<PeerId, MatchboxSender>>>, 453 + } 454 + 455 + impl MockSignaling { 456 + fn new() -> Self { 457 + tokio::time::pause(); 458 + Self::default() 459 + } 460 + 461 + fn client_connect( 462 + &self, 463 + id: Uuid, 464 + ) -> ( 465 + WaitingPeer, 466 + FutPin<Result<Arc<MatchboxTransport>, anyhow::Error>>, 467 + ) { 468 + let (itx, irx) = mpsc::unbounded(); 469 + let (otx, orx) = mpsc::unbounded(); 470 + let (peer_tx, peer_rx) = mpsc::unbounded(); 471 + let id_handle = Arc::new(StdMutex::new(None)); 472 + 473 + let (sock, fut, disconnect, cancel) = 474 + MockSocket::new(peer_rx, (otx, irx), id_handle.clone()); 475 + 476 + let transport_fut = Box::pin(MatchboxTransport::from_socket_and_loop_fut(sock, fut)); 477 + 478 + let peer = WaitingPeer { 479 + incoming: itx, 480 + outgoing: orx, 481 + peer_tx, 482 + intended_id: PeerId(id), 483 + id_handle, 484 + disconnect, 485 + client_cancel: cancel, 486 + }; 487 + 488 + (peer, transport_fut) 489 + } 490 + 491 + async fn broadcast_peer_join(&mut self, source: PeerId) { 492 + let (source_sender, _, _, _) = self.peers.get(&source).expect("Source not in peers"); 493 + let mut source_sender = source_sender.clone(); 494 + let peers = self.peers.iter_mut().filter(|(k, _)| **k != source); 495 + for (id, (peer_tx, _, _, _)) in peers { 496 + peer_tx 497 + .send((source, PeerState::Connected)) 498 + .await 499 + .expect("Failed to send"); 500 + source_sender 501 + .send((*id, PeerState::Connected)) 502 + .await 503 + .expect("Failed to send"); 504 + } 505 + } 506 + 507 + async fn broadcast_peer_leave(&mut self, source: PeerId) { 508 + let peers = self.peers.iter_mut().filter(|(k, _)| **k != source); 509 + for (_, (peer_tx, _, _, _)) in peers { 510 + peer_tx 511 + .send((source, PeerState::Disconnected)) 512 + .await 513 + .expect("Failed to send"); 514 + } 515 + } 516 + 517 + /// Assign an ID to a MockSocket and set it so the future resolves 518 + async fn assign_id(&mut self, waiting: WaitingPeer) { 519 + let WaitingPeer { 520 + id_handle, 521 + intended_id, 522 + incoming, 523 + mut outgoing, 524 + peer_tx, 525 + disconnect, 526 + client_cancel, 527 + } = waiting; 528 + 529 + let cancel = CancellationToken::new(); 530 + 531 + *id_handle.lock().unwrap() = Some(intended_id); 532 + self.peers.insert( 533 + intended_id, 534 + (peer_tx, disconnect, cancel.clone(), client_cancel), 535 + ); 536 + self.senders.lock().await.insert(intended_id, incoming); 537 + self.broadcast_peer_join(intended_id).await; 538 + 539 + let senders = self.senders.clone(); 540 + 541 + tokio::spawn(async move { 542 + let id = intended_id; 543 + loop { 544 + tokio::select! { 545 + biased; 546 + 547 + _ = cancel.cancelled() => { break; } 548 + 549 + Some((peer, packet)) = outgoing.next() => { 550 + let mut senders = senders.lock().await; 551 + let sender = senders.get_mut(&peer).expect("Failed to find peer"); 552 + sender.send((id, packet)).await.expect("Failed to send"); 553 + } 554 + } 555 + } 556 + }); 557 + } 558 + 559 + async fn disconnect_peer(&mut self, id: Uuid, res: LoopFutRes) { 560 + let (_, dc, cancel, _) = self.peers.remove(&PeerId(id)).expect("Peer not connected"); 561 + cancel.cancel(); 562 + dc.send(res).expect("Failed to send dc"); 563 + self.broadcast_peer_leave(PeerId(id)).await; 564 + } 565 + 566 + async fn wait_for_socket_drop(&self, id: Uuid) { 567 + let cancel = self.peers.get(&PeerId(id)).unwrap().3.clone(); 568 + cancel.cancelled().await; 569 + } 570 + 571 + async fn wait_for_client_disconnected(&mut self, id: Uuid) { 572 + self.wait_for_socket_drop(id).await; 573 + self.disconnect_peer(id, Ok(())).await; 574 + } 575 + 576 + async fn wait(&self) { 577 + tokio::time::sleep(Duration::from_millis(1)).await; 578 + } 579 + 580 + async fn quick_join(&mut self, id: Uuid) -> Arc<MatchboxTransport> { 581 + let (wait, fut) = self.client_connect(id); 582 + self.assign_id(wait).await; 583 + fut.await.expect("Transport init failed") 584 + } 585 + } 586 + 587 + const fn id(x: u128) -> Uuid { 588 + Uuid::from_u128(x) 589 + } 590 + 591 + #[test] 592 + async fn test_full_loop() { 593 + let mut sig = MockSignaling::new(); 594 + 595 + let (wait, fut) = sig.client_connect(id(1)); 596 + 597 + sig.assign_id(wait).await; 598 + 599 + let transport = fut.await.expect("Tansport failed to initialize"); 600 + 601 + assert_eq!(transport.my_id, id(1)); 602 + 603 + transport.disconnect().await; 604 + 605 + sig.wait_for_client_disconnected(id(1)).await; 606 + } 607 + 608 + #[test] 609 + async fn test_dc_pre_assign() { 610 + let sig = MockSignaling::new(); 611 + 612 + let (wait, fut) = sig.client_connect(id(1)); 613 + 614 + wait.disconnect.send(Ok(())).expect("Failed to send"); 615 + 616 + let res = fut.await; 617 + 618 + assert!(res.is_err()); 619 + assert!(wait.incoming.is_closed()); 620 + assert!(wait.peer_tx.is_closed()); 621 + assert!(wait.client_cancel.is_cancelled()); 622 + } 623 + 624 + #[test] 625 + async fn test_err_pre_assign() { 626 + let sig = MockSignaling::new(); 627 + 628 + let (wait, fut) = sig.client_connect(id(1)); 629 + 630 + wait.disconnect 631 + .send(Err(SocketError::Disconnected( 632 + SignalingError::UnknownFormat, 633 + ))) 634 + .expect("Failed to send"); 635 + 636 + let res = fut.await; 637 + 638 + assert!(res.is_err()); 639 + assert!(wait.incoming.is_closed()); 640 + assert!(wait.peer_tx.is_closed()); 641 + assert!(wait.client_cancel.is_cancelled()); 642 + } 643 + 644 + #[test] 645 + async fn test_graceful_disconnect() { 646 + let mut sig = MockSignaling::new(); 647 + 648 + let (wait, fut) = sig.client_connect(id(1)); 649 + 650 + let can = wait.client_cancel.clone(); 651 + 652 + sig.assign_id(wait).await; 653 + 654 + let transport = fut.await.expect("Transport init failed"); 655 + 656 + sig.disconnect_peer(id(1), Ok(())).await; 657 + 658 + let (_, disconnected) = transport 659 + .incoming 660 + .1 661 + .lock() 662 + .await 663 + .recv() 664 + .await 665 + .expect("Transport didnt send error"); 666 + 667 + assert!(matches!(disconnected, TransportMessage::Disconnected)); 668 + 669 + can.cancelled().await; 670 + 671 + assert!(transport.incoming.0.is_closed()); 672 + assert!(transport.msg_sender.is_closed()); 673 + } 674 + 675 + #[test] 676 + async fn test_error_handle() { 677 + let mut sig = MockSignaling::new(); 678 + 679 + let (wait, fut) = sig.client_connect(id(1)); 680 + 681 + let can = wait.client_cancel.clone(); 682 + 683 + sig.assign_id(wait).await; 684 + 685 + let transport = fut.await.expect("Transport init failed"); 686 + 687 + sig.disconnect_peer( 688 + id(1), 689 + Err(SocketError::Disconnected(SignalingError::UnknownFormat)), 690 + ) 691 + .await; 692 + 693 + let (_, disconnected) = transport 694 + .incoming 695 + .1 696 + .lock() 697 + .await 698 + .recv() 699 + .await 700 + .expect("Transport didnt send error"); 701 + 702 + assert!(matches!(disconnected, TransportMessage::Error(_))); 703 + 704 + // Wait for the transport to drop the socket 705 + can.cancelled().await; 706 + 707 + assert!(transport.incoming.0.is_closed()); 708 + assert!(transport.msg_sender.is_closed()); 709 + } 710 + 711 + #[test] 712 + async fn test_message_passing() { 713 + let mut sig = MockSignaling::new(); 714 + 715 + let t1 = sig.quick_join(id(1)).await; 716 + let t2 = sig.quick_join(id(2)).await; 717 + 718 + sig.wait().await; 719 + 720 + let (_, msg) = t1.force_recv_msg().await; 721 + let (_, msg2) = t2.force_recv_msg().await; 722 + 723 + assert_eq!(t1.all_peers.lock().await.len(), 1); 724 + assert_eq!(t2.all_peers.lock().await.len(), 1); 725 + assert!(matches!(msg, TransportMessage::PeerConnect(pid) if pid == id(2))); 726 + assert!(matches!(msg2, TransportMessage::PeerConnect(pid) if pid == id(1))); 727 + 728 + t1.send_transport_message(Some(id(2)), GameEvent::PlayerCaught(id(1)).into()) 729 + .await; 730 + 731 + sig.wait().await; 732 + 733 + let (_, msg) = t2.force_recv_msg().await; 734 + 735 + assert!( 736 + matches!(msg, TransportMessage::Game(ge) if matches!(*ge, GameEvent::PlayerCaught(i) if i == id(1))) 737 + ); 738 + 739 + t2.send_transport_message(None, LobbyMessage::PlayerSwitch(id(2), true).into()) 740 + .await; 741 + 742 + sig.wait().await; 743 + 744 + let (_, msg) = t1.force_recv_msg().await; 745 + 746 + assert!( 747 + matches!(msg, TransportMessage::Lobby(lm) if matches!(*lm, LobbyMessage::PlayerSwitch(i, b) if i == id(2) && b)) 748 + ); 749 + } 750 + 751 + #[test] 752 + async fn test_msg_broadcast() { 753 + let mut sig = MockSignaling::new(); 754 + 755 + let t1 = sig.quick_join(id(1)).await; 756 + let t2 = sig.quick_join(id(2)).await; 757 + let t3 = sig.quick_join(id(3)).await; 758 + let t4 = sig.quick_join(id(4)).await; 759 + 760 + sig.wait().await; 761 + 762 + let ts = [t1, t2, t3, t4]; 763 + 764 + for t in ts.iter() { 765 + assert_eq!(t.all_peers.lock().await.len(), ts.len() - 1); 766 + // Eat the PeerConnected messages 767 + for _ in 0..(ts.len() - 1) { 768 + t.force_recv_msg().await; 769 + } 770 + } 771 + 772 + ts[0] 773 + .send_transport_message(None, GameEvent::PlayerCaught(id(1)).into()) 774 + .await; 775 + 776 + sig.wait().await; 777 + 778 + ts[0].assert_no_incoming().await; 779 + 780 + for t in ts.iter().skip(1) { 781 + let (pid, msg) = t.force_recv_msg().await; 782 + assert_eq!(pid, Some(id(1))); 783 + assert!( 784 + matches!(msg, TransportMessage::Game(ge) if matches!(*ge, GameEvent::PlayerCaught(i) if i == id(1))) 785 + ); 786 + } 787 + } 788 + 789 + #[test] 790 + async fn test_direct_msg() { 791 + let mut sig = MockSignaling::new(); 792 + 793 + let t1 = sig.quick_join(id(1)).await; 794 + let t2 = sig.quick_join(id(2)).await; 795 + let t3 = sig.quick_join(id(3)).await; 796 + 797 + sig.wait().await; 798 + 799 + let ts = [t1, t2, t3]; 800 + 801 + for t in ts.iter() { 802 + assert_eq!(t.all_peers.lock().await.len(), ts.len() - 1); 803 + // Eat the PeerConnected messages 804 + for _ in 0..(ts.len() - 1) { 805 + t.force_recv_msg().await; 806 + } 807 + } 808 + 809 + ts[0] 810 + .send_transport_message(Some(id(2)), GameEvent::PlayerCaught(id(1)).into()) 811 + .await; 812 + 813 + sig.wait().await; 814 + 815 + ts[0].assert_no_incoming().await; 816 + ts[2].assert_no_incoming().await; 817 + 818 + let (pid, msg) = ts[1].force_recv_msg().await; 819 + assert_eq!(pid, Some(id(1))); 820 + assert!( 821 + matches!(msg, TransportMessage::Game(ge) if matches!(*ge, GameEvent::PlayerCaught(i) if i == id(1))) 822 + ); 823 + } 824 + 825 + #[test] 826 + async fn test_multiple_disconnect() { 827 + let mut sig = MockSignaling::new(); 828 + 829 + let t1 = sig.quick_join(id(1)).await; 830 + let t2 = sig.quick_join(id(2)).await; 831 + let t3 = sig.quick_join(id(3)).await; 832 + 833 + sig.wait().await; 834 + 835 + let ts = [t1, t2, t3]; 836 + 837 + for t in ts.iter() { 838 + assert_eq!(t.all_peers.lock().await.len(), ts.len() - 1); 839 + // Eat the PeerConnected messages 840 + for _ in 0..(ts.len() - 1) { 841 + t.force_recv_msg().await; 842 + } 843 + } 844 + 845 + ts[0].disconnect().await; 846 + 847 + sig.wait_for_client_disconnected(id(1)).await; 848 + 849 + sig.wait().await; 850 + 851 + for t in ts.iter().skip(1) { 852 + let (_, msg) = t.force_recv_msg().await; 853 + 854 + let all = t.all_peers.lock().await; 855 + assert!(!all.contains(&id(1))); 856 + assert!(matches!(msg, TransportMessage::PeerDisconnect(i) if i == id(1))); 857 + } 858 + } 859 + 860 + #[test] 861 + async fn test_big_message() { 862 + // Just a random string that's bigger than the max packet size 863 + let pfp = "vbnsj".repeat(65560); 864 + let pfp2 = pfp.clone(); 865 + 866 + let mut sig = MockSignaling::new(); 867 + 868 + let t1 = sig.quick_join(id(1)).await; 869 + let t2 = sig.quick_join(id(2)).await; 870 + 871 + sig.wait().await; 872 + 873 + t1.force_recv_msg().await; 874 + t2.force_recv_msg().await; 875 + 876 + t1.send_transport_message( 877 + Some(id(2)), 878 + LobbyMessage::PlayerSync( 879 + id(1), 880 + PlayerProfile { 881 + display_name: "asdf".to_string(), 882 + pfp_base64: Some(pfp2), 883 + }, 884 + ) 885 + .into(), 886 + ) 887 + .await; 888 + 889 + sig.wait().await; 890 + 891 + let (_, msg) = t2.force_recv_msg().await; 892 + 893 + if let TransportMessage::Lobby(le) = msg { 894 + if let LobbyMessage::PlayerSync(i, p) = *le { 895 + assert_eq!(i, id(1)); 896 + assert_eq!(p.display_name, "asdf".to_string()); 897 + assert_eq!(p.pfp_base64, Some(pfp)); 898 + } else { 899 + panic!("Incorrect lobby message"); 900 + } 901 + } else { 902 + panic!("Incorrect message"); 903 + } 904 + } 905 + }
+1 -3
manhunt-transport/src/packets.rs
··· 1 1 use std::collections::HashMap; 2 2 3 3 use anyhow::{anyhow, bail}; 4 - use manhunt_logic::{prelude::*, TransportMessage}; 4 + use manhunt_logic::{TransportMessage, prelude::*}; 5 5 use serde::{Deserialize, Serialize}; 6 6 use uuid::Uuid; 7 7 ··· 174 174 assert_eq!(data.len(), 1); 175 175 176 176 let data = data.into_iter().next().unwrap(); 177 - 178 - println!("dat: {data:?}"); 179 177 180 178 let decoded = handler 181 179 .consume_packet(Uuid::default(), data)
+12 -6
manhunt-transport/src/server.rs
··· 66 66 .await 67 67 .context("Could not send request")? 68 68 .error_for_status() 69 - .context("Server returned error")?; 69 + .context("Server returned an error")?; 70 70 Ok(()) 71 71 } 72 72 73 - pub fn generate_join_code() -> String { 74 - // 5 character sequence of A-Z 75 - (0..5) 76 - .map(|_| (b'A' + rand::random_range(0..26)) as char) 77 - .collect::<String>() 73 + const SERVER_GEN_CODE_URL: &str = const_str::concat!(SERVER_HTTP_URL, "/gen_code"); 74 + 75 + pub async fn request_room_code() -> Result<String> { 76 + reqwest::get(SERVER_GEN_CODE_URL) 77 + .await 78 + .context("Failed to contact signaling server")? 79 + .error_for_status() 80 + .context("Server returned an error")? 81 + .text() 82 + .await 83 + .context("Failed to decode response") 78 84 }
+4 -1
nix/packages/manhunt-signaling.nix
··· 9 9 toSource { 10 10 root = ../../.; 11 11 fileset = unions [ 12 - ../../backend 12 + ../../manhunt-app 13 13 ../../manhunt-logic 14 14 ../../manhunt-transport 15 15 ../../manhunt-signaling 16 + ../../manhunt-testing 16 17 ../../Cargo.toml 17 18 ../../Cargo.lock 18 19 ]; ··· 24 25 cp ${../../Cargo.lock} Cargo.lock 25 26 chmod +w Cargo.lock 26 27 ''; 28 + 29 + useNextest = true; 27 30 28 31 meta = with lib; { 29 32 description = "Signaling server for Manhunt app";
+13 -8
nix/packages/manhunt.nix
··· 7 7 librsvg, 8 8 webkitgtk_4_1, 9 9 pkg-config, 10 - wrapGAppsHook, 10 + wrapGAppsHook3, 11 11 copyDesktopItems, 12 12 rustPlatform, 13 13 manhunt-frontend, ··· 19 19 toSource { 20 20 root = ../../.; 21 21 fileset = unions [ 22 - ../../backend 22 + ../../manhunt-app 23 23 ../../manhunt-logic 24 24 ../../manhunt-transport 25 25 ../../manhunt-signaling 26 + ../../manhunt-testing 26 27 ../../Cargo.toml 27 28 ../../Cargo.lock 28 29 ]; 29 30 }; 30 31 cargoLock.lockFile = ../../Cargo.lock; 31 - buildAndTestSubdir = "backend"; 32 + buildAndTestSubdir = "manhunt-app"; 32 33 buildFeatures = [ 33 34 "tauri/custom-protocol" 34 35 ]; ··· 36 37 nativeBuildInputs = [ 37 38 pkg-config 38 39 copyDesktopItems 39 - wrapGAppsHook 40 + wrapGAppsHook3 40 41 ]; 41 42 42 43 buildInputs = [ ··· 49 50 ]; 50 51 51 52 postPatch = '' 52 - substituteInPlace backend/tauri.conf.json \ 53 + substituteInPlace manhunt-app/tauri.conf.json \ 53 54 --replace-fail '"frontendDist": "../frontend/dist"' '"frontendDist": "${manhunt-frontend}"' 54 55 ''; 55 56 57 + useNextest = true; 58 + 59 + cargoTestFlags = "-p manhunt-logic -p manhunt-transport -p manhunt-app"; 60 + 56 61 postInstall = '' 57 - install -DT backend/icons/128x128@2x.png $out/share/icons/hicolor/256x256@2/apps/manhunt.png 58 - install -DT backend/icons/128x128.png $out/share/icons/hicolor/128x128/apps/manhunt.png 59 - install -DT backend/icons/32x32.png $out/share/icons/hicolor/32x32/apps/manhunt.png 62 + install -DT manhunt-app/icons/128x128@2x.png $out/share/icons/hicolor/256x256@2/apps/manhunt.png 63 + install -DT manhunt-app/icons/128x128.png $out/share/icons/hicolor/128x128/apps/manhunt.png 64 + install -DT manhunt-app/icons/32x32.png $out/share/icons/hicolor/32x32/apps/manhunt.png 60 65 ''; 61 66 62 67 meta = with lib; {