├── .gitignore ├── .release-plz.toml ├── .rustfmt.toml ├── .editorconfig ├── src ├── source │ ├── mod.rs │ └── imp.rs ├── sink │ ├── mod.rs │ └── imp.rs └── lib.rs ├── .github └── workflows │ ├── release.yml │ └── pr.yml ├── LICENSE-MIT ├── Cargo.toml ├── CHANGELOG.md ├── README.md ├── justfile ├── CLAUDE.md ├── LICENSE-APACHE └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | target/ 3 | *.mp4 4 | *.fmp4 5 | debug/ 6 | -------------------------------------------------------------------------------- /.release-plz.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | dependencies_update = true 3 | -------------------------------------------------------------------------------- /.rustfmt.toml: -------------------------------------------------------------------------------- 1 | # i die on this hill 2 | hard_tabs = true 3 | 4 | max_width = 120 5 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | trim_trailing_whitespace = true 7 | insert_final_newline = true 8 | indent_style = tab 9 | indent_size = 4 10 | max_line_length = 120 11 | 12 | # YAML doesn't support hard tabs 🙃 13 | [**.yml] 14 | indent_style = space 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /src/source/mod.rs: -------------------------------------------------------------------------------- 1 | use gst::glib; 2 | use gst::prelude::*; 3 | 4 | mod imp; 5 | 6 | glib::wrapper! { 7 | pub struct HangSrc(ObjectSubclass) @extends gst::Bin, gst::Element, gst::Object; 8 | } 9 | 10 | pub fn register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> { 11 | gst::Element::register(Some(plugin), "hangsrc", gst::Rank::NONE, HangSrc::static_type()) 12 | } 13 | -------------------------------------------------------------------------------- /src/sink/mod.rs: -------------------------------------------------------------------------------- 1 | use gst::glib; 2 | use gst::prelude::*; 3 | 4 | mod imp; 5 | 6 | glib::wrapper! { 7 | pub struct HangSink(ObjectSubclass) @extends gst_base::BaseSink, gst::Element, gst::Object; 8 | } 9 | 10 | pub fn register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> { 11 | gst::Element::register(Some(plugin), "hangsink", gst::Rank::NONE, HangSink::static_type()) 12 | } 13 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: release 2 | 3 | permissions: 4 | pull-requests: write 5 | contents: write 6 | 7 | on: 8 | push: 9 | branches: 10 | - main 11 | 12 | jobs: 13 | release: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - name: Checkout repository 17 | uses: actions/checkout@v4 18 | with: 19 | fetch-depth: 0 20 | - name: Install Rust toolchain 21 | uses: dtolnay/rust-toolchain@stable 22 | - name: Run release-plz 23 | uses: MarcoIeni/release-plz-action@v0.5 24 | env: 25 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 26 | CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} 27 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Luke Curley 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | use gst::glib; 2 | 3 | mod sink; 4 | mod source; 5 | 6 | use tracing::level_filters::LevelFilter; 7 | use tracing_subscriber::EnvFilter; 8 | 9 | pub fn plugin_init(plugin: &gst::Plugin) -> Result<(), glib::BoolError> { 10 | sink::register(plugin)?; 11 | source::register(plugin)?; 12 | 13 | let filter = EnvFilter::builder() 14 | .with_default_directive(LevelFilter::INFO.into()) 15 | .from_env_lossy() // Allow overriding with RUST_LOG 16 | .add_directive("h2=warn".parse().unwrap()) 17 | .add_directive("quinn=info".parse().unwrap()) 18 | .add_directive("tracing::span=off".parse().unwrap()) 19 | .add_directive("tracing::span::active=off".parse().unwrap()); 20 | 21 | let logger = tracing_subscriber::FmtSubscriber::builder() 22 | .with_writer(std::io::stderr) 23 | .with_env_filter(filter) 24 | .finish(); 25 | 26 | tracing::subscriber::set_global_default(logger).unwrap(); 27 | Ok(()) 28 | } 29 | 30 | gst::plugin_define!( 31 | hang, 32 | env!("CARGO_PKG_DESCRIPTION"), 33 | plugin_init, 34 | concat!(env!("CARGO_PKG_VERSION"), "-", env!("COMMIT_ID")), 35 | "Apache 2.0", 36 | env!("CARGO_PKG_NAME"), 37 | env!("CARGO_PKG_NAME"), 38 | env!("CARGO_PKG_REPOSITORY"), 39 | env!("BUILD_REL_DATE") 40 | ); 41 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "hang-gst" 3 | description = "Media over QUIC - Gstreamer plugin" 4 | authors = ["Luke Curley"] 5 | repository = "https://github.com/kixelated/hang-gst" 6 | license = "MIT OR Apache-2.0" 7 | 8 | version = "0.2.2" 9 | edition = "2021" 10 | 11 | keywords = ["quic", "http3", "webtransport", "media", "live"] 12 | categories = ["multimedia", "network-programming", "web-programming"] 13 | 14 | [lib] 15 | name = "gsthang" 16 | crate-type = ["cdylib", "rlib"] 17 | path = "src/lib.rs" 18 | 19 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 20 | 21 | [dependencies] 22 | # Using local path dependencies from moq-dev 23 | hang = "0.9.0" 24 | moq-lite = "0.10.1" 25 | moq-native = "0.10.1" 26 | 27 | anyhow = { version = "1", features = ["backtrace"] } 28 | bytes = "1" 29 | gst = { package = "gstreamer", version = "0.23" } 30 | gst-base = { package = "gstreamer-base", version = "0.23" } 31 | #gst-app = { package = "gstreamer-app", version = "0.23", features = ["v1_20"] } 32 | 33 | once_cell = "1" 34 | tokio = { version = "1", features = ["full"] } 35 | tracing = "0.1.41" 36 | tracing-subscriber = "0.3.19" 37 | url = "2" 38 | 39 | [build-dependencies] 40 | gst-plugin-version-helper = "0.8" 41 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [Unreleased] 9 | 10 | ## [0.2.2] - 2025-08-12 11 | 12 | ### Other 13 | 14 | - Support an array of authorized paths 15 | - Revamp the Producer/Consumer API for moq_lite 16 | 17 | ## [0.2.1] - 2025-07-22 18 | 19 | ### Other 20 | 21 | - Create a type-safe Path wrapper for Javascript 22 | - Add an ANNOUNCE_INIT message 23 | 24 | ## [0.1.2] - 2025-06-20 25 | 26 | ### Other 27 | 28 | - updated the following local packages: hang 29 | 30 | ## [0.1.1] - 2025-06-03 31 | 32 | ### Other 33 | 34 | - Add support for authentication tokens ([#399](https://github.com/kixelated/moq/pull/399)) 35 | - Add location tracks, fix some bugs, switch to nix ([#401](https://github.com/kixelated/moq/pull/401)) 36 | - Move config to a separate field to match the specification. ([#387](https://github.com/kixelated/moq/pull/387)) 37 | 38 | ## [0.1.0](https://github.com/kixelated/moq/releases/tag/hang-gst-v0.1.0) - 2025-05-21 39 | 40 | ### Other 41 | 42 | - Split into Rust/Javascript halves and rebrand as moq-lite/hang ([#376](https://github.com/kixelated/moq/pull/376)) 43 | -------------------------------------------------------------------------------- /.github/workflows/pr.yml: -------------------------------------------------------------------------------- 1 | name: pr 2 | 3 | on: 4 | pull_request: 5 | branches: ["main"] 6 | 7 | env: 8 | CARGO_TERM_COLOR: always 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v3 16 | 17 | # Install Rust with clippy/rustfmt 18 | - uses: actions-rust-lang/setup-rust-toolchain@v1 19 | with: 20 | components: clippy, rustfmt 21 | 22 | # We need gstreamer installed to compile this repo 23 | - name: Setup GStreamer 24 | run: | 25 | sudo apt-get update 26 | sudo apt-get remove libunwind-* 27 | sudo apt-get install -y \ 28 | libgstreamer1.0-dev \ 29 | libgstreamer-plugins-base1.0-dev \ 30 | libgstreamer-plugins-bad1.0-dev \ 31 | gstreamer1.0-plugins-base \ 32 | gstreamer1.0-plugins-good \ 33 | gstreamer1.0-plugins-bad \ 34 | gstreamer1.0-plugins-ugly \ 35 | gstreamer1.0-libav \ 36 | gstreamer1.0-tools \ 37 | gstreamer1.0-x \ 38 | gstreamer1.0-alsa \ 39 | gstreamer1.0-gl \ 40 | gstreamer1.0-gtk3 \ 41 | gstreamer1.0-qt5 \ 42 | gstreamer1.0-pulseaudio 43 | 44 | # Make sure u guys don't write bad code 45 | - run: cargo test --verbose 46 | - run: cargo clippy --no-deps 47 | - run: cargo fmt --check 48 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | Media over QUIC 3 |

4 | 5 | A GStreamer plugin for [MoQ (Media over QUIC)](https://github.com/kixelated/moq) that enables publishing and consuming media streams using the MoQ protocol. 6 | 7 | This plugin was originally part of the main MoQ repository but has been separated to avoid requiring GStreamer as a build dependency. 8 | 9 | # Usage 10 | ## Requirements 11 | - [Rustup](https://www.rust-lang.org/tools/install) 12 | - [Just](https://github.com/casey/just?tab=readme-ov-file#installation) 13 | 14 | ## Setup 15 | We use `just` to simplify the development process. 16 | Check out the [Justfile](justfile) or run `just` to see the available commands. 17 | 18 | Install any other required tools: 19 | ```sh 20 | just setup 21 | ``` 22 | 23 | ## Development 24 | First make sure you have a local moq-relay server running: 25 | ```sh 26 | just relay 27 | ``` 28 | 29 | Now you can publish and subscribe to a video: 30 | ```sh 31 | # Publish to a localhost moq-relay server 32 | just pub-gst bbb 33 | 34 | # Subscribe from a localhost moq-relay server 35 | just sub bbb 36 | ``` 37 | 38 | # License 39 | 40 | Licensed under either: 41 | 42 | - Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) 43 | - MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) 44 | -------------------------------------------------------------------------------- /justfile: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env just --justfile 2 | 3 | # Using Just: https://github.com/casey/just?tab=readme-ov-file#installation 4 | 5 | export RUST_BACKTRACE := "1" 6 | export RUST_LOG := "info" 7 | export URL := "http://localhost:4443" 8 | #export GST_DEBUG:="*:4" 9 | 10 | # List all of the available commands. 11 | default: 12 | just --list 13 | 14 | # Install any required dependencies. 15 | setup: 16 | # Upgrade Rust 17 | rustup update 18 | 19 | # Make sure the right components are installed. 20 | rustup component add rustfmt clippy 21 | 22 | # Install cargo binstall if needed. 23 | cargo install cargo-binstall 24 | 25 | # Install cargo shear if needed. 26 | cargo binstall --no-confirm cargo-shear 27 | 28 | # Download the video and convert it to a fragmented MP4 that we can stream 29 | download name url: 30 | if [ ! -f dev/{{name}}.mp4 ]; then \ 31 | wget {{url}} -O dev/{{name}}.mp4; \ 32 | fi 33 | 34 | if [ ! -f dev/{{name}}.fmp4 ]; then \ 35 | ffmpeg -i dev/{{name}}.mp4 \ 36 | -c copy \ 37 | -f mp4 -movflags cmaf+separate_moof+delay_moov+skip_trailer+frag_every_frame \ 38 | dev/{{name}}.fmp4; \ 39 | fi 40 | 41 | # Publish a video using gstreamer to the localhost relay server 42 | pub-gst broadcast: (download "bbb" "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4") 43 | # Build the plugins 44 | cargo build 45 | 46 | # Run gstreamer and pipe the output to our plugin 47 | GST_PLUGIN_PATH="${PWD}/target/debug${GST_PLUGIN_PATH:+:$GST_PLUGIN_PATH}" \ 48 | gst-launch-1.0 -v -e multifilesrc location="dev/bbb.fmp4" loop=true ! qtdemux name=demux \ 49 | demux.video_0 ! h264parse ! queue ! identity sync=true ! isofmp4mux name=mux chunk-duration=1 fragment-duration=1 ! hangsink url="$URL" broadcast="{{broadcast}}" tls-disable-verify=true \ 50 | demux.audio_0 ! aacparse ! queue ! mux. 51 | 52 | # Subscribe to a video using gstreamer 53 | sub broadcast: 54 | # Build the plugins 55 | cargo build 56 | 57 | # Run gstreamer and pipe the output to our plugin 58 | # This will render the video to the screen 59 | GST_PLUGIN_PATH="${PWD}/target/debug${GST_PLUGIN_PATH:+:$GST_PLUGIN_PATH}" \ 60 | gst-launch-1.0 -v -e hangsrc url="$URL" broadcast="{{broadcast}}" tls-disable-verify=true ! decodebin ! videoconvert ! autovideosink 61 | 62 | # Run the CI checks 63 | check $RUSTFLAGS="-D warnings": 64 | cargo check --all-targets 65 | cargo clippy --all-targets -- -D warnings 66 | cargo fmt -- --check 67 | cargo shear # requires: cargo binstall cargo-shear 68 | 69 | # Run any CI tests 70 | test $RUSTFLAGS="-D warnings": 71 | cargo test 72 | 73 | # Automatically fix some issues. 74 | fix: 75 | cargo fix --allow-staged --all-targets --all-features 76 | cargo clippy --fix --allow-staged --all-targets --all-features 77 | cargo fmt --all 78 | cargo shear --fix 79 | 80 | # Upgrade any tooling 81 | upgrade: 82 | rustup upgrade 83 | 84 | # Install cargo-upgrades if needed. 85 | cargo install cargo-upgrades cargo-edit 86 | cargo upgrade 87 | 88 | # Build the plugins 89 | build: 90 | cargo build 91 | -------------------------------------------------------------------------------- /CLAUDE.md: -------------------------------------------------------------------------------- 1 | # CLAUDE.md 2 | 3 | This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. 4 | 5 | ## Project Overview 6 | 7 | This is a GStreamer plugin for Media over QUIC (MoQ), written in Rust. It provides `hangsink` and `hangsrc` elements that enable publishing and subscribing to media streams using the MoQ protocol over QUIC transport. The project has been renamed from moq-gst to hang-gst and uses the updated hang/moq-lite dependencies. 8 | 9 | ## Development Setup 10 | 11 | ### Prerequisites 12 | - Rust toolchain (via `rustup`) 13 | - Just command runner 14 | - A running moq-relay server from [moq](https://github.com/kixelated/moq) 15 | 16 | ### Initial Setup 17 | ```bash 18 | # Install dependencies and tools 19 | just setup 20 | 21 | # To see all available commands 22 | just 23 | ``` 24 | 25 | ## Common Commands 26 | 27 | ### Building 28 | ```bash 29 | # Build the plugin 30 | just build 31 | # or 32 | cargo build 33 | ``` 34 | 35 | ### Testing and Quality Checks 36 | ```bash 37 | # Run all CI checks (clippy, fmt, cargo check) 38 | just check 39 | 40 | # Run tests 41 | just test 42 | 43 | # Auto-fix issues 44 | just fix 45 | ``` 46 | 47 | ### Development Workflow 48 | ```bash 49 | # Start a relay server (in moq repo) 50 | just relay 51 | 52 | # Publish video stream with broadcast name 53 | just pub-gst bbb 54 | 55 | # Subscribe to video stream with broadcast name 56 | just sub bbb 57 | ``` 58 | 59 | ## Architecture 60 | 61 | ### Plugin Structure 62 | - **lib.rs**: Main plugin entry point, registers both sink and source elements as "hang" plugin 63 | - **sink/**: Hang sink element (`hangsink`) for publishing streams 64 | - `mod.rs`: GStreamer element wrapper for HangSink 65 | - `imp.rs`: Core implementation with async Tokio runtime 66 | - **source/**: Hang source element (`hangsrc`) for consuming streams 67 | - `mod.rs`: GStreamer element wrapper for HangSrc 68 | - `imp.rs`: Core implementation with async Tokio runtime 69 | 70 | ### Key Dependencies 71 | - **hang**: Higher-level hang protocol utilities and CMAF handling (local path dependency) 72 | - **moq-native**: Core MoQ protocol implementation with QUIC/TLS (local path dependency) 73 | - **gstreamer**: GStreamer bindings for Rust 74 | - **tokio**: Async runtime (single-threaded worker pool) 75 | 76 | ### Plugin Elements 77 | - `hangsink`: BaseSink element that accepts media data and publishes via MoQ with broadcast name 78 | - `hangsrc`: Bin element that receives MoQ streams and outputs GStreamer buffers 79 | 80 | Both elements use a shared Tokio runtime and support TLS configuration options. They require broadcast names for operation. 81 | 82 | ## Environment Variables 83 | - `RUST_LOG=info`: Controls logging level 84 | - `URL=http://localhost:4443`: Default relay server URL 85 | - `GST_PLUGIN_PATH`: Must include the built plugin directory 86 | 87 | ## Notable Changes from moq-gst 88 | - Renamed from moq-gst to hang-gst 89 | - Element names changed from moqsink/moqsrc to hangsink/hangsrc 90 | - Added broadcast parameter requirement for both elements 91 | - Updated dependencies to use local hang and moq-native packages 92 | - Updated justfile commands to include broadcast parameters -------------------------------------------------------------------------------- /src/sink/imp.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Context as _; 2 | use bytes::BytesMut; 3 | use gst::glib; 4 | use gst::prelude::*; 5 | use gst::subclass::prelude::*; 6 | use gst_base::subclass::prelude::*; 7 | 8 | use hang::moq_lite; 9 | 10 | use once_cell::sync::Lazy; 11 | use std::sync::Arc; 12 | use std::sync::Mutex; 13 | use url::Url; 14 | 15 | pub static RUNTIME: Lazy = Lazy::new(|| { 16 | tokio::runtime::Builder::new_multi_thread() 17 | .enable_all() 18 | .worker_threads(1) 19 | .build() 20 | .unwrap() 21 | }); 22 | 23 | #[derive(Default, Clone)] 24 | struct Settings { 25 | pub url: Option, 26 | pub broadcast: Option, 27 | pub tls_disable_verify: bool, 28 | } 29 | 30 | #[derive(Default)] 31 | struct State { 32 | pub media: Option, 33 | pub buffer: BytesMut, 34 | } 35 | 36 | #[derive(Default)] 37 | pub struct HangSink { 38 | settings: Mutex, 39 | state: Arc>, 40 | } 41 | 42 | #[glib::object_subclass] 43 | impl ObjectSubclass for HangSink { 44 | const NAME: &'static str = "HangSink"; 45 | type Type = super::HangSink; 46 | type ParentType = gst_base::BaseSink; 47 | 48 | fn new() -> Self { 49 | Self::default() 50 | } 51 | } 52 | 53 | impl ObjectImpl for HangSink { 54 | fn properties() -> &'static [glib::ParamSpec] { 55 | static PROPERTIES: Lazy> = Lazy::new(|| { 56 | vec![ 57 | glib::ParamSpecString::builder("url") 58 | .nick("Source URL") 59 | .blurb("Connect to the given URL") 60 | .build(), 61 | glib::ParamSpecString::builder("broadcast") 62 | .nick("Broadcast") 63 | .blurb("The name of the broadcast to publish") 64 | .build(), 65 | glib::ParamSpecBoolean::builder("tls-disable-verify") 66 | .nick("TLS disable verify") 67 | .blurb("Disable TLS verification") 68 | .default_value(false) 69 | .build(), 70 | ] 71 | }); 72 | PROPERTIES.as_ref() 73 | } 74 | 75 | fn set_property(&self, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec) { 76 | let mut settings = self.settings.lock().unwrap(); 77 | 78 | match pspec.name() { 79 | "url" => settings.url = value.get().unwrap(), 80 | "broadcast" => settings.broadcast = value.get().unwrap(), 81 | "tls-disable-verify" => settings.tls_disable_verify = value.get().unwrap(), 82 | _ => unimplemented!(), 83 | } 84 | } 85 | 86 | fn property(&self, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { 87 | let settings = self.settings.lock().unwrap(); 88 | 89 | match pspec.name() { 90 | "url" => settings.url.to_value(), 91 | "broadcast" => settings.broadcast.to_value(), 92 | "tls-disable-verify" => settings.tls_disable_verify.to_value(), 93 | _ => unimplemented!(), 94 | } 95 | } 96 | } 97 | 98 | impl GstObjectImpl for HangSink {} 99 | 100 | impl ElementImpl for HangSink { 101 | fn metadata() -> Option<&'static gst::subclass::ElementMetadata> { 102 | static ELEMENT_METADATA: Lazy = Lazy::new(|| { 103 | gst::subclass::ElementMetadata::new( 104 | "MoQ Sink", 105 | "Sink/Network/MoQ", 106 | "Transmits media over the network via MoQ", 107 | "Luke Curley ", 108 | ) 109 | }); 110 | 111 | Some(&*ELEMENT_METADATA) 112 | } 113 | 114 | fn pad_templates() -> &'static [gst::PadTemplate] { 115 | static PAD_TEMPLATES: Lazy> = Lazy::new(|| { 116 | let caps = gst::Caps::builder("video/quicktime") 117 | .field("variant", "iso-fragmented") 118 | .build(); 119 | 120 | let pad_template = 121 | gst::PadTemplate::new("sink", gst::PadDirection::Sink, gst::PadPresence::Always, &caps).unwrap(); 122 | 123 | vec![pad_template] 124 | }); 125 | PAD_TEMPLATES.as_ref() 126 | } 127 | } 128 | 129 | impl BaseSinkImpl for HangSink { 130 | fn start(&self) -> Result<(), gst::ErrorMessage> { 131 | let _guard = RUNTIME.enter(); 132 | self.setup() 133 | .map_err(|e| gst::error_msg!(gst::ResourceError::Failed, ["Failed to connect: {}", e])) 134 | } 135 | 136 | fn stop(&self) -> Result<(), gst::ErrorMessage> { 137 | Ok(()) 138 | } 139 | 140 | fn render(&self, buffer: &gst::Buffer) -> Result { 141 | let _guard = RUNTIME.enter(); 142 | let data = buffer.map_readable().map_err(|_| gst::FlowError::Error)?; 143 | 144 | let mut state = self.state.lock().unwrap(); 145 | 146 | // Append incoming data to our buffer 147 | state.buffer.extend_from_slice(data.as_slice()); 148 | 149 | // Take media out temporarily to avoid borrow conflict 150 | let mut media = state.media.take().expect("not initialized"); 151 | 152 | // Try to decode what we have buffered 153 | let result = media.decode(&mut state.buffer); 154 | 155 | // Put media back 156 | state.media = Some(media); 157 | 158 | if let Err(e) = result { 159 | gst::error!(gst::CAT_DEFAULT, "Failed to decode: {}", e); 160 | return Err(gst::FlowError::Error); 161 | } 162 | 163 | Ok(gst::FlowSuccess::Ok) 164 | } 165 | } 166 | 167 | impl HangSink { 168 | fn setup(&self) -> anyhow::Result<()> { 169 | let settings = self.settings.lock().unwrap(); 170 | 171 | let url = settings.url.as_ref().expect("url is required"); 172 | let url = Url::parse(url).context("invalid URL")?; 173 | 174 | // TODO support TLS certs and other options 175 | let client = moq_native::ClientConfig { 176 | tls: moq_native::ClientTls { 177 | disable_verify: Some(settings.tls_disable_verify), 178 | ..Default::default() 179 | }, 180 | ..Default::default() 181 | } 182 | .init()?; 183 | 184 | RUNTIME.block_on(async move { 185 | let session = client.connect(url.clone()).await.expect("failed to connect"); 186 | 187 | let origin = moq_lite::Origin::produce(); 188 | let broadcast = moq_lite::Broadcast::produce(); 189 | 190 | let name = settings.broadcast.as_ref().expect("broadcast is required"); 191 | origin.producer.publish_broadcast(name, broadcast.consumer); 192 | 193 | let _session = moq_lite::Session::connect(session, origin.consumer, None) 194 | .await 195 | .expect("failed to connect"); 196 | 197 | let media = hang::import::Fmp4::new(broadcast.producer.into()); 198 | 199 | let mut state = self.state.lock().unwrap(); 200 | state.media = Some(media); 201 | }); 202 | 203 | Ok(()) 204 | } 205 | } 206 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /src/source/imp.rs: -------------------------------------------------------------------------------- 1 | use anyhow::Context as _; 2 | use gst::glib; 3 | use gst::prelude::*; 4 | use gst::subclass::prelude::*; 5 | 6 | use hang::moq_lite; 7 | 8 | use once_cell::sync::Lazy; 9 | use std::sync::LazyLock; 10 | use std::sync::Mutex; 11 | 12 | static CAT: Lazy = 13 | Lazy::new(|| gst::DebugCategory::new("hang-src", gst::DebugColorFlags::empty(), Some("Hang Source Element"))); 14 | 15 | pub static RUNTIME: Lazy = Lazy::new(|| { 16 | tokio::runtime::Builder::new_multi_thread() 17 | .enable_all() 18 | .worker_threads(1) 19 | .build() 20 | .unwrap() 21 | }); 22 | 23 | #[derive(Default, Clone)] 24 | struct Settings { 25 | pub url: Option, 26 | pub broadcast: Option, 27 | pub tls_disable_verify: bool, 28 | } 29 | 30 | #[derive(Default)] 31 | pub struct HangSrc { 32 | settings: Mutex, 33 | } 34 | 35 | #[glib::object_subclass] 36 | impl ObjectSubclass for HangSrc { 37 | const NAME: &'static str = "HangSrc"; 38 | type Type = super::HangSrc; 39 | type ParentType = gst::Bin; 40 | 41 | fn new() -> Self { 42 | Self::default() 43 | } 44 | } 45 | 46 | impl GstObjectImpl for HangSrc {} 47 | impl BinImpl for HangSrc {} 48 | 49 | impl ObjectImpl for HangSrc { 50 | fn properties() -> &'static [glib::ParamSpec] { 51 | static PROPERTIES: Lazy> = Lazy::new(|| { 52 | vec![ 53 | glib::ParamSpecString::builder("url") 54 | .nick("Source URL") 55 | .blurb("Connect to the given URL") 56 | .build(), 57 | glib::ParamSpecString::builder("broadcast") 58 | .nick("Broadcast") 59 | .blurb("The name of the broadcast to consume") 60 | .build(), 61 | glib::ParamSpecBoolean::builder("tls-disable-verify") 62 | .nick("TLS disable verify") 63 | .blurb("Disable TLS verification") 64 | .default_value(false) 65 | .build(), 66 | ] 67 | }); 68 | PROPERTIES.as_ref() 69 | } 70 | 71 | fn set_property(&self, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec) { 72 | let mut settings = self.settings.lock().unwrap(); 73 | 74 | match pspec.name() { 75 | "url" => settings.url = value.get().unwrap(), 76 | "broadcast" => settings.broadcast = value.get().unwrap(), 77 | "tls-disable-verify" => settings.tls_disable_verify = value.get().unwrap(), 78 | _ => unimplemented!(), 79 | } 80 | } 81 | 82 | fn property(&self, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { 83 | let settings = self.settings.lock().unwrap(); 84 | 85 | match pspec.name() { 86 | "url" => settings.url.to_value(), 87 | "broadcast" => settings.broadcast.to_value(), 88 | "tls-disable-verify" => settings.tls_disable_verify.to_value(), 89 | _ => unimplemented!(), 90 | } 91 | } 92 | } 93 | 94 | impl ElementImpl for HangSrc { 95 | fn metadata() -> Option<&'static gst::subclass::ElementMetadata> { 96 | static ELEMENT_METADATA: Lazy = Lazy::new(|| { 97 | gst::subclass::ElementMetadata::new( 98 | "MoQ Src", 99 | "Source/Network/MoQ", 100 | "Receives media over the network via MoQ", 101 | "Luke Curley ", 102 | ) 103 | }); 104 | 105 | Some(&*ELEMENT_METADATA) 106 | } 107 | 108 | fn pad_templates() -> &'static [gst::PadTemplate] { 109 | static PAD_TEMPLATES: LazyLock> = LazyLock::new(|| { 110 | let video = gst::PadTemplate::new( 111 | "video_%u", 112 | gst::PadDirection::Src, 113 | gst::PadPresence::Sometimes, 114 | &gst::Caps::new_any(), 115 | ) 116 | .unwrap(); 117 | 118 | let audio = gst::PadTemplate::new( 119 | "audio_%u", 120 | gst::PadDirection::Src, 121 | gst::PadPresence::Sometimes, 122 | &gst::Caps::new_any(), 123 | ) 124 | .unwrap(); 125 | 126 | vec![video, audio] 127 | }); 128 | 129 | PAD_TEMPLATES.as_ref() 130 | } 131 | 132 | fn change_state(&self, transition: gst::StateChange) -> Result { 133 | match transition { 134 | gst::StateChange::ReadyToPaused => { 135 | if let Err(e) = RUNTIME.block_on(self.setup()) { 136 | gst::error!(CAT, obj = self.obj(), "Failed to setup: {:?}", e); 137 | return Err(gst::StateChangeError); 138 | } 139 | // Chain up first to let the bin handle the state change 140 | let result = self.parent_change_state(transition); 141 | result?; 142 | // This is a live source - no preroll needed 143 | return Ok(gst::StateChangeSuccess::NoPreroll); 144 | } 145 | 146 | gst::StateChange::PausedToReady => { 147 | // Cleanup publisher 148 | self.cleanup(); 149 | } 150 | 151 | _ => (), 152 | } 153 | 154 | // Chain up for other transitions 155 | self.parent_change_state(transition) 156 | } 157 | } 158 | 159 | impl HangSrc { 160 | async fn setup(&self) -> anyhow::Result<()> { 161 | let (client, url, name) = { 162 | let settings = self.settings.lock().unwrap(); 163 | let url = url::Url::parse(settings.url.as_ref().expect("url is required"))?; 164 | let name = settings.broadcast.as_ref().expect("broadcast is required").clone(); 165 | 166 | // TODO support TLS certs and other options 167 | let client = moq_native::ClientConfig { 168 | tls: moq_native::ClientTls { 169 | disable_verify: Some(settings.tls_disable_verify), 170 | ..Default::default() 171 | }, 172 | ..Default::default() 173 | } 174 | .init()?; 175 | 176 | (client, url, name) 177 | }; 178 | 179 | let session = client.connect(url).await?; 180 | let origin = moq_lite::Origin::produce(); 181 | let _session = moq_lite::Session::connect(session, None, origin.producer).await?; 182 | 183 | let broadcast = origin 184 | .consumer 185 | .consume_broadcast(&name) 186 | .ok_or_else(|| anyhow::anyhow!("Broadcast '{}' not found", name))?; 187 | 188 | let catalog = broadcast.subscribe_track(&hang::catalog::Catalog::default_track()); 189 | let mut catalog = hang::catalog::CatalogConsumer::new(catalog); 190 | 191 | // TODO handle catalog updates 192 | let catalog = catalog.next().await?.context("no catalog found")?.clone(); 193 | 194 | if let Some(video) = catalog.video { 195 | for (track_name, config) in video.renditions { 196 | let track_ref = hang::moq_lite::Track::new(&track_name); 197 | let mut track = 198 | hang::TrackConsumer::new(broadcast.subscribe_track(&track_ref), std::time::Duration::from_secs(1)); 199 | 200 | let caps = match config.codec { 201 | hang::catalog::VideoCodec::H264(_) => { 202 | let builder = gst::Caps::builder("video/x-h264") 203 | //.field("width", video.resolution.width) 204 | //.field("height", video.resolution.height) 205 | .field("alignment", "au"); 206 | 207 | if let Some(description) = config.description { 208 | builder 209 | .field("stream-format", "avc") 210 | .field("codec_data", gst::Buffer::from_slice(description.clone())) 211 | .build() 212 | } else { 213 | builder.field("stream-format", "annexb").build() 214 | } 215 | } 216 | _ => unimplemented!(), 217 | }; 218 | 219 | gst::info!(CAT, "caps: {:?}", caps); 220 | 221 | let templ = self.obj().element_class().pad_template("video_%u").unwrap(); 222 | 223 | let srcpad = gst::Pad::builder_from_template(&templ).name(&track_name).build(); 224 | srcpad.set_active(true).unwrap(); 225 | 226 | let stream_start = gst::event::StreamStart::builder(&track_name) 227 | .group_id(gst::GroupId::next()) 228 | .build(); 229 | srcpad.push_event(stream_start); 230 | 231 | let caps_evt = gst::event::Caps::new(&caps); 232 | srcpad.push_event(caps_evt); 233 | 234 | let segment = gst::event::Segment::new(&gst::FormattedSegment::::new()); 235 | srcpad.push_event(segment); 236 | 237 | self.obj().add_pad(&srcpad).expect("Failed to add pad"); 238 | 239 | // Push to the srcpad in a background task. 240 | let mut reference = None; 241 | tokio::spawn(async move { 242 | loop { 243 | match track.read_frame().await { 244 | Ok(Some(frame)) => { 245 | let payload: Vec = frame.payload.into_iter().flatten().collect(); 246 | let mut buffer = gst::Buffer::from_slice(payload); 247 | let buffer_mut = buffer.get_mut().unwrap(); 248 | 249 | // Make timestamps relative to the first frame for proper playback 250 | let pts = if let Some(reference_ts) = reference { 251 | let timestamp: std::time::Duration = (frame.timestamp - reference_ts).into(); 252 | gst::ClockTime::from_nseconds(timestamp.as_nanos() as _) 253 | } else { 254 | reference = Some(frame.timestamp); 255 | gst::ClockTime::ZERO 256 | }; 257 | buffer_mut.set_pts(Some(pts)); 258 | 259 | let mut flags = buffer_mut.flags(); 260 | match frame.keyframe { 261 | true => flags.remove(gst::BufferFlags::DELTA_UNIT), 262 | false => flags.insert(gst::BufferFlags::DELTA_UNIT), 263 | }; 264 | 265 | buffer_mut.set_flags(flags); 266 | 267 | gst::info!(CAT, "pushing sample: {:?}", buffer); 268 | 269 | if let Err(err) = srcpad.push(buffer) { 270 | gst::warning!(CAT, "Failed to push sample: {:?}", err); 271 | } 272 | } 273 | Ok(None) => { 274 | // Stream ended normally 275 | gst::info!(CAT, "Stream ended normally"); 276 | break; 277 | } 278 | Err(e) => { 279 | // Handle connection errors gracefully 280 | gst::warning!(CAT, "Failed to read frame: {:?}", e); 281 | break; 282 | } 283 | } 284 | } 285 | }); 286 | } 287 | } 288 | 289 | if let Some(audio) = catalog.audio { 290 | for (track_name, config) in audio.renditions { 291 | let track_ref = hang::moq_lite::Track::new(&track_name); 292 | let mut track = 293 | hang::TrackConsumer::new(broadcast.subscribe_track(&track_ref), std::time::Duration::from_secs(1)); 294 | 295 | let caps = match &config.codec { 296 | hang::catalog::AudioCodec::AAC(_aac) => { 297 | let builder = gst::Caps::builder("audio/mpeg") 298 | .field("mpegversion", 4) 299 | .field("channels", config.channel_count) 300 | .field("rate", config.sample_rate); 301 | 302 | if let Some(description) = config.description { 303 | builder 304 | .field("codec_data", gst::Buffer::from_slice(description.clone())) 305 | .field("stream-format", "aac") 306 | .build() 307 | } else { 308 | builder.field("stream-format", "adts").build() 309 | } 310 | } 311 | hang::catalog::AudioCodec::Opus => { 312 | let builder = gst::Caps::builder("audio/x-opus") 313 | .field("rate", config.sample_rate) 314 | .field("channels", config.channel_count); 315 | 316 | if let Some(description) = config.description { 317 | builder 318 | .field("codec_data", gst::Buffer::from_slice(description.clone())) 319 | .field("stream-format", "ogg") 320 | .build() 321 | } else { 322 | builder.field("stream-format", "opus").build() 323 | } 324 | } 325 | _ => unimplemented!(), 326 | }; 327 | 328 | gst::info!(CAT, "caps: {:?}", caps); 329 | 330 | let templ = self.obj().element_class().pad_template("audio_%u").unwrap(); 331 | 332 | let srcpad = gst::Pad::builder_from_template(&templ).name(&track_name).build(); 333 | srcpad.set_active(true).unwrap(); 334 | 335 | let stream_start = gst::event::StreamStart::builder(&track_name) 336 | .group_id(gst::GroupId::next()) 337 | .build(); 338 | srcpad.push_event(stream_start); 339 | 340 | let caps_evt = gst::event::Caps::new(&caps); 341 | srcpad.push_event(caps_evt); 342 | 343 | let segment = gst::event::Segment::new(&gst::FormattedSegment::::new()); 344 | srcpad.push_event(segment); 345 | 346 | self.obj().add_pad(&srcpad).expect("Failed to add pad"); 347 | 348 | // Push to the srcpad in a background task. 349 | let mut reference = None; 350 | tokio::spawn(async move { 351 | loop { 352 | match track.read_frame().await { 353 | Ok(Some(frame)) => { 354 | let payload: Vec = frame.payload.into_iter().flatten().collect(); 355 | let mut buffer = gst::Buffer::from_slice(payload); 356 | let buffer_mut = buffer.get_mut().unwrap(); 357 | 358 | // Make timestamps relative to the first frame for proper playback 359 | let pts = if let Some(reference_ts) = reference { 360 | let timestamp: std::time::Duration = (frame.timestamp - reference_ts).into(); 361 | gst::ClockTime::from_nseconds(timestamp.as_nanos() as _) 362 | } else { 363 | reference = Some(frame.timestamp); 364 | gst::ClockTime::ZERO 365 | }; 366 | buffer_mut.set_pts(Some(pts)); 367 | 368 | let mut flags = buffer_mut.flags(); 369 | flags.remove(gst::BufferFlags::DELTA_UNIT); 370 | buffer_mut.set_flags(flags); 371 | 372 | gst::info!(CAT, "pushing sample: {:?}", buffer); 373 | 374 | if let Err(err) = srcpad.push(buffer) { 375 | gst::warning!(CAT, "Failed to push sample: {:?}", err); 376 | } 377 | } 378 | Ok(None) => { 379 | // Stream ended normally 380 | gst::info!(CAT, "Stream ended normally"); 381 | break; 382 | } 383 | Err(e) => { 384 | // Handle connection errors gracefully 385 | gst::warning!(CAT, "Failed to read frame: {:?}", e); 386 | break; 387 | } 388 | } 389 | } 390 | }); 391 | } 392 | } 393 | 394 | // We downloaded the catalog and created all the pads. 395 | self.obj().no_more_pads(); 396 | 397 | Ok(()) 398 | } 399 | 400 | fn cleanup(&self) { 401 | // TODO kill spawned tasks 402 | } 403 | } 404 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.25.1" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.1" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.3" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "android_system_properties" 31 | version = "0.1.5" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 34 | dependencies = [ 35 | "libc", 36 | ] 37 | 38 | [[package]] 39 | name = "anstream" 40 | version = "0.6.21" 41 | source = "registry+https://github.com/rust-lang/crates.io-index" 42 | checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" 43 | dependencies = [ 44 | "anstyle", 45 | "anstyle-parse", 46 | "anstyle-query", 47 | "anstyle-wincon", 48 | "colorchoice", 49 | "is_terminal_polyfill", 50 | "utf8parse", 51 | ] 52 | 53 | [[package]] 54 | name = "anstyle" 55 | version = "1.0.13" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" 58 | 59 | [[package]] 60 | name = "anstyle-parse" 61 | version = "0.2.7" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 64 | dependencies = [ 65 | "utf8parse", 66 | ] 67 | 68 | [[package]] 69 | name = "anstyle-query" 70 | version = "1.1.4" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" 73 | dependencies = [ 74 | "windows-sys 0.60.2", 75 | ] 76 | 77 | [[package]] 78 | name = "anstyle-wincon" 79 | version = "3.0.10" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" 82 | dependencies = [ 83 | "anstyle", 84 | "once_cell_polyfill", 85 | "windows-sys 0.60.2", 86 | ] 87 | 88 | [[package]] 89 | name = "anyhow" 90 | version = "1.0.100" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" 93 | dependencies = [ 94 | "backtrace", 95 | ] 96 | 97 | [[package]] 98 | name = "async-channel" 99 | version = "2.5.0" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" 102 | dependencies = [ 103 | "concurrent-queue", 104 | "event-listener-strategy", 105 | "futures-core", 106 | "pin-project-lite", 107 | ] 108 | 109 | [[package]] 110 | name = "atomic-waker" 111 | version = "1.1.2" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 114 | 115 | [[package]] 116 | name = "atomic_refcell" 117 | version = "0.1.13" 118 | source = "registry+https://github.com/rust-lang/crates.io-index" 119 | checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c" 120 | 121 | [[package]] 122 | name = "autocfg" 123 | version = "1.5.0" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 126 | 127 | [[package]] 128 | name = "aws-lc-rs" 129 | version = "1.14.1" 130 | source = "registry+https://github.com/rust-lang/crates.io-index" 131 | checksum = "879b6c89592deb404ba4dc0ae6b58ffd1795c78991cbb5b8bc441c48a070440d" 132 | dependencies = [ 133 | "aws-lc-sys", 134 | "zeroize", 135 | ] 136 | 137 | [[package]] 138 | name = "aws-lc-sys" 139 | version = "0.32.3" 140 | source = "registry+https://github.com/rust-lang/crates.io-index" 141 | checksum = "107a4e9d9cab9963e04e84bb8dee0e25f2a987f9a8bad5ed054abd439caa8f8c" 142 | dependencies = [ 143 | "bindgen", 144 | "cc", 145 | "cmake", 146 | "dunce", 147 | "fs_extra", 148 | ] 149 | 150 | [[package]] 151 | name = "backtrace" 152 | version = "0.3.76" 153 | source = "registry+https://github.com/rust-lang/crates.io-index" 154 | checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" 155 | dependencies = [ 156 | "addr2line", 157 | "cfg-if", 158 | "libc", 159 | "miniz_oxide", 160 | "object", 161 | "rustc-demangle", 162 | "windows-link", 163 | ] 164 | 165 | [[package]] 166 | name = "base64" 167 | version = "0.22.1" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 170 | 171 | [[package]] 172 | name = "bindgen" 173 | version = "0.72.1" 174 | source = "registry+https://github.com/rust-lang/crates.io-index" 175 | checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" 176 | dependencies = [ 177 | "bitflags", 178 | "cexpr", 179 | "clang-sys", 180 | "itertools 0.13.0", 181 | "log", 182 | "prettyplease", 183 | "proc-macro2", 184 | "quote", 185 | "regex", 186 | "rustc-hash", 187 | "shlex", 188 | "syn", 189 | ] 190 | 191 | [[package]] 192 | name = "bitflags" 193 | version = "2.10.0" 194 | source = "registry+https://github.com/rust-lang/crates.io-index" 195 | checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" 196 | 197 | [[package]] 198 | name = "buf-list" 199 | version = "1.1.2" 200 | source = "registry+https://github.com/rust-lang/crates.io-index" 201 | checksum = "a6b175f9cf8fffedd4c4b18bcfef092356e952b81f596e148f18e98280994593" 202 | dependencies = [ 203 | "bytes", 204 | ] 205 | 206 | [[package]] 207 | name = "bumpalo" 208 | version = "3.19.0" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 211 | 212 | [[package]] 213 | name = "bytes" 214 | version = "1.10.1" 215 | source = "registry+https://github.com/rust-lang/crates.io-index" 216 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 217 | dependencies = [ 218 | "serde", 219 | ] 220 | 221 | [[package]] 222 | name = "cc" 223 | version = "1.2.41" 224 | source = "registry+https://github.com/rust-lang/crates.io-index" 225 | checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" 226 | dependencies = [ 227 | "find-msvc-tools", 228 | "jobserver", 229 | "libc", 230 | "shlex", 231 | ] 232 | 233 | [[package]] 234 | name = "cesu8" 235 | version = "1.1.0" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" 238 | 239 | [[package]] 240 | name = "cexpr" 241 | version = "0.6.0" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 244 | dependencies = [ 245 | "nom", 246 | ] 247 | 248 | [[package]] 249 | name = "cfg-expr" 250 | version = "0.20.3" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | checksum = "1a2c5f3bf25ec225351aa1c8e230d04d880d3bd89dea133537dafad4ae291e5c" 253 | dependencies = [ 254 | "smallvec", 255 | "target-lexicon", 256 | ] 257 | 258 | [[package]] 259 | name = "cfg-if" 260 | version = "1.0.4" 261 | source = "registry+https://github.com/rust-lang/crates.io-index" 262 | checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" 263 | 264 | [[package]] 265 | name = "cfg_aliases" 266 | version = "0.2.1" 267 | source = "registry+https://github.com/rust-lang/crates.io-index" 268 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 269 | 270 | [[package]] 271 | name = "chrono" 272 | version = "0.4.42" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" 275 | dependencies = [ 276 | "iana-time-zone", 277 | "num-traits", 278 | "serde", 279 | "windows-link", 280 | ] 281 | 282 | [[package]] 283 | name = "clang-sys" 284 | version = "1.8.1" 285 | source = "registry+https://github.com/rust-lang/crates.io-index" 286 | checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 287 | dependencies = [ 288 | "glob", 289 | "libc", 290 | "libloading", 291 | ] 292 | 293 | [[package]] 294 | name = "clap" 295 | version = "4.5.50" 296 | source = "registry+https://github.com/rust-lang/crates.io-index" 297 | checksum = "0c2cfd7bf8a6017ddaa4e32ffe7403d547790db06bd171c1c53926faab501623" 298 | dependencies = [ 299 | "clap_builder", 300 | "clap_derive", 301 | ] 302 | 303 | [[package]] 304 | name = "clap_builder" 305 | version = "4.5.50" 306 | source = "registry+https://github.com/rust-lang/crates.io-index" 307 | checksum = "0a4c05b9e80c5ccd3a7ef080ad7b6ba7d6fc00a985b8b157197075677c82c7a0" 308 | dependencies = [ 309 | "anstream", 310 | "anstyle", 311 | "clap_lex", 312 | "strsim", 313 | ] 314 | 315 | [[package]] 316 | name = "clap_derive" 317 | version = "4.5.49" 318 | source = "registry+https://github.com/rust-lang/crates.io-index" 319 | checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" 320 | dependencies = [ 321 | "heck", 322 | "proc-macro2", 323 | "quote", 324 | "syn", 325 | ] 326 | 327 | [[package]] 328 | name = "clap_lex" 329 | version = "0.7.6" 330 | source = "registry+https://github.com/rust-lang/crates.io-index" 331 | checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" 332 | 333 | [[package]] 334 | name = "cmake" 335 | version = "0.1.54" 336 | source = "registry+https://github.com/rust-lang/crates.io-index" 337 | checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" 338 | dependencies = [ 339 | "cc", 340 | ] 341 | 342 | [[package]] 343 | name = "colorchoice" 344 | version = "1.0.4" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 347 | 348 | [[package]] 349 | name = "combine" 350 | version = "4.6.7" 351 | source = "registry+https://github.com/rust-lang/crates.io-index" 352 | checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" 353 | dependencies = [ 354 | "bytes", 355 | "memchr", 356 | ] 357 | 358 | [[package]] 359 | name = "concurrent-queue" 360 | version = "2.5.0" 361 | source = "registry+https://github.com/rust-lang/crates.io-index" 362 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 363 | dependencies = [ 364 | "crossbeam-utils", 365 | ] 366 | 367 | [[package]] 368 | name = "core-foundation" 369 | version = "0.10.1" 370 | source = "registry+https://github.com/rust-lang/crates.io-index" 371 | checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" 372 | dependencies = [ 373 | "core-foundation-sys", 374 | "libc", 375 | ] 376 | 377 | [[package]] 378 | name = "core-foundation-sys" 379 | version = "0.8.7" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 382 | 383 | [[package]] 384 | name = "crossbeam-utils" 385 | version = "0.8.21" 386 | source = "registry+https://github.com/rust-lang/crates.io-index" 387 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 388 | 389 | [[package]] 390 | name = "darling" 391 | version = "0.21.3" 392 | source = "registry+https://github.com/rust-lang/crates.io-index" 393 | checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" 394 | dependencies = [ 395 | "darling_core", 396 | "darling_macro", 397 | ] 398 | 399 | [[package]] 400 | name = "darling_core" 401 | version = "0.21.3" 402 | source = "registry+https://github.com/rust-lang/crates.io-index" 403 | checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" 404 | dependencies = [ 405 | "fnv", 406 | "ident_case", 407 | "proc-macro2", 408 | "quote", 409 | "strsim", 410 | "syn", 411 | ] 412 | 413 | [[package]] 414 | name = "darling_macro" 415 | version = "0.21.3" 416 | source = "registry+https://github.com/rust-lang/crates.io-index" 417 | checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" 418 | dependencies = [ 419 | "darling_core", 420 | "quote", 421 | "syn", 422 | ] 423 | 424 | [[package]] 425 | name = "deranged" 426 | version = "0.5.4" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" 429 | dependencies = [ 430 | "powerfmt", 431 | "serde_core", 432 | ] 433 | 434 | [[package]] 435 | name = "derive_more" 436 | version = "2.0.1" 437 | source = "registry+https://github.com/rust-lang/crates.io-index" 438 | checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" 439 | dependencies = [ 440 | "derive_more-impl", 441 | ] 442 | 443 | [[package]] 444 | name = "derive_more-impl" 445 | version = "2.0.1" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" 448 | dependencies = [ 449 | "proc-macro2", 450 | "quote", 451 | "syn", 452 | "unicode-xid", 453 | ] 454 | 455 | [[package]] 456 | name = "displaydoc" 457 | version = "0.2.5" 458 | source = "registry+https://github.com/rust-lang/crates.io-index" 459 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 460 | dependencies = [ 461 | "proc-macro2", 462 | "quote", 463 | "syn", 464 | ] 465 | 466 | [[package]] 467 | name = "dunce" 468 | version = "1.0.5" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" 471 | 472 | [[package]] 473 | name = "dyn-clone" 474 | version = "1.0.20" 475 | source = "registry+https://github.com/rust-lang/crates.io-index" 476 | checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" 477 | 478 | [[package]] 479 | name = "either" 480 | version = "1.15.0" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 483 | 484 | [[package]] 485 | name = "equivalent" 486 | version = "1.0.2" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 489 | 490 | [[package]] 491 | name = "event-listener" 492 | version = "5.4.1" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" 495 | dependencies = [ 496 | "concurrent-queue", 497 | "parking", 498 | "pin-project-lite", 499 | ] 500 | 501 | [[package]] 502 | name = "event-listener-strategy" 503 | version = "0.5.4" 504 | source = "registry+https://github.com/rust-lang/crates.io-index" 505 | checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" 506 | dependencies = [ 507 | "event-listener", 508 | "pin-project-lite", 509 | ] 510 | 511 | [[package]] 512 | name = "fastbloom" 513 | version = "0.14.0" 514 | source = "registry+https://github.com/rust-lang/crates.io-index" 515 | checksum = "18c1ddb9231d8554c2d6bdf4cfaabf0c59251658c68b6c95cd52dd0c513a912a" 516 | dependencies = [ 517 | "getrandom 0.3.4", 518 | "libm", 519 | "rand", 520 | "siphasher", 521 | ] 522 | 523 | [[package]] 524 | name = "find-msvc-tools" 525 | version = "0.1.4" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" 528 | 529 | [[package]] 530 | name = "fnv" 531 | version = "1.0.7" 532 | source = "registry+https://github.com/rust-lang/crates.io-index" 533 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 534 | 535 | [[package]] 536 | name = "form_urlencoded" 537 | version = "1.2.2" 538 | source = "registry+https://github.com/rust-lang/crates.io-index" 539 | checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 540 | dependencies = [ 541 | "percent-encoding", 542 | ] 543 | 544 | [[package]] 545 | name = "fs_extra" 546 | version = "1.3.0" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" 549 | 550 | [[package]] 551 | name = "futures" 552 | version = "0.3.31" 553 | source = "registry+https://github.com/rust-lang/crates.io-index" 554 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 555 | dependencies = [ 556 | "futures-channel", 557 | "futures-core", 558 | "futures-executor", 559 | "futures-io", 560 | "futures-sink", 561 | "futures-task", 562 | "futures-util", 563 | ] 564 | 565 | [[package]] 566 | name = "futures-channel" 567 | version = "0.3.31" 568 | source = "registry+https://github.com/rust-lang/crates.io-index" 569 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 570 | dependencies = [ 571 | "futures-core", 572 | "futures-sink", 573 | ] 574 | 575 | [[package]] 576 | name = "futures-core" 577 | version = "0.3.31" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 580 | 581 | [[package]] 582 | name = "futures-executor" 583 | version = "0.3.31" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 586 | dependencies = [ 587 | "futures-core", 588 | "futures-task", 589 | "futures-util", 590 | ] 591 | 592 | [[package]] 593 | name = "futures-io" 594 | version = "0.3.31" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 597 | 598 | [[package]] 599 | name = "futures-macro" 600 | version = "0.3.31" 601 | source = "registry+https://github.com/rust-lang/crates.io-index" 602 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 603 | dependencies = [ 604 | "proc-macro2", 605 | "quote", 606 | "syn", 607 | ] 608 | 609 | [[package]] 610 | name = "futures-sink" 611 | version = "0.3.31" 612 | source = "registry+https://github.com/rust-lang/crates.io-index" 613 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 614 | 615 | [[package]] 616 | name = "futures-task" 617 | version = "0.3.31" 618 | source = "registry+https://github.com/rust-lang/crates.io-index" 619 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 620 | 621 | [[package]] 622 | name = "futures-util" 623 | version = "0.3.31" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 626 | dependencies = [ 627 | "futures-channel", 628 | "futures-core", 629 | "futures-io", 630 | "futures-macro", 631 | "futures-sink", 632 | "futures-task", 633 | "memchr", 634 | "pin-project-lite", 635 | "pin-utils", 636 | "slab", 637 | ] 638 | 639 | [[package]] 640 | name = "getrandom" 641 | version = "0.2.16" 642 | source = "registry+https://github.com/rust-lang/crates.io-index" 643 | checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 644 | dependencies = [ 645 | "cfg-if", 646 | "js-sys", 647 | "libc", 648 | "wasi", 649 | "wasm-bindgen", 650 | ] 651 | 652 | [[package]] 653 | name = "getrandom" 654 | version = "0.3.4" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" 657 | dependencies = [ 658 | "cfg-if", 659 | "js-sys", 660 | "libc", 661 | "r-efi", 662 | "wasip2", 663 | "wasm-bindgen", 664 | ] 665 | 666 | [[package]] 667 | name = "gimli" 668 | version = "0.32.3" 669 | source = "registry+https://github.com/rust-lang/crates.io-index" 670 | checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" 671 | 672 | [[package]] 673 | name = "gio-sys" 674 | version = "0.20.10" 675 | source = "registry+https://github.com/rust-lang/crates.io-index" 676 | checksum = "521e93a7e56fc89e84aea9a52cfc9436816a4b363b030260b699950ff1336c83" 677 | dependencies = [ 678 | "glib-sys", 679 | "gobject-sys", 680 | "libc", 681 | "system-deps", 682 | "windows-sys 0.59.0", 683 | ] 684 | 685 | [[package]] 686 | name = "glib" 687 | version = "0.20.12" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | checksum = "ffc4b6e352d4716d84d7dde562dd9aee2a7d48beb872dd9ece7f2d1515b2d683" 690 | dependencies = [ 691 | "bitflags", 692 | "futures-channel", 693 | "futures-core", 694 | "futures-executor", 695 | "futures-task", 696 | "futures-util", 697 | "gio-sys", 698 | "glib-macros", 699 | "glib-sys", 700 | "gobject-sys", 701 | "libc", 702 | "memchr", 703 | "smallvec", 704 | ] 705 | 706 | [[package]] 707 | name = "glib-macros" 708 | version = "0.20.12" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "e8084af62f09475a3f529b1629c10c429d7600ee1398ae12dd3bf175d74e7145" 711 | dependencies = [ 712 | "heck", 713 | "proc-macro-crate", 714 | "proc-macro2", 715 | "quote", 716 | "syn", 717 | ] 718 | 719 | [[package]] 720 | name = "glib-sys" 721 | version = "0.20.10" 722 | source = "registry+https://github.com/rust-lang/crates.io-index" 723 | checksum = "8ab79e1ed126803a8fb827e3de0e2ff95191912b8db65cee467edb56fc4cc215" 724 | dependencies = [ 725 | "libc", 726 | "system-deps", 727 | ] 728 | 729 | [[package]] 730 | name = "glob" 731 | version = "0.3.3" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" 734 | 735 | [[package]] 736 | name = "gobject-sys" 737 | version = "0.20.10" 738 | source = "registry+https://github.com/rust-lang/crates.io-index" 739 | checksum = "ec9aca94bb73989e3cfdbf8f2e0f1f6da04db4d291c431f444838925c4c63eda" 740 | dependencies = [ 741 | "glib-sys", 742 | "libc", 743 | "system-deps", 744 | ] 745 | 746 | [[package]] 747 | name = "gst-plugin-version-helper" 748 | version = "0.8.3" 749 | source = "registry+https://github.com/rust-lang/crates.io-index" 750 | checksum = "a68a894ef2d738054b950e1dbef5d9012b63fd968d4d32dbccd31bd8d8d4b219" 751 | dependencies = [ 752 | "chrono", 753 | "toml_edit", 754 | ] 755 | 756 | [[package]] 757 | name = "gstreamer" 758 | version = "0.23.7" 759 | source = "registry+https://github.com/rust-lang/crates.io-index" 760 | checksum = "8757a87f3706560037a01a9f06a59fcc7bdb0864744dcf73546606e60c4316e1" 761 | dependencies = [ 762 | "cfg-if", 763 | "futures-channel", 764 | "futures-core", 765 | "futures-util", 766 | "glib", 767 | "gstreamer-sys", 768 | "itertools 0.14.0", 769 | "libc", 770 | "muldiv", 771 | "num-integer", 772 | "num-rational", 773 | "once_cell", 774 | "option-operations", 775 | "paste", 776 | "pin-project-lite", 777 | "smallvec", 778 | "thiserror 2.0.17", 779 | ] 780 | 781 | [[package]] 782 | name = "gstreamer-base" 783 | version = "0.23.6" 784 | source = "registry+https://github.com/rust-lang/crates.io-index" 785 | checksum = "f19a74fd04ffdcb847dd322640f2cf520897129d00a7bcb92fd62a63f3e27404" 786 | dependencies = [ 787 | "atomic_refcell", 788 | "cfg-if", 789 | "glib", 790 | "gstreamer", 791 | "gstreamer-base-sys", 792 | "libc", 793 | ] 794 | 795 | [[package]] 796 | name = "gstreamer-base-sys" 797 | version = "0.23.6" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | checksum = "87f2fb0037b6d3c5b51f60dea11e667910f33be222308ca5a101450018a09840" 800 | dependencies = [ 801 | "glib-sys", 802 | "gobject-sys", 803 | "gstreamer-sys", 804 | "libc", 805 | "system-deps", 806 | ] 807 | 808 | [[package]] 809 | name = "gstreamer-sys" 810 | version = "0.23.6" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | checksum = "feea73b4d92dbf9c24a203c9cd0bcc740d584f6b5960d5faf359febf288919b2" 813 | dependencies = [ 814 | "glib-sys", 815 | "gobject-sys", 816 | "libc", 817 | "system-deps", 818 | ] 819 | 820 | [[package]] 821 | name = "h264-parser" 822 | version = "0.4.0" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "ab2f85be813ce08f0569fcd816f256c6f4287c975d69a9a14ceacc309f1de967" 825 | 826 | [[package]] 827 | name = "hang" 828 | version = "0.9.0" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "2b4ffdb9c72ec7f06cacea47589d3b2d71452e85cdb780033d99fbb00e46c98f" 831 | dependencies = [ 832 | "anyhow", 833 | "buf-list", 834 | "bytes", 835 | "derive_more", 836 | "futures", 837 | "h264-parser", 838 | "hex", 839 | "lazy_static", 840 | "moq-lite", 841 | "mp4-atom", 842 | "num_enum", 843 | "regex", 844 | "serde", 845 | "serde_json", 846 | "serde_with", 847 | "thiserror 2.0.17", 848 | "tokio", 849 | "tracing", 850 | ] 851 | 852 | [[package]] 853 | name = "hang-gst" 854 | version = "0.2.2" 855 | dependencies = [ 856 | "anyhow", 857 | "bytes", 858 | "gst-plugin-version-helper", 859 | "gstreamer", 860 | "gstreamer-base", 861 | "hang", 862 | "moq-lite", 863 | "moq-native", 864 | "once_cell", 865 | "tokio", 866 | "tracing", 867 | "tracing-subscriber", 868 | "url", 869 | ] 870 | 871 | [[package]] 872 | name = "hashbrown" 873 | version = "0.12.3" 874 | source = "registry+https://github.com/rust-lang/crates.io-index" 875 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 876 | 877 | [[package]] 878 | name = "hashbrown" 879 | version = "0.16.0" 880 | source = "registry+https://github.com/rust-lang/crates.io-index" 881 | checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" 882 | 883 | [[package]] 884 | name = "heck" 885 | version = "0.5.0" 886 | source = "registry+https://github.com/rust-lang/crates.io-index" 887 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 888 | 889 | [[package]] 890 | name = "hex" 891 | version = "0.4.3" 892 | source = "registry+https://github.com/rust-lang/crates.io-index" 893 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 894 | 895 | [[package]] 896 | name = "http" 897 | version = "1.3.1" 898 | source = "registry+https://github.com/rust-lang/crates.io-index" 899 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 900 | dependencies = [ 901 | "bytes", 902 | "fnv", 903 | "itoa", 904 | ] 905 | 906 | [[package]] 907 | name = "http-body" 908 | version = "1.0.1" 909 | source = "registry+https://github.com/rust-lang/crates.io-index" 910 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 911 | dependencies = [ 912 | "bytes", 913 | "http", 914 | ] 915 | 916 | [[package]] 917 | name = "http-body-util" 918 | version = "0.1.3" 919 | source = "registry+https://github.com/rust-lang/crates.io-index" 920 | checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 921 | dependencies = [ 922 | "bytes", 923 | "futures-core", 924 | "http", 925 | "http-body", 926 | "pin-project-lite", 927 | ] 928 | 929 | [[package]] 930 | name = "httparse" 931 | version = "1.10.1" 932 | source = "registry+https://github.com/rust-lang/crates.io-index" 933 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 934 | 935 | [[package]] 936 | name = "hyper" 937 | version = "1.7.0" 938 | source = "registry+https://github.com/rust-lang/crates.io-index" 939 | checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" 940 | dependencies = [ 941 | "atomic-waker", 942 | "bytes", 943 | "futures-channel", 944 | "futures-core", 945 | "http", 946 | "http-body", 947 | "httparse", 948 | "itoa", 949 | "pin-project-lite", 950 | "pin-utils", 951 | "smallvec", 952 | "tokio", 953 | "want", 954 | ] 955 | 956 | [[package]] 957 | name = "hyper-util" 958 | version = "0.1.17" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" 961 | dependencies = [ 962 | "base64", 963 | "bytes", 964 | "futures-channel", 965 | "futures-core", 966 | "futures-util", 967 | "http", 968 | "http-body", 969 | "hyper", 970 | "ipnet", 971 | "libc", 972 | "percent-encoding", 973 | "pin-project-lite", 974 | "socket2", 975 | "tokio", 976 | "tower-service", 977 | "tracing", 978 | ] 979 | 980 | [[package]] 981 | name = "iana-time-zone" 982 | version = "0.1.64" 983 | source = "registry+https://github.com/rust-lang/crates.io-index" 984 | checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" 985 | dependencies = [ 986 | "android_system_properties", 987 | "core-foundation-sys", 988 | "iana-time-zone-haiku", 989 | "js-sys", 990 | "log", 991 | "wasm-bindgen", 992 | "windows-core", 993 | ] 994 | 995 | [[package]] 996 | name = "iana-time-zone-haiku" 997 | version = "0.1.2" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1000 | dependencies = [ 1001 | "cc", 1002 | ] 1003 | 1004 | [[package]] 1005 | name = "icu_collections" 1006 | version = "2.0.0" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 1009 | dependencies = [ 1010 | "displaydoc", 1011 | "potential_utf", 1012 | "yoke", 1013 | "zerofrom", 1014 | "zerovec", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "icu_locale_core" 1019 | version = "2.0.0" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 1022 | dependencies = [ 1023 | "displaydoc", 1024 | "litemap", 1025 | "tinystr", 1026 | "writeable", 1027 | "zerovec", 1028 | ] 1029 | 1030 | [[package]] 1031 | name = "icu_normalizer" 1032 | version = "2.0.0" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 1035 | dependencies = [ 1036 | "displaydoc", 1037 | "icu_collections", 1038 | "icu_normalizer_data", 1039 | "icu_properties", 1040 | "icu_provider", 1041 | "smallvec", 1042 | "zerovec", 1043 | ] 1044 | 1045 | [[package]] 1046 | name = "icu_normalizer_data" 1047 | version = "2.0.0" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 1050 | 1051 | [[package]] 1052 | name = "icu_properties" 1053 | version = "2.0.1" 1054 | source = "registry+https://github.com/rust-lang/crates.io-index" 1055 | checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 1056 | dependencies = [ 1057 | "displaydoc", 1058 | "icu_collections", 1059 | "icu_locale_core", 1060 | "icu_properties_data", 1061 | "icu_provider", 1062 | "potential_utf", 1063 | "zerotrie", 1064 | "zerovec", 1065 | ] 1066 | 1067 | [[package]] 1068 | name = "icu_properties_data" 1069 | version = "2.0.1" 1070 | source = "registry+https://github.com/rust-lang/crates.io-index" 1071 | checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 1072 | 1073 | [[package]] 1074 | name = "icu_provider" 1075 | version = "2.0.0" 1076 | source = "registry+https://github.com/rust-lang/crates.io-index" 1077 | checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 1078 | dependencies = [ 1079 | "displaydoc", 1080 | "icu_locale_core", 1081 | "stable_deref_trait", 1082 | "tinystr", 1083 | "writeable", 1084 | "yoke", 1085 | "zerofrom", 1086 | "zerotrie", 1087 | "zerovec", 1088 | ] 1089 | 1090 | [[package]] 1091 | name = "ident_case" 1092 | version = "1.0.1" 1093 | source = "registry+https://github.com/rust-lang/crates.io-index" 1094 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1095 | 1096 | [[package]] 1097 | name = "idna" 1098 | version = "1.1.0" 1099 | source = "registry+https://github.com/rust-lang/crates.io-index" 1100 | checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 1101 | dependencies = [ 1102 | "idna_adapter", 1103 | "smallvec", 1104 | "utf8_iter", 1105 | ] 1106 | 1107 | [[package]] 1108 | name = "idna_adapter" 1109 | version = "1.2.1" 1110 | source = "registry+https://github.com/rust-lang/crates.io-index" 1111 | checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 1112 | dependencies = [ 1113 | "icu_normalizer", 1114 | "icu_properties", 1115 | ] 1116 | 1117 | [[package]] 1118 | name = "indexmap" 1119 | version = "1.9.3" 1120 | source = "registry+https://github.com/rust-lang/crates.io-index" 1121 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 1122 | dependencies = [ 1123 | "autocfg", 1124 | "hashbrown 0.12.3", 1125 | "serde", 1126 | ] 1127 | 1128 | [[package]] 1129 | name = "indexmap" 1130 | version = "2.12.0" 1131 | source = "registry+https://github.com/rust-lang/crates.io-index" 1132 | checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" 1133 | dependencies = [ 1134 | "equivalent", 1135 | "hashbrown 0.16.0", 1136 | "serde", 1137 | "serde_core", 1138 | ] 1139 | 1140 | [[package]] 1141 | name = "ipnet" 1142 | version = "2.11.0" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 1145 | 1146 | [[package]] 1147 | name = "iri-string" 1148 | version = "0.7.8" 1149 | source = "registry+https://github.com/rust-lang/crates.io-index" 1150 | checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 1151 | dependencies = [ 1152 | "memchr", 1153 | "serde", 1154 | ] 1155 | 1156 | [[package]] 1157 | name = "is_terminal_polyfill" 1158 | version = "1.70.2" 1159 | source = "registry+https://github.com/rust-lang/crates.io-index" 1160 | checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" 1161 | 1162 | [[package]] 1163 | name = "itertools" 1164 | version = "0.13.0" 1165 | source = "registry+https://github.com/rust-lang/crates.io-index" 1166 | checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 1167 | dependencies = [ 1168 | "either", 1169 | ] 1170 | 1171 | [[package]] 1172 | name = "itertools" 1173 | version = "0.14.0" 1174 | source = "registry+https://github.com/rust-lang/crates.io-index" 1175 | checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" 1176 | dependencies = [ 1177 | "either", 1178 | ] 1179 | 1180 | [[package]] 1181 | name = "itoa" 1182 | version = "1.0.15" 1183 | source = "registry+https://github.com/rust-lang/crates.io-index" 1184 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 1185 | 1186 | [[package]] 1187 | name = "jni" 1188 | version = "0.21.1" 1189 | source = "registry+https://github.com/rust-lang/crates.io-index" 1190 | checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" 1191 | dependencies = [ 1192 | "cesu8", 1193 | "cfg-if", 1194 | "combine", 1195 | "jni-sys", 1196 | "log", 1197 | "thiserror 1.0.69", 1198 | "walkdir", 1199 | "windows-sys 0.45.0", 1200 | ] 1201 | 1202 | [[package]] 1203 | name = "jni-sys" 1204 | version = "0.3.0" 1205 | source = "registry+https://github.com/rust-lang/crates.io-index" 1206 | checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" 1207 | 1208 | [[package]] 1209 | name = "jobserver" 1210 | version = "0.1.34" 1211 | source = "registry+https://github.com/rust-lang/crates.io-index" 1212 | checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" 1213 | dependencies = [ 1214 | "getrandom 0.3.4", 1215 | "libc", 1216 | ] 1217 | 1218 | [[package]] 1219 | name = "js-sys" 1220 | version = "0.3.81" 1221 | source = "registry+https://github.com/rust-lang/crates.io-index" 1222 | checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" 1223 | dependencies = [ 1224 | "once_cell", 1225 | "wasm-bindgen", 1226 | ] 1227 | 1228 | [[package]] 1229 | name = "lazy_static" 1230 | version = "1.5.0" 1231 | source = "registry+https://github.com/rust-lang/crates.io-index" 1232 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 1233 | 1234 | [[package]] 1235 | name = "libc" 1236 | version = "0.2.177" 1237 | source = "registry+https://github.com/rust-lang/crates.io-index" 1238 | checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" 1239 | 1240 | [[package]] 1241 | name = "libloading" 1242 | version = "0.8.9" 1243 | source = "registry+https://github.com/rust-lang/crates.io-index" 1244 | checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" 1245 | dependencies = [ 1246 | "cfg-if", 1247 | "windows-link", 1248 | ] 1249 | 1250 | [[package]] 1251 | name = "libm" 1252 | version = "0.2.15" 1253 | source = "registry+https://github.com/rust-lang/crates.io-index" 1254 | checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" 1255 | 1256 | [[package]] 1257 | name = "litemap" 1258 | version = "0.8.0" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 1261 | 1262 | [[package]] 1263 | name = "lock_api" 1264 | version = "0.4.14" 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" 1266 | checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 1267 | dependencies = [ 1268 | "scopeguard", 1269 | ] 1270 | 1271 | [[package]] 1272 | name = "log" 1273 | version = "0.4.28" 1274 | source = "registry+https://github.com/rust-lang/crates.io-index" 1275 | checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 1276 | 1277 | [[package]] 1278 | name = "lru-slab" 1279 | version = "0.1.2" 1280 | source = "registry+https://github.com/rust-lang/crates.io-index" 1281 | checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" 1282 | 1283 | [[package]] 1284 | name = "matchers" 1285 | version = "0.2.0" 1286 | source = "registry+https://github.com/rust-lang/crates.io-index" 1287 | checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" 1288 | dependencies = [ 1289 | "regex-automata", 1290 | ] 1291 | 1292 | [[package]] 1293 | name = "memchr" 1294 | version = "2.7.6" 1295 | source = "registry+https://github.com/rust-lang/crates.io-index" 1296 | checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 1297 | 1298 | [[package]] 1299 | name = "minimal-lexical" 1300 | version = "0.2.1" 1301 | source = "registry+https://github.com/rust-lang/crates.io-index" 1302 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 1303 | 1304 | [[package]] 1305 | name = "miniz_oxide" 1306 | version = "0.8.9" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 1309 | dependencies = [ 1310 | "adler2", 1311 | ] 1312 | 1313 | [[package]] 1314 | name = "mio" 1315 | version = "1.1.0" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" 1318 | dependencies = [ 1319 | "libc", 1320 | "wasi", 1321 | "windows-sys 0.61.2", 1322 | ] 1323 | 1324 | [[package]] 1325 | name = "moq-lite" 1326 | version = "0.10.1" 1327 | source = "registry+https://github.com/rust-lang/crates.io-index" 1328 | checksum = "2c2258f990ddd8465f8dcf343bd00714927cd8b8b81784b153020ca24e47898f" 1329 | dependencies = [ 1330 | "async-channel", 1331 | "bytes", 1332 | "futures", 1333 | "hex", 1334 | "num_enum", 1335 | "serde", 1336 | "thiserror 2.0.17", 1337 | "tokio", 1338 | "tracing", 1339 | "web-async", 1340 | "web-transport-trait", 1341 | ] 1342 | 1343 | [[package]] 1344 | name = "moq-native" 1345 | version = "0.10.1" 1346 | source = "registry+https://github.com/rust-lang/crates.io-index" 1347 | checksum = "0e9c5c481870917a231c5c8d0ad8d293007b12efaf16ddf49c70b833c5f9af3e" 1348 | dependencies = [ 1349 | "anyhow", 1350 | "clap", 1351 | "futures", 1352 | "hex", 1353 | "moq-lite", 1354 | "quinn", 1355 | "rcgen", 1356 | "reqwest", 1357 | "rustls", 1358 | "rustls-native-certs", 1359 | "rustls-pemfile", 1360 | "rustls-webpki", 1361 | "serde", 1362 | "serde_with", 1363 | "time", 1364 | "tokio", 1365 | "tracing", 1366 | "tracing-subscriber", 1367 | "url", 1368 | "web-transport-quinn", 1369 | ] 1370 | 1371 | [[package]] 1372 | name = "mp4-atom" 1373 | version = "0.9.2" 1374 | source = "registry+https://github.com/rust-lang/crates.io-index" 1375 | checksum = "58b9fcf396d53fdf1c43a9afd38953412b9d782d11391807b473927317bb28f9" 1376 | dependencies = [ 1377 | "bytes", 1378 | "derive_more", 1379 | "num", 1380 | "paste", 1381 | "serde", 1382 | "thiserror 1.0.69", 1383 | "tokio", 1384 | "tracing", 1385 | ] 1386 | 1387 | [[package]] 1388 | name = "muldiv" 1389 | version = "1.0.1" 1390 | source = "registry+https://github.com/rust-lang/crates.io-index" 1391 | checksum = "956787520e75e9bd233246045d19f42fb73242759cc57fba9611d940ae96d4b0" 1392 | 1393 | [[package]] 1394 | name = "nom" 1395 | version = "7.1.3" 1396 | source = "registry+https://github.com/rust-lang/crates.io-index" 1397 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 1398 | dependencies = [ 1399 | "memchr", 1400 | "minimal-lexical", 1401 | ] 1402 | 1403 | [[package]] 1404 | name = "nu-ansi-term" 1405 | version = "0.50.3" 1406 | source = "registry+https://github.com/rust-lang/crates.io-index" 1407 | checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" 1408 | dependencies = [ 1409 | "windows-sys 0.61.2", 1410 | ] 1411 | 1412 | [[package]] 1413 | name = "num" 1414 | version = "0.4.3" 1415 | source = "registry+https://github.com/rust-lang/crates.io-index" 1416 | checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" 1417 | dependencies = [ 1418 | "num-bigint", 1419 | "num-complex", 1420 | "num-integer", 1421 | "num-iter", 1422 | "num-rational", 1423 | "num-traits", 1424 | ] 1425 | 1426 | [[package]] 1427 | name = "num-bigint" 1428 | version = "0.4.6" 1429 | source = "registry+https://github.com/rust-lang/crates.io-index" 1430 | checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 1431 | dependencies = [ 1432 | "num-integer", 1433 | "num-traits", 1434 | ] 1435 | 1436 | [[package]] 1437 | name = "num-complex" 1438 | version = "0.4.6" 1439 | source = "registry+https://github.com/rust-lang/crates.io-index" 1440 | checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" 1441 | dependencies = [ 1442 | "num-traits", 1443 | ] 1444 | 1445 | [[package]] 1446 | name = "num-conv" 1447 | version = "0.1.0" 1448 | source = "registry+https://github.com/rust-lang/crates.io-index" 1449 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1450 | 1451 | [[package]] 1452 | name = "num-integer" 1453 | version = "0.1.46" 1454 | source = "registry+https://github.com/rust-lang/crates.io-index" 1455 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1456 | dependencies = [ 1457 | "num-traits", 1458 | ] 1459 | 1460 | [[package]] 1461 | name = "num-iter" 1462 | version = "0.1.45" 1463 | source = "registry+https://github.com/rust-lang/crates.io-index" 1464 | checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" 1465 | dependencies = [ 1466 | "autocfg", 1467 | "num-integer", 1468 | "num-traits", 1469 | ] 1470 | 1471 | [[package]] 1472 | name = "num-rational" 1473 | version = "0.4.2" 1474 | source = "registry+https://github.com/rust-lang/crates.io-index" 1475 | checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" 1476 | dependencies = [ 1477 | "num-bigint", 1478 | "num-integer", 1479 | "num-traits", 1480 | ] 1481 | 1482 | [[package]] 1483 | name = "num-traits" 1484 | version = "0.2.19" 1485 | source = "registry+https://github.com/rust-lang/crates.io-index" 1486 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1487 | dependencies = [ 1488 | "autocfg", 1489 | ] 1490 | 1491 | [[package]] 1492 | name = "num_enum" 1493 | version = "0.7.5" 1494 | source = "registry+https://github.com/rust-lang/crates.io-index" 1495 | checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" 1496 | dependencies = [ 1497 | "num_enum_derive", 1498 | "rustversion", 1499 | ] 1500 | 1501 | [[package]] 1502 | name = "num_enum_derive" 1503 | version = "0.7.5" 1504 | source = "registry+https://github.com/rust-lang/crates.io-index" 1505 | checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" 1506 | dependencies = [ 1507 | "proc-macro-crate", 1508 | "proc-macro2", 1509 | "quote", 1510 | "syn", 1511 | ] 1512 | 1513 | [[package]] 1514 | name = "object" 1515 | version = "0.37.3" 1516 | source = "registry+https://github.com/rust-lang/crates.io-index" 1517 | checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" 1518 | dependencies = [ 1519 | "memchr", 1520 | ] 1521 | 1522 | [[package]] 1523 | name = "once_cell" 1524 | version = "1.21.3" 1525 | source = "registry+https://github.com/rust-lang/crates.io-index" 1526 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 1527 | 1528 | [[package]] 1529 | name = "once_cell_polyfill" 1530 | version = "1.70.2" 1531 | source = "registry+https://github.com/rust-lang/crates.io-index" 1532 | checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" 1533 | 1534 | [[package]] 1535 | name = "openssl-probe" 1536 | version = "0.1.6" 1537 | source = "registry+https://github.com/rust-lang/crates.io-index" 1538 | checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 1539 | 1540 | [[package]] 1541 | name = "option-operations" 1542 | version = "0.5.0" 1543 | source = "registry+https://github.com/rust-lang/crates.io-index" 1544 | checksum = "7c26d27bb1aeab65138e4bf7666045169d1717febcc9ff870166be8348b223d0" 1545 | dependencies = [ 1546 | "paste", 1547 | ] 1548 | 1549 | [[package]] 1550 | name = "parking" 1551 | version = "2.2.1" 1552 | source = "registry+https://github.com/rust-lang/crates.io-index" 1553 | checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 1554 | 1555 | [[package]] 1556 | name = "parking_lot" 1557 | version = "0.12.5" 1558 | source = "registry+https://github.com/rust-lang/crates.io-index" 1559 | checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 1560 | dependencies = [ 1561 | "lock_api", 1562 | "parking_lot_core", 1563 | ] 1564 | 1565 | [[package]] 1566 | name = "parking_lot_core" 1567 | version = "0.9.12" 1568 | source = "registry+https://github.com/rust-lang/crates.io-index" 1569 | checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 1570 | dependencies = [ 1571 | "cfg-if", 1572 | "libc", 1573 | "redox_syscall", 1574 | "smallvec", 1575 | "windows-link", 1576 | ] 1577 | 1578 | [[package]] 1579 | name = "paste" 1580 | version = "1.0.15" 1581 | source = "registry+https://github.com/rust-lang/crates.io-index" 1582 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 1583 | 1584 | [[package]] 1585 | name = "percent-encoding" 1586 | version = "2.3.2" 1587 | source = "registry+https://github.com/rust-lang/crates.io-index" 1588 | checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 1589 | 1590 | [[package]] 1591 | name = "pin-project-lite" 1592 | version = "0.2.16" 1593 | source = "registry+https://github.com/rust-lang/crates.io-index" 1594 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1595 | 1596 | [[package]] 1597 | name = "pin-utils" 1598 | version = "0.1.0" 1599 | source = "registry+https://github.com/rust-lang/crates.io-index" 1600 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1601 | 1602 | [[package]] 1603 | name = "pkg-config" 1604 | version = "0.3.32" 1605 | source = "registry+https://github.com/rust-lang/crates.io-index" 1606 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 1607 | 1608 | [[package]] 1609 | name = "potential_utf" 1610 | version = "0.1.3" 1611 | source = "registry+https://github.com/rust-lang/crates.io-index" 1612 | checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" 1613 | dependencies = [ 1614 | "zerovec", 1615 | ] 1616 | 1617 | [[package]] 1618 | name = "powerfmt" 1619 | version = "0.2.0" 1620 | source = "registry+https://github.com/rust-lang/crates.io-index" 1621 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1622 | 1623 | [[package]] 1624 | name = "ppv-lite86" 1625 | version = "0.2.21" 1626 | source = "registry+https://github.com/rust-lang/crates.io-index" 1627 | checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 1628 | dependencies = [ 1629 | "zerocopy", 1630 | ] 1631 | 1632 | [[package]] 1633 | name = "prettyplease" 1634 | version = "0.2.37" 1635 | source = "registry+https://github.com/rust-lang/crates.io-index" 1636 | checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" 1637 | dependencies = [ 1638 | "proc-macro2", 1639 | "syn", 1640 | ] 1641 | 1642 | [[package]] 1643 | name = "proc-macro-crate" 1644 | version = "3.4.0" 1645 | source = "registry+https://github.com/rust-lang/crates.io-index" 1646 | checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" 1647 | dependencies = [ 1648 | "toml_edit", 1649 | ] 1650 | 1651 | [[package]] 1652 | name = "proc-macro2" 1653 | version = "1.0.102" 1654 | source = "registry+https://github.com/rust-lang/crates.io-index" 1655 | checksum = "8e0f6df8eaa422d97d72edcd152e1451618fed47fabbdbd5a8864167b1d4aff7" 1656 | dependencies = [ 1657 | "unicode-ident", 1658 | ] 1659 | 1660 | [[package]] 1661 | name = "quinn" 1662 | version = "0.11.9" 1663 | source = "registry+https://github.com/rust-lang/crates.io-index" 1664 | checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" 1665 | dependencies = [ 1666 | "bytes", 1667 | "cfg_aliases", 1668 | "pin-project-lite", 1669 | "quinn-proto", 1670 | "quinn-udp", 1671 | "rustc-hash", 1672 | "rustls", 1673 | "socket2", 1674 | "thiserror 2.0.17", 1675 | "tokio", 1676 | "tracing", 1677 | "web-time", 1678 | ] 1679 | 1680 | [[package]] 1681 | name = "quinn-proto" 1682 | version = "0.11.13" 1683 | source = "registry+https://github.com/rust-lang/crates.io-index" 1684 | checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" 1685 | dependencies = [ 1686 | "aws-lc-rs", 1687 | "bytes", 1688 | "fastbloom", 1689 | "getrandom 0.3.4", 1690 | "lru-slab", 1691 | "rand", 1692 | "ring", 1693 | "rustc-hash", 1694 | "rustls", 1695 | "rustls-pki-types", 1696 | "rustls-platform-verifier", 1697 | "slab", 1698 | "thiserror 2.0.17", 1699 | "tinyvec", 1700 | "tracing", 1701 | "web-time", 1702 | ] 1703 | 1704 | [[package]] 1705 | name = "quinn-udp" 1706 | version = "0.5.14" 1707 | source = "registry+https://github.com/rust-lang/crates.io-index" 1708 | checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" 1709 | dependencies = [ 1710 | "cfg_aliases", 1711 | "libc", 1712 | "once_cell", 1713 | "socket2", 1714 | "tracing", 1715 | "windows-sys 0.60.2", 1716 | ] 1717 | 1718 | [[package]] 1719 | name = "quote" 1720 | version = "1.0.41" 1721 | source = "registry+https://github.com/rust-lang/crates.io-index" 1722 | checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" 1723 | dependencies = [ 1724 | "proc-macro2", 1725 | ] 1726 | 1727 | [[package]] 1728 | name = "r-efi" 1729 | version = "5.3.0" 1730 | source = "registry+https://github.com/rust-lang/crates.io-index" 1731 | checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 1732 | 1733 | [[package]] 1734 | name = "rand" 1735 | version = "0.9.2" 1736 | source = "registry+https://github.com/rust-lang/crates.io-index" 1737 | checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 1738 | dependencies = [ 1739 | "rand_chacha", 1740 | "rand_core", 1741 | ] 1742 | 1743 | [[package]] 1744 | name = "rand_chacha" 1745 | version = "0.9.0" 1746 | source = "registry+https://github.com/rust-lang/crates.io-index" 1747 | checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 1748 | dependencies = [ 1749 | "ppv-lite86", 1750 | "rand_core", 1751 | ] 1752 | 1753 | [[package]] 1754 | name = "rand_core" 1755 | version = "0.9.3" 1756 | source = "registry+https://github.com/rust-lang/crates.io-index" 1757 | checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 1758 | dependencies = [ 1759 | "getrandom 0.3.4", 1760 | ] 1761 | 1762 | [[package]] 1763 | name = "rcgen" 1764 | version = "0.14.5" 1765 | source = "registry+https://github.com/rust-lang/crates.io-index" 1766 | checksum = "5fae430c6b28f1ad601274e78b7dffa0546de0b73b4cd32f46723c0c2a16f7a5" 1767 | dependencies = [ 1768 | "aws-lc-rs", 1769 | "rustls-pki-types", 1770 | "time", 1771 | "yasna", 1772 | ] 1773 | 1774 | [[package]] 1775 | name = "redox_syscall" 1776 | version = "0.5.18" 1777 | source = "registry+https://github.com/rust-lang/crates.io-index" 1778 | checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 1779 | dependencies = [ 1780 | "bitflags", 1781 | ] 1782 | 1783 | [[package]] 1784 | name = "ref-cast" 1785 | version = "1.0.25" 1786 | source = "registry+https://github.com/rust-lang/crates.io-index" 1787 | checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" 1788 | dependencies = [ 1789 | "ref-cast-impl", 1790 | ] 1791 | 1792 | [[package]] 1793 | name = "ref-cast-impl" 1794 | version = "1.0.25" 1795 | source = "registry+https://github.com/rust-lang/crates.io-index" 1796 | checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" 1797 | dependencies = [ 1798 | "proc-macro2", 1799 | "quote", 1800 | "syn", 1801 | ] 1802 | 1803 | [[package]] 1804 | name = "regex" 1805 | version = "1.12.2" 1806 | source = "registry+https://github.com/rust-lang/crates.io-index" 1807 | checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" 1808 | dependencies = [ 1809 | "aho-corasick", 1810 | "memchr", 1811 | "regex-automata", 1812 | "regex-syntax", 1813 | ] 1814 | 1815 | [[package]] 1816 | name = "regex-automata" 1817 | version = "0.4.13" 1818 | source = "registry+https://github.com/rust-lang/crates.io-index" 1819 | checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" 1820 | dependencies = [ 1821 | "aho-corasick", 1822 | "memchr", 1823 | "regex-syntax", 1824 | ] 1825 | 1826 | [[package]] 1827 | name = "regex-syntax" 1828 | version = "0.8.8" 1829 | source = "registry+https://github.com/rust-lang/crates.io-index" 1830 | checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" 1831 | 1832 | [[package]] 1833 | name = "reqwest" 1834 | version = "0.12.24" 1835 | source = "registry+https://github.com/rust-lang/crates.io-index" 1836 | checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" 1837 | dependencies = [ 1838 | "base64", 1839 | "bytes", 1840 | "futures-core", 1841 | "http", 1842 | "http-body", 1843 | "http-body-util", 1844 | "hyper", 1845 | "hyper-util", 1846 | "js-sys", 1847 | "log", 1848 | "percent-encoding", 1849 | "pin-project-lite", 1850 | "serde", 1851 | "serde_json", 1852 | "serde_urlencoded", 1853 | "sync_wrapper", 1854 | "tokio", 1855 | "tower", 1856 | "tower-http", 1857 | "tower-service", 1858 | "url", 1859 | "wasm-bindgen", 1860 | "wasm-bindgen-futures", 1861 | "web-sys", 1862 | ] 1863 | 1864 | [[package]] 1865 | name = "ring" 1866 | version = "0.17.14" 1867 | source = "registry+https://github.com/rust-lang/crates.io-index" 1868 | checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 1869 | dependencies = [ 1870 | "cc", 1871 | "cfg-if", 1872 | "getrandom 0.2.16", 1873 | "libc", 1874 | "untrusted", 1875 | "windows-sys 0.52.0", 1876 | ] 1877 | 1878 | [[package]] 1879 | name = "rustc-demangle" 1880 | version = "0.1.26" 1881 | source = "registry+https://github.com/rust-lang/crates.io-index" 1882 | checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 1883 | 1884 | [[package]] 1885 | name = "rustc-hash" 1886 | version = "2.1.1" 1887 | source = "registry+https://github.com/rust-lang/crates.io-index" 1888 | checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 1889 | 1890 | [[package]] 1891 | name = "rustls" 1892 | version = "0.23.34" 1893 | source = "registry+https://github.com/rust-lang/crates.io-index" 1894 | checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" 1895 | dependencies = [ 1896 | "aws-lc-rs", 1897 | "log", 1898 | "once_cell", 1899 | "rustls-pki-types", 1900 | "rustls-webpki", 1901 | "subtle", 1902 | "zeroize", 1903 | ] 1904 | 1905 | [[package]] 1906 | name = "rustls-native-certs" 1907 | version = "0.8.2" 1908 | source = "registry+https://github.com/rust-lang/crates.io-index" 1909 | checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" 1910 | dependencies = [ 1911 | "openssl-probe", 1912 | "rustls-pki-types", 1913 | "schannel", 1914 | "security-framework", 1915 | ] 1916 | 1917 | [[package]] 1918 | name = "rustls-pemfile" 1919 | version = "2.2.0" 1920 | source = "registry+https://github.com/rust-lang/crates.io-index" 1921 | checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" 1922 | dependencies = [ 1923 | "rustls-pki-types", 1924 | ] 1925 | 1926 | [[package]] 1927 | name = "rustls-pki-types" 1928 | version = "1.12.0" 1929 | source = "registry+https://github.com/rust-lang/crates.io-index" 1930 | checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" 1931 | dependencies = [ 1932 | "web-time", 1933 | "zeroize", 1934 | ] 1935 | 1936 | [[package]] 1937 | name = "rustls-platform-verifier" 1938 | version = "0.6.2" 1939 | source = "registry+https://github.com/rust-lang/crates.io-index" 1940 | checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" 1941 | dependencies = [ 1942 | "core-foundation", 1943 | "core-foundation-sys", 1944 | "jni", 1945 | "log", 1946 | "once_cell", 1947 | "rustls", 1948 | "rustls-native-certs", 1949 | "rustls-platform-verifier-android", 1950 | "rustls-webpki", 1951 | "security-framework", 1952 | "security-framework-sys", 1953 | "webpki-root-certs", 1954 | "windows-sys 0.61.2", 1955 | ] 1956 | 1957 | [[package]] 1958 | name = "rustls-platform-verifier-android" 1959 | version = "0.1.1" 1960 | source = "registry+https://github.com/rust-lang/crates.io-index" 1961 | checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" 1962 | 1963 | [[package]] 1964 | name = "rustls-webpki" 1965 | version = "0.103.7" 1966 | source = "registry+https://github.com/rust-lang/crates.io-index" 1967 | checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" 1968 | dependencies = [ 1969 | "aws-lc-rs", 1970 | "ring", 1971 | "rustls-pki-types", 1972 | "untrusted", 1973 | ] 1974 | 1975 | [[package]] 1976 | name = "rustversion" 1977 | version = "1.0.22" 1978 | source = "registry+https://github.com/rust-lang/crates.io-index" 1979 | checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 1980 | 1981 | [[package]] 1982 | name = "ryu" 1983 | version = "1.0.20" 1984 | source = "registry+https://github.com/rust-lang/crates.io-index" 1985 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1986 | 1987 | [[package]] 1988 | name = "same-file" 1989 | version = "1.0.6" 1990 | source = "registry+https://github.com/rust-lang/crates.io-index" 1991 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1992 | dependencies = [ 1993 | "winapi-util", 1994 | ] 1995 | 1996 | [[package]] 1997 | name = "schannel" 1998 | version = "0.1.28" 1999 | source = "registry+https://github.com/rust-lang/crates.io-index" 2000 | checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" 2001 | dependencies = [ 2002 | "windows-sys 0.61.2", 2003 | ] 2004 | 2005 | [[package]] 2006 | name = "schemars" 2007 | version = "0.9.0" 2008 | source = "registry+https://github.com/rust-lang/crates.io-index" 2009 | checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" 2010 | dependencies = [ 2011 | "dyn-clone", 2012 | "ref-cast", 2013 | "serde", 2014 | "serde_json", 2015 | ] 2016 | 2017 | [[package]] 2018 | name = "schemars" 2019 | version = "1.0.4" 2020 | source = "registry+https://github.com/rust-lang/crates.io-index" 2021 | checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" 2022 | dependencies = [ 2023 | "dyn-clone", 2024 | "ref-cast", 2025 | "serde", 2026 | "serde_json", 2027 | ] 2028 | 2029 | [[package]] 2030 | name = "scopeguard" 2031 | version = "1.2.0" 2032 | source = "registry+https://github.com/rust-lang/crates.io-index" 2033 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 2034 | 2035 | [[package]] 2036 | name = "security-framework" 2037 | version = "3.5.1" 2038 | source = "registry+https://github.com/rust-lang/crates.io-index" 2039 | checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" 2040 | dependencies = [ 2041 | "bitflags", 2042 | "core-foundation", 2043 | "core-foundation-sys", 2044 | "libc", 2045 | "security-framework-sys", 2046 | ] 2047 | 2048 | [[package]] 2049 | name = "security-framework-sys" 2050 | version = "2.15.0" 2051 | source = "registry+https://github.com/rust-lang/crates.io-index" 2052 | checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" 2053 | dependencies = [ 2054 | "core-foundation-sys", 2055 | "libc", 2056 | ] 2057 | 2058 | [[package]] 2059 | name = "serde" 2060 | version = "1.0.228" 2061 | source = "registry+https://github.com/rust-lang/crates.io-index" 2062 | checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 2063 | dependencies = [ 2064 | "serde_core", 2065 | "serde_derive", 2066 | ] 2067 | 2068 | [[package]] 2069 | name = "serde_core" 2070 | version = "1.0.228" 2071 | source = "registry+https://github.com/rust-lang/crates.io-index" 2072 | checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 2073 | dependencies = [ 2074 | "serde_derive", 2075 | ] 2076 | 2077 | [[package]] 2078 | name = "serde_derive" 2079 | version = "1.0.228" 2080 | source = "registry+https://github.com/rust-lang/crates.io-index" 2081 | checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 2082 | dependencies = [ 2083 | "proc-macro2", 2084 | "quote", 2085 | "syn", 2086 | ] 2087 | 2088 | [[package]] 2089 | name = "serde_json" 2090 | version = "1.0.145" 2091 | source = "registry+https://github.com/rust-lang/crates.io-index" 2092 | checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 2093 | dependencies = [ 2094 | "itoa", 2095 | "memchr", 2096 | "ryu", 2097 | "serde", 2098 | "serde_core", 2099 | ] 2100 | 2101 | [[package]] 2102 | name = "serde_spanned" 2103 | version = "1.0.3" 2104 | source = "registry+https://github.com/rust-lang/crates.io-index" 2105 | checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" 2106 | dependencies = [ 2107 | "serde_core", 2108 | ] 2109 | 2110 | [[package]] 2111 | name = "serde_urlencoded" 2112 | version = "0.7.1" 2113 | source = "registry+https://github.com/rust-lang/crates.io-index" 2114 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 2115 | dependencies = [ 2116 | "form_urlencoded", 2117 | "itoa", 2118 | "ryu", 2119 | "serde", 2120 | ] 2121 | 2122 | [[package]] 2123 | name = "serde_with" 2124 | version = "3.15.1" 2125 | source = "registry+https://github.com/rust-lang/crates.io-index" 2126 | checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" 2127 | dependencies = [ 2128 | "base64", 2129 | "chrono", 2130 | "hex", 2131 | "indexmap 1.9.3", 2132 | "indexmap 2.12.0", 2133 | "schemars 0.9.0", 2134 | "schemars 1.0.4", 2135 | "serde_core", 2136 | "serde_json", 2137 | "serde_with_macros", 2138 | "time", 2139 | ] 2140 | 2141 | [[package]] 2142 | name = "serde_with_macros" 2143 | version = "3.15.1" 2144 | source = "registry+https://github.com/rust-lang/crates.io-index" 2145 | checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" 2146 | dependencies = [ 2147 | "darling", 2148 | "proc-macro2", 2149 | "quote", 2150 | "syn", 2151 | ] 2152 | 2153 | [[package]] 2154 | name = "sharded-slab" 2155 | version = "0.1.7" 2156 | source = "registry+https://github.com/rust-lang/crates.io-index" 2157 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 2158 | dependencies = [ 2159 | "lazy_static", 2160 | ] 2161 | 2162 | [[package]] 2163 | name = "shlex" 2164 | version = "1.3.0" 2165 | source = "registry+https://github.com/rust-lang/crates.io-index" 2166 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 2167 | 2168 | [[package]] 2169 | name = "signal-hook-registry" 2170 | version = "1.4.6" 2171 | source = "registry+https://github.com/rust-lang/crates.io-index" 2172 | checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" 2173 | dependencies = [ 2174 | "libc", 2175 | ] 2176 | 2177 | [[package]] 2178 | name = "siphasher" 2179 | version = "1.0.1" 2180 | source = "registry+https://github.com/rust-lang/crates.io-index" 2181 | checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" 2182 | 2183 | [[package]] 2184 | name = "slab" 2185 | version = "0.4.11" 2186 | source = "registry+https://github.com/rust-lang/crates.io-index" 2187 | checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 2188 | 2189 | [[package]] 2190 | name = "smallvec" 2191 | version = "1.15.1" 2192 | source = "registry+https://github.com/rust-lang/crates.io-index" 2193 | checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 2194 | 2195 | [[package]] 2196 | name = "socket2" 2197 | version = "0.6.1" 2198 | source = "registry+https://github.com/rust-lang/crates.io-index" 2199 | checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" 2200 | dependencies = [ 2201 | "libc", 2202 | "windows-sys 0.60.2", 2203 | ] 2204 | 2205 | [[package]] 2206 | name = "stable_deref_trait" 2207 | version = "1.2.1" 2208 | source = "registry+https://github.com/rust-lang/crates.io-index" 2209 | checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" 2210 | 2211 | [[package]] 2212 | name = "strsim" 2213 | version = "0.11.1" 2214 | source = "registry+https://github.com/rust-lang/crates.io-index" 2215 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 2216 | 2217 | [[package]] 2218 | name = "subtle" 2219 | version = "2.6.1" 2220 | source = "registry+https://github.com/rust-lang/crates.io-index" 2221 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 2222 | 2223 | [[package]] 2224 | name = "syn" 2225 | version = "2.0.108" 2226 | source = "registry+https://github.com/rust-lang/crates.io-index" 2227 | checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" 2228 | dependencies = [ 2229 | "proc-macro2", 2230 | "quote", 2231 | "unicode-ident", 2232 | ] 2233 | 2234 | [[package]] 2235 | name = "sync_wrapper" 2236 | version = "1.0.2" 2237 | source = "registry+https://github.com/rust-lang/crates.io-index" 2238 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 2239 | dependencies = [ 2240 | "futures-core", 2241 | ] 2242 | 2243 | [[package]] 2244 | name = "synstructure" 2245 | version = "0.13.2" 2246 | source = "registry+https://github.com/rust-lang/crates.io-index" 2247 | checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 2248 | dependencies = [ 2249 | "proc-macro2", 2250 | "quote", 2251 | "syn", 2252 | ] 2253 | 2254 | [[package]] 2255 | name = "system-deps" 2256 | version = "7.0.6" 2257 | source = "registry+https://github.com/rust-lang/crates.io-index" 2258 | checksum = "c236d79f20808ca0084bfcd1a2fd6c686216b7f7a0c4fc39deb0cbf5eaab3713" 2259 | dependencies = [ 2260 | "cfg-expr", 2261 | "heck", 2262 | "pkg-config", 2263 | "toml", 2264 | "version-compare", 2265 | ] 2266 | 2267 | [[package]] 2268 | name = "target-lexicon" 2269 | version = "0.13.2" 2270 | source = "registry+https://github.com/rust-lang/crates.io-index" 2271 | checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" 2272 | 2273 | [[package]] 2274 | name = "thiserror" 2275 | version = "1.0.69" 2276 | source = "registry+https://github.com/rust-lang/crates.io-index" 2277 | checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" 2278 | dependencies = [ 2279 | "thiserror-impl 1.0.69", 2280 | ] 2281 | 2282 | [[package]] 2283 | name = "thiserror" 2284 | version = "2.0.17" 2285 | source = "registry+https://github.com/rust-lang/crates.io-index" 2286 | checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 2287 | dependencies = [ 2288 | "thiserror-impl 2.0.17", 2289 | ] 2290 | 2291 | [[package]] 2292 | name = "thiserror-impl" 2293 | version = "1.0.69" 2294 | source = "registry+https://github.com/rust-lang/crates.io-index" 2295 | checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" 2296 | dependencies = [ 2297 | "proc-macro2", 2298 | "quote", 2299 | "syn", 2300 | ] 2301 | 2302 | [[package]] 2303 | name = "thiserror-impl" 2304 | version = "2.0.17" 2305 | source = "registry+https://github.com/rust-lang/crates.io-index" 2306 | checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 2307 | dependencies = [ 2308 | "proc-macro2", 2309 | "quote", 2310 | "syn", 2311 | ] 2312 | 2313 | [[package]] 2314 | name = "thread_local" 2315 | version = "1.1.9" 2316 | source = "registry+https://github.com/rust-lang/crates.io-index" 2317 | checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" 2318 | dependencies = [ 2319 | "cfg-if", 2320 | ] 2321 | 2322 | [[package]] 2323 | name = "time" 2324 | version = "0.3.44" 2325 | source = "registry+https://github.com/rust-lang/crates.io-index" 2326 | checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" 2327 | dependencies = [ 2328 | "deranged", 2329 | "itoa", 2330 | "num-conv", 2331 | "powerfmt", 2332 | "serde", 2333 | "time-core", 2334 | "time-macros", 2335 | ] 2336 | 2337 | [[package]] 2338 | name = "time-core" 2339 | version = "0.1.6" 2340 | source = "registry+https://github.com/rust-lang/crates.io-index" 2341 | checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" 2342 | 2343 | [[package]] 2344 | name = "time-macros" 2345 | version = "0.2.24" 2346 | source = "registry+https://github.com/rust-lang/crates.io-index" 2347 | checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" 2348 | dependencies = [ 2349 | "num-conv", 2350 | "time-core", 2351 | ] 2352 | 2353 | [[package]] 2354 | name = "tinystr" 2355 | version = "0.8.1" 2356 | source = "registry+https://github.com/rust-lang/crates.io-index" 2357 | checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 2358 | dependencies = [ 2359 | "displaydoc", 2360 | "zerovec", 2361 | ] 2362 | 2363 | [[package]] 2364 | name = "tinyvec" 2365 | version = "1.10.0" 2366 | source = "registry+https://github.com/rust-lang/crates.io-index" 2367 | checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" 2368 | dependencies = [ 2369 | "tinyvec_macros", 2370 | ] 2371 | 2372 | [[package]] 2373 | name = "tinyvec_macros" 2374 | version = "0.1.1" 2375 | source = "registry+https://github.com/rust-lang/crates.io-index" 2376 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 2377 | 2378 | [[package]] 2379 | name = "tokio" 2380 | version = "1.48.0" 2381 | source = "registry+https://github.com/rust-lang/crates.io-index" 2382 | checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" 2383 | dependencies = [ 2384 | "bytes", 2385 | "libc", 2386 | "mio", 2387 | "parking_lot", 2388 | "pin-project-lite", 2389 | "signal-hook-registry", 2390 | "socket2", 2391 | "tokio-macros", 2392 | "windows-sys 0.61.2", 2393 | ] 2394 | 2395 | [[package]] 2396 | name = "tokio-macros" 2397 | version = "2.6.0" 2398 | source = "registry+https://github.com/rust-lang/crates.io-index" 2399 | checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" 2400 | dependencies = [ 2401 | "proc-macro2", 2402 | "quote", 2403 | "syn", 2404 | ] 2405 | 2406 | [[package]] 2407 | name = "toml" 2408 | version = "0.9.8" 2409 | source = "registry+https://github.com/rust-lang/crates.io-index" 2410 | checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" 2411 | dependencies = [ 2412 | "indexmap 2.12.0", 2413 | "serde_core", 2414 | "serde_spanned", 2415 | "toml_datetime", 2416 | "toml_parser", 2417 | "toml_writer", 2418 | "winnow", 2419 | ] 2420 | 2421 | [[package]] 2422 | name = "toml_datetime" 2423 | version = "0.7.3" 2424 | source = "registry+https://github.com/rust-lang/crates.io-index" 2425 | checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" 2426 | dependencies = [ 2427 | "serde_core", 2428 | ] 2429 | 2430 | [[package]] 2431 | name = "toml_edit" 2432 | version = "0.23.7" 2433 | source = "registry+https://github.com/rust-lang/crates.io-index" 2434 | checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" 2435 | dependencies = [ 2436 | "indexmap 2.12.0", 2437 | "toml_datetime", 2438 | "toml_parser", 2439 | "winnow", 2440 | ] 2441 | 2442 | [[package]] 2443 | name = "toml_parser" 2444 | version = "1.0.4" 2445 | source = "registry+https://github.com/rust-lang/crates.io-index" 2446 | checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" 2447 | dependencies = [ 2448 | "winnow", 2449 | ] 2450 | 2451 | [[package]] 2452 | name = "toml_writer" 2453 | version = "1.0.4" 2454 | source = "registry+https://github.com/rust-lang/crates.io-index" 2455 | checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" 2456 | 2457 | [[package]] 2458 | name = "tower" 2459 | version = "0.5.2" 2460 | source = "registry+https://github.com/rust-lang/crates.io-index" 2461 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 2462 | dependencies = [ 2463 | "futures-core", 2464 | "futures-util", 2465 | "pin-project-lite", 2466 | "sync_wrapper", 2467 | "tokio", 2468 | "tower-layer", 2469 | "tower-service", 2470 | ] 2471 | 2472 | [[package]] 2473 | name = "tower-http" 2474 | version = "0.6.6" 2475 | source = "registry+https://github.com/rust-lang/crates.io-index" 2476 | checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 2477 | dependencies = [ 2478 | "bitflags", 2479 | "bytes", 2480 | "futures-util", 2481 | "http", 2482 | "http-body", 2483 | "iri-string", 2484 | "pin-project-lite", 2485 | "tower", 2486 | "tower-layer", 2487 | "tower-service", 2488 | ] 2489 | 2490 | [[package]] 2491 | name = "tower-layer" 2492 | version = "0.3.3" 2493 | source = "registry+https://github.com/rust-lang/crates.io-index" 2494 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 2495 | 2496 | [[package]] 2497 | name = "tower-service" 2498 | version = "0.3.3" 2499 | source = "registry+https://github.com/rust-lang/crates.io-index" 2500 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 2501 | 2502 | [[package]] 2503 | name = "tracing" 2504 | version = "0.1.41" 2505 | source = "registry+https://github.com/rust-lang/crates.io-index" 2506 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 2507 | dependencies = [ 2508 | "pin-project-lite", 2509 | "tracing-attributes", 2510 | "tracing-core", 2511 | ] 2512 | 2513 | [[package]] 2514 | name = "tracing-attributes" 2515 | version = "0.1.30" 2516 | source = "registry+https://github.com/rust-lang/crates.io-index" 2517 | checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" 2518 | dependencies = [ 2519 | "proc-macro2", 2520 | "quote", 2521 | "syn", 2522 | ] 2523 | 2524 | [[package]] 2525 | name = "tracing-core" 2526 | version = "0.1.34" 2527 | source = "registry+https://github.com/rust-lang/crates.io-index" 2528 | checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" 2529 | dependencies = [ 2530 | "once_cell", 2531 | "valuable", 2532 | ] 2533 | 2534 | [[package]] 2535 | name = "tracing-log" 2536 | version = "0.2.0" 2537 | source = "registry+https://github.com/rust-lang/crates.io-index" 2538 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 2539 | dependencies = [ 2540 | "log", 2541 | "once_cell", 2542 | "tracing-core", 2543 | ] 2544 | 2545 | [[package]] 2546 | name = "tracing-subscriber" 2547 | version = "0.3.20" 2548 | source = "registry+https://github.com/rust-lang/crates.io-index" 2549 | checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" 2550 | dependencies = [ 2551 | "matchers", 2552 | "nu-ansi-term", 2553 | "once_cell", 2554 | "regex-automata", 2555 | "sharded-slab", 2556 | "smallvec", 2557 | "thread_local", 2558 | "tracing", 2559 | "tracing-core", 2560 | "tracing-log", 2561 | ] 2562 | 2563 | [[package]] 2564 | name = "try-lock" 2565 | version = "0.2.5" 2566 | source = "registry+https://github.com/rust-lang/crates.io-index" 2567 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2568 | 2569 | [[package]] 2570 | name = "unicode-ident" 2571 | version = "1.0.20" 2572 | source = "registry+https://github.com/rust-lang/crates.io-index" 2573 | checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" 2574 | 2575 | [[package]] 2576 | name = "unicode-xid" 2577 | version = "0.2.6" 2578 | source = "registry+https://github.com/rust-lang/crates.io-index" 2579 | checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 2580 | 2581 | [[package]] 2582 | name = "untrusted" 2583 | version = "0.9.0" 2584 | source = "registry+https://github.com/rust-lang/crates.io-index" 2585 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 2586 | 2587 | [[package]] 2588 | name = "url" 2589 | version = "2.5.7" 2590 | source = "registry+https://github.com/rust-lang/crates.io-index" 2591 | checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 2592 | dependencies = [ 2593 | "form_urlencoded", 2594 | "idna", 2595 | "percent-encoding", 2596 | "serde", 2597 | ] 2598 | 2599 | [[package]] 2600 | name = "utf8_iter" 2601 | version = "1.0.4" 2602 | source = "registry+https://github.com/rust-lang/crates.io-index" 2603 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2604 | 2605 | [[package]] 2606 | name = "utf8parse" 2607 | version = "0.2.2" 2608 | source = "registry+https://github.com/rust-lang/crates.io-index" 2609 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 2610 | 2611 | [[package]] 2612 | name = "valuable" 2613 | version = "0.1.1" 2614 | source = "registry+https://github.com/rust-lang/crates.io-index" 2615 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 2616 | 2617 | [[package]] 2618 | name = "version-compare" 2619 | version = "0.2.0" 2620 | source = "registry+https://github.com/rust-lang/crates.io-index" 2621 | checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" 2622 | 2623 | [[package]] 2624 | name = "walkdir" 2625 | version = "2.5.0" 2626 | source = "registry+https://github.com/rust-lang/crates.io-index" 2627 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 2628 | dependencies = [ 2629 | "same-file", 2630 | "winapi-util", 2631 | ] 2632 | 2633 | [[package]] 2634 | name = "want" 2635 | version = "0.3.1" 2636 | source = "registry+https://github.com/rust-lang/crates.io-index" 2637 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2638 | dependencies = [ 2639 | "try-lock", 2640 | ] 2641 | 2642 | [[package]] 2643 | name = "wasi" 2644 | version = "0.11.1+wasi-snapshot-preview1" 2645 | source = "registry+https://github.com/rust-lang/crates.io-index" 2646 | checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 2647 | 2648 | [[package]] 2649 | name = "wasip2" 2650 | version = "1.0.1+wasi-0.2.4" 2651 | source = "registry+https://github.com/rust-lang/crates.io-index" 2652 | checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 2653 | dependencies = [ 2654 | "wit-bindgen", 2655 | ] 2656 | 2657 | [[package]] 2658 | name = "wasm-bindgen" 2659 | version = "0.2.104" 2660 | source = "registry+https://github.com/rust-lang/crates.io-index" 2661 | checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" 2662 | dependencies = [ 2663 | "cfg-if", 2664 | "once_cell", 2665 | "rustversion", 2666 | "wasm-bindgen-macro", 2667 | "wasm-bindgen-shared", 2668 | ] 2669 | 2670 | [[package]] 2671 | name = "wasm-bindgen-backend" 2672 | version = "0.2.104" 2673 | source = "registry+https://github.com/rust-lang/crates.io-index" 2674 | checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" 2675 | dependencies = [ 2676 | "bumpalo", 2677 | "log", 2678 | "proc-macro2", 2679 | "quote", 2680 | "syn", 2681 | "wasm-bindgen-shared", 2682 | ] 2683 | 2684 | [[package]] 2685 | name = "wasm-bindgen-futures" 2686 | version = "0.4.54" 2687 | source = "registry+https://github.com/rust-lang/crates.io-index" 2688 | checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" 2689 | dependencies = [ 2690 | "cfg-if", 2691 | "js-sys", 2692 | "once_cell", 2693 | "wasm-bindgen", 2694 | "web-sys", 2695 | ] 2696 | 2697 | [[package]] 2698 | name = "wasm-bindgen-macro" 2699 | version = "0.2.104" 2700 | source = "registry+https://github.com/rust-lang/crates.io-index" 2701 | checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" 2702 | dependencies = [ 2703 | "quote", 2704 | "wasm-bindgen-macro-support", 2705 | ] 2706 | 2707 | [[package]] 2708 | name = "wasm-bindgen-macro-support" 2709 | version = "0.2.104" 2710 | source = "registry+https://github.com/rust-lang/crates.io-index" 2711 | checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" 2712 | dependencies = [ 2713 | "proc-macro2", 2714 | "quote", 2715 | "syn", 2716 | "wasm-bindgen-backend", 2717 | "wasm-bindgen-shared", 2718 | ] 2719 | 2720 | [[package]] 2721 | name = "wasm-bindgen-shared" 2722 | version = "0.2.104" 2723 | source = "registry+https://github.com/rust-lang/crates.io-index" 2724 | checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" 2725 | dependencies = [ 2726 | "unicode-ident", 2727 | ] 2728 | 2729 | [[package]] 2730 | name = "web-async" 2731 | version = "0.1.1" 2732 | source = "registry+https://github.com/rust-lang/crates.io-index" 2733 | checksum = "f6b2260b739b0e95cf9b78f22a64704af7ed9760ea12baa3745b4b97899dc89a" 2734 | dependencies = [ 2735 | "tokio", 2736 | "tracing", 2737 | "wasm-bindgen-futures", 2738 | ] 2739 | 2740 | [[package]] 2741 | name = "web-sys" 2742 | version = "0.3.81" 2743 | source = "registry+https://github.com/rust-lang/crates.io-index" 2744 | checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" 2745 | dependencies = [ 2746 | "js-sys", 2747 | "wasm-bindgen", 2748 | ] 2749 | 2750 | [[package]] 2751 | name = "web-time" 2752 | version = "1.1.0" 2753 | source = "registry+https://github.com/rust-lang/crates.io-index" 2754 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 2755 | dependencies = [ 2756 | "js-sys", 2757 | "wasm-bindgen", 2758 | ] 2759 | 2760 | [[package]] 2761 | name = "web-transport-proto" 2762 | version = "0.3.0" 2763 | source = "registry+https://github.com/rust-lang/crates.io-index" 2764 | checksum = "4b5400535d6dd4c07dc86e83651a838fd513de7f5011d4e4eafa239fa4d0ded4" 2765 | dependencies = [ 2766 | "bytes", 2767 | "http", 2768 | "thiserror 2.0.17", 2769 | "tokio", 2770 | "url", 2771 | ] 2772 | 2773 | [[package]] 2774 | name = "web-transport-quinn" 2775 | version = "0.10.1" 2776 | source = "registry+https://github.com/rust-lang/crates.io-index" 2777 | checksum = "91815d3170c715230c94b5107a71ccf81646513e548ee1408c3ce285d021d6ca" 2778 | dependencies = [ 2779 | "bytes", 2780 | "futures", 2781 | "http", 2782 | "log", 2783 | "quinn", 2784 | "rustls", 2785 | "rustls-native-certs", 2786 | "thiserror 2.0.17", 2787 | "tokio", 2788 | "url", 2789 | "web-transport-proto", 2790 | "web-transport-trait", 2791 | ] 2792 | 2793 | [[package]] 2794 | name = "web-transport-trait" 2795 | version = "0.3.0" 2796 | source = "registry+https://github.com/rust-lang/crates.io-index" 2797 | checksum = "8f4bafa8c6ff708042f67ef8031ca0f342822fd785b70f36a4b2c014760fc442" 2798 | dependencies = [ 2799 | "bytes", 2800 | ] 2801 | 2802 | [[package]] 2803 | name = "webpki-root-certs" 2804 | version = "1.0.3" 2805 | source = "registry+https://github.com/rust-lang/crates.io-index" 2806 | checksum = "05d651ec480de84b762e7be71e6efa7461699c19d9e2c272c8d93455f567786e" 2807 | dependencies = [ 2808 | "rustls-pki-types", 2809 | ] 2810 | 2811 | [[package]] 2812 | name = "winapi-util" 2813 | version = "0.1.11" 2814 | source = "registry+https://github.com/rust-lang/crates.io-index" 2815 | checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" 2816 | dependencies = [ 2817 | "windows-sys 0.61.2", 2818 | ] 2819 | 2820 | [[package]] 2821 | name = "windows-core" 2822 | version = "0.62.2" 2823 | source = "registry+https://github.com/rust-lang/crates.io-index" 2824 | checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" 2825 | dependencies = [ 2826 | "windows-implement", 2827 | "windows-interface", 2828 | "windows-link", 2829 | "windows-result", 2830 | "windows-strings", 2831 | ] 2832 | 2833 | [[package]] 2834 | name = "windows-implement" 2835 | version = "0.60.2" 2836 | source = "registry+https://github.com/rust-lang/crates.io-index" 2837 | checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" 2838 | dependencies = [ 2839 | "proc-macro2", 2840 | "quote", 2841 | "syn", 2842 | ] 2843 | 2844 | [[package]] 2845 | name = "windows-interface" 2846 | version = "0.59.3" 2847 | source = "registry+https://github.com/rust-lang/crates.io-index" 2848 | checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" 2849 | dependencies = [ 2850 | "proc-macro2", 2851 | "quote", 2852 | "syn", 2853 | ] 2854 | 2855 | [[package]] 2856 | name = "windows-link" 2857 | version = "0.2.1" 2858 | source = "registry+https://github.com/rust-lang/crates.io-index" 2859 | checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 2860 | 2861 | [[package]] 2862 | name = "windows-result" 2863 | version = "0.4.1" 2864 | source = "registry+https://github.com/rust-lang/crates.io-index" 2865 | checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" 2866 | dependencies = [ 2867 | "windows-link", 2868 | ] 2869 | 2870 | [[package]] 2871 | name = "windows-strings" 2872 | version = "0.5.1" 2873 | source = "registry+https://github.com/rust-lang/crates.io-index" 2874 | checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" 2875 | dependencies = [ 2876 | "windows-link", 2877 | ] 2878 | 2879 | [[package]] 2880 | name = "windows-sys" 2881 | version = "0.45.0" 2882 | source = "registry+https://github.com/rust-lang/crates.io-index" 2883 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 2884 | dependencies = [ 2885 | "windows-targets 0.42.2", 2886 | ] 2887 | 2888 | [[package]] 2889 | name = "windows-sys" 2890 | version = "0.52.0" 2891 | source = "registry+https://github.com/rust-lang/crates.io-index" 2892 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2893 | dependencies = [ 2894 | "windows-targets 0.52.6", 2895 | ] 2896 | 2897 | [[package]] 2898 | name = "windows-sys" 2899 | version = "0.59.0" 2900 | source = "registry+https://github.com/rust-lang/crates.io-index" 2901 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2902 | dependencies = [ 2903 | "windows-targets 0.52.6", 2904 | ] 2905 | 2906 | [[package]] 2907 | name = "windows-sys" 2908 | version = "0.60.2" 2909 | source = "registry+https://github.com/rust-lang/crates.io-index" 2910 | checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 2911 | dependencies = [ 2912 | "windows-targets 0.53.5", 2913 | ] 2914 | 2915 | [[package]] 2916 | name = "windows-sys" 2917 | version = "0.61.2" 2918 | source = "registry+https://github.com/rust-lang/crates.io-index" 2919 | checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 2920 | dependencies = [ 2921 | "windows-link", 2922 | ] 2923 | 2924 | [[package]] 2925 | name = "windows-targets" 2926 | version = "0.42.2" 2927 | source = "registry+https://github.com/rust-lang/crates.io-index" 2928 | checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" 2929 | dependencies = [ 2930 | "windows_aarch64_gnullvm 0.42.2", 2931 | "windows_aarch64_msvc 0.42.2", 2932 | "windows_i686_gnu 0.42.2", 2933 | "windows_i686_msvc 0.42.2", 2934 | "windows_x86_64_gnu 0.42.2", 2935 | "windows_x86_64_gnullvm 0.42.2", 2936 | "windows_x86_64_msvc 0.42.2", 2937 | ] 2938 | 2939 | [[package]] 2940 | name = "windows-targets" 2941 | version = "0.52.6" 2942 | source = "registry+https://github.com/rust-lang/crates.io-index" 2943 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2944 | dependencies = [ 2945 | "windows_aarch64_gnullvm 0.52.6", 2946 | "windows_aarch64_msvc 0.52.6", 2947 | "windows_i686_gnu 0.52.6", 2948 | "windows_i686_gnullvm 0.52.6", 2949 | "windows_i686_msvc 0.52.6", 2950 | "windows_x86_64_gnu 0.52.6", 2951 | "windows_x86_64_gnullvm 0.52.6", 2952 | "windows_x86_64_msvc 0.52.6", 2953 | ] 2954 | 2955 | [[package]] 2956 | name = "windows-targets" 2957 | version = "0.53.5" 2958 | source = "registry+https://github.com/rust-lang/crates.io-index" 2959 | checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" 2960 | dependencies = [ 2961 | "windows-link", 2962 | "windows_aarch64_gnullvm 0.53.1", 2963 | "windows_aarch64_msvc 0.53.1", 2964 | "windows_i686_gnu 0.53.1", 2965 | "windows_i686_gnullvm 0.53.1", 2966 | "windows_i686_msvc 0.53.1", 2967 | "windows_x86_64_gnu 0.53.1", 2968 | "windows_x86_64_gnullvm 0.53.1", 2969 | "windows_x86_64_msvc 0.53.1", 2970 | ] 2971 | 2972 | [[package]] 2973 | name = "windows_aarch64_gnullvm" 2974 | version = "0.42.2" 2975 | source = "registry+https://github.com/rust-lang/crates.io-index" 2976 | checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" 2977 | 2978 | [[package]] 2979 | name = "windows_aarch64_gnullvm" 2980 | version = "0.52.6" 2981 | source = "registry+https://github.com/rust-lang/crates.io-index" 2982 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2983 | 2984 | [[package]] 2985 | name = "windows_aarch64_gnullvm" 2986 | version = "0.53.1" 2987 | source = "registry+https://github.com/rust-lang/crates.io-index" 2988 | checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" 2989 | 2990 | [[package]] 2991 | name = "windows_aarch64_msvc" 2992 | version = "0.42.2" 2993 | source = "registry+https://github.com/rust-lang/crates.io-index" 2994 | checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" 2995 | 2996 | [[package]] 2997 | name = "windows_aarch64_msvc" 2998 | version = "0.52.6" 2999 | source = "registry+https://github.com/rust-lang/crates.io-index" 3000 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 3001 | 3002 | [[package]] 3003 | name = "windows_aarch64_msvc" 3004 | version = "0.53.1" 3005 | source = "registry+https://github.com/rust-lang/crates.io-index" 3006 | checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" 3007 | 3008 | [[package]] 3009 | name = "windows_i686_gnu" 3010 | version = "0.42.2" 3011 | source = "registry+https://github.com/rust-lang/crates.io-index" 3012 | checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" 3013 | 3014 | [[package]] 3015 | name = "windows_i686_gnu" 3016 | version = "0.52.6" 3017 | source = "registry+https://github.com/rust-lang/crates.io-index" 3018 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 3019 | 3020 | [[package]] 3021 | name = "windows_i686_gnu" 3022 | version = "0.53.1" 3023 | source = "registry+https://github.com/rust-lang/crates.io-index" 3024 | checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" 3025 | 3026 | [[package]] 3027 | name = "windows_i686_gnullvm" 3028 | version = "0.52.6" 3029 | source = "registry+https://github.com/rust-lang/crates.io-index" 3030 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 3031 | 3032 | [[package]] 3033 | name = "windows_i686_gnullvm" 3034 | version = "0.53.1" 3035 | source = "registry+https://github.com/rust-lang/crates.io-index" 3036 | checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" 3037 | 3038 | [[package]] 3039 | name = "windows_i686_msvc" 3040 | version = "0.42.2" 3041 | source = "registry+https://github.com/rust-lang/crates.io-index" 3042 | checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" 3043 | 3044 | [[package]] 3045 | name = "windows_i686_msvc" 3046 | version = "0.52.6" 3047 | source = "registry+https://github.com/rust-lang/crates.io-index" 3048 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 3049 | 3050 | [[package]] 3051 | name = "windows_i686_msvc" 3052 | version = "0.53.1" 3053 | source = "registry+https://github.com/rust-lang/crates.io-index" 3054 | checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" 3055 | 3056 | [[package]] 3057 | name = "windows_x86_64_gnu" 3058 | version = "0.42.2" 3059 | source = "registry+https://github.com/rust-lang/crates.io-index" 3060 | checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" 3061 | 3062 | [[package]] 3063 | name = "windows_x86_64_gnu" 3064 | version = "0.52.6" 3065 | source = "registry+https://github.com/rust-lang/crates.io-index" 3066 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 3067 | 3068 | [[package]] 3069 | name = "windows_x86_64_gnu" 3070 | version = "0.53.1" 3071 | source = "registry+https://github.com/rust-lang/crates.io-index" 3072 | checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" 3073 | 3074 | [[package]] 3075 | name = "windows_x86_64_gnullvm" 3076 | version = "0.42.2" 3077 | source = "registry+https://github.com/rust-lang/crates.io-index" 3078 | checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" 3079 | 3080 | [[package]] 3081 | name = "windows_x86_64_gnullvm" 3082 | version = "0.52.6" 3083 | source = "registry+https://github.com/rust-lang/crates.io-index" 3084 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 3085 | 3086 | [[package]] 3087 | name = "windows_x86_64_gnullvm" 3088 | version = "0.53.1" 3089 | source = "registry+https://github.com/rust-lang/crates.io-index" 3090 | checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" 3091 | 3092 | [[package]] 3093 | name = "windows_x86_64_msvc" 3094 | version = "0.42.2" 3095 | source = "registry+https://github.com/rust-lang/crates.io-index" 3096 | checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" 3097 | 3098 | [[package]] 3099 | name = "windows_x86_64_msvc" 3100 | version = "0.52.6" 3101 | source = "registry+https://github.com/rust-lang/crates.io-index" 3102 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 3103 | 3104 | [[package]] 3105 | name = "windows_x86_64_msvc" 3106 | version = "0.53.1" 3107 | source = "registry+https://github.com/rust-lang/crates.io-index" 3108 | checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" 3109 | 3110 | [[package]] 3111 | name = "winnow" 3112 | version = "0.7.13" 3113 | source = "registry+https://github.com/rust-lang/crates.io-index" 3114 | checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" 3115 | dependencies = [ 3116 | "memchr", 3117 | ] 3118 | 3119 | [[package]] 3120 | name = "wit-bindgen" 3121 | version = "0.46.0" 3122 | source = "registry+https://github.com/rust-lang/crates.io-index" 3123 | checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" 3124 | 3125 | [[package]] 3126 | name = "writeable" 3127 | version = "0.6.1" 3128 | source = "registry+https://github.com/rust-lang/crates.io-index" 3129 | checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 3130 | 3131 | [[package]] 3132 | name = "yasna" 3133 | version = "0.5.2" 3134 | source = "registry+https://github.com/rust-lang/crates.io-index" 3135 | checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" 3136 | dependencies = [ 3137 | "time", 3138 | ] 3139 | 3140 | [[package]] 3141 | name = "yoke" 3142 | version = "0.8.0" 3143 | source = "registry+https://github.com/rust-lang/crates.io-index" 3144 | checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 3145 | dependencies = [ 3146 | "serde", 3147 | "stable_deref_trait", 3148 | "yoke-derive", 3149 | "zerofrom", 3150 | ] 3151 | 3152 | [[package]] 3153 | name = "yoke-derive" 3154 | version = "0.8.0" 3155 | source = "registry+https://github.com/rust-lang/crates.io-index" 3156 | checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 3157 | dependencies = [ 3158 | "proc-macro2", 3159 | "quote", 3160 | "syn", 3161 | "synstructure", 3162 | ] 3163 | 3164 | [[package]] 3165 | name = "zerocopy" 3166 | version = "0.8.27" 3167 | source = "registry+https://github.com/rust-lang/crates.io-index" 3168 | checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" 3169 | dependencies = [ 3170 | "zerocopy-derive", 3171 | ] 3172 | 3173 | [[package]] 3174 | name = "zerocopy-derive" 3175 | version = "0.8.27" 3176 | source = "registry+https://github.com/rust-lang/crates.io-index" 3177 | checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" 3178 | dependencies = [ 3179 | "proc-macro2", 3180 | "quote", 3181 | "syn", 3182 | ] 3183 | 3184 | [[package]] 3185 | name = "zerofrom" 3186 | version = "0.1.6" 3187 | source = "registry+https://github.com/rust-lang/crates.io-index" 3188 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 3189 | dependencies = [ 3190 | "zerofrom-derive", 3191 | ] 3192 | 3193 | [[package]] 3194 | name = "zerofrom-derive" 3195 | version = "0.1.6" 3196 | source = "registry+https://github.com/rust-lang/crates.io-index" 3197 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 3198 | dependencies = [ 3199 | "proc-macro2", 3200 | "quote", 3201 | "syn", 3202 | "synstructure", 3203 | ] 3204 | 3205 | [[package]] 3206 | name = "zeroize" 3207 | version = "1.8.2" 3208 | source = "registry+https://github.com/rust-lang/crates.io-index" 3209 | checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" 3210 | 3211 | [[package]] 3212 | name = "zerotrie" 3213 | version = "0.2.2" 3214 | source = "registry+https://github.com/rust-lang/crates.io-index" 3215 | checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 3216 | dependencies = [ 3217 | "displaydoc", 3218 | "yoke", 3219 | "zerofrom", 3220 | ] 3221 | 3222 | [[package]] 3223 | name = "zerovec" 3224 | version = "0.11.4" 3225 | source = "registry+https://github.com/rust-lang/crates.io-index" 3226 | checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" 3227 | dependencies = [ 3228 | "yoke", 3229 | "zerofrom", 3230 | "zerovec-derive", 3231 | ] 3232 | 3233 | [[package]] 3234 | name = "zerovec-derive" 3235 | version = "0.11.1" 3236 | source = "registry+https://github.com/rust-lang/crates.io-index" 3237 | checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 3238 | dependencies = [ 3239 | "proc-macro2", 3240 | "quote", 3241 | "syn", 3242 | ] 3243 | --------------------------------------------------------------------------------