├── .gitignore ├── src ├── robot │ ├── mod.rs │ ├── config.rs │ ├── util.rs │ └── controller.rs └── main.rs ├── Cargo.toml ├── README.md ├── .github └── workflows │ └── build.yml └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | **/*.rs.bk 3 | *~ -------------------------------------------------------------------------------- /src/robot/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod config; 2 | pub mod controller; 3 | #[macro_use] 4 | pub mod util; 5 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "ftc_http" 3 | version = "2.2.0" 4 | authors = ["Brooks J Rady "] 5 | edition = "2021" 6 | description = "Provides an interface to FTC OnBotJava from outside of the browser" 7 | license = "LGPL-3.0" 8 | 9 | [dependencies] 10 | confy = "0.4.0" 11 | lazy_static = "1.4.0" 12 | regex = "1.6.0" 13 | walkdir = "2.3.2" 14 | url = "2.2.2" 15 | 16 | [dependencies.reqwest] 17 | version = "0.11.11" 18 | default-features = false 19 | features = ["blocking", "cookies", "gzip", "json", "multipart", "rustls-tls"] 20 | 21 | [dependencies.serde] 22 | version = "1.0.139" 23 | features = ["derive"] 24 | 25 | [dependencies.structopt] 26 | version = "0.3.26" 27 | features = ["wrap_help"] 28 | 29 | [profile.release] 30 | opt-level = "z" 31 | lto = true 32 | codegen-units = 1 33 | panic = "abort" 34 | -------------------------------------------------------------------------------- /src/robot/config.rs: -------------------------------------------------------------------------------- 1 | use serde::{Deserialize, Serialize}; 2 | use std::time::Duration; 3 | 4 | #[derive(Serialize, Deserialize)] 5 | pub struct AppConfig { 6 | pub hosts: Vec, 7 | pub host_timeout: Duration, 8 | pub build_timeout: Duration, 9 | } 10 | 11 | impl Default for AppConfig { 12 | fn default() -> Self { 13 | // Should I really be using .into() here? 14 | // Maybe prefer something a little more explicit? 15 | let hosts = vec![ 16 | "http://192.168.43.1:8080".into(), 17 | "http://192.168.49.1:8080".into(), 18 | ]; 19 | let host_timeout = Duration::from_millis(500); 20 | let build_timeout = Duration::from_secs(45); 21 | Self { 22 | hosts, 23 | host_timeout, 24 | build_timeout, 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FTC HTTP 2 | 3 | For pre-compiled binaries, please see the [releases tab](https://github.com/TheLostLambda/ftc_http/releases). 4 | Currently, all three major, desktop operating systems are supported: Linux, Windows, and macOS. 5 | If you are working on a platform not supported by the current set of binaries, just open an issue under the [issues tab](https://github.com/TheLostLambda/ftc_http/issues) and I will add a supported binary. 6 | 7 | ## Configuration 8 | By default, `ftc_http` is set to use a rather aggressive connection timeout 9 | (500ms) when checking for robot controllers on the network. If `ftc_http` 10 | reports that the robot controller is offline when you are certain it's online, 11 | try increasing this value. 12 | 13 | When hosting a Wi-Fi network, the robot controller listens on one of two IP 14 | addresses: 15 | * `http://192.168.43.1:8080` (REV Control Hub) 16 | * `http://192.168.49.1:8080` (Android Phone) 17 | 18 | This version of `ftc_http` automatically tests both addressees, but if your 19 | robot controller is operating on a non-standard host address, you can add it to 20 | the list of hosts checked with the `--host` option. 21 | 22 | If the host and timeout options provided yield a successful connection, then 23 | they are automatically remembered and do not need to be given a second time. If 24 | you'd like to reset `ftc_http` to its default configuration, then simply pass 25 | the `--restore_defaults` flag. 26 | 27 | ## Usage 28 | Short flags can be combined to perform a series of actions following a single 29 | invocation. A somewhat contrived example of this would be the following command: 30 | ``` 31 | ftc_http -dwub foo/ bar/ 32 | ``` 33 | This command downloads a copy of the code from the robot controller (saving 34 | it in the foo/ directory), wipes the robot controller, uploads a fresh copy 35 | of the code (from the bar/ directory), and builds it. 36 | 37 | ## Building 38 | To build `ftc_http`, be sure that you have cloned the repository on your computer and then run: 39 | 40 | `cargo build --release` 41 | 42 | If you do not have Rust / Cargo installed, please see 43 | [rustup.rs](https://www.rustup.rs/). 44 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build Binaries 2 | on: 3 | workflow_dispatch: 4 | 5 | jobs: 6 | build-release: 7 | name: build-release 8 | runs-on: ${{ matrix.os }} 9 | env: 10 | RUST_BACKTRACE: 1 11 | strategy: 12 | matrix: 13 | build: 14 | - linux musl x64 15 | - linux musl aarch64 16 | - macos x64 17 | - macos aarch64 18 | - windows x64 19 | include: 20 | - build: linux musl x64 21 | os: ubuntu-latest 22 | rust: beta 23 | target: x86_64-unknown-linux-musl 24 | - build: linux musl aarch64 25 | os: ubuntu-latest 26 | rust: beta 27 | target: aarch64-unknown-linux-musl 28 | - build: macos x64 29 | os: macos-latest 30 | rust: beta 31 | target: x86_64-apple-darwin 32 | - build: macos aarch64 33 | os: macos-11 34 | rust: beta 35 | target: aarch64-apple-darwin 36 | - build: windows x64 37 | os: ubuntu-latest 38 | rust: beta 39 | target: x86_64-pc-windows-gnu 40 | steps: 41 | - name: Checkout repository 42 | uses: actions/checkout@v2 43 | 44 | - name: Install Rust 45 | uses: actions-rs/toolchain@v1 46 | with: 47 | toolchain: ${{ matrix.rust }} 48 | profile: minimal 49 | override: true 50 | target: ${{ matrix.target }} 51 | 52 | - name: Install musl-tools 53 | if: matrix.os == 'ubuntu-latest' 54 | run: sudo apt-get install -y --no-install-recommends musl-tools 55 | 56 | - name: Install cargo-cross 57 | run: cargo install --debug cross 58 | 59 | - name: Build release binary 60 | run: cross build --release --target ${{ matrix.target }} 61 | 62 | - name: Strip release binary 63 | run: strip "target/${{ matrix.target }}/release/ftc_http" || true 64 | 65 | - name: Archive binary artifacts 66 | uses: actions/upload-artifact@v2 67 | with: 68 | name: ftc_http-${{ matrix.target }} 69 | path: | 70 | target/${{ matrix.target }}/release/ftc_http 71 | target/${{ matrix.target }}/release/ftc_http.exe 72 | -------------------------------------------------------------------------------- /src/robot/util.rs: -------------------------------------------------------------------------------- 1 | use lazy_static::lazy_static; 2 | use regex::Regex; 3 | use serde::Deserialize; 4 | use std::error::Error; 5 | use std::fmt; 6 | use std::fs::File; 7 | use std::io::{BufRead, BufReader}; 8 | use std::path::{Path, PathBuf}; 9 | use std::time::Duration; 10 | 11 | pub type Result = std::result::Result>; 12 | 13 | #[derive(Deserialize)] 14 | pub struct Files { 15 | pub src: Vec, 16 | } 17 | 18 | #[derive(Deserialize)] 19 | pub struct BuildStatus { 20 | pub completed: bool, 21 | pub successful: bool, 22 | } 23 | 24 | #[derive(Debug)] 25 | pub enum RobotError { 26 | BuildTimeout(Duration), 27 | NoJavaPackage(PathBuf), 28 | NotConnected, 29 | } 30 | 31 | impl fmt::Display for RobotError { 32 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 33 | match self { 34 | Self::NotConnected => write!( 35 | f, 36 | "No known hosts were online.\n\n\ 37 | Please check that your robot controller is in \"Program & Manage\" mode and\n\ 38 | that your computer is connected to the robot controller via wifi-direct.\n\ 39 | Alternatively, you can try manually specifying a host address with the --host\n\ 40 | option or extending the timeout period with the --host-timeout-ms option." 41 | ), 42 | Self::NoJavaPackage(path) => write!( 43 | f, 44 | "Could not resolve the Java package for {}\n\n\ 45 | Does the file contain a correctly formatted `package ...;` line? A package\n\ 46 | declaration is required by OnBotJava to assign paths to uploaded files.", 47 | path.display() 48 | ), 49 | Self::BuildTimeout(duration) => write!( 50 | f, 51 | "The build has taken more than {} seconds to complete and appears unresponsive.\n\n\ 52 | Please restart the robot controller or, if this problem persists, increase the\n\ 53 | build timeout using the --build-timeout-sec option.", 54 | duration.as_secs() 55 | ), 56 | } 57 | } 58 | } 59 | 60 | impl Error for RobotError {} 61 | 62 | macro_rules! catch { 63 | ($result:expr, $code:expr, $fmt:expr $(, $arg:tt)*) => { 64 | match $result { 65 | Ok(val) => val, 66 | Err(err) => { 67 | eprintln!($fmt, $($arg, )* e = err); 68 | std::process::exit($code); 69 | } 70 | } 71 | } 72 | } 73 | 74 | pub fn java_package_to_path(java_file: &Path) -> Result { 75 | lazy_static! { 76 | static ref PACKAGE_LINE: Regex = Regex::new(r"package ([\S]+);").unwrap(); 77 | static ref PACKAGE_PATH: Regex = Regex::new(r"[^.]+").unwrap(); 78 | } 79 | let reader = BufReader::new(File::open(java_file)?); 80 | 81 | for line in reader.lines() { 82 | if let Some(package) = PACKAGE_LINE.captures(&line?) { 83 | let path: Vec = PACKAGE_PATH 84 | .captures_iter(&package[1]) 85 | .map(|c| c[0].to_string()) 86 | .collect(); 87 | let file_name = java_file.file_name().unwrap().to_string_lossy(); 88 | return Ok(format!("/{}/{}", path.join("/"), file_name)); 89 | } 90 | } 91 | 92 | Err(RobotError::NoJavaPackage(java_file.to_owned()).into()) 93 | } 94 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | mod robot; 3 | 4 | use crate::robot::config::AppConfig; 5 | use crate::robot::controller::RobotController; 6 | use core::time::Duration; 7 | use std::iter; 8 | use std::path::Path; 9 | use structopt::StructOpt; 10 | 11 | #[derive(StructOpt)] 12 | #[structopt(author)] 13 | /// Provides an interface to FTC OnBotJava from outside of the browser 14 | /// 15 | /// Flags can be combined to perform a series of actions following a single 16 | /// invocation. A somewhat contrived example of this would be the following 17 | /// command: 18 | /// 19 | /// ftc_http -dwub foo/ bar/ 20 | /// 21 | /// This command downloads a copy of the code from the robot controller (saving 22 | /// it in the foo/ directory), wipes the robot controller, uploads a fresh copy 23 | /// of the code (from the bar/ directory), and builds it. 24 | struct Ftc { 25 | /// Download .java files from the robot controller. 26 | /// 27 | /// Source files are saved to the location specified in DIRS. This defaults to 28 | /// the current directory. 29 | /// 30 | /// Files on the local computer are never deleted by ftc_http, though old 31 | /// files with the same name are overwritten. Be sure to save to a fresh 32 | /// location if you don't want to risk overwriting old source files. 33 | #[structopt(short, long)] 34 | download: bool, 35 | /// Uploads .java files to the robot controller. 36 | /// 37 | /// Uploads files from the location specified in DIRS. Defaults to the 38 | /// current directory. Source files are recursively located by their .java 39 | /// extension. 40 | #[structopt(short, long)] 41 | upload: bool, 42 | /// Builds the code on the robot controller. 43 | /// 44 | /// Initiates a build on the robot controller and reports the build status 45 | /// and any errors back to the user. 46 | #[structopt(short, long)] 47 | build: bool, 48 | /// Wipes all files from the robot controller. 49 | /// 50 | /// Using this option ensures that files deleted on the local machine are 51 | /// also deleted on the robot controller. Be cautious and make a backup with 52 | /// the -d option before wiping anything. 53 | #[structopt(short, long)] 54 | wipe: bool, 55 | /// A list of directories used by the download and upload options. 56 | /// 57 | /// Between 0 and 2 directories can be specified. When -d and -u are used 58 | /// together, the first directory is where files are downloaded and the 59 | /// second is where they are uploaded from. 60 | #[structopt(name = "DIRS")] 61 | directories: Vec, 62 | /// Manually specify the address of the robot controller. 63 | /// 64 | /// Addresses are given in the form: "http://:" 65 | #[structopt(long, name = "ADDR")] 66 | host: Option, 67 | /// Manually specify the connection timeout. 68 | /// 69 | /// Wait at least this long before declaring a robot controller offline 70 | /// (given in milliseconds). 71 | #[structopt(long, name = "HOST_DELAY")] 72 | host_timeout_ms: Option, 73 | /// Manually specify the build timeout. 74 | /// 75 | /// Wait at least this long before declaring the build system unresponsive 76 | /// (given in seconds). 77 | #[structopt(long, name = "BUILD_DELAY")] 78 | build_timeout_sec: Option, 79 | /// Reset the host and timeout values to their defaults. 80 | /// 81 | /// This deletes any custom values that have been automatically remembered. 82 | #[structopt(long)] 83 | restore_defaults: bool, 84 | } 85 | 86 | fn main() { 87 | let opt = Ftc::from_args(); 88 | if opt.restore_defaults { 89 | catch!( 90 | confy::store("ftc_http", AppConfig::default()), 91 | 1, 92 | "Failed {} to save configuration to file. \n\n{e}" 93 | ); 94 | } else if opt.download || opt.wipe || opt.upload || opt.build { 95 | let mut dirs = opt 96 | .directories 97 | .iter() 98 | .map(Path::new) 99 | .chain(iter::repeat(Path::new("."))); 100 | let mut conf: AppConfig = catch!( 101 | confy::load("ftc_http"), 102 | 2, 103 | "Failed to read configuration from file. \n\n{e}" 104 | ); 105 | if let Some(host) = opt.host { 106 | if !conf.hosts.contains(&host) { 107 | conf.hosts.insert(0, host); 108 | } 109 | } 110 | if let Some(ms) = opt.host_timeout_ms { 111 | conf.host_timeout = Duration::from_millis(ms); 112 | } 113 | if let Some(s) = opt.build_timeout_sec { 114 | conf.build_timeout = Duration::from_secs(s); 115 | } 116 | let r = catch!( 117 | RobotController::new(&mut conf), 118 | 3, 119 | "Failed to establish a connection with the robot controller. \n\n{e}" 120 | ); 121 | catch!( 122 | confy::store("ftc_http", conf), 123 | 1, 124 | "Failed {} to save configuration to file. \n\n{e}" 125 | ); 126 | if opt.download { 127 | catch!( 128 | r.download(dirs.next().unwrap()), 129 | 4, 130 | "Failed to download source files from the robot controller. \n\n{e}" 131 | ); 132 | } 133 | if opt.wipe { 134 | catch!( 135 | r.wipe(), 136 | 5, 137 | "Failed to wipe source files from the robot controller. \n\n{e}" 138 | ); 139 | } 140 | if opt.upload { 141 | catch!( 142 | r.upload(dirs.next().unwrap()), 143 | 6, 144 | "Failed to upload source files to the robot controller. \n\n{e}" 145 | ); 146 | } 147 | if opt.build { 148 | catch!( 149 | r.build(), 150 | 7, 151 | "Failed to build the source file on the robot controller. \n\n{e}" 152 | ); 153 | } 154 | } else { 155 | println!("Try running with -h for a usage summary or --help for a more complete manual."); 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /src/robot/controller.rs: -------------------------------------------------------------------------------- 1 | use crate::robot::{ 2 | config::AppConfig, 3 | util::{java_package_to_path, BuildStatus, Files, Result, RobotError}, 4 | }; 5 | use reqwest::blocking::{multipart, Client}; 6 | use std::{ 7 | fs, 8 | io::{self, Write}, 9 | path::Path, 10 | thread, 11 | time::{Duration, Instant}, 12 | }; 13 | use url::Url; 14 | use walkdir::WalkDir; 15 | 16 | pub struct RobotController { 17 | client: Client, 18 | host: Url, 19 | build_timeout: Duration, 20 | } 21 | 22 | impl RobotController { 23 | pub fn new(conf: &mut AppConfig) -> Result { 24 | // Make a HTTP client with a custom connection timeout and cookie support 25 | let client = Client::builder() 26 | .connect_timeout(conf.host_timeout) 27 | .cookie_store(true) 28 | .build()?; 29 | // Start pinging hosts to see which one the robot controller is on 30 | for (i, host) in conf.hosts.iter().cloned().enumerate() { 31 | let host = Url::parse(&host)?; 32 | print!("Trying host {}...", host); 33 | io::stdout().flush()?; 34 | match client.get(host.clone()).send() { 35 | Ok(resp) if resp.status().is_success() => { 36 | println!("online"); 37 | conf.hosts.swap(0, i); 38 | return Ok(Self { 39 | client, 40 | host, 41 | build_timeout: conf.build_timeout, 42 | }); 43 | } 44 | _ => { 45 | println!("offline"); 46 | continue; 47 | } 48 | } 49 | } 50 | // If no hosts are online, conclude that we aren't connected 51 | Err(RobotError::NotConnected.into()) 52 | } 53 | 54 | pub fn download(&self, dest: &Path) -> Result<()> { 55 | // Get a list of the remote files on the device 56 | let files = self.get_files()?; 57 | // Loop over all files with a `.java` extension, downloading them one at a time 58 | for file in files.iter().filter(|s| s.contains(".java")) { 59 | let path = dest.join(&file[1..]); 60 | fs::create_dir_all(path.parent().unwrap())?; 61 | 62 | print!("Pulling {}...", path.display()); 63 | io::stdout().flush()?; 64 | 65 | let mut url = self.host.join("/java/file/download")?; 66 | url.set_query(Some(&["f=/src", file].concat())); 67 | let data = self.client.get(url).send()?.text()?; 68 | 69 | fs::write(&path, &data)?; 70 | 71 | println!("done"); 72 | } 73 | Ok(()) 74 | } 75 | 76 | pub fn upload(&self, src: &Path) -> Result<()> { 77 | // Get a listing of all `.java` files in the local target directory 78 | let local_files = WalkDir::new(src) 79 | .into_iter() 80 | .filter_map(|e| e.ok()) 81 | .filter(|e| e.path().extension().map_or(false, |t| t == "java")) 82 | .map(|e| e.into_path()); 83 | 84 | // Get a listing of remote files, to resolve upload conflicts if a file already exists 85 | let remote_files = self.get_files()?; 86 | 87 | for file in local_files { 88 | print!("Pushing {}...", &file.display()); 89 | io::stdout().flush()?; 90 | 91 | // Predict the remote path using Java `package` information 92 | let java_path = java_package_to_path(&file)?; 93 | // Does the local file already exist on the robot controller? 94 | if remote_files.contains(&java_path) { 95 | // If so, delete it before attempting an upload 96 | self.delete(&java_path)?; 97 | } 98 | 99 | // Finally, upload the local file 100 | let url = self.host.join("/java/file/upload")?; 101 | let form = multipart::Form::new().file("file", file)?; 102 | self.client.post(url).multipart(form).send()?; 103 | 104 | println!("done"); 105 | } 106 | 107 | Ok(()) 108 | } 109 | 110 | pub fn build(&self) -> Result<()> { 111 | // Start a build on the robot controller 112 | let url = self.host.join("/java/build/start")?; 113 | self.client.get(url).send()?; 114 | 115 | print!("Building..."); 116 | io::stdout().flush()?; 117 | 118 | // Record the current time and poll the build until completion. If the build takes too long 119 | // to complete, bail out with an informative error 120 | let build_start = Instant::now(); 121 | while build_start.elapsed() < self.build_timeout { 122 | // Check the build status 123 | let url = self.host.join("/java/build/status")?; 124 | let status: BuildStatus = self.client.get(url).send()?.json()?; 125 | 126 | // If the build has completed 127 | if status.completed { 128 | // Check if it was successful 129 | if status.successful { 130 | // If it was, inform the user 131 | println!("BUILD SUCCESSFUL"); 132 | } else { 133 | // Otherwise inform the user of failure 134 | println!("BUILD FAILED"); 135 | 136 | // And print the encountered build errors 137 | let url = self.host.join("/java/build/wait")?; 138 | println!("{}", self.client.get(url).send()?.text()?); 139 | } 140 | // Return from the function since the build is complete 141 | return Ok(()); 142 | } 143 | 144 | print!("."); 145 | io::stdout().flush()?; 146 | 147 | // Wait a second between polling requests 148 | thread::sleep(Duration::from_secs(1)); 149 | } 150 | 151 | // If we made it all of the way here, the build has timed-out and we should inform the user 152 | println!("BUILD TIMEOUT"); 153 | Err(RobotError::BuildTimeout(self.build_timeout).into()) 154 | } 155 | 156 | pub fn wipe(&self) -> Result<()> { 157 | print!("Wiping all remote files..."); 158 | io::stdout().flush()?; 159 | 160 | // Recursively delete all files on the robot controller 161 | self.delete("/")?; 162 | 163 | println!("done"); 164 | Ok(()) 165 | } 166 | 167 | fn delete(&self, file: &str) -> Result<()> { 168 | let url = self.host.join("/java/file/delete")?; 169 | // Build the form params to be POSTed to delete the file 170 | let params = [("delete", format!(r#"["src/{}"]"#, &file[1..]))]; 171 | self.client.post(url).form(¶ms).send()?; 172 | 173 | Ok(()) 174 | } 175 | 176 | fn get_files(&self) -> Result> { 177 | // Read the remote file-tree into a vector of paths 178 | let url = self.host.join("/java/file/tree")?; 179 | let tree: Files = self.client.get(url).send()?.json()?; 180 | Ok(tree.src) 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "adler" 7 | version = "1.0.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 10 | 11 | [[package]] 12 | name = "aho-corasick" 13 | version = "0.7.18" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" 16 | dependencies = [ 17 | "memchr", 18 | ] 19 | 20 | [[package]] 21 | name = "ansi_term" 22 | version = "0.12.1" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" 25 | dependencies = [ 26 | "winapi", 27 | ] 28 | 29 | [[package]] 30 | name = "async-compression" 31 | version = "0.3.14" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "345fd392ab01f746c717b1357165b76f0b67a60192007b234058c9045fdcf695" 34 | dependencies = [ 35 | "flate2", 36 | "futures-core", 37 | "memchr", 38 | "pin-project-lite", 39 | "tokio", 40 | ] 41 | 42 | [[package]] 43 | name = "atty" 44 | version = "0.2.14" 45 | source = "registry+https://github.com/rust-lang/crates.io-index" 46 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 47 | dependencies = [ 48 | "hermit-abi", 49 | "libc", 50 | "winapi", 51 | ] 52 | 53 | [[package]] 54 | name = "autocfg" 55 | version = "1.1.0" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 58 | 59 | [[package]] 60 | name = "base64" 61 | version = "0.13.0" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 64 | 65 | [[package]] 66 | name = "bitflags" 67 | version = "1.3.2" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 70 | 71 | [[package]] 72 | name = "bumpalo" 73 | version = "3.10.0" 74 | source = "registry+https://github.com/rust-lang/crates.io-index" 75 | checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" 76 | 77 | [[package]] 78 | name = "byteorder" 79 | version = "1.4.3" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 82 | 83 | [[package]] 84 | name = "bytes" 85 | version = "1.1.0" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" 88 | 89 | [[package]] 90 | name = "cc" 91 | version = "1.0.73" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" 94 | 95 | [[package]] 96 | name = "cfg-if" 97 | version = "0.1.10" 98 | source = "registry+https://github.com/rust-lang/crates.io-index" 99 | checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 100 | 101 | [[package]] 102 | name = "cfg-if" 103 | version = "1.0.0" 104 | source = "registry+https://github.com/rust-lang/crates.io-index" 105 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 106 | 107 | [[package]] 108 | name = "clap" 109 | version = "2.34.0" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" 112 | dependencies = [ 113 | "ansi_term", 114 | "atty", 115 | "bitflags", 116 | "strsim", 117 | "term_size", 118 | "textwrap", 119 | "unicode-width", 120 | "vec_map", 121 | ] 122 | 123 | [[package]] 124 | name = "confy" 125 | version = "0.4.0" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "2913470204e9e8498a0f31f17f90a0de801ae92c8c5ac18c49af4819e6786697" 128 | dependencies = [ 129 | "directories", 130 | "serde", 131 | "toml", 132 | ] 133 | 134 | [[package]] 135 | name = "cookie" 136 | version = "0.16.0" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "94d4706de1b0fa5b132270cddffa8585166037822e260a944fe161acd137ca05" 139 | dependencies = [ 140 | "percent-encoding", 141 | "time", 142 | "version_check", 143 | ] 144 | 145 | [[package]] 146 | name = "cookie_store" 147 | version = "0.16.1" 148 | source = "registry+https://github.com/rust-lang/crates.io-index" 149 | checksum = "2e4b6aa369f41f5faa04bb80c9b1f4216ea81646ed6124d76ba5c49a7aafd9cd" 150 | dependencies = [ 151 | "cookie", 152 | "idna", 153 | "log", 154 | "publicsuffix", 155 | "serde", 156 | "serde_json", 157 | "time", 158 | "url", 159 | ] 160 | 161 | [[package]] 162 | name = "crc32fast" 163 | version = "1.3.2" 164 | source = "registry+https://github.com/rust-lang/crates.io-index" 165 | checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" 166 | dependencies = [ 167 | "cfg-if 1.0.0", 168 | ] 169 | 170 | [[package]] 171 | name = "directories" 172 | version = "2.0.2" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "551a778172a450d7fc12e629ca3b0428d00f6afa9a43da1b630d54604e97371c" 175 | dependencies = [ 176 | "cfg-if 0.1.10", 177 | "dirs-sys", 178 | ] 179 | 180 | [[package]] 181 | name = "dirs-sys" 182 | version = "0.3.7" 183 | source = "registry+https://github.com/rust-lang/crates.io-index" 184 | checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" 185 | dependencies = [ 186 | "libc", 187 | "redox_users", 188 | "winapi", 189 | ] 190 | 191 | [[package]] 192 | name = "encoding_rs" 193 | version = "0.8.31" 194 | source = "registry+https://github.com/rust-lang/crates.io-index" 195 | checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" 196 | dependencies = [ 197 | "cfg-if 1.0.0", 198 | ] 199 | 200 | [[package]] 201 | name = "flate2" 202 | version = "1.0.24" 203 | source = "registry+https://github.com/rust-lang/crates.io-index" 204 | checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" 205 | dependencies = [ 206 | "crc32fast", 207 | "miniz_oxide", 208 | ] 209 | 210 | [[package]] 211 | name = "fnv" 212 | version = "1.0.7" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 215 | 216 | [[package]] 217 | name = "form_urlencoded" 218 | version = "1.0.1" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 221 | dependencies = [ 222 | "matches", 223 | "percent-encoding", 224 | ] 225 | 226 | [[package]] 227 | name = "ftc_http" 228 | version = "2.2.0" 229 | dependencies = [ 230 | "confy", 231 | "lazy_static", 232 | "regex", 233 | "reqwest", 234 | "serde", 235 | "structopt", 236 | "url", 237 | "walkdir", 238 | ] 239 | 240 | [[package]] 241 | name = "futures-channel" 242 | version = "0.3.21" 243 | source = "registry+https://github.com/rust-lang/crates.io-index" 244 | checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" 245 | dependencies = [ 246 | "futures-core", 247 | ] 248 | 249 | [[package]] 250 | name = "futures-core" 251 | version = "0.3.21" 252 | source = "registry+https://github.com/rust-lang/crates.io-index" 253 | checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" 254 | 255 | [[package]] 256 | name = "futures-io" 257 | version = "0.3.21" 258 | source = "registry+https://github.com/rust-lang/crates.io-index" 259 | checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" 260 | 261 | [[package]] 262 | name = "futures-sink" 263 | version = "0.3.21" 264 | source = "registry+https://github.com/rust-lang/crates.io-index" 265 | checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" 266 | 267 | [[package]] 268 | name = "futures-task" 269 | version = "0.3.21" 270 | source = "registry+https://github.com/rust-lang/crates.io-index" 271 | checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" 272 | 273 | [[package]] 274 | name = "futures-util" 275 | version = "0.3.21" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" 278 | dependencies = [ 279 | "futures-core", 280 | "futures-io", 281 | "futures-task", 282 | "memchr", 283 | "pin-project-lite", 284 | "pin-utils", 285 | "slab", 286 | ] 287 | 288 | [[package]] 289 | name = "getrandom" 290 | version = "0.2.7" 291 | source = "registry+https://github.com/rust-lang/crates.io-index" 292 | checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" 293 | dependencies = [ 294 | "cfg-if 1.0.0", 295 | "libc", 296 | "wasi", 297 | ] 298 | 299 | [[package]] 300 | name = "h2" 301 | version = "0.3.13" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" 304 | dependencies = [ 305 | "bytes", 306 | "fnv", 307 | "futures-core", 308 | "futures-sink", 309 | "futures-util", 310 | "http", 311 | "indexmap", 312 | "slab", 313 | "tokio", 314 | "tokio-util", 315 | "tracing", 316 | ] 317 | 318 | [[package]] 319 | name = "hashbrown" 320 | version = "0.11.2" 321 | source = "registry+https://github.com/rust-lang/crates.io-index" 322 | checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" 323 | 324 | [[package]] 325 | name = "hashbrown" 326 | version = "0.12.2" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | checksum = "607c8a29735385251a339424dd462993c0fed8fa09d378f259377df08c126022" 329 | 330 | [[package]] 331 | name = "heck" 332 | version = "0.3.3" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" 335 | dependencies = [ 336 | "unicode-segmentation", 337 | ] 338 | 339 | [[package]] 340 | name = "hermit-abi" 341 | version = "0.1.19" 342 | source = "registry+https://github.com/rust-lang/crates.io-index" 343 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 344 | dependencies = [ 345 | "libc", 346 | ] 347 | 348 | [[package]] 349 | name = "http" 350 | version = "0.2.8" 351 | source = "registry+https://github.com/rust-lang/crates.io-index" 352 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 353 | dependencies = [ 354 | "bytes", 355 | "fnv", 356 | "itoa", 357 | ] 358 | 359 | [[package]] 360 | name = "http-body" 361 | version = "0.4.5" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 364 | dependencies = [ 365 | "bytes", 366 | "http", 367 | "pin-project-lite", 368 | ] 369 | 370 | [[package]] 371 | name = "httparse" 372 | version = "1.7.1" 373 | source = "registry+https://github.com/rust-lang/crates.io-index" 374 | checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" 375 | 376 | [[package]] 377 | name = "httpdate" 378 | version = "1.0.2" 379 | source = "registry+https://github.com/rust-lang/crates.io-index" 380 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 381 | 382 | [[package]] 383 | name = "hyper" 384 | version = "0.14.20" 385 | source = "registry+https://github.com/rust-lang/crates.io-index" 386 | checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" 387 | dependencies = [ 388 | "bytes", 389 | "futures-channel", 390 | "futures-core", 391 | "futures-util", 392 | "h2", 393 | "http", 394 | "http-body", 395 | "httparse", 396 | "httpdate", 397 | "itoa", 398 | "pin-project-lite", 399 | "socket2", 400 | "tokio", 401 | "tower-service", 402 | "tracing", 403 | "want", 404 | ] 405 | 406 | [[package]] 407 | name = "hyper-rustls" 408 | version = "0.23.0" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "d87c48c02e0dc5e3b849a2041db3029fd066650f8f717c07bf8ed78ccb895cac" 411 | dependencies = [ 412 | "http", 413 | "hyper", 414 | "rustls", 415 | "tokio", 416 | "tokio-rustls", 417 | ] 418 | 419 | [[package]] 420 | name = "idna" 421 | version = "0.2.3" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 424 | dependencies = [ 425 | "matches", 426 | "unicode-bidi", 427 | "unicode-normalization", 428 | ] 429 | 430 | [[package]] 431 | name = "indexmap" 432 | version = "1.9.1" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" 435 | dependencies = [ 436 | "autocfg", 437 | "hashbrown 0.12.2", 438 | ] 439 | 440 | [[package]] 441 | name = "ipnet" 442 | version = "2.5.0" 443 | source = "registry+https://github.com/rust-lang/crates.io-index" 444 | checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" 445 | 446 | [[package]] 447 | name = "itoa" 448 | version = "1.0.2" 449 | source = "registry+https://github.com/rust-lang/crates.io-index" 450 | checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" 451 | 452 | [[package]] 453 | name = "js-sys" 454 | version = "0.3.58" 455 | source = "registry+https://github.com/rust-lang/crates.io-index" 456 | checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" 457 | dependencies = [ 458 | "wasm-bindgen", 459 | ] 460 | 461 | [[package]] 462 | name = "lazy_static" 463 | version = "1.4.0" 464 | source = "registry+https://github.com/rust-lang/crates.io-index" 465 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 466 | 467 | [[package]] 468 | name = "libc" 469 | version = "0.2.126" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" 472 | 473 | [[package]] 474 | name = "log" 475 | version = "0.4.17" 476 | source = "registry+https://github.com/rust-lang/crates.io-index" 477 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 478 | dependencies = [ 479 | "cfg-if 1.0.0", 480 | ] 481 | 482 | [[package]] 483 | name = "matches" 484 | version = "0.1.9" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" 487 | 488 | [[package]] 489 | name = "memchr" 490 | version = "2.5.0" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 493 | 494 | [[package]] 495 | name = "mime" 496 | version = "0.3.16" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 499 | 500 | [[package]] 501 | name = "mime_guess" 502 | version = "2.0.4" 503 | source = "registry+https://github.com/rust-lang/crates.io-index" 504 | checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" 505 | dependencies = [ 506 | "mime", 507 | "unicase", 508 | ] 509 | 510 | [[package]] 511 | name = "miniz_oxide" 512 | version = "0.5.3" 513 | source = "registry+https://github.com/rust-lang/crates.io-index" 514 | checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" 515 | dependencies = [ 516 | "adler", 517 | ] 518 | 519 | [[package]] 520 | name = "mio" 521 | version = "0.8.4" 522 | source = "registry+https://github.com/rust-lang/crates.io-index" 523 | checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" 524 | dependencies = [ 525 | "libc", 526 | "log", 527 | "wasi", 528 | "windows-sys", 529 | ] 530 | 531 | [[package]] 532 | name = "num_cpus" 533 | version = "1.13.1" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 536 | dependencies = [ 537 | "hermit-abi", 538 | "libc", 539 | ] 540 | 541 | [[package]] 542 | name = "num_threads" 543 | version = "0.1.6" 544 | source = "registry+https://github.com/rust-lang/crates.io-index" 545 | checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" 546 | dependencies = [ 547 | "libc", 548 | ] 549 | 550 | [[package]] 551 | name = "once_cell" 552 | version = "1.13.0" 553 | source = "registry+https://github.com/rust-lang/crates.io-index" 554 | checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" 555 | 556 | [[package]] 557 | name = "percent-encoding" 558 | version = "2.1.0" 559 | source = "registry+https://github.com/rust-lang/crates.io-index" 560 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 561 | 562 | [[package]] 563 | name = "pin-project-lite" 564 | version = "0.2.9" 565 | source = "registry+https://github.com/rust-lang/crates.io-index" 566 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 567 | 568 | [[package]] 569 | name = "pin-utils" 570 | version = "0.1.0" 571 | source = "registry+https://github.com/rust-lang/crates.io-index" 572 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 573 | 574 | [[package]] 575 | name = "proc-macro-error" 576 | version = "1.0.4" 577 | source = "registry+https://github.com/rust-lang/crates.io-index" 578 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 579 | dependencies = [ 580 | "proc-macro-error-attr", 581 | "proc-macro2", 582 | "quote", 583 | "syn", 584 | "version_check", 585 | ] 586 | 587 | [[package]] 588 | name = "proc-macro-error-attr" 589 | version = "1.0.4" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 592 | dependencies = [ 593 | "proc-macro2", 594 | "quote", 595 | "version_check", 596 | ] 597 | 598 | [[package]] 599 | name = "proc-macro-hack" 600 | version = "0.5.19" 601 | source = "registry+https://github.com/rust-lang/crates.io-index" 602 | checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" 603 | 604 | [[package]] 605 | name = "proc-macro2" 606 | version = "1.0.40" 607 | source = "registry+https://github.com/rust-lang/crates.io-index" 608 | checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" 609 | dependencies = [ 610 | "unicode-ident", 611 | ] 612 | 613 | [[package]] 614 | name = "psl-types" 615 | version = "2.0.10" 616 | source = "registry+https://github.com/rust-lang/crates.io-index" 617 | checksum = "e8eda7c62d9ecaafdf8b62374c006de0adf61666ae96a96ba74a37134aa4e470" 618 | 619 | [[package]] 620 | name = "publicsuffix" 621 | version = "2.1.1" 622 | source = "registry+https://github.com/rust-lang/crates.io-index" 623 | checksum = "292972edad6bbecc137ab84c5e36421a4a6c979ea31d3cc73540dd04315b33e1" 624 | dependencies = [ 625 | "byteorder", 626 | "hashbrown 0.11.2", 627 | "idna", 628 | "psl-types", 629 | ] 630 | 631 | [[package]] 632 | name = "quote" 633 | version = "1.0.20" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" 636 | dependencies = [ 637 | "proc-macro2", 638 | ] 639 | 640 | [[package]] 641 | name = "redox_syscall" 642 | version = "0.2.13" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" 645 | dependencies = [ 646 | "bitflags", 647 | ] 648 | 649 | [[package]] 650 | name = "redox_users" 651 | version = "0.4.3" 652 | source = "registry+https://github.com/rust-lang/crates.io-index" 653 | checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" 654 | dependencies = [ 655 | "getrandom", 656 | "redox_syscall", 657 | "thiserror", 658 | ] 659 | 660 | [[package]] 661 | name = "regex" 662 | version = "1.6.0" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" 665 | dependencies = [ 666 | "aho-corasick", 667 | "memchr", 668 | "regex-syntax", 669 | ] 670 | 671 | [[package]] 672 | name = "regex-syntax" 673 | version = "0.6.27" 674 | source = "registry+https://github.com/rust-lang/crates.io-index" 675 | checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" 676 | 677 | [[package]] 678 | name = "reqwest" 679 | version = "0.11.11" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" 682 | dependencies = [ 683 | "async-compression", 684 | "base64", 685 | "bytes", 686 | "cookie", 687 | "cookie_store", 688 | "encoding_rs", 689 | "futures-core", 690 | "futures-util", 691 | "h2", 692 | "http", 693 | "http-body", 694 | "hyper", 695 | "hyper-rustls", 696 | "ipnet", 697 | "js-sys", 698 | "lazy_static", 699 | "log", 700 | "mime", 701 | "mime_guess", 702 | "percent-encoding", 703 | "pin-project-lite", 704 | "proc-macro-hack", 705 | "rustls", 706 | "rustls-pemfile", 707 | "serde", 708 | "serde_json", 709 | "serde_urlencoded", 710 | "tokio", 711 | "tokio-rustls", 712 | "tokio-util", 713 | "tower-service", 714 | "url", 715 | "wasm-bindgen", 716 | "wasm-bindgen-futures", 717 | "web-sys", 718 | "webpki-roots", 719 | "winreg", 720 | ] 721 | 722 | [[package]] 723 | name = "ring" 724 | version = "0.16.20" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" 727 | dependencies = [ 728 | "cc", 729 | "libc", 730 | "once_cell", 731 | "spin", 732 | "untrusted", 733 | "web-sys", 734 | "winapi", 735 | ] 736 | 737 | [[package]] 738 | name = "rustls" 739 | version = "0.20.6" 740 | source = "registry+https://github.com/rust-lang/crates.io-index" 741 | checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" 742 | dependencies = [ 743 | "log", 744 | "ring", 745 | "sct", 746 | "webpki", 747 | ] 748 | 749 | [[package]] 750 | name = "rustls-pemfile" 751 | version = "1.0.0" 752 | source = "registry+https://github.com/rust-lang/crates.io-index" 753 | checksum = "e7522c9de787ff061458fe9a829dc790a3f5b22dc571694fc5883f448b94d9a9" 754 | dependencies = [ 755 | "base64", 756 | ] 757 | 758 | [[package]] 759 | name = "ryu" 760 | version = "1.0.10" 761 | source = "registry+https://github.com/rust-lang/crates.io-index" 762 | checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" 763 | 764 | [[package]] 765 | name = "same-file" 766 | version = "1.0.6" 767 | source = "registry+https://github.com/rust-lang/crates.io-index" 768 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 769 | dependencies = [ 770 | "winapi-util", 771 | ] 772 | 773 | [[package]] 774 | name = "sct" 775 | version = "0.7.0" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" 778 | dependencies = [ 779 | "ring", 780 | "untrusted", 781 | ] 782 | 783 | [[package]] 784 | name = "serde" 785 | version = "1.0.139" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "0171ebb889e45aa68b44aee0859b3eede84c6f5f5c228e6f140c0b2a0a46cad6" 788 | dependencies = [ 789 | "serde_derive", 790 | ] 791 | 792 | [[package]] 793 | name = "serde_derive" 794 | version = "1.0.139" 795 | source = "registry+https://github.com/rust-lang/crates.io-index" 796 | checksum = "dc1d3230c1de7932af58ad8ffbe1d784bd55efd5a9d84ac24f69c72d83543dfb" 797 | dependencies = [ 798 | "proc-macro2", 799 | "quote", 800 | "syn", 801 | ] 802 | 803 | [[package]] 804 | name = "serde_json" 805 | version = "1.0.82" 806 | source = "registry+https://github.com/rust-lang/crates.io-index" 807 | checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" 808 | dependencies = [ 809 | "itoa", 810 | "ryu", 811 | "serde", 812 | ] 813 | 814 | [[package]] 815 | name = "serde_urlencoded" 816 | version = "0.7.1" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 819 | dependencies = [ 820 | "form_urlencoded", 821 | "itoa", 822 | "ryu", 823 | "serde", 824 | ] 825 | 826 | [[package]] 827 | name = "slab" 828 | version = "0.4.6" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" 831 | 832 | [[package]] 833 | name = "socket2" 834 | version = "0.4.4" 835 | source = "registry+https://github.com/rust-lang/crates.io-index" 836 | checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" 837 | dependencies = [ 838 | "libc", 839 | "winapi", 840 | ] 841 | 842 | [[package]] 843 | name = "spin" 844 | version = "0.5.2" 845 | source = "registry+https://github.com/rust-lang/crates.io-index" 846 | checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" 847 | 848 | [[package]] 849 | name = "strsim" 850 | version = "0.8.0" 851 | source = "registry+https://github.com/rust-lang/crates.io-index" 852 | checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" 853 | 854 | [[package]] 855 | name = "structopt" 856 | version = "0.3.26" 857 | source = "registry+https://github.com/rust-lang/crates.io-index" 858 | checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" 859 | dependencies = [ 860 | "clap", 861 | "lazy_static", 862 | "structopt-derive", 863 | ] 864 | 865 | [[package]] 866 | name = "structopt-derive" 867 | version = "0.4.18" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" 870 | dependencies = [ 871 | "heck", 872 | "proc-macro-error", 873 | "proc-macro2", 874 | "quote", 875 | "syn", 876 | ] 877 | 878 | [[package]] 879 | name = "syn" 880 | version = "1.0.98" 881 | source = "registry+https://github.com/rust-lang/crates.io-index" 882 | checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" 883 | dependencies = [ 884 | "proc-macro2", 885 | "quote", 886 | "unicode-ident", 887 | ] 888 | 889 | [[package]] 890 | name = "term_size" 891 | version = "0.3.2" 892 | source = "registry+https://github.com/rust-lang/crates.io-index" 893 | checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9" 894 | dependencies = [ 895 | "libc", 896 | "winapi", 897 | ] 898 | 899 | [[package]] 900 | name = "textwrap" 901 | version = "0.11.0" 902 | source = "registry+https://github.com/rust-lang/crates.io-index" 903 | checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" 904 | dependencies = [ 905 | "term_size", 906 | "unicode-width", 907 | ] 908 | 909 | [[package]] 910 | name = "thiserror" 911 | version = "1.0.31" 912 | source = "registry+https://github.com/rust-lang/crates.io-index" 913 | checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" 914 | dependencies = [ 915 | "thiserror-impl", 916 | ] 917 | 918 | [[package]] 919 | name = "thiserror-impl" 920 | version = "1.0.31" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" 923 | dependencies = [ 924 | "proc-macro2", 925 | "quote", 926 | "syn", 927 | ] 928 | 929 | [[package]] 930 | name = "time" 931 | version = "0.3.11" 932 | source = "registry+https://github.com/rust-lang/crates.io-index" 933 | checksum = "72c91f41dcb2f096c05f0873d667dceec1087ce5bcf984ec8ffb19acddbb3217" 934 | dependencies = [ 935 | "itoa", 936 | "libc", 937 | "num_threads", 938 | "time-macros", 939 | ] 940 | 941 | [[package]] 942 | name = "time-macros" 943 | version = "0.2.4" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" 946 | 947 | [[package]] 948 | name = "tinyvec" 949 | version = "1.6.0" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 952 | dependencies = [ 953 | "tinyvec_macros", 954 | ] 955 | 956 | [[package]] 957 | name = "tinyvec_macros" 958 | version = "0.1.0" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 961 | 962 | [[package]] 963 | name = "tokio" 964 | version = "1.19.2" 965 | source = "registry+https://github.com/rust-lang/crates.io-index" 966 | checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439" 967 | dependencies = [ 968 | "bytes", 969 | "libc", 970 | "memchr", 971 | "mio", 972 | "num_cpus", 973 | "once_cell", 974 | "pin-project-lite", 975 | "socket2", 976 | "winapi", 977 | ] 978 | 979 | [[package]] 980 | name = "tokio-rustls" 981 | version = "0.23.4" 982 | source = "registry+https://github.com/rust-lang/crates.io-index" 983 | checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" 984 | dependencies = [ 985 | "rustls", 986 | "tokio", 987 | "webpki", 988 | ] 989 | 990 | [[package]] 991 | name = "tokio-util" 992 | version = "0.7.3" 993 | source = "registry+https://github.com/rust-lang/crates.io-index" 994 | checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" 995 | dependencies = [ 996 | "bytes", 997 | "futures-core", 998 | "futures-sink", 999 | "pin-project-lite", 1000 | "tokio", 1001 | "tracing", 1002 | ] 1003 | 1004 | [[package]] 1005 | name = "toml" 1006 | version = "0.5.9" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" 1009 | dependencies = [ 1010 | "serde", 1011 | ] 1012 | 1013 | [[package]] 1014 | name = "tower-service" 1015 | version = "0.3.2" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 1018 | 1019 | [[package]] 1020 | name = "tracing" 1021 | version = "0.1.35" 1022 | source = "registry+https://github.com/rust-lang/crates.io-index" 1023 | checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" 1024 | dependencies = [ 1025 | "cfg-if 1.0.0", 1026 | "pin-project-lite", 1027 | "tracing-core", 1028 | ] 1029 | 1030 | [[package]] 1031 | name = "tracing-core" 1032 | version = "0.1.28" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | checksum = "7b7358be39f2f274f322d2aaed611acc57f382e8eb1e5b48cb9ae30933495ce7" 1035 | dependencies = [ 1036 | "once_cell", 1037 | ] 1038 | 1039 | [[package]] 1040 | name = "try-lock" 1041 | version = "0.2.3" 1042 | source = "registry+https://github.com/rust-lang/crates.io-index" 1043 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 1044 | 1045 | [[package]] 1046 | name = "unicase" 1047 | version = "2.6.0" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 1050 | dependencies = [ 1051 | "version_check", 1052 | ] 1053 | 1054 | [[package]] 1055 | name = "unicode-bidi" 1056 | version = "0.3.8" 1057 | source = "registry+https://github.com/rust-lang/crates.io-index" 1058 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 1059 | 1060 | [[package]] 1061 | name = "unicode-ident" 1062 | version = "1.0.1" 1063 | source = "registry+https://github.com/rust-lang/crates.io-index" 1064 | checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c" 1065 | 1066 | [[package]] 1067 | name = "unicode-normalization" 1068 | version = "0.1.21" 1069 | source = "registry+https://github.com/rust-lang/crates.io-index" 1070 | checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" 1071 | dependencies = [ 1072 | "tinyvec", 1073 | ] 1074 | 1075 | [[package]] 1076 | name = "unicode-segmentation" 1077 | version = "1.9.0" 1078 | source = "registry+https://github.com/rust-lang/crates.io-index" 1079 | checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" 1080 | 1081 | [[package]] 1082 | name = "unicode-width" 1083 | version = "0.1.9" 1084 | source = "registry+https://github.com/rust-lang/crates.io-index" 1085 | checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" 1086 | 1087 | [[package]] 1088 | name = "untrusted" 1089 | version = "0.7.1" 1090 | source = "registry+https://github.com/rust-lang/crates.io-index" 1091 | checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" 1092 | 1093 | [[package]] 1094 | name = "url" 1095 | version = "2.2.2" 1096 | source = "registry+https://github.com/rust-lang/crates.io-index" 1097 | checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" 1098 | dependencies = [ 1099 | "form_urlencoded", 1100 | "idna", 1101 | "matches", 1102 | "percent-encoding", 1103 | ] 1104 | 1105 | [[package]] 1106 | name = "vec_map" 1107 | version = "0.8.2" 1108 | source = "registry+https://github.com/rust-lang/crates.io-index" 1109 | checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" 1110 | 1111 | [[package]] 1112 | name = "version_check" 1113 | version = "0.9.4" 1114 | source = "registry+https://github.com/rust-lang/crates.io-index" 1115 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1116 | 1117 | [[package]] 1118 | name = "walkdir" 1119 | version = "2.3.2" 1120 | source = "registry+https://github.com/rust-lang/crates.io-index" 1121 | checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" 1122 | dependencies = [ 1123 | "same-file", 1124 | "winapi", 1125 | "winapi-util", 1126 | ] 1127 | 1128 | [[package]] 1129 | name = "want" 1130 | version = "0.3.0" 1131 | source = "registry+https://github.com/rust-lang/crates.io-index" 1132 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 1133 | dependencies = [ 1134 | "log", 1135 | "try-lock", 1136 | ] 1137 | 1138 | [[package]] 1139 | name = "wasi" 1140 | version = "0.11.0+wasi-snapshot-preview1" 1141 | source = "registry+https://github.com/rust-lang/crates.io-index" 1142 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1143 | 1144 | [[package]] 1145 | name = "wasm-bindgen" 1146 | version = "0.2.81" 1147 | source = "registry+https://github.com/rust-lang/crates.io-index" 1148 | checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" 1149 | dependencies = [ 1150 | "cfg-if 1.0.0", 1151 | "wasm-bindgen-macro", 1152 | ] 1153 | 1154 | [[package]] 1155 | name = "wasm-bindgen-backend" 1156 | version = "0.2.81" 1157 | source = "registry+https://github.com/rust-lang/crates.io-index" 1158 | checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" 1159 | dependencies = [ 1160 | "bumpalo", 1161 | "lazy_static", 1162 | "log", 1163 | "proc-macro2", 1164 | "quote", 1165 | "syn", 1166 | "wasm-bindgen-shared", 1167 | ] 1168 | 1169 | [[package]] 1170 | name = "wasm-bindgen-futures" 1171 | version = "0.4.31" 1172 | source = "registry+https://github.com/rust-lang/crates.io-index" 1173 | checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" 1174 | dependencies = [ 1175 | "cfg-if 1.0.0", 1176 | "js-sys", 1177 | "wasm-bindgen", 1178 | "web-sys", 1179 | ] 1180 | 1181 | [[package]] 1182 | name = "wasm-bindgen-macro" 1183 | version = "0.2.81" 1184 | source = "registry+https://github.com/rust-lang/crates.io-index" 1185 | checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" 1186 | dependencies = [ 1187 | "quote", 1188 | "wasm-bindgen-macro-support", 1189 | ] 1190 | 1191 | [[package]] 1192 | name = "wasm-bindgen-macro-support" 1193 | version = "0.2.81" 1194 | source = "registry+https://github.com/rust-lang/crates.io-index" 1195 | checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" 1196 | dependencies = [ 1197 | "proc-macro2", 1198 | "quote", 1199 | "syn", 1200 | "wasm-bindgen-backend", 1201 | "wasm-bindgen-shared", 1202 | ] 1203 | 1204 | [[package]] 1205 | name = "wasm-bindgen-shared" 1206 | version = "0.2.81" 1207 | source = "registry+https://github.com/rust-lang/crates.io-index" 1208 | checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" 1209 | 1210 | [[package]] 1211 | name = "web-sys" 1212 | version = "0.3.58" 1213 | source = "registry+https://github.com/rust-lang/crates.io-index" 1214 | checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" 1215 | dependencies = [ 1216 | "js-sys", 1217 | "wasm-bindgen", 1218 | ] 1219 | 1220 | [[package]] 1221 | name = "webpki" 1222 | version = "0.22.0" 1223 | source = "registry+https://github.com/rust-lang/crates.io-index" 1224 | checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" 1225 | dependencies = [ 1226 | "ring", 1227 | "untrusted", 1228 | ] 1229 | 1230 | [[package]] 1231 | name = "webpki-roots" 1232 | version = "0.22.4" 1233 | source = "registry+https://github.com/rust-lang/crates.io-index" 1234 | checksum = "f1c760f0d366a6c24a02ed7816e23e691f5d92291f94d15e836006fd11b04daf" 1235 | dependencies = [ 1236 | "webpki", 1237 | ] 1238 | 1239 | [[package]] 1240 | name = "winapi" 1241 | version = "0.3.9" 1242 | source = "registry+https://github.com/rust-lang/crates.io-index" 1243 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1244 | dependencies = [ 1245 | "winapi-i686-pc-windows-gnu", 1246 | "winapi-x86_64-pc-windows-gnu", 1247 | ] 1248 | 1249 | [[package]] 1250 | name = "winapi-i686-pc-windows-gnu" 1251 | version = "0.4.0" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1254 | 1255 | [[package]] 1256 | name = "winapi-util" 1257 | version = "0.1.5" 1258 | source = "registry+https://github.com/rust-lang/crates.io-index" 1259 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 1260 | dependencies = [ 1261 | "winapi", 1262 | ] 1263 | 1264 | [[package]] 1265 | name = "winapi-x86_64-pc-windows-gnu" 1266 | version = "0.4.0" 1267 | source = "registry+https://github.com/rust-lang/crates.io-index" 1268 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1269 | 1270 | [[package]] 1271 | name = "windows-sys" 1272 | version = "0.36.1" 1273 | source = "registry+https://github.com/rust-lang/crates.io-index" 1274 | checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" 1275 | dependencies = [ 1276 | "windows_aarch64_msvc", 1277 | "windows_i686_gnu", 1278 | "windows_i686_msvc", 1279 | "windows_x86_64_gnu", 1280 | "windows_x86_64_msvc", 1281 | ] 1282 | 1283 | [[package]] 1284 | name = "windows_aarch64_msvc" 1285 | version = "0.36.1" 1286 | source = "registry+https://github.com/rust-lang/crates.io-index" 1287 | checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" 1288 | 1289 | [[package]] 1290 | name = "windows_i686_gnu" 1291 | version = "0.36.1" 1292 | source = "registry+https://github.com/rust-lang/crates.io-index" 1293 | checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" 1294 | 1295 | [[package]] 1296 | name = "windows_i686_msvc" 1297 | version = "0.36.1" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" 1300 | 1301 | [[package]] 1302 | name = "windows_x86_64_gnu" 1303 | version = "0.36.1" 1304 | source = "registry+https://github.com/rust-lang/crates.io-index" 1305 | checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" 1306 | 1307 | [[package]] 1308 | name = "windows_x86_64_msvc" 1309 | version = "0.36.1" 1310 | source = "registry+https://github.com/rust-lang/crates.io-index" 1311 | checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" 1312 | 1313 | [[package]] 1314 | name = "winreg" 1315 | version = "0.10.1" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 1318 | dependencies = [ 1319 | "winapi", 1320 | ] 1321 | --------------------------------------------------------------------------------