├── module ├── system │ ├── bin │ │ └── placeholder │ └── usr │ │ └── share │ │ └── mmrl │ │ └── config │ │ └── mmrl │ │ ├── info.json │ │ └── index.jsx ├── META-INF │ └── com │ │ └── google │ │ └── android │ │ ├── updater-script │ │ └── update-binary ├── update.json ├── module.prop ├── install.sh └── common │ └── repo.json ├── .github ├── FUNDING.yaml └── workflows │ └── rust.yml ├── .gitignore ├── CHANGELOG.md ├── assets ├── 1.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png ├── CLI-Banner.png ├── store_ready.sketch └── store_ready │ ├── 1.png │ ├── 2.png │ ├── 3.png │ └── 4.png ├── .gitattributes ├── src ├── cmd │ ├── mod.rs │ ├── search.rs │ ├── download.rs │ ├── info.rs │ ├── upself.rs │ ├── repo.rs │ └── install.rs ├── repo.rs ├── android_root.rs ├── utils.rs └── main.rs ├── Makefile ├── Cargo.toml ├── LICENSE ├── README.md └── Cargo.lock /module/system/bin/placeholder: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/FUNDING.yaml: -------------------------------------------------------------------------------- 1 | github: DerGoogler 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /module/system/bin/mmrl -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # 0.3.8 2 | 3 | - Auto find root cli's 4 | -------------------------------------------------------------------------------- /module/META-INF/com/google/android/updater-script: -------------------------------------------------------------------------------- 1 | #MAGISK -------------------------------------------------------------------------------- /assets/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MMRLApp/MMRL-CLI/HEAD/assets/1.png -------------------------------------------------------------------------------- /assets/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MMRLApp/MMRL-CLI/HEAD/assets/2.png -------------------------------------------------------------------------------- /assets/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MMRLApp/MMRL-CLI/HEAD/assets/3.png -------------------------------------------------------------------------------- /assets/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MMRLApp/MMRL-CLI/HEAD/assets/4.png -------------------------------------------------------------------------------- /assets/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MMRLApp/MMRL-CLI/HEAD/assets/5.png -------------------------------------------------------------------------------- /assets/CLI-Banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MMRLApp/MMRL-CLI/HEAD/assets/CLI-Banner.png -------------------------------------------------------------------------------- /assets/store_ready.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MMRLApp/MMRL-CLI/HEAD/assets/store_ready.sketch -------------------------------------------------------------------------------- /assets/store_ready/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MMRLApp/MMRL-CLI/HEAD/assets/store_ready/1.png -------------------------------------------------------------------------------- /assets/store_ready/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MMRLApp/MMRL-CLI/HEAD/assets/store_ready/2.png -------------------------------------------------------------------------------- /assets/store_ready/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MMRLApp/MMRL-CLI/HEAD/assets/store_ready/3.png -------------------------------------------------------------------------------- /assets/store_ready/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MMRLApp/MMRL-CLI/HEAD/assets/store_ready/4.png -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.rs text=auto eol=lf 2 | *.sh text=auto eol=lf 3 | *.prop text=auto eol=lf 4 | * text=auto eol=lf -------------------------------------------------------------------------------- /src/cmd/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod info; 2 | pub mod download; 3 | pub mod search; 4 | pub mod install; 5 | pub mod upself; 6 | pub mod repo; -------------------------------------------------------------------------------- /module/system/usr/share/mmrl/config/mmrl/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.3.11", 3 | "versionCode": "0311", 4 | "author": "Der_Googler", 5 | "rustVersion": "1.78.0", 6 | "buildDate": "2024-08-18" 7 | } 8 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | build: 2 | cross build --target aarch64-linux-android --release 3 | 4 | install: build 5 | adb push target/aarch64-linux-android/release/mmrl /data/mkuser/usr/bin 6 | 7 | module: build 8 | bash build-module.sh 9 | 10 | nb-module: 11 | bash build-module.sh -------------------------------------------------------------------------------- /module/update.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.3.11", 3 | "versionCode": "0311", 4 | "zipUrl": "https://github.com/DerGoogler/MMRL-CLI/releases/download/v0.3.11/mmrl-0.3.11-module-aarch64.zip", 5 | "changelog": "https://raw.githubusercontent.com/DerGoogler/MMRL-CLI/master/CHANGELOG.md" 6 | } 7 | -------------------------------------------------------------------------------- /module/module.prop: -------------------------------------------------------------------------------- 1 | id=mmrl 2 | name=MMRL CLI 3 | version=0.3.11 4 | versionCode=0311 5 | author=Der_Googler 6 | description=MMRL Command Line Interface is a free tool to install Magisk/KernelSU modules. Build on 2024-08-18 with Rust 1.78.0. 7 | updateJson=https://raw.githubusercontent.com/DerGoogler/MMRL-CLI/master/module/update.json 8 | license=MIT 9 | -------------------------------------------------------------------------------- /.github/workflows/rust.yml: -------------------------------------------------------------------------------- 1 | name: Rust 2 | 3 | on: 4 | push: 5 | branches: [ "master" ] 6 | pull_request: 7 | branches: [ "master" ] 8 | 9 | env: 10 | CARGO_TERM_COLOR: always 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | steps: 18 | - uses: actions/checkout@v3 19 | - name: Build 20 | run: rustup target add aarch64-linux-android && cargo build --verbose 21 | -------------------------------------------------------------------------------- /module/META-INF/com/google/android/update-binary: -------------------------------------------------------------------------------- 1 | #!/sbin/sh 2 | 3 | ################# 4 | # Initialization 5 | ################# 6 | 7 | umask 022 8 | 9 | # echo before loading util_functions 10 | ui_print() { echo "$1"; } 11 | 12 | require_new_magisk() { 13 | ui_print "*******************************" 14 | ui_print " Please install Magisk v20.4+! " 15 | ui_print "*******************************" 16 | exit 1 17 | } 18 | 19 | ######################### 20 | # Load util_functions.sh 21 | ######################### 22 | 23 | OUTFD=$2 24 | ZIPFILE=$3 25 | 26 | mount /data 2>/dev/null 27 | 28 | [ -f /data/adb/magisk/util_functions.sh ] || require_new_magisk 29 | . /data/adb/magisk/util_functions.sh 30 | [ $MAGISK_VER_CODE -lt 20400 ] && require_new_magisk 31 | 32 | install_module 33 | exit 0 -------------------------------------------------------------------------------- /module/install.sh: -------------------------------------------------------------------------------- 1 | SKIPMOUNT=false 2 | PROPFILE=false 3 | POSTFSDATA=false 4 | LATESTARTSERVICE=false 5 | 6 | print_modname() { 7 | ui_print " __ _____ _______ __ " 8 | ui_print " / |/ / |/ / __ \/ / " 9 | ui_print " / /|_/ / /|_/ / /_/ / / " 10 | ui_print " / / / / / / / _, _/ /___" 11 | ui_print "/_/ /_/_/ /_/_/ |_/_____/" 12 | } 13 | 14 | on_install() { 15 | ui_print "- Extracting module files" 16 | unzip -qq -o "$ZIPFILE" 'system/*' -d $MODPATH >&2 17 | [ -d "$MODPATH/system/bin/" ] || mkdir -p "$MODPATH/system/bin/" 18 | ln -sf mmrl $MODPATH/system/bin/mrepo 19 | ln -sf mmrl $MODPATH/system/bin/foxmmm 20 | ln -sf mmrl $MODPATH/system/bin/amm 21 | 22 | } 23 | 24 | set_permissions() { 25 | # The following is the default rule, DO NOT remove 26 | set_perm_recursive $MODPATH 0 0 0755 0644 27 | set_perm $MODPATH/system/bin/mmrl 0 0 0755 28 | set_perm $MODPATH/system/bin/mrepo 0 0 0755 29 | set_perm $MODPATH/system/bin/foxmmm 0 0 0755 30 | set_perm $MODPATH/system/bin/amm 0 0 0755 31 | } -------------------------------------------------------------------------------- /module/common/repo.json: -------------------------------------------------------------------------------- 1 | { 2 | "support": "https://github.com/DerGoogler/MMRL-CLI/issues", 3 | "donate": "https://github.com/sponsors/DerGoogler", 4 | "cover": "https://raw.githubusercontent.com/DerGoogler/MMRL-CLI/master/assets/CLI-Banner.png", 5 | "screenshots": [ 6 | "https://raw.githubusercontent.com/DerGoogler/MMRL-CLI/master/assets/store_ready/1.png", 7 | "https://raw.githubusercontent.com/DerGoogler/MMRL-CLI/master/assets/store_ready/2.png", 8 | "https://raw.githubusercontent.com/DerGoogler/MMRL-CLI/master/assets/store_ready/3.png", 9 | "https://raw.githubusercontent.com/DerGoogler/MMRL-CLI/master/assets/store_ready/4.png" 10 | ], 11 | "categories": [ 12 | "Tools", 13 | "System", 14 | "Configurable" 15 | ], 16 | "readme": "https://raw.githubusercontent.com/DerGoogler/MMRL-CLI/master/README.md", 17 | "note": { 18 | "color": "yellow", 19 | "title": "Attention", 20 | "message": "The initial install of MMRL-CLI should be through your root manager. This module is not required above MMRL V3" 21 | } 22 | } -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "mmrl" 3 | description = "MMRL comes now as command line interface, with multi module install support!" 4 | version = "0.3.11" 5 | edition = "2021" 6 | author = "Der_Googler" 7 | license = "MIT" 8 | 9 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 10 | 11 | [dependencies] 12 | reqwest = { version = "0.11.22", features = ["blocking", "json"] } 13 | serde = { version = "1.0.189", features = ["derive"] } 14 | serde_json = "1.0.107" 15 | clap = { version = "4.0.29", features = ["derive"] } 16 | trauma = "2.2.4" 17 | tokio = { version = "1.33.0", features = ["macros", "rt-multi-thread"] } 18 | error-chain = "0.12.4" 19 | indicatif = "0.17.7" 20 | rand = "0.8.5" 21 | futures-util = "0.3.28" 22 | rust-ini = "0.19.0" 23 | zip = "0.6.6" 24 | serde_ini = "0.2.0" 25 | regex = "1.10.2" 26 | async-recursion = "1.0.5" 27 | openssl = { version = "0.10.45", features = ["vendored"] } 28 | # openssl = "0.10.45" 29 | url = "2.2" 30 | walkdir = "2.4.0" 31 | log = "0.4" 32 | simplelog = "0.10" 33 | 34 | [dependencies.confy] 35 | features = ["toml_conf"] 36 | default-features = false 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Jimmy Böhm (Der_Googler) 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/cmd/search.rs: -------------------------------------------------------------------------------- 1 | use crate::repo::Module; 2 | 3 | pub async fn search(modules: Vec, cb: impl Fn(&Module) -> bool) { 4 | print!("\x1B[1mFound these modules:\x1B[0m\n\n"); 5 | for module in modules { 6 | let m = module.clone(); 7 | if cb(&m) { 8 | println!( 9 | "\x1B[36m\x1B[4m{}\x1B[0m {}\n", 10 | m.name, 11 | [ 12 | "\x1B[34m".to_string(), 13 | m.version, 14 | "\x1B[34m".to_string(), 15 | " \x1B[34m(".to_string(), 16 | "\x1B[33m".to_string(), 17 | m.version_code.to_string(), 18 | "\x1B[0m".to_string(), 19 | "\x1B[0m)".to_string(), 20 | " \x1B[94m[".to_string(), 21 | m.track.license, 22 | "]\x1B[0m".to_string(), 23 | "\n".to_string(), 24 | "\x1B[2mId: ".to_string(), 25 | m.id, 26 | "\x1B[0m".to_string() 27 | ] 28 | .join("") 29 | ); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/cmd/download.rs: -------------------------------------------------------------------------------- 1 | use crate::{ 2 | android_root::get_downloads_dir, 3 | repo::{find_module, find_version, get_id_details, Module}, 4 | utils::{download_from_url, get_last, is_url}, 5 | }; 6 | use reqwest::Client; 7 | 8 | pub async fn download(client: Client, modules: &Vec, id: String) -> () { 9 | let _url = &id.to_owned()[..]; 10 | if is_url(_url) { 11 | let name = get_last(_url); 12 | let path = &[ 13 | get_downloads_dir(), 14 | [name.clone().unwrap().to_string(), "zip".to_string()].join("."), 15 | ] 16 | .join("/"); 17 | download_from_url(client, id.clone(), id, path).await; 18 | } else { 19 | let (_id, _ver) = get_id_details(id); 20 | let module = find_module(&modules, _id.clone()); 21 | 22 | let version = find_version(module.versions.clone(), _ver); 23 | 24 | let path = &[ 25 | get_downloads_dir(), 26 | [ 27 | [version.version.clone(), module.id].join("-"), 28 | "zip".to_string(), 29 | ] 30 | .join("."), 31 | ] 32 | .join("/"); 33 | 34 | download_from_url(client, version.zip_url, module.name, path).await; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/cmd/info.rs: -------------------------------------------------------------------------------- 1 | use std::path::Path; 2 | 3 | use ini::Ini; 4 | 5 | use crate::repo::{find_module, Module}; 6 | 7 | pub async fn info(modules: &Vec, id: String) { 8 | let module = find_module(&modules, id); 9 | 10 | let _id = &module.id; 11 | 12 | let moduleprop = Path::new("/data/adb/modules/").join(_id).join("module.prop"); 13 | println!("\x1B[1mName:\x1B[0m {}", module.name); 14 | println!("\x1B[1mAuthor:\x1B[0m {}", module.author); 15 | if moduleprop.exists() { 16 | let conf = Ini::load_from_file(moduleprop.to_str().unwrap()).unwrap(); 17 | let prop = conf.section(None::).unwrap(); 18 | println!("\x1B[4m\x1B[1mInstalled version: \x1B[34m{} \x1B[33m(\x1B[32m{}\x1B[33m)\x1B[0m", prop.get("version").unwrap(), prop.get("versionCode").unwrap()) 19 | } 20 | println!( 21 | "\x1B[1mLatest version (Cloud):\x1B[0m \x1B[4m\x1B[34m{}\x1B[0m \x1B[33m(\x1B[32m{}\x1B[33m)\x1B[0m", 22 | module.version, 23 | module.version_code.to_string() 24 | ); 25 | println!("\x1B[1mDescription:\x1B[0m {}", module.description); 26 | println!( "\x1B[1mLicense:\x1B[0m \x1B[36m{}\x1B[0m", module.track.license); 27 | println!("\x1B[2mModule id: {}\x1B[0m", _id); 28 | } -------------------------------------------------------------------------------- /src/cmd/upself.rs: -------------------------------------------------------------------------------- 1 | use crate::android_root::{get_downloads_dir, get_install_cli, ANDROID_PATH}; 2 | use crate::exit; 3 | use crate::utils::{confirm, download_from_url}; 4 | use reqwest::Client; 5 | use std::io::{BufRead, BufReader, Error, ErrorKind}; 6 | use std::process::{Command, Stdio}; 7 | 8 | pub async fn upself(client: Client, version: String, yes: bool) { 9 | let zip_url = format!( 10 | "https://github.com/DerGoogler/MMRL-CLI/releases/download/v{}/mmrl-{}-module-aarch64.zip", 11 | version, version 12 | ); 13 | 14 | let path = &[ 15 | get_downloads_dir(), 16 | [["mmrl", &version].join("-"), "zip".to_string()].join("."), 17 | ] 18 | .join("/"); 19 | 20 | download_from_url(client, zip_url, version, path).await; 21 | 22 | let success = yes || confirm("\nDo you want to continue [y/N]? "); 23 | 24 | if success { 25 | let (bin, args) = get_install_cli(&path); 26 | 27 | let stdout = Command::new(bin) 28 | .args(args) 29 | .env("PATH", ANDROID_PATH) 30 | .stdout(Stdio::piped()) 31 | .spawn() 32 | .unwrap() 33 | .stdout 34 | .ok_or_else(|| Error::new(ErrorKind::Other, "Could not capture standard output.")) 35 | .unwrap(); 36 | 37 | let reader = BufReader::new(stdout); 38 | 39 | for line in reader.lines() { 40 | match line { 41 | Ok(ln) => println!("{}", ln), 42 | Err(e) => { 43 | println!("{}", e); 44 | exit(500) 45 | } 46 | } 47 | } 48 | exit(0); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/cmd/repo.rs: -------------------------------------------------------------------------------- 1 | use serde_json::Value; 2 | use std::fs::OpenOptions; 3 | use std::io::{self, Read, Seek, Write}; 4 | use std::process::exit; 5 | 6 | use crate::repo::{find_module, Module}; 7 | 8 | fn add_repos_to_json(file_path: &str, new_repos: Vec) -> io::Result<()> { 9 | let file = OpenOptions::new() 10 | .read(true) 11 | .write(true) 12 | .create(true) 13 | .open(file_path); 14 | 15 | let mut file = match file { 16 | Ok(f) => f, 17 | Err(e) => return Err(e), 18 | }; 19 | 20 | let mut content = String::new(); 21 | file.read_to_string(&mut content)?; 22 | 23 | let mut json: Value = if content.trim().is_empty() { 24 | Value::Array(vec![]) 25 | } else { 26 | serde_json::from_str(&content)? 27 | }; 28 | 29 | if let Value::Array(ref mut repos) = json { 30 | for repo in new_repos { 31 | let repo_value = Value::String(repo.to_string()); 32 | if !repos.contains(&repo_value) { 33 | repos.push(repo_value); 34 | } else { 35 | println!("- \"{}\" has been already added", repo) 36 | } 37 | } 38 | } else { 39 | return Err(io::Error::new( 40 | io::ErrorKind::InvalidData, 41 | "JSON is not an array", 42 | )); 43 | } 44 | 45 | file.set_len(0)?; 46 | file.seek(std::io::SeekFrom::Start(0))?; 47 | file.write_all(serde_json::to_string_pretty(&json)?.as_bytes())?; 48 | 49 | Ok(()) 50 | } 51 | 52 | pub async fn add(url: Vec) -> () { 53 | let file_path = "/data/adb/mmrl/repos.json"; 54 | match add_repos_to_json(file_path, url) { 55 | Ok(_) => { 56 | println!("- Repositories added successfully."); 57 | exit(0) 58 | } 59 | Err(e) => { 60 | eprintln!("! Error adding repositories: {}", e); 61 | exit(500) 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Magisk Module Repo Loader CLI 2 | 3 | MMRL comes now as command line interface, with multi module install support! 4 | 5 | GitHub all releases 6 | 7 | Get it on MMRL 8 | 9 | ## Repositoreis 10 | 11 | You can use any repo you want, the only requirement it that the repo supports the [MRepo-Format](https://github.com/ya0211/magisk-modules-repo-util) 12 | 13 | ```shell 14 | mmrl repo add "https://apt.izzysoft.de/magisk/json/modules.json" "https://..." # ... 15 | ``` 16 | 17 | Install a module with it 18 | 19 | ```shell 20 | # Install aliases are "add" and "get" 21 | mmrl install app-data-file-exec data_isolation_support 22 | ``` 23 | 24 | ## Get informations 25 | 26 | The MMRL CLI also supports getting infos of the module 27 | 28 | just run 29 | 30 | ```shell 31 | mmrl info mkshrc node_on_android 32 | ``` 33 | 34 | ## Searching 35 | 36 | Wanna search some module? You can do it. 37 | 38 | ```shell 39 | mmrl search id node # mmrl lookup all "hide user" 40 | ``` 41 | 42 | Get all filter 43 | 44 | ```shell 45 | mmrl search 46 | ``` 47 | 48 | ## Downloading 49 | 50 | Downloading just the module is also posible 51 | 52 | ```shell 53 | mmrl download mkshrc node_on_android # --version 152 54 | ``` 55 | 56 | ## Installing modules 57 | 58 | Maybe simple... 59 | 60 | ```shell 61 | mmrl install mkshrc@1.3.4 node_on_android 62 | ``` 63 | 64 | ## Install Viper4Android 65 | 66 | > Requires version `0.1.1` 67 | 68 | ```shell 69 | mmrl install -y "https://zackptg5.com/downloads/Audio-Modification-Library_v5.1.zip" "https://john-fawkes.com/Downloads/acp.zip" "https://github.com/AndroidAudioMods/ViPER4Android/releases/download/v0.5.0/V4A_Magisk_Module_0.5.0.zip" 70 | ``` 71 | 72 | # Screenshots 73 | 74 |

75 | 76 | 77 | 78 | 79 |

80 | 81 | 82 | # Dev 83 | 84 | ## Error code 85 | 86 | ```properties 87 | 88 | M_INS_SUCCESS = 0 89 | M_INS_FAILURE = 1 90 | M_DWL_FAILURE = 2 91 | FILE_CRA_ERRO = 3 92 | TERM_INTR_ERR = 500 93 | ``` 94 | -------------------------------------------------------------------------------- /src/repo.rs: -------------------------------------------------------------------------------- 1 | use std::process::exit; 2 | 3 | use serde::Deserialize; 4 | use serde::Serialize; 5 | 6 | #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 7 | #[serde(rename_all = "camelCase")] 8 | pub struct Repo { 9 | pub name: String, 10 | pub metadata: Metadata, 11 | pub modules: Vec, 12 | } 13 | 14 | #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 15 | #[serde(rename_all = "camelCase")] 16 | pub struct Metadata { 17 | pub version: i64, 18 | pub timestamp: f64, 19 | } 20 | 21 | #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 22 | #[serde(rename_all = "camelCase")] 23 | pub struct Module { 24 | pub id: String, 25 | pub name: String, 26 | pub version: String, 27 | pub version_code: i64, 28 | pub author: String, 29 | pub description: String, 30 | pub track: Track, 31 | pub versions: Vec, 32 | } 33 | 34 | #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 35 | #[serde(rename_all = "camelCase")] 36 | pub struct Track { 37 | #[serde(rename = "type")] 38 | pub type_field: String, 39 | pub added: f64, 40 | pub license: String, 41 | pub homepage: String, 42 | pub source: String, 43 | pub support: String, 44 | pub require: Option>, 45 | pub donate: String, 46 | } 47 | 48 | #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 49 | #[serde(rename_all = "camelCase")] 50 | pub struct Version { 51 | pub timestamp: f64, 52 | pub version: String, 53 | pub version_code: i64, 54 | pub zip_url: String, 55 | pub changelog: String, 56 | } 57 | 58 | pub(crate) fn find_module(modules: &Vec, id: String) -> Module { 59 | let module_exists = modules.iter().any(|m| m.id == id); 60 | if !module_exists { 61 | eprintln!("! Unable to find {}", id); 62 | exit(1); 63 | } 64 | let module_pos = modules.iter().position(|m| m.id == id).unwrap(); 65 | return modules[module_pos].clone(); 66 | } 67 | 68 | pub(crate) fn find_version(versions: Vec, version_name: String) -> Version { 69 | if version_name.to_lowercase() == "latest" { 70 | return versions.last().unwrap().clone(); 71 | } else { 72 | let version_exists = versions.iter().any(|v| v.version == version_name); 73 | if !version_exists { 74 | println!("! Unable to find {}", version_name); 75 | exit(1); 76 | } 77 | let version_pos = versions 78 | .iter() 79 | .position(|v| v.version == version_name) 80 | .unwrap(); 81 | return versions[version_pos].clone(); 82 | } 83 | } 84 | 85 | pub fn get_id_details(id: String) -> (String, String) { 86 | let parts: Vec<&str> = id.split('@').collect(); 87 | let _id = parts.get(0).unwrap(); 88 | let _ver = parts.get(1).unwrap_or(&"latest"); 89 | return (_id.to_string(), _ver.to_string()) 90 | } -------------------------------------------------------------------------------- /src/android_root.rs: -------------------------------------------------------------------------------- 1 | use regex::Regex; 2 | use std::fs; 3 | use std::{ 4 | env, 5 | fs::File, 6 | io::{self, Write}, 7 | path::{Path, PathBuf}, 8 | process::exit, 9 | }; 10 | 11 | use ini::Ini; 12 | 13 | pub static ANDROID_PATH: &'static str = 14 | "$PATH:/system/bin:/system/xbin:/sbin:/data/adb/ksu/bin:/data/adb/ap/bin:/data/adb/magisk"; 15 | 16 | #[cfg(target_os = "linux")] 17 | pub fn get_downloads_dir() -> String { 18 | return match env::var("HOME") { 19 | Ok(val) => [val, String::from("Downloads")].join("/"), 20 | Err(e) => panic!("could not find {}: {}", "HOME", e), 21 | }; 22 | } 23 | 24 | pub fn is_mmrl() -> bool { 25 | return match env::var("MMRL_INTR") { 26 | Ok(_val) => true, 27 | Err(_e) => false, 28 | }; 29 | } 30 | 31 | #[cfg(target_os = "android")] 32 | pub fn get_downloads_dir() -> String { 33 | return match env::var("EXTERNAL_STORAGE") { 34 | Ok(val) => [val, String::from("Download")].join("/"), 35 | Err(e) => panic!("could not find {}: {}", "EXTERNAL_STORAGE", e), 36 | }; 37 | } 38 | 39 | pub fn check_paths(paths: Vec<&str>) -> Result { 40 | for _path in paths { 41 | let path = PathBuf::from(_path); 42 | if path.exists() { 43 | let _ = Ok::(path.exists()); 44 | } else { 45 | let _ = Ok::(false); 46 | } 47 | } 48 | 49 | Ok(false) 50 | } 51 | 52 | struct Searcher { 53 | regex: Regex, 54 | } 55 | 56 | impl Searcher { 57 | fn new(pattern: &str) -> Searcher { 58 | Searcher { 59 | regex: Regex::new(pattern).unwrap(), 60 | } 61 | } 62 | 63 | fn search(&self, contents: &str) -> bool { 64 | self.regex.is_match(contents) 65 | } 66 | } 67 | 68 | fn mount_detect(searcher: &Searcher) -> bool { 69 | let path = Path::new("/proc/self/mounts"); 70 | 71 | if path.exists() { 72 | if let Ok(contents) = fs::read_to_string(path) { 73 | searcher.search(&contents) 74 | } else { 75 | false 76 | } 77 | } else { 78 | false 79 | } 80 | } 81 | 82 | pub fn has_magisk_su() -> bool { 83 | return mount_detect(&Searcher::new(r"(magisk|core\/mirror|core\/img)")); 84 | } 85 | 86 | pub fn has_kernel_su() -> bool { 87 | return mount_detect(&Searcher::new(r"(KSU|KernelSU)")); 88 | } 89 | 90 | pub fn has_apatch_su() -> bool { 91 | return mount_detect(&Searcher::new(r"(APD|APatch)")); 92 | } 93 | 94 | pub fn get_root_manager() -> &'static str { 95 | if has_magisk_su() { 96 | return "Magisk"; 97 | } else if has_kernel_su() { 98 | return "KernelSU"; 99 | } else if has_apatch_su() { 100 | return "APatchSU"; 101 | } else { 102 | return "Unknown"; 103 | } 104 | } 105 | 106 | pub fn get_install_cli(path: &str) -> (&str, Vec<&str>) { 107 | match get_root_manager() { 108 | "Magisk" => { 109 | return ("magisk", vec!["--install-module", path]); 110 | } 111 | "KernelSU" => { 112 | return ("ksud", vec!["module", "install", path]); 113 | } 114 | "APatchSU" => { 115 | return ("apd", vec!["module", "install", path]); 116 | } 117 | "Unknown" => { 118 | println!("! Unable to determine install cli"); 119 | exit(0) 120 | } 121 | _ => { 122 | println!("! Unable to determine install cli"); 123 | exit(0) 124 | } 125 | } 126 | } 127 | 128 | pub fn module_state(id: String, state: &str) { 129 | let base_path = Path::new("/data/adb/modules").join(id); 130 | let mod_state = base_path.join(state); 131 | 132 | let moduleprop = base_path.join("module.prop"); 133 | 134 | if base_path.exists() && moduleprop.exists() && !mod_state.exists() { 135 | let conf = Ini::load_from_file(moduleprop.to_str().unwrap()).unwrap(); 136 | let prop = conf.section(None::).unwrap(); 137 | let mut f = File::create(mod_state).unwrap(); 138 | match f.write_all(b"") { 139 | Ok(_addr) => { 140 | println!("{} will be {}d.", prop.get("name").unwrap(), state); 141 | } 142 | Err(err) => { 143 | println!("{}", err); 144 | exit(1); 145 | } 146 | } 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /src/cmd/install.rs: -------------------------------------------------------------------------------- 1 | extern crate serde; 2 | extern crate serde_ini; 3 | 4 | use crate::android_root::{get_downloads_dir, get_install_cli, ANDROID_PATH}; 5 | use crate::repo::{find_module, find_version, get_id_details, Module}; 6 | use crate::utils::{confirm, download_from_url, get_last, is_url}; 7 | use async_recursion::async_recursion; 8 | use reqwest::Client; 9 | use std::io::{BufRead, BufReader, Error, ErrorKind, Read}; 10 | use std::process::{exit, Command, Stdio}; 11 | 12 | #[async_recursion] 13 | pub async fn install( 14 | client: Client, 15 | yes: bool, 16 | _requires: bool, 17 | modules: &Vec, 18 | id: String, 19 | ) { 20 | let _url = &id.to_owned()[..]; 21 | if is_url(_url) { 22 | let name = get_last(_url); 23 | let path = &[ 24 | get_downloads_dir(), 25 | [name.clone().unwrap().to_string(), "zip".to_string()].join("."), 26 | ] 27 | .join("/"); 28 | download_from_url(client.clone(), id.clone(), name.unwrap(), path).await; 29 | // check_requires(path.clone(), requires, client.clone(), yes, modules).await; 30 | 31 | println!("? Info not availabe in url install"); 32 | let success = yes || confirm("Do you want to continue [y/N] "); 33 | 34 | if success { 35 | let (bin, args) = get_install_cli(&path); 36 | 37 | let stdout = Command::new(bin) 38 | .args(args) 39 | .stdout(Stdio::piped()) 40 | .spawn() 41 | .unwrap() 42 | .stdout 43 | .ok_or_else(|| Error::new(ErrorKind::Other, "Could not capture standard output.")) 44 | .unwrap(); 45 | 46 | let reader = BufReader::new(stdout); 47 | 48 | for line in reader.lines() { 49 | match line { 50 | Ok(ln) => println!("{}", ln), 51 | Err(e) => { 52 | println!("{}", e); 53 | exit(500) 54 | } 55 | } 56 | } 57 | exit(0); 58 | } else { 59 | exit(0); 60 | } 61 | } else { 62 | let (_id, _ver) = get_id_details(id); 63 | let module = find_module(&modules, _id.clone()); 64 | let version = find_version(module.versions.clone(), _ver); 65 | 66 | let path = &[ 67 | get_downloads_dir(), 68 | [ 69 | [version.version.clone(), module.id].join("-"), 70 | "zip".to_string(), 71 | ] 72 | .join("."), 73 | ] 74 | .join("/"); 75 | 76 | download_from_url(client.clone(), version.zip_url, module.name, path).await; 77 | // check_requires(path.clone(), requires, client.clone(), yes, modules).await; 78 | 79 | let success = yes || confirm("Do you want to continue [y/N] "); 80 | 81 | if success { 82 | let (bin, args) = get_install_cli(&path); 83 | 84 | let stdout = Command::new(bin) 85 | .args(args) 86 | .env("PATH", ANDROID_PATH) 87 | .stdout(Stdio::piped()) 88 | .spawn() 89 | .unwrap() 90 | .stdout 91 | .ok_or_else(|| Error::new(ErrorKind::Other, "Could not capture standard output.")) 92 | .unwrap(); 93 | 94 | let reader = BufReader::new(stdout); 95 | 96 | for line in reader.lines() { 97 | match line { 98 | Ok(ln) => println!("{}", ln), 99 | Err(e) => { 100 | println!("{}", e); 101 | exit(500) 102 | } 103 | } 104 | } 105 | } else { 106 | exit(0); 107 | } 108 | } 109 | } 110 | 111 | pub async fn install_local(yes: bool, id: String) -> () { 112 | let success = yes || confirm("Do you want to continue [y/N] "); 113 | 114 | if success { 115 | let (bin, args) = get_install_cli(&id); 116 | 117 | let stdout = Command::new(bin) 118 | .args(args) 119 | .env("PATH", ANDROID_PATH) 120 | .stdout(Stdio::piped()) 121 | .spawn() 122 | .unwrap() 123 | .stdout 124 | .ok_or_else(|| Error::new(ErrorKind::Other, "Could not capture standard output.")) 125 | .unwrap(); 126 | 127 | let reader = BufReader::new(stdout); 128 | 129 | for line in reader.lines() { 130 | match line { 131 | Ok(ln) => println!("{}", ln), 132 | Err(e) => { 133 | println!("{}", e); 134 | exit(500) 135 | } 136 | } 137 | } 138 | } else { 139 | exit(0); 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /module/system/usr/share/mmrl/config/mmrl/index.jsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | import { Page, Toolbar } from "@mmrl/ui" 3 | import { useActivity, useNativeFileStorage, useStrings } from "@mmrl/hooks" 4 | import { withRequireNewVersion } from "@mmrl/hoc" 5 | import { 6 | ArrowBackIosRounded, 7 | DeleteRounded, 8 | AddRounded 9 | } from "@mui/icons-material" 10 | import { 11 | List, 12 | ListItem, 13 | ListItemText, 14 | ListSubheader, 15 | IconButton, 16 | Card, 17 | CardContent, 18 | Typography, 19 | Grid, 20 | Dialog, 21 | DialogActions, 22 | DialogContent, 23 | DialogContentText, 24 | DialogTitle, 25 | TextField, 26 | Button, 27 | } from "@mui/material" 28 | 29 | const info = require(path.resolve(__dirname, "info.json")) 30 | 31 | const App = () => { 32 | const [repos, setRepos] = useNativeFileStorage("/data/adb/mmrl/repos.json", [ 33 | "https://magisk-modules-alt-repo.github.io/json-v2/json/modules.json", 34 | "https://gr.dergoogler.com/gmr/json/modules.json" 35 | ], { loader: "json" }) 36 | 37 | const { context } = useActivity() 38 | const { strings } = useStrings() 39 | 40 | 41 | const [open, setOpen] = React.useState(false) 42 | const [repoLink, setRepoLink] = React.useState("") 43 | const handleDialogOpen = () => setOpen(true) 44 | const handleDialogClose = () => { setOpen(false), setRepoLink("") } 45 | const handleRepoLinkChange = (e) => setRepoLink(e.target.value) 46 | 47 | 48 | const renderToolbar = React.useCallback(() => { 49 | return ( 50 | 56 | 57 | 58 | 59 | Command line interface config 60 | 61 | 62 | 63 | 64 | ) 65 | }, []) 66 | 67 | 68 | return ( 69 | 70 | 71 | 72 | 73 | 74 | Author: 75 | 76 | 77 | {info.author} 78 | 79 | 80 | Version: 81 | 82 | 83 | {info.version} ({info.versionCode}) 84 | 85 | 86 | Rust version: 87 | 88 | 89 | {info.rustVersion} 90 | 91 | 92 | Build date: 93 | 94 | 95 | {info.buildDate} 96 | 97 | 98 | 99 | 100 | 101 | Installed repositories}> 102 | {repos.map((repo) => { 103 | const handleDelete = () => { 104 | setRepos((rep) => rep.filter((remv) => remv != repo)) 105 | } 106 | return ( 107 | 109 | 110 | 111 | }> 112 | 113 | 114 | ) 115 | })} 116 | 117 | 118 | 119 | 120 | {strings("add_repository")} 121 | 122 | {strings("add_repository_description")} 123 | 134 | 135 | 136 | 137 | 146 | 147 | 148 | 149 | ) 150 | } 151 | 152 | export default withRequireNewVersion({ 153 | versionCode: 21918, 154 | component: App, 155 | }); -------------------------------------------------------------------------------- /src/utils.rs: -------------------------------------------------------------------------------- 1 | extern crate walkdir; 2 | extern crate zip; 3 | 4 | use futures_util::StreamExt; 5 | use regex::Regex; 6 | use reqwest::Client; 7 | use serde::{Deserialize, Serialize}; 8 | use std::cmp::min; 9 | use std::fs::File; 10 | use std::io; 11 | use std::io::prelude::*; 12 | use std::io::{Seek, Write}; 13 | use std::iter::Iterator; 14 | use std::path::Path; 15 | use std::process::exit; 16 | use url::Url; 17 | use zip::write::FileOptions; 18 | use zip::ZipArchive; 19 | 20 | use walkdir::DirEntry; 21 | 22 | #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 23 | #[serde(rename_all = "camelCase")] 24 | pub struct MMRLJSON { 25 | pub require: Vec, 26 | } 27 | 28 | pub fn get_mmrl_json(path: &str) -> Result { 29 | let fname = Path::new(path); 30 | let zipfile = File::open(fname).unwrap(); 31 | 32 | let mut archive = ZipArchive::new(zipfile).unwrap(); 33 | 34 | let mut file = match archive.by_name("mmrl.json") { 35 | Ok(file) => file, 36 | Err(..) => { 37 | println!("mmrl.json not found"); 38 | return serde_json::from_str("{\"require\":[]}"); 39 | } 40 | }; 41 | 42 | let mut contents = String::new(); 43 | file.read_to_string(&mut contents).unwrap(); 44 | return serde_json::from_str(contents.as_str()); 45 | } 46 | 47 | pub fn confirm(msg: &str) -> bool { 48 | loop { 49 | print!("{}", msg); 50 | let mut input = String::new(); 51 | io::stdout().flush().unwrap(); 52 | io::stdin() 53 | .read_line(&mut input) 54 | .expect("Failed to read input"); 55 | let trimmed = input.trim().to_lowercase(); 56 | match trimmed.to_lowercase().as_str() { 57 | "yes" | "y" => { 58 | return true; 59 | } 60 | "no" | "n" => { 61 | return false; 62 | } 63 | _ => { 64 | return false; 65 | } 66 | } 67 | } 68 | } 69 | 70 | pub fn get_last(url: &str) -> Result { 71 | Url::parse(url) 72 | .map_err(|_| "Unable to parse")? 73 | .path_segments() 74 | .ok_or("No segments")? 75 | .last() 76 | .ok_or("No items") 77 | .map(String::from) 78 | } 79 | 80 | pub async fn download_from_url(client: Client, url: String, name: String, path: &String) -> String { 81 | let res = client 82 | .get(url.clone()) 83 | .send() 84 | .await 85 | .or(Err(format!("! Failed to GET from '{}'", url))) 86 | .unwrap(); 87 | 88 | let total_size = res 89 | .content_length() 90 | .ok_or(format!("! Failed to get content length from '{}'", url)) 91 | .unwrap(); 92 | 93 | println!("- Downloading {}", name); 94 | 95 | // download chunks 96 | let mut file = File::create(path); 97 | 98 | let mut downloaded: u64 = 0; 99 | let mut stream = res.bytes_stream(); 100 | 101 | while let Some(item) = stream.next().await { 102 | let chunk = match item { 103 | Ok(c) => c, 104 | Err(_e) => { 105 | println!("! Error while downloading file"); 106 | exit(2); 107 | } 108 | }; 109 | 110 | let _ = match file { 111 | Ok(ref mut f) => f.write_all(&chunk), 112 | Err(_e) => { 113 | println!("! Error while writing to file"); 114 | exit(3) 115 | } 116 | }; 117 | 118 | let new = min(downloaded + (chunk.len() as u64), total_size); 119 | downloaded = new; 120 | } 121 | 122 | println!("- Downloaded {} to {}", name, path); 123 | 124 | return path.to_string(); 125 | } 126 | 127 | pub fn is_url(url: &str) -> bool { 128 | let url_regex: &str = r"https?://(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}(\.[a-z]{2,4})?\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)"; 129 | return Regex::new(url_regex).unwrap().is_match(url); 130 | } 131 | 132 | pub fn is_git(url: &str) -> bool { 133 | let git_regex: &str = 134 | r"((git|ssh|http(s)?)|(git@[\w\.]+))(:(\/\/)?)([\w\.@\:\/\-~]+)(\.git)(\/)?"; 135 | return Regex::new(git_regex).unwrap().is_match(url); 136 | } 137 | 138 | pub fn zip_dir( 139 | it: &mut dyn Iterator, 140 | prefix: &str, 141 | writer: T, 142 | method: zip::CompressionMethod, 143 | ) -> zip::result::ZipResult<()> 144 | where 145 | T: Write + Seek, 146 | { 147 | let mut zip = zip::ZipWriter::new(writer); 148 | let options = FileOptions::default() 149 | .compression_method(method) 150 | .unix_permissions(0o755); 151 | 152 | let mut buffer = Vec::new(); 153 | for entry in it { 154 | let path = entry.path(); 155 | let name = path.strip_prefix(Path::new(prefix)).unwrap(); 156 | 157 | // Write file or directory explicitly 158 | // Some unzip tools unzip files with directory paths correctly, some do not! 159 | if path.is_file() { 160 | println!("adding file {:?} as {:?} ...", path, name); 161 | zip.start_file_from_path(name, options)?; 162 | let mut f = File::open(path)?; 163 | 164 | f.read_to_end(&mut buffer)?; 165 | zip.write_all(&*buffer)?; 166 | buffer.clear(); 167 | } else if name.as_os_str().len() != 0 { 168 | // Only if not root! Avoids path spec / warning 169 | // and mapname conversion failed error on unzip 170 | println!("adding dir {:?} as {:?} ...", path, name); 171 | zip.add_directory_from_path(name, options)?; 172 | } 173 | } 174 | zip.finish()?; 175 | Result::Ok(()) 176 | } 177 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | extern crate reqwest; 2 | 3 | pub mod android_root; 4 | pub mod cmd; 5 | pub mod repo; 6 | pub mod utils; 7 | use crate::cmd::{ 8 | download::download, info::info, install::install, repo::add, search::search, upself::upself, 9 | }; 10 | use crate::repo::Module; 11 | 12 | use android_root::module_state; 13 | use clap::{Parser, Subcommand}; 14 | use cmd::install::install_local; 15 | use repo::Repo; 16 | use serde_json::json; 17 | use std::io::Write; 18 | use std::{ 19 | fs::{self, File}, 20 | path::Path, 21 | process::exit, 22 | }; 23 | 24 | #[derive(Debug, Subcommand)] 25 | enum SearchCommands { 26 | #[command(arg_required_else_help = true)] 27 | All { query: String }, 28 | #[command(arg_required_else_help = true)] 29 | Id { query: String }, 30 | #[command(arg_required_else_help = true)] 31 | Name { query: String }, 32 | #[command(arg_required_else_help = true)] 33 | Author { query: String }, 34 | #[command(arg_required_else_help = true, alias = "desc")] 35 | Description { query: String }, 36 | #[command(arg_required_else_help = true, alias = "ver")] 37 | Version { query: String }, 38 | #[command(arg_required_else_help = true, alias = "li")] 39 | License { query: String }, 40 | } 41 | 42 | #[derive(Debug, Subcommand)] 43 | enum RepoCommands { 44 | #[command(arg_required_else_help = true)] 45 | Add { url: Vec }, 46 | } 47 | 48 | #[derive(Debug, Subcommand)] 49 | enum InstallCommands { 50 | /// Install a local module 51 | #[command(arg_required_else_help = true, aliases = &["ll", "lcl"])] 52 | Local { 53 | /// Skip confirm 54 | #[arg(short, long)] 55 | yes: bool, 56 | /// Module ZIP location 57 | path: Vec, 58 | }, 59 | } 60 | 61 | #[derive(Debug, Subcommand)] 62 | enum Commands { 63 | /// Update MMRL CLI 64 | #[command(arg_required_else_help = true, aliases = &["sup", "up"])] 65 | Upself { 66 | /// Skip confirm 67 | #[arg(short, long)] 68 | yes: bool, 69 | /// Example: 0.1.0 70 | version: String, 71 | }, 72 | /// Add new repositories 73 | #[command(arg_required_else_help = true)] 74 | Repo { 75 | #[clap(subcommand)] 76 | commands: RepoCommands, 77 | }, 78 | /// View module infomation 79 | #[command(arg_required_else_help = true, aliases = &["view"])] 80 | Info { 81 | /// Give info from given module ids 82 | ids: Vec, 83 | }, 84 | /// Search through modules 85 | #[command(arg_required_else_help = true, aliases = &["lookup", "find"])] 86 | Search { 87 | #[clap(subcommand)] 88 | commands: SearchCommands, 89 | // Downloads the modules from the given ids 90 | // query: String, 91 | }, 92 | /// Download any module 93 | #[command(arg_required_else_help = true, aliases = &["dl"])] 94 | Download { 95 | /// Downloads the modules from the given ids 96 | ids: Vec, 97 | }, 98 | /// Install any module 99 | #[command(arg_required_else_help = true, aliases = &["add", "get", "fetch"])] 100 | Install { 101 | #[clap(subcommand)] 102 | commands: Option, 103 | /// Skip confirm 104 | #[arg(short, long)] 105 | yes: bool, 106 | /// Also install requires of a module 107 | #[arg(short, long)] 108 | requires: bool, 109 | /// Installs selected modules 110 | ids: Vec, 111 | }, 112 | Enable { 113 | /// Enabled selected modules 114 | ids: Vec, 115 | }, 116 | Disable { 117 | /// Disabled selected modules 118 | ids: Vec, 119 | }, 120 | Remove { 121 | /// Remove selected modules 122 | ids: Vec, 123 | }, 124 | } 125 | 126 | /// Magisk Module Repo Loader CLI 127 | #[derive(Parser, Debug)] 128 | #[command(author, version, about, long_about = None)] 129 | struct Args { 130 | #[clap(subcommand)] 131 | commands: Commands, 132 | } 133 | 134 | const REPOS_SOURCE: &str = "/data/adb/mmrl/repos.json"; 135 | 136 | fn setup() { 137 | let file_path = Path::new(REPOS_SOURCE); // Replace with the desired file path 138 | 139 | if !file_path.exists() { 140 | // Create all directories in the path if they don't exist 141 | if let Some(parent_dir) = file_path.parent() { 142 | if !parent_dir.exists() { 143 | if let Err(err) = fs::create_dir_all(parent_dir) { 144 | eprintln!("Error creating directories: {}", err); 145 | return; 146 | } 147 | } 148 | } 149 | 150 | // Create the file 151 | let mut file = match File::create(&file_path) { 152 | Ok(file) => file, 153 | Err(err) => { 154 | eprintln!("Error creating file: {}", err); 155 | return; 156 | } 157 | }; 158 | 159 | // You can write to the file if needed 160 | if let Err(err) = writeln!( 161 | file, 162 | "[\n\t\"https://gr.dergoogler.com/gmr/json/modules.json\",\n\t\"https://magisk-modules-alt-repo.github.io/json-v2/json/modules.json\"]" 163 | ) { 164 | eprintln!("Error writing to file: {}", err); 165 | } 166 | } 167 | } 168 | 169 | async fn fetch_repos(url: String) -> Result { 170 | let response = reqwest::get(url).await?; 171 | let body = response.json().await?; 172 | Ok(body) 173 | } 174 | 175 | #[tokio::main] 176 | async fn main() { 177 | setup(); 178 | let client = reqwest::Client::builder().build().unwrap(); 179 | let args = Args::parse(); 180 | let mut modules: Vec = vec![]; 181 | 182 | let file = File::open(REPOS_SOURCE).expect("file should open read only"); 183 | let contents: Vec = serde_json::from_reader(file).unwrap(); 184 | 185 | let mut repos = vec![]; 186 | 187 | for url in contents { 188 | let repo = tokio::spawn(fetch_repos(url.clone())); 189 | let result = repo.await.unwrap(); 190 | 191 | let _repo = match result { 192 | Ok(data) => repos.push(data), 193 | Err(_e) => { 194 | repos.push(serde_json::from_str(r#"{ "name": "", "metadata": { "version": 666, "timestamp": 666 }, "modules": [] }"#).unwrap()); 195 | println!("! Unable to fetch \"{}\", pushed empty data", url); 196 | } 197 | }; 198 | } 199 | 200 | for mut repo in repos { 201 | modules.append(&mut repo.modules); 202 | } 203 | 204 | match args.commands { 205 | Commands::Repo { commands } => match commands { 206 | RepoCommands::Add { url } => { 207 | add(url).await; 208 | exit(0); 209 | } 210 | }, 211 | Commands::Info { ids } => { 212 | for id in ids { 213 | info(&modules.clone(), id).await; 214 | } 215 | exit(0); 216 | } 217 | Commands::Upself { yes, version } => { 218 | upself(client, version, yes).await; 219 | exit(0); 220 | } 221 | Commands::Search { commands } => match commands { 222 | SearchCommands::All { query } => { 223 | search(modules.clone(), |module| { 224 | module.id.to_lowercase().contains(&query.to_lowercase()) 225 | || module.name.to_lowercase().contains(&query.to_lowercase()) 226 | || module 227 | .description 228 | .to_lowercase() 229 | .contains(&query.to_lowercase()) 230 | || module.author.to_lowercase().contains(&query.to_lowercase()) 231 | || module 232 | .version 233 | .to_lowercase() 234 | .contains(&query.to_lowercase()) 235 | }) 236 | .await; 237 | exit(0); 238 | } 239 | SearchCommands::Id { query } => { 240 | search(modules.clone(), |module| { 241 | module.id.to_lowercase().contains(&query.to_lowercase()) 242 | }) 243 | .await; 244 | exit(0); 245 | } 246 | SearchCommands::Name { query } => { 247 | search(modules.clone(), |module| { 248 | module.name.to_lowercase().contains(&query.to_lowercase()) 249 | }) 250 | .await; 251 | exit(0); 252 | } 253 | SearchCommands::Author { query } => { 254 | search(modules.clone(), |module| { 255 | module.author.to_lowercase().contains(&query.to_lowercase()) 256 | }) 257 | .await; 258 | exit(0); 259 | } 260 | SearchCommands::Description { query } => { 261 | search(modules.clone(), |module| { 262 | module 263 | .description 264 | .to_lowercase() 265 | .contains(&query.to_lowercase()) 266 | }) 267 | .await; 268 | exit(0); 269 | } 270 | SearchCommands::Version { query } => { 271 | search(modules.clone(), |module| { 272 | module 273 | .version 274 | .to_lowercase() 275 | .contains(&query.to_lowercase()) 276 | }) 277 | .await; 278 | exit(0); 279 | } 280 | SearchCommands::License { query } => { 281 | search(modules.clone(), |module| { 282 | module 283 | .track 284 | .license 285 | .to_lowercase() 286 | .contains(&query.to_lowercase()) 287 | }) 288 | .await; 289 | exit(0); 290 | } 291 | }, 292 | Commands::Install { 293 | yes, 294 | requires, 295 | ids, 296 | commands, 297 | } => match commands { 298 | Some(InstallCommands::Local { yes, path }) => { 299 | for id in path { 300 | install_local(yes, id).await; 301 | } 302 | exit(0); 303 | } 304 | None => { 305 | for id in ids { 306 | install(client.clone(), yes, requires, &modules, id).await; 307 | } 308 | exit(0); 309 | } 310 | }, 311 | Commands::Enable { ids } => { 312 | for id in ids { 313 | let base_path = Path::new("/data/adb/modules").join(id); 314 | let disable = base_path.join("disable"); 315 | let remove = base_path.join("remove"); 316 | 317 | if disable.exists() { 318 | fs::remove_file(disable).expect("File delete failed"); 319 | } 320 | 321 | if remove.exists() { 322 | fs::remove_file(remove).expect("File delete failed"); 323 | } 324 | } 325 | } 326 | Commands::Disable { ids } => { 327 | for id in ids { 328 | module_state(id, "disable"); 329 | } 330 | } 331 | Commands::Remove { ids } => { 332 | for id in ids { 333 | module_state(id, "remove"); 334 | } 335 | } 336 | Commands::Download { ids } => { 337 | for id in ids { 338 | download(client.clone(), &modules, id).await; 339 | } 340 | exit(0); 341 | } 342 | } 343 | } 344 | -------------------------------------------------------------------------------- /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 = "addr2line" 7 | version = "0.21.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "aes" 22 | version = "0.8.4" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" 25 | dependencies = [ 26 | "cfg-if", 27 | "cipher", 28 | "cpufeatures", 29 | ] 30 | 31 | [[package]] 32 | name = "aho-corasick" 33 | version = "1.1.3" 34 | source = "registry+https://github.com/rust-lang/crates.io-index" 35 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 36 | dependencies = [ 37 | "memchr", 38 | ] 39 | 40 | [[package]] 41 | name = "android-tzdata" 42 | version = "0.1.1" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 45 | 46 | [[package]] 47 | name = "android_system_properties" 48 | version = "0.1.5" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 51 | dependencies = [ 52 | "libc", 53 | ] 54 | 55 | [[package]] 56 | name = "anstream" 57 | version = "0.6.14" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" 60 | dependencies = [ 61 | "anstyle", 62 | "anstyle-parse", 63 | "anstyle-query", 64 | "anstyle-wincon", 65 | "colorchoice", 66 | "is_terminal_polyfill", 67 | "utf8parse", 68 | ] 69 | 70 | [[package]] 71 | name = "anstyle" 72 | version = "1.0.7" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" 75 | 76 | [[package]] 77 | name = "anstyle-parse" 78 | version = "0.2.4" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" 81 | dependencies = [ 82 | "utf8parse", 83 | ] 84 | 85 | [[package]] 86 | name = "anstyle-query" 87 | version = "1.0.3" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" 90 | dependencies = [ 91 | "windows-sys 0.52.0", 92 | ] 93 | 94 | [[package]] 95 | name = "anstyle-wincon" 96 | version = "3.0.3" 97 | source = "registry+https://github.com/rust-lang/crates.io-index" 98 | checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" 99 | dependencies = [ 100 | "anstyle", 101 | "windows-sys 0.52.0", 102 | ] 103 | 104 | [[package]] 105 | name = "anyhow" 106 | version = "1.0.86" 107 | source = "registry+https://github.com/rust-lang/crates.io-index" 108 | checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" 109 | 110 | [[package]] 111 | name = "async-recursion" 112 | version = "1.1.1" 113 | source = "registry+https://github.com/rust-lang/crates.io-index" 114 | checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" 115 | dependencies = [ 116 | "proc-macro2", 117 | "quote", 118 | "syn", 119 | ] 120 | 121 | [[package]] 122 | name = "async-trait" 123 | version = "0.1.80" 124 | source = "registry+https://github.com/rust-lang/crates.io-index" 125 | checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" 126 | dependencies = [ 127 | "proc-macro2", 128 | "quote", 129 | "syn", 130 | ] 131 | 132 | [[package]] 133 | name = "autocfg" 134 | version = "1.3.0" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" 137 | 138 | [[package]] 139 | name = "backtrace" 140 | version = "0.3.71" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" 143 | dependencies = [ 144 | "addr2line", 145 | "cc", 146 | "cfg-if", 147 | "libc", 148 | "miniz_oxide", 149 | "object", 150 | "rustc-demangle", 151 | ] 152 | 153 | [[package]] 154 | name = "base64" 155 | version = "0.21.7" 156 | source = "registry+https://github.com/rust-lang/crates.io-index" 157 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 158 | 159 | [[package]] 160 | name = "base64ct" 161 | version = "1.6.0" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" 164 | 165 | [[package]] 166 | name = "bitflags" 167 | version = "1.3.2" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 170 | 171 | [[package]] 172 | name = "bitflags" 173 | version = "2.5.0" 174 | source = "registry+https://github.com/rust-lang/crates.io-index" 175 | checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" 176 | 177 | [[package]] 178 | name = "block-buffer" 179 | version = "0.10.4" 180 | source = "registry+https://github.com/rust-lang/crates.io-index" 181 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 182 | dependencies = [ 183 | "generic-array", 184 | ] 185 | 186 | [[package]] 187 | name = "bumpalo" 188 | version = "3.16.0" 189 | source = "registry+https://github.com/rust-lang/crates.io-index" 190 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 191 | 192 | [[package]] 193 | name = "byteorder" 194 | version = "1.5.0" 195 | source = "registry+https://github.com/rust-lang/crates.io-index" 196 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 197 | 198 | [[package]] 199 | name = "bytes" 200 | version = "1.6.0" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" 203 | 204 | [[package]] 205 | name = "bzip2" 206 | version = "0.4.4" 207 | source = "registry+https://github.com/rust-lang/crates.io-index" 208 | checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" 209 | dependencies = [ 210 | "bzip2-sys", 211 | "libc", 212 | ] 213 | 214 | [[package]] 215 | name = "bzip2-sys" 216 | version = "0.1.11+1.0.8" 217 | source = "registry+https://github.com/rust-lang/crates.io-index" 218 | checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" 219 | dependencies = [ 220 | "cc", 221 | "libc", 222 | "pkg-config", 223 | ] 224 | 225 | [[package]] 226 | name = "cc" 227 | version = "1.0.98" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" 230 | dependencies = [ 231 | "jobserver", 232 | "libc", 233 | "once_cell", 234 | ] 235 | 236 | [[package]] 237 | name = "cfg-if" 238 | version = "1.0.0" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 241 | 242 | [[package]] 243 | name = "chrono" 244 | version = "0.4.38" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" 247 | dependencies = [ 248 | "android-tzdata", 249 | "iana-time-zone", 250 | "js-sys", 251 | "num-traits", 252 | "wasm-bindgen", 253 | "windows-targets 0.52.5", 254 | ] 255 | 256 | [[package]] 257 | name = "cipher" 258 | version = "0.4.4" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" 261 | dependencies = [ 262 | "crypto-common", 263 | "inout", 264 | ] 265 | 266 | [[package]] 267 | name = "clap" 268 | version = "4.5.4" 269 | source = "registry+https://github.com/rust-lang/crates.io-index" 270 | checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" 271 | dependencies = [ 272 | "clap_builder", 273 | "clap_derive", 274 | ] 275 | 276 | [[package]] 277 | name = "clap_builder" 278 | version = "4.5.2" 279 | source = "registry+https://github.com/rust-lang/crates.io-index" 280 | checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" 281 | dependencies = [ 282 | "anstream", 283 | "anstyle", 284 | "clap_lex", 285 | "strsim", 286 | ] 287 | 288 | [[package]] 289 | name = "clap_derive" 290 | version = "4.5.4" 291 | source = "registry+https://github.com/rust-lang/crates.io-index" 292 | checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" 293 | dependencies = [ 294 | "heck", 295 | "proc-macro2", 296 | "quote", 297 | "syn", 298 | ] 299 | 300 | [[package]] 301 | name = "clap_lex" 302 | version = "0.7.0" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" 305 | 306 | [[package]] 307 | name = "colorchoice" 308 | version = "1.0.1" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" 311 | 312 | [[package]] 313 | name = "confy" 314 | version = "0.6.1" 315 | source = "registry+https://github.com/rust-lang/crates.io-index" 316 | checksum = "45b1f4c00870f07dc34adcac82bb6a72cc5aabca8536ba1797e01df51d2ce9a0" 317 | dependencies = [ 318 | "directories", 319 | "serde", 320 | "thiserror", 321 | "toml", 322 | ] 323 | 324 | [[package]] 325 | name = "console" 326 | version = "0.15.8" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" 329 | dependencies = [ 330 | "encode_unicode", 331 | "lazy_static", 332 | "libc", 333 | "unicode-width", 334 | "windows-sys 0.52.0", 335 | ] 336 | 337 | [[package]] 338 | name = "const-random" 339 | version = "0.1.18" 340 | source = "registry+https://github.com/rust-lang/crates.io-index" 341 | checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" 342 | dependencies = [ 343 | "const-random-macro", 344 | ] 345 | 346 | [[package]] 347 | name = "const-random-macro" 348 | version = "0.1.16" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" 351 | dependencies = [ 352 | "getrandom", 353 | "once_cell", 354 | "tiny-keccak", 355 | ] 356 | 357 | [[package]] 358 | name = "constant_time_eq" 359 | version = "0.1.5" 360 | source = "registry+https://github.com/rust-lang/crates.io-index" 361 | checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 362 | 363 | [[package]] 364 | name = "core-foundation" 365 | version = "0.9.4" 366 | source = "registry+https://github.com/rust-lang/crates.io-index" 367 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 368 | dependencies = [ 369 | "core-foundation-sys", 370 | "libc", 371 | ] 372 | 373 | [[package]] 374 | name = "core-foundation-sys" 375 | version = "0.8.6" 376 | source = "registry+https://github.com/rust-lang/crates.io-index" 377 | checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" 378 | 379 | [[package]] 380 | name = "cpufeatures" 381 | version = "0.2.12" 382 | source = "registry+https://github.com/rust-lang/crates.io-index" 383 | checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" 384 | dependencies = [ 385 | "libc", 386 | ] 387 | 388 | [[package]] 389 | name = "crc32fast" 390 | version = "1.4.2" 391 | source = "registry+https://github.com/rust-lang/crates.io-index" 392 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 393 | dependencies = [ 394 | "cfg-if", 395 | ] 396 | 397 | [[package]] 398 | name = "crossbeam-channel" 399 | version = "0.5.13" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" 402 | dependencies = [ 403 | "crossbeam-utils", 404 | ] 405 | 406 | [[package]] 407 | name = "crossbeam-utils" 408 | version = "0.8.20" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" 411 | 412 | [[package]] 413 | name = "crunchy" 414 | version = "0.2.2" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 417 | 418 | [[package]] 419 | name = "crypto-common" 420 | version = "0.1.6" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 423 | dependencies = [ 424 | "generic-array", 425 | "typenum", 426 | ] 427 | 428 | [[package]] 429 | name = "deranged" 430 | version = "0.3.11" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" 433 | dependencies = [ 434 | "powerfmt", 435 | ] 436 | 437 | [[package]] 438 | name = "digest" 439 | version = "0.10.7" 440 | source = "registry+https://github.com/rust-lang/crates.io-index" 441 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 442 | dependencies = [ 443 | "block-buffer", 444 | "crypto-common", 445 | "subtle", 446 | ] 447 | 448 | [[package]] 449 | name = "directories" 450 | version = "5.0.1" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" 453 | dependencies = [ 454 | "dirs-sys", 455 | ] 456 | 457 | [[package]] 458 | name = "dirs-sys" 459 | version = "0.4.1" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" 462 | dependencies = [ 463 | "libc", 464 | "option-ext", 465 | "redox_users", 466 | "windows-sys 0.48.0", 467 | ] 468 | 469 | [[package]] 470 | name = "dlv-list" 471 | version = "0.5.2" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" 474 | dependencies = [ 475 | "const-random", 476 | ] 477 | 478 | [[package]] 479 | name = "either" 480 | version = "1.12.0" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" 483 | 484 | [[package]] 485 | name = "encode_unicode" 486 | version = "0.3.6" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" 489 | 490 | [[package]] 491 | name = "encoding_rs" 492 | version = "0.8.34" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" 495 | dependencies = [ 496 | "cfg-if", 497 | ] 498 | 499 | [[package]] 500 | name = "equivalent" 501 | version = "1.0.1" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 504 | 505 | [[package]] 506 | name = "errno" 507 | version = "0.3.9" 508 | source = "registry+https://github.com/rust-lang/crates.io-index" 509 | checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" 510 | dependencies = [ 511 | "libc", 512 | "windows-sys 0.52.0", 513 | ] 514 | 515 | [[package]] 516 | name = "error-chain" 517 | version = "0.12.4" 518 | source = "registry+https://github.com/rust-lang/crates.io-index" 519 | checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" 520 | dependencies = [ 521 | "backtrace", 522 | "version_check", 523 | ] 524 | 525 | [[package]] 526 | name = "fastrand" 527 | version = "2.1.0" 528 | source = "registry+https://github.com/rust-lang/crates.io-index" 529 | checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" 530 | 531 | [[package]] 532 | name = "flate2" 533 | version = "1.0.30" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" 536 | dependencies = [ 537 | "crc32fast", 538 | "miniz_oxide", 539 | ] 540 | 541 | [[package]] 542 | name = "fnv" 543 | version = "1.0.7" 544 | source = "registry+https://github.com/rust-lang/crates.io-index" 545 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 546 | 547 | [[package]] 548 | name = "foreign-types" 549 | version = "0.3.2" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 552 | dependencies = [ 553 | "foreign-types-shared", 554 | ] 555 | 556 | [[package]] 557 | name = "foreign-types-shared" 558 | version = "0.1.1" 559 | source = "registry+https://github.com/rust-lang/crates.io-index" 560 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 561 | 562 | [[package]] 563 | name = "form_urlencoded" 564 | version = "1.2.1" 565 | source = "registry+https://github.com/rust-lang/crates.io-index" 566 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 567 | dependencies = [ 568 | "percent-encoding", 569 | ] 570 | 571 | [[package]] 572 | name = "futures" 573 | version = "0.3.30" 574 | source = "registry+https://github.com/rust-lang/crates.io-index" 575 | checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" 576 | dependencies = [ 577 | "futures-channel", 578 | "futures-core", 579 | "futures-executor", 580 | "futures-io", 581 | "futures-sink", 582 | "futures-task", 583 | "futures-util", 584 | ] 585 | 586 | [[package]] 587 | name = "futures-channel" 588 | version = "0.3.30" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" 591 | dependencies = [ 592 | "futures-core", 593 | "futures-sink", 594 | ] 595 | 596 | [[package]] 597 | name = "futures-core" 598 | version = "0.3.30" 599 | source = "registry+https://github.com/rust-lang/crates.io-index" 600 | checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" 601 | 602 | [[package]] 603 | name = "futures-executor" 604 | version = "0.3.30" 605 | source = "registry+https://github.com/rust-lang/crates.io-index" 606 | checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" 607 | dependencies = [ 608 | "futures-core", 609 | "futures-task", 610 | "futures-util", 611 | ] 612 | 613 | [[package]] 614 | name = "futures-io" 615 | version = "0.3.30" 616 | source = "registry+https://github.com/rust-lang/crates.io-index" 617 | checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" 618 | 619 | [[package]] 620 | name = "futures-macro" 621 | version = "0.3.30" 622 | source = "registry+https://github.com/rust-lang/crates.io-index" 623 | checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" 624 | dependencies = [ 625 | "proc-macro2", 626 | "quote", 627 | "syn", 628 | ] 629 | 630 | [[package]] 631 | name = "futures-sink" 632 | version = "0.3.30" 633 | source = "registry+https://github.com/rust-lang/crates.io-index" 634 | checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" 635 | 636 | [[package]] 637 | name = "futures-task" 638 | version = "0.3.30" 639 | source = "registry+https://github.com/rust-lang/crates.io-index" 640 | checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" 641 | 642 | [[package]] 643 | name = "futures-util" 644 | version = "0.3.30" 645 | source = "registry+https://github.com/rust-lang/crates.io-index" 646 | checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" 647 | dependencies = [ 648 | "futures-channel", 649 | "futures-core", 650 | "futures-io", 651 | "futures-macro", 652 | "futures-sink", 653 | "futures-task", 654 | "memchr", 655 | "pin-project-lite", 656 | "pin-utils", 657 | "slab", 658 | ] 659 | 660 | [[package]] 661 | name = "generic-array" 662 | version = "0.14.7" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 665 | dependencies = [ 666 | "typenum", 667 | "version_check", 668 | ] 669 | 670 | [[package]] 671 | name = "getrandom" 672 | version = "0.2.15" 673 | source = "registry+https://github.com/rust-lang/crates.io-index" 674 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 675 | dependencies = [ 676 | "cfg-if", 677 | "js-sys", 678 | "libc", 679 | "wasi", 680 | "wasm-bindgen", 681 | ] 682 | 683 | [[package]] 684 | name = "gimli" 685 | version = "0.28.1" 686 | source = "registry+https://github.com/rust-lang/crates.io-index" 687 | checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" 688 | 689 | [[package]] 690 | name = "h2" 691 | version = "0.3.26" 692 | source = "registry+https://github.com/rust-lang/crates.io-index" 693 | checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" 694 | dependencies = [ 695 | "bytes", 696 | "fnv", 697 | "futures-core", 698 | "futures-sink", 699 | "futures-util", 700 | "http", 701 | "indexmap 2.2.6", 702 | "slab", 703 | "tokio", 704 | "tokio-util", 705 | "tracing", 706 | ] 707 | 708 | [[package]] 709 | name = "hashbrown" 710 | version = "0.12.3" 711 | source = "registry+https://github.com/rust-lang/crates.io-index" 712 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 713 | 714 | [[package]] 715 | name = "hashbrown" 716 | version = "0.13.2" 717 | source = "registry+https://github.com/rust-lang/crates.io-index" 718 | checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" 719 | 720 | [[package]] 721 | name = "hashbrown" 722 | version = "0.14.5" 723 | source = "registry+https://github.com/rust-lang/crates.io-index" 724 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 725 | 726 | [[package]] 727 | name = "heck" 728 | version = "0.5.0" 729 | source = "registry+https://github.com/rust-lang/crates.io-index" 730 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 731 | 732 | [[package]] 733 | name = "hermit-abi" 734 | version = "0.3.9" 735 | source = "registry+https://github.com/rust-lang/crates.io-index" 736 | checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" 737 | 738 | [[package]] 739 | name = "hmac" 740 | version = "0.12.1" 741 | source = "registry+https://github.com/rust-lang/crates.io-index" 742 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 743 | dependencies = [ 744 | "digest", 745 | ] 746 | 747 | [[package]] 748 | name = "http" 749 | version = "0.2.12" 750 | source = "registry+https://github.com/rust-lang/crates.io-index" 751 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 752 | dependencies = [ 753 | "bytes", 754 | "fnv", 755 | "itoa", 756 | ] 757 | 758 | [[package]] 759 | name = "http-body" 760 | version = "0.4.6" 761 | source = "registry+https://github.com/rust-lang/crates.io-index" 762 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 763 | dependencies = [ 764 | "bytes", 765 | "http", 766 | "pin-project-lite", 767 | ] 768 | 769 | [[package]] 770 | name = "httparse" 771 | version = "1.8.0" 772 | source = "registry+https://github.com/rust-lang/crates.io-index" 773 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 774 | 775 | [[package]] 776 | name = "httpdate" 777 | version = "1.0.3" 778 | source = "registry+https://github.com/rust-lang/crates.io-index" 779 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 780 | 781 | [[package]] 782 | name = "hyper" 783 | version = "0.14.28" 784 | source = "registry+https://github.com/rust-lang/crates.io-index" 785 | checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" 786 | dependencies = [ 787 | "bytes", 788 | "futures-channel", 789 | "futures-core", 790 | "futures-util", 791 | "h2", 792 | "http", 793 | "http-body", 794 | "httparse", 795 | "httpdate", 796 | "itoa", 797 | "pin-project-lite", 798 | "socket2", 799 | "tokio", 800 | "tower-service", 801 | "tracing", 802 | "want", 803 | ] 804 | 805 | [[package]] 806 | name = "hyper-tls" 807 | version = "0.5.0" 808 | source = "registry+https://github.com/rust-lang/crates.io-index" 809 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 810 | dependencies = [ 811 | "bytes", 812 | "hyper", 813 | "native-tls", 814 | "tokio", 815 | "tokio-native-tls", 816 | ] 817 | 818 | [[package]] 819 | name = "iana-time-zone" 820 | version = "0.1.60" 821 | source = "registry+https://github.com/rust-lang/crates.io-index" 822 | checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" 823 | dependencies = [ 824 | "android_system_properties", 825 | "core-foundation-sys", 826 | "iana-time-zone-haiku", 827 | "js-sys", 828 | "wasm-bindgen", 829 | "windows-core", 830 | ] 831 | 832 | [[package]] 833 | name = "iana-time-zone-haiku" 834 | version = "0.1.2" 835 | source = "registry+https://github.com/rust-lang/crates.io-index" 836 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 837 | dependencies = [ 838 | "cc", 839 | ] 840 | 841 | [[package]] 842 | name = "idna" 843 | version = "0.5.0" 844 | source = "registry+https://github.com/rust-lang/crates.io-index" 845 | checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" 846 | dependencies = [ 847 | "unicode-bidi", 848 | "unicode-normalization", 849 | ] 850 | 851 | [[package]] 852 | name = "indexmap" 853 | version = "1.9.3" 854 | source = "registry+https://github.com/rust-lang/crates.io-index" 855 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 856 | dependencies = [ 857 | "autocfg", 858 | "hashbrown 0.12.3", 859 | ] 860 | 861 | [[package]] 862 | name = "indexmap" 863 | version = "2.2.6" 864 | source = "registry+https://github.com/rust-lang/crates.io-index" 865 | checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" 866 | dependencies = [ 867 | "equivalent", 868 | "hashbrown 0.14.5", 869 | ] 870 | 871 | [[package]] 872 | name = "indicatif" 873 | version = "0.17.8" 874 | source = "registry+https://github.com/rust-lang/crates.io-index" 875 | checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" 876 | dependencies = [ 877 | "console", 878 | "instant", 879 | "number_prefix", 880 | "portable-atomic", 881 | "unicode-width", 882 | ] 883 | 884 | [[package]] 885 | name = "inout" 886 | version = "0.1.3" 887 | source = "registry+https://github.com/rust-lang/crates.io-index" 888 | checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" 889 | dependencies = [ 890 | "generic-array", 891 | ] 892 | 893 | [[package]] 894 | name = "instant" 895 | version = "0.1.13" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" 898 | dependencies = [ 899 | "cfg-if", 900 | "js-sys", 901 | "wasm-bindgen", 902 | "web-sys", 903 | ] 904 | 905 | [[package]] 906 | name = "ipnet" 907 | version = "2.9.0" 908 | source = "registry+https://github.com/rust-lang/crates.io-index" 909 | checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" 910 | 911 | [[package]] 912 | name = "is_terminal_polyfill" 913 | version = "1.70.0" 914 | source = "registry+https://github.com/rust-lang/crates.io-index" 915 | checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" 916 | 917 | [[package]] 918 | name = "itoa" 919 | version = "1.0.11" 920 | source = "registry+https://github.com/rust-lang/crates.io-index" 921 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 922 | 923 | [[package]] 924 | name = "jobserver" 925 | version = "0.1.31" 926 | source = "registry+https://github.com/rust-lang/crates.io-index" 927 | checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" 928 | dependencies = [ 929 | "libc", 930 | ] 931 | 932 | [[package]] 933 | name = "js-sys" 934 | version = "0.3.69" 935 | source = "registry+https://github.com/rust-lang/crates.io-index" 936 | checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" 937 | dependencies = [ 938 | "wasm-bindgen", 939 | ] 940 | 941 | [[package]] 942 | name = "lazy_static" 943 | version = "1.4.0" 944 | source = "registry+https://github.com/rust-lang/crates.io-index" 945 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 946 | 947 | [[package]] 948 | name = "libc" 949 | version = "0.2.155" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" 952 | 953 | [[package]] 954 | name = "libredox" 955 | version = "0.1.3" 956 | source = "registry+https://github.com/rust-lang/crates.io-index" 957 | checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" 958 | dependencies = [ 959 | "bitflags 2.5.0", 960 | "libc", 961 | ] 962 | 963 | [[package]] 964 | name = "linux-raw-sys" 965 | version = "0.4.14" 966 | source = "registry+https://github.com/rust-lang/crates.io-index" 967 | checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" 968 | 969 | [[package]] 970 | name = "lock_api" 971 | version = "0.4.12" 972 | source = "registry+https://github.com/rust-lang/crates.io-index" 973 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 974 | dependencies = [ 975 | "autocfg", 976 | "scopeguard", 977 | ] 978 | 979 | [[package]] 980 | name = "log" 981 | version = "0.4.21" 982 | source = "registry+https://github.com/rust-lang/crates.io-index" 983 | checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" 984 | 985 | [[package]] 986 | name = "matchit" 987 | version = "0.7.3" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" 990 | 991 | [[package]] 992 | name = "memchr" 993 | version = "2.7.2" 994 | source = "registry+https://github.com/rust-lang/crates.io-index" 995 | checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" 996 | 997 | [[package]] 998 | name = "mime" 999 | version = "0.3.17" 1000 | source = "registry+https://github.com/rust-lang/crates.io-index" 1001 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 1002 | 1003 | [[package]] 1004 | name = "mime_guess" 1005 | version = "2.0.4" 1006 | source = "registry+https://github.com/rust-lang/crates.io-index" 1007 | checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" 1008 | dependencies = [ 1009 | "mime", 1010 | "unicase", 1011 | ] 1012 | 1013 | [[package]] 1014 | name = "miniz_oxide" 1015 | version = "0.7.3" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" 1018 | dependencies = [ 1019 | "adler", 1020 | ] 1021 | 1022 | [[package]] 1023 | name = "mio" 1024 | version = "0.8.11" 1025 | source = "registry+https://github.com/rust-lang/crates.io-index" 1026 | checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" 1027 | dependencies = [ 1028 | "libc", 1029 | "wasi", 1030 | "windows-sys 0.48.0", 1031 | ] 1032 | 1033 | [[package]] 1034 | name = "mmrl" 1035 | version = "0.3.11" 1036 | dependencies = [ 1037 | "async-recursion", 1038 | "clap", 1039 | "confy", 1040 | "error-chain", 1041 | "futures-util", 1042 | "indicatif", 1043 | "log", 1044 | "openssl", 1045 | "rand", 1046 | "regex", 1047 | "reqwest", 1048 | "rust-ini", 1049 | "serde", 1050 | "serde_ini", 1051 | "serde_json", 1052 | "simplelog", 1053 | "tokio", 1054 | "trauma", 1055 | "url", 1056 | "walkdir", 1057 | "zip", 1058 | ] 1059 | 1060 | [[package]] 1061 | name = "native-tls" 1062 | version = "0.2.11" 1063 | source = "registry+https://github.com/rust-lang/crates.io-index" 1064 | checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" 1065 | dependencies = [ 1066 | "lazy_static", 1067 | "libc", 1068 | "log", 1069 | "openssl", 1070 | "openssl-probe", 1071 | "openssl-sys", 1072 | "schannel", 1073 | "security-framework", 1074 | "security-framework-sys", 1075 | "tempfile", 1076 | ] 1077 | 1078 | [[package]] 1079 | name = "nu-ansi-term" 1080 | version = "0.46.0" 1081 | source = "registry+https://github.com/rust-lang/crates.io-index" 1082 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 1083 | dependencies = [ 1084 | "overload", 1085 | "winapi", 1086 | ] 1087 | 1088 | [[package]] 1089 | name = "num-conv" 1090 | version = "0.1.0" 1091 | source = "registry+https://github.com/rust-lang/crates.io-index" 1092 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 1093 | 1094 | [[package]] 1095 | name = "num-traits" 1096 | version = "0.2.19" 1097 | source = "registry+https://github.com/rust-lang/crates.io-index" 1098 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1099 | dependencies = [ 1100 | "autocfg", 1101 | ] 1102 | 1103 | [[package]] 1104 | name = "num_cpus" 1105 | version = "1.16.0" 1106 | source = "registry+https://github.com/rust-lang/crates.io-index" 1107 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 1108 | dependencies = [ 1109 | "hermit-abi", 1110 | "libc", 1111 | ] 1112 | 1113 | [[package]] 1114 | name = "number_prefix" 1115 | version = "0.4.0" 1116 | source = "registry+https://github.com/rust-lang/crates.io-index" 1117 | checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" 1118 | 1119 | [[package]] 1120 | name = "object" 1121 | version = "0.32.2" 1122 | source = "registry+https://github.com/rust-lang/crates.io-index" 1123 | checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" 1124 | dependencies = [ 1125 | "memchr", 1126 | ] 1127 | 1128 | [[package]] 1129 | name = "once_cell" 1130 | version = "1.19.0" 1131 | source = "registry+https://github.com/rust-lang/crates.io-index" 1132 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 1133 | 1134 | [[package]] 1135 | name = "openssl" 1136 | version = "0.10.64" 1137 | source = "registry+https://github.com/rust-lang/crates.io-index" 1138 | checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" 1139 | dependencies = [ 1140 | "bitflags 2.5.0", 1141 | "cfg-if", 1142 | "foreign-types", 1143 | "libc", 1144 | "once_cell", 1145 | "openssl-macros", 1146 | "openssl-sys", 1147 | ] 1148 | 1149 | [[package]] 1150 | name = "openssl-macros" 1151 | version = "0.1.1" 1152 | source = "registry+https://github.com/rust-lang/crates.io-index" 1153 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 1154 | dependencies = [ 1155 | "proc-macro2", 1156 | "quote", 1157 | "syn", 1158 | ] 1159 | 1160 | [[package]] 1161 | name = "openssl-probe" 1162 | version = "0.1.5" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 1165 | 1166 | [[package]] 1167 | name = "openssl-src" 1168 | version = "300.3.1+3.3.1" 1169 | source = "registry+https://github.com/rust-lang/crates.io-index" 1170 | checksum = "7259953d42a81bf137fbbd73bd30a8e1914d6dce43c2b90ed575783a22608b91" 1171 | dependencies = [ 1172 | "cc", 1173 | ] 1174 | 1175 | [[package]] 1176 | name = "openssl-sys" 1177 | version = "0.9.102" 1178 | source = "registry+https://github.com/rust-lang/crates.io-index" 1179 | checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" 1180 | dependencies = [ 1181 | "cc", 1182 | "libc", 1183 | "openssl-src", 1184 | "pkg-config", 1185 | "vcpkg", 1186 | ] 1187 | 1188 | [[package]] 1189 | name = "opentelemetry" 1190 | version = "0.17.0" 1191 | source = "registry+https://github.com/rust-lang/crates.io-index" 1192 | checksum = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8" 1193 | dependencies = [ 1194 | "async-trait", 1195 | "crossbeam-channel", 1196 | "futures-channel", 1197 | "futures-executor", 1198 | "futures-util", 1199 | "js-sys", 1200 | "lazy_static", 1201 | "percent-encoding", 1202 | "pin-project", 1203 | "rand", 1204 | "thiserror", 1205 | ] 1206 | 1207 | [[package]] 1208 | name = "opentelemetry" 1209 | version = "0.20.0" 1210 | source = "registry+https://github.com/rust-lang/crates.io-index" 1211 | checksum = "9591d937bc0e6d2feb6f71a559540ab300ea49955229c347a517a28d27784c54" 1212 | dependencies = [ 1213 | "opentelemetry_api", 1214 | "opentelemetry_sdk", 1215 | ] 1216 | 1217 | [[package]] 1218 | name = "opentelemetry_api" 1219 | version = "0.20.0" 1220 | source = "registry+https://github.com/rust-lang/crates.io-index" 1221 | checksum = "8a81f725323db1b1206ca3da8bb19874bbd3f57c3bcd59471bfb04525b265b9b" 1222 | dependencies = [ 1223 | "futures-channel", 1224 | "futures-util", 1225 | "indexmap 1.9.3", 1226 | "js-sys", 1227 | "once_cell", 1228 | "pin-project-lite", 1229 | "thiserror", 1230 | "urlencoding", 1231 | ] 1232 | 1233 | [[package]] 1234 | name = "opentelemetry_sdk" 1235 | version = "0.20.0" 1236 | source = "registry+https://github.com/rust-lang/crates.io-index" 1237 | checksum = "fa8e705a0612d48139799fcbaba0d4a90f06277153e43dd2bdc16c6f0edd8026" 1238 | dependencies = [ 1239 | "async-trait", 1240 | "crossbeam-channel", 1241 | "futures-channel", 1242 | "futures-executor", 1243 | "futures-util", 1244 | "once_cell", 1245 | "opentelemetry_api", 1246 | "ordered-float", 1247 | "percent-encoding", 1248 | "rand", 1249 | "regex", 1250 | "thiserror", 1251 | ] 1252 | 1253 | [[package]] 1254 | name = "option-ext" 1255 | version = "0.2.0" 1256 | source = "registry+https://github.com/rust-lang/crates.io-index" 1257 | checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" 1258 | 1259 | [[package]] 1260 | name = "ordered-float" 1261 | version = "3.9.2" 1262 | source = "registry+https://github.com/rust-lang/crates.io-index" 1263 | checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" 1264 | dependencies = [ 1265 | "num-traits", 1266 | ] 1267 | 1268 | [[package]] 1269 | name = "ordered-multimap" 1270 | version = "0.6.0" 1271 | source = "registry+https://github.com/rust-lang/crates.io-index" 1272 | checksum = "4ed8acf08e98e744e5384c8bc63ceb0364e68a6854187221c18df61c4797690e" 1273 | dependencies = [ 1274 | "dlv-list", 1275 | "hashbrown 0.13.2", 1276 | ] 1277 | 1278 | [[package]] 1279 | name = "overload" 1280 | version = "0.1.1" 1281 | source = "registry+https://github.com/rust-lang/crates.io-index" 1282 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 1283 | 1284 | [[package]] 1285 | name = "parking_lot" 1286 | version = "0.11.2" 1287 | source = "registry+https://github.com/rust-lang/crates.io-index" 1288 | checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" 1289 | dependencies = [ 1290 | "instant", 1291 | "lock_api", 1292 | "parking_lot_core", 1293 | ] 1294 | 1295 | [[package]] 1296 | name = "parking_lot_core" 1297 | version = "0.8.6" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" 1300 | dependencies = [ 1301 | "cfg-if", 1302 | "instant", 1303 | "libc", 1304 | "redox_syscall", 1305 | "smallvec", 1306 | "winapi", 1307 | ] 1308 | 1309 | [[package]] 1310 | name = "password-hash" 1311 | version = "0.4.2" 1312 | source = "registry+https://github.com/rust-lang/crates.io-index" 1313 | checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" 1314 | dependencies = [ 1315 | "base64ct", 1316 | "rand_core", 1317 | "subtle", 1318 | ] 1319 | 1320 | [[package]] 1321 | name = "pbkdf2" 1322 | version = "0.11.0" 1323 | source = "registry+https://github.com/rust-lang/crates.io-index" 1324 | checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" 1325 | dependencies = [ 1326 | "digest", 1327 | "hmac", 1328 | "password-hash", 1329 | "sha2", 1330 | ] 1331 | 1332 | [[package]] 1333 | name = "percent-encoding" 1334 | version = "2.3.1" 1335 | source = "registry+https://github.com/rust-lang/crates.io-index" 1336 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1337 | 1338 | [[package]] 1339 | name = "pin-project" 1340 | version = "1.1.5" 1341 | source = "registry+https://github.com/rust-lang/crates.io-index" 1342 | checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" 1343 | dependencies = [ 1344 | "pin-project-internal", 1345 | ] 1346 | 1347 | [[package]] 1348 | name = "pin-project-internal" 1349 | version = "1.1.5" 1350 | source = "registry+https://github.com/rust-lang/crates.io-index" 1351 | checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" 1352 | dependencies = [ 1353 | "proc-macro2", 1354 | "quote", 1355 | "syn", 1356 | ] 1357 | 1358 | [[package]] 1359 | name = "pin-project-lite" 1360 | version = "0.2.14" 1361 | source = "registry+https://github.com/rust-lang/crates.io-index" 1362 | checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" 1363 | 1364 | [[package]] 1365 | name = "pin-utils" 1366 | version = "0.1.0" 1367 | source = "registry+https://github.com/rust-lang/crates.io-index" 1368 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1369 | 1370 | [[package]] 1371 | name = "pkg-config" 1372 | version = "0.3.30" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" 1375 | 1376 | [[package]] 1377 | name = "portable-atomic" 1378 | version = "1.6.0" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" 1381 | 1382 | [[package]] 1383 | name = "powerfmt" 1384 | version = "0.2.0" 1385 | source = "registry+https://github.com/rust-lang/crates.io-index" 1386 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 1387 | 1388 | [[package]] 1389 | name = "ppv-lite86" 1390 | version = "0.2.17" 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" 1392 | checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" 1393 | 1394 | [[package]] 1395 | name = "proc-macro2" 1396 | version = "1.0.83" 1397 | source = "registry+https://github.com/rust-lang/crates.io-index" 1398 | checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" 1399 | dependencies = [ 1400 | "unicode-ident", 1401 | ] 1402 | 1403 | [[package]] 1404 | name = "quote" 1405 | version = "1.0.36" 1406 | source = "registry+https://github.com/rust-lang/crates.io-index" 1407 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 1408 | dependencies = [ 1409 | "proc-macro2", 1410 | ] 1411 | 1412 | [[package]] 1413 | name = "rand" 1414 | version = "0.8.5" 1415 | source = "registry+https://github.com/rust-lang/crates.io-index" 1416 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1417 | dependencies = [ 1418 | "libc", 1419 | "rand_chacha", 1420 | "rand_core", 1421 | ] 1422 | 1423 | [[package]] 1424 | name = "rand_chacha" 1425 | version = "0.3.1" 1426 | source = "registry+https://github.com/rust-lang/crates.io-index" 1427 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1428 | dependencies = [ 1429 | "ppv-lite86", 1430 | "rand_core", 1431 | ] 1432 | 1433 | [[package]] 1434 | name = "rand_core" 1435 | version = "0.6.4" 1436 | source = "registry+https://github.com/rust-lang/crates.io-index" 1437 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1438 | dependencies = [ 1439 | "getrandom", 1440 | ] 1441 | 1442 | [[package]] 1443 | name = "redox_syscall" 1444 | version = "0.2.16" 1445 | source = "registry+https://github.com/rust-lang/crates.io-index" 1446 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 1447 | dependencies = [ 1448 | "bitflags 1.3.2", 1449 | ] 1450 | 1451 | [[package]] 1452 | name = "redox_users" 1453 | version = "0.4.5" 1454 | source = "registry+https://github.com/rust-lang/crates.io-index" 1455 | checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" 1456 | dependencies = [ 1457 | "getrandom", 1458 | "libredox", 1459 | "thiserror", 1460 | ] 1461 | 1462 | [[package]] 1463 | name = "regex" 1464 | version = "1.10.4" 1465 | source = "registry+https://github.com/rust-lang/crates.io-index" 1466 | checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" 1467 | dependencies = [ 1468 | "aho-corasick", 1469 | "memchr", 1470 | "regex-automata", 1471 | "regex-syntax", 1472 | ] 1473 | 1474 | [[package]] 1475 | name = "regex-automata" 1476 | version = "0.4.6" 1477 | source = "registry+https://github.com/rust-lang/crates.io-index" 1478 | checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" 1479 | dependencies = [ 1480 | "aho-corasick", 1481 | "memchr", 1482 | "regex-syntax", 1483 | ] 1484 | 1485 | [[package]] 1486 | name = "regex-syntax" 1487 | version = "0.8.3" 1488 | source = "registry+https://github.com/rust-lang/crates.io-index" 1489 | checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" 1490 | 1491 | [[package]] 1492 | name = "reqwest" 1493 | version = "0.11.27" 1494 | source = "registry+https://github.com/rust-lang/crates.io-index" 1495 | checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" 1496 | dependencies = [ 1497 | "base64", 1498 | "bytes", 1499 | "encoding_rs", 1500 | "futures-core", 1501 | "futures-util", 1502 | "h2", 1503 | "http", 1504 | "http-body", 1505 | "hyper", 1506 | "hyper-tls", 1507 | "ipnet", 1508 | "js-sys", 1509 | "log", 1510 | "mime", 1511 | "mime_guess", 1512 | "native-tls", 1513 | "once_cell", 1514 | "percent-encoding", 1515 | "pin-project-lite", 1516 | "rustls-pemfile", 1517 | "serde", 1518 | "serde_json", 1519 | "serde_urlencoded", 1520 | "sync_wrapper", 1521 | "system-configuration", 1522 | "tokio", 1523 | "tokio-native-tls", 1524 | "tokio-socks", 1525 | "tokio-util", 1526 | "tower-service", 1527 | "url", 1528 | "wasm-bindgen", 1529 | "wasm-bindgen-futures", 1530 | "wasm-streams", 1531 | "web-sys", 1532 | "winreg", 1533 | ] 1534 | 1535 | [[package]] 1536 | name = "reqwest-middleware" 1537 | version = "0.2.5" 1538 | source = "registry+https://github.com/rust-lang/crates.io-index" 1539 | checksum = "5a735987236a8e238bf0296c7e351b999c188ccc11477f311b82b55c93984216" 1540 | dependencies = [ 1541 | "anyhow", 1542 | "async-trait", 1543 | "http", 1544 | "reqwest", 1545 | "serde", 1546 | "task-local-extensions", 1547 | "thiserror", 1548 | ] 1549 | 1550 | [[package]] 1551 | name = "reqwest-retry" 1552 | version = "0.3.0" 1553 | source = "registry+https://github.com/rust-lang/crates.io-index" 1554 | checksum = "9af20b65c2ee9746cc575acb6bd28a05ffc0d15e25c992a8f4462d8686aacb4f" 1555 | dependencies = [ 1556 | "anyhow", 1557 | "async-trait", 1558 | "chrono", 1559 | "futures", 1560 | "getrandom", 1561 | "http", 1562 | "hyper", 1563 | "parking_lot", 1564 | "reqwest", 1565 | "reqwest-middleware", 1566 | "retry-policies", 1567 | "task-local-extensions", 1568 | "tokio", 1569 | "tracing", 1570 | "wasm-timer", 1571 | ] 1572 | 1573 | [[package]] 1574 | name = "reqwest-tracing" 1575 | version = "0.4.8" 1576 | source = "registry+https://github.com/rust-lang/crates.io-index" 1577 | checksum = "190838e54153d7a7e2ea98851304b3ce92daeabf14c54d32b01b84a3e636f683" 1578 | dependencies = [ 1579 | "anyhow", 1580 | "async-trait", 1581 | "getrandom", 1582 | "matchit", 1583 | "opentelemetry 0.17.0", 1584 | "reqwest", 1585 | "reqwest-middleware", 1586 | "task-local-extensions", 1587 | "tracing", 1588 | "tracing-opentelemetry 0.17.4", 1589 | ] 1590 | 1591 | [[package]] 1592 | name = "result" 1593 | version = "1.0.0" 1594 | source = "registry+https://github.com/rust-lang/crates.io-index" 1595 | checksum = "194d8e591e405d1eecf28819740abed6d719d1a2db87fc0bcdedee9a26d55560" 1596 | 1597 | [[package]] 1598 | name = "retry-policies" 1599 | version = "0.2.1" 1600 | source = "registry+https://github.com/rust-lang/crates.io-index" 1601 | checksum = "17dd00bff1d737c40dbcd47d4375281bf4c17933f9eef0a185fc7bacca23ecbd" 1602 | dependencies = [ 1603 | "anyhow", 1604 | "chrono", 1605 | "rand", 1606 | ] 1607 | 1608 | [[package]] 1609 | name = "rust-ini" 1610 | version = "0.19.0" 1611 | source = "registry+https://github.com/rust-lang/crates.io-index" 1612 | checksum = "7e2a3bcec1f113553ef1c88aae6c020a369d03d55b58de9869a0908930385091" 1613 | dependencies = [ 1614 | "cfg-if", 1615 | "ordered-multimap", 1616 | ] 1617 | 1618 | [[package]] 1619 | name = "rustc-demangle" 1620 | version = "0.1.24" 1621 | source = "registry+https://github.com/rust-lang/crates.io-index" 1622 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1623 | 1624 | [[package]] 1625 | name = "rustix" 1626 | version = "0.38.34" 1627 | source = "registry+https://github.com/rust-lang/crates.io-index" 1628 | checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" 1629 | dependencies = [ 1630 | "bitflags 2.5.0", 1631 | "errno", 1632 | "libc", 1633 | "linux-raw-sys", 1634 | "windows-sys 0.52.0", 1635 | ] 1636 | 1637 | [[package]] 1638 | name = "rustls-pemfile" 1639 | version = "1.0.4" 1640 | source = "registry+https://github.com/rust-lang/crates.io-index" 1641 | checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 1642 | dependencies = [ 1643 | "base64", 1644 | ] 1645 | 1646 | [[package]] 1647 | name = "ryu" 1648 | version = "1.0.18" 1649 | source = "registry+https://github.com/rust-lang/crates.io-index" 1650 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 1651 | 1652 | [[package]] 1653 | name = "same-file" 1654 | version = "1.0.6" 1655 | source = "registry+https://github.com/rust-lang/crates.io-index" 1656 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1657 | dependencies = [ 1658 | "winapi-util", 1659 | ] 1660 | 1661 | [[package]] 1662 | name = "schannel" 1663 | version = "0.1.23" 1664 | source = "registry+https://github.com/rust-lang/crates.io-index" 1665 | checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" 1666 | dependencies = [ 1667 | "windows-sys 0.52.0", 1668 | ] 1669 | 1670 | [[package]] 1671 | name = "scopeguard" 1672 | version = "1.2.0" 1673 | source = "registry+https://github.com/rust-lang/crates.io-index" 1674 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1675 | 1676 | [[package]] 1677 | name = "security-framework" 1678 | version = "2.11.0" 1679 | source = "registry+https://github.com/rust-lang/crates.io-index" 1680 | checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" 1681 | dependencies = [ 1682 | "bitflags 2.5.0", 1683 | "core-foundation", 1684 | "core-foundation-sys", 1685 | "libc", 1686 | "security-framework-sys", 1687 | ] 1688 | 1689 | [[package]] 1690 | name = "security-framework-sys" 1691 | version = "2.11.0" 1692 | source = "registry+https://github.com/rust-lang/crates.io-index" 1693 | checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" 1694 | dependencies = [ 1695 | "core-foundation-sys", 1696 | "libc", 1697 | ] 1698 | 1699 | [[package]] 1700 | name = "serde" 1701 | version = "1.0.202" 1702 | source = "registry+https://github.com/rust-lang/crates.io-index" 1703 | checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" 1704 | dependencies = [ 1705 | "serde_derive", 1706 | ] 1707 | 1708 | [[package]] 1709 | name = "serde_derive" 1710 | version = "1.0.202" 1711 | source = "registry+https://github.com/rust-lang/crates.io-index" 1712 | checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" 1713 | dependencies = [ 1714 | "proc-macro2", 1715 | "quote", 1716 | "syn", 1717 | ] 1718 | 1719 | [[package]] 1720 | name = "serde_ini" 1721 | version = "0.2.0" 1722 | source = "registry+https://github.com/rust-lang/crates.io-index" 1723 | checksum = "eb236687e2bb073a7521c021949be944641e671b8505a94069ca37b656c81139" 1724 | dependencies = [ 1725 | "result", 1726 | "serde", 1727 | "void", 1728 | ] 1729 | 1730 | [[package]] 1731 | name = "serde_json" 1732 | version = "1.0.117" 1733 | source = "registry+https://github.com/rust-lang/crates.io-index" 1734 | checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" 1735 | dependencies = [ 1736 | "itoa", 1737 | "ryu", 1738 | "serde", 1739 | ] 1740 | 1741 | [[package]] 1742 | name = "serde_spanned" 1743 | version = "0.6.6" 1744 | source = "registry+https://github.com/rust-lang/crates.io-index" 1745 | checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" 1746 | dependencies = [ 1747 | "serde", 1748 | ] 1749 | 1750 | [[package]] 1751 | name = "serde_urlencoded" 1752 | version = "0.7.1" 1753 | source = "registry+https://github.com/rust-lang/crates.io-index" 1754 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1755 | dependencies = [ 1756 | "form_urlencoded", 1757 | "itoa", 1758 | "ryu", 1759 | "serde", 1760 | ] 1761 | 1762 | [[package]] 1763 | name = "sha1" 1764 | version = "0.10.6" 1765 | source = "registry+https://github.com/rust-lang/crates.io-index" 1766 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 1767 | dependencies = [ 1768 | "cfg-if", 1769 | "cpufeatures", 1770 | "digest", 1771 | ] 1772 | 1773 | [[package]] 1774 | name = "sha2" 1775 | version = "0.10.8" 1776 | source = "registry+https://github.com/rust-lang/crates.io-index" 1777 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1778 | dependencies = [ 1779 | "cfg-if", 1780 | "cpufeatures", 1781 | "digest", 1782 | ] 1783 | 1784 | [[package]] 1785 | name = "sharded-slab" 1786 | version = "0.1.7" 1787 | source = "registry+https://github.com/rust-lang/crates.io-index" 1788 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1789 | dependencies = [ 1790 | "lazy_static", 1791 | ] 1792 | 1793 | [[package]] 1794 | name = "simplelog" 1795 | version = "0.10.2" 1796 | source = "registry+https://github.com/rust-lang/crates.io-index" 1797 | checksum = "85d04ae642154220ef00ee82c36fb07853c10a4f2a0ca6719f9991211d2eb959" 1798 | dependencies = [ 1799 | "chrono", 1800 | "log", 1801 | "termcolor", 1802 | ] 1803 | 1804 | [[package]] 1805 | name = "slab" 1806 | version = "0.4.9" 1807 | source = "registry+https://github.com/rust-lang/crates.io-index" 1808 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1809 | dependencies = [ 1810 | "autocfg", 1811 | ] 1812 | 1813 | [[package]] 1814 | name = "smallvec" 1815 | version = "1.13.2" 1816 | source = "registry+https://github.com/rust-lang/crates.io-index" 1817 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1818 | 1819 | [[package]] 1820 | name = "socket2" 1821 | version = "0.5.7" 1822 | source = "registry+https://github.com/rust-lang/crates.io-index" 1823 | checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" 1824 | dependencies = [ 1825 | "libc", 1826 | "windows-sys 0.52.0", 1827 | ] 1828 | 1829 | [[package]] 1830 | name = "strsim" 1831 | version = "0.11.1" 1832 | source = "registry+https://github.com/rust-lang/crates.io-index" 1833 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1834 | 1835 | [[package]] 1836 | name = "subtle" 1837 | version = "2.5.0" 1838 | source = "registry+https://github.com/rust-lang/crates.io-index" 1839 | checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" 1840 | 1841 | [[package]] 1842 | name = "syn" 1843 | version = "2.0.66" 1844 | source = "registry+https://github.com/rust-lang/crates.io-index" 1845 | checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" 1846 | dependencies = [ 1847 | "proc-macro2", 1848 | "quote", 1849 | "unicode-ident", 1850 | ] 1851 | 1852 | [[package]] 1853 | name = "sync_wrapper" 1854 | version = "0.1.2" 1855 | source = "registry+https://github.com/rust-lang/crates.io-index" 1856 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 1857 | 1858 | [[package]] 1859 | name = "system-configuration" 1860 | version = "0.5.1" 1861 | source = "registry+https://github.com/rust-lang/crates.io-index" 1862 | checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" 1863 | dependencies = [ 1864 | "bitflags 1.3.2", 1865 | "core-foundation", 1866 | "system-configuration-sys", 1867 | ] 1868 | 1869 | [[package]] 1870 | name = "system-configuration-sys" 1871 | version = "0.5.0" 1872 | source = "registry+https://github.com/rust-lang/crates.io-index" 1873 | checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" 1874 | dependencies = [ 1875 | "core-foundation-sys", 1876 | "libc", 1877 | ] 1878 | 1879 | [[package]] 1880 | name = "task-local-extensions" 1881 | version = "0.1.4" 1882 | source = "registry+https://github.com/rust-lang/crates.io-index" 1883 | checksum = "ba323866e5d033818e3240feeb9f7db2c4296674e4d9e16b97b7bf8f490434e8" 1884 | dependencies = [ 1885 | "pin-utils", 1886 | ] 1887 | 1888 | [[package]] 1889 | name = "tempfile" 1890 | version = "3.10.1" 1891 | source = "registry+https://github.com/rust-lang/crates.io-index" 1892 | checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" 1893 | dependencies = [ 1894 | "cfg-if", 1895 | "fastrand", 1896 | "rustix", 1897 | "windows-sys 0.52.0", 1898 | ] 1899 | 1900 | [[package]] 1901 | name = "termcolor" 1902 | version = "1.1.3" 1903 | source = "registry+https://github.com/rust-lang/crates.io-index" 1904 | checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" 1905 | dependencies = [ 1906 | "winapi-util", 1907 | ] 1908 | 1909 | [[package]] 1910 | name = "thiserror" 1911 | version = "1.0.61" 1912 | source = "registry+https://github.com/rust-lang/crates.io-index" 1913 | checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" 1914 | dependencies = [ 1915 | "thiserror-impl", 1916 | ] 1917 | 1918 | [[package]] 1919 | name = "thiserror-impl" 1920 | version = "1.0.61" 1921 | source = "registry+https://github.com/rust-lang/crates.io-index" 1922 | checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" 1923 | dependencies = [ 1924 | "proc-macro2", 1925 | "quote", 1926 | "syn", 1927 | ] 1928 | 1929 | [[package]] 1930 | name = "thread_local" 1931 | version = "1.1.8" 1932 | source = "registry+https://github.com/rust-lang/crates.io-index" 1933 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 1934 | dependencies = [ 1935 | "cfg-if", 1936 | "once_cell", 1937 | ] 1938 | 1939 | [[package]] 1940 | name = "time" 1941 | version = "0.3.36" 1942 | source = "registry+https://github.com/rust-lang/crates.io-index" 1943 | checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" 1944 | dependencies = [ 1945 | "deranged", 1946 | "num-conv", 1947 | "powerfmt", 1948 | "serde", 1949 | "time-core", 1950 | ] 1951 | 1952 | [[package]] 1953 | name = "time-core" 1954 | version = "0.1.2" 1955 | source = "registry+https://github.com/rust-lang/crates.io-index" 1956 | checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" 1957 | 1958 | [[package]] 1959 | name = "tiny-keccak" 1960 | version = "2.0.2" 1961 | source = "registry+https://github.com/rust-lang/crates.io-index" 1962 | checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" 1963 | dependencies = [ 1964 | "crunchy", 1965 | ] 1966 | 1967 | [[package]] 1968 | name = "tinyvec" 1969 | version = "1.6.0" 1970 | source = "registry+https://github.com/rust-lang/crates.io-index" 1971 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 1972 | dependencies = [ 1973 | "tinyvec_macros", 1974 | ] 1975 | 1976 | [[package]] 1977 | name = "tinyvec_macros" 1978 | version = "0.1.1" 1979 | source = "registry+https://github.com/rust-lang/crates.io-index" 1980 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1981 | 1982 | [[package]] 1983 | name = "tokio" 1984 | version = "1.37.0" 1985 | source = "registry+https://github.com/rust-lang/crates.io-index" 1986 | checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" 1987 | dependencies = [ 1988 | "backtrace", 1989 | "bytes", 1990 | "libc", 1991 | "mio", 1992 | "num_cpus", 1993 | "pin-project-lite", 1994 | "socket2", 1995 | "tokio-macros", 1996 | "windows-sys 0.48.0", 1997 | ] 1998 | 1999 | [[package]] 2000 | name = "tokio-macros" 2001 | version = "2.2.0" 2002 | source = "registry+https://github.com/rust-lang/crates.io-index" 2003 | checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" 2004 | dependencies = [ 2005 | "proc-macro2", 2006 | "quote", 2007 | "syn", 2008 | ] 2009 | 2010 | [[package]] 2011 | name = "tokio-native-tls" 2012 | version = "0.3.1" 2013 | source = "registry+https://github.com/rust-lang/crates.io-index" 2014 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 2015 | dependencies = [ 2016 | "native-tls", 2017 | "tokio", 2018 | ] 2019 | 2020 | [[package]] 2021 | name = "tokio-socks" 2022 | version = "0.5.1" 2023 | source = "registry+https://github.com/rust-lang/crates.io-index" 2024 | checksum = "51165dfa029d2a65969413a6cc96f354b86b464498702f174a4efa13608fd8c0" 2025 | dependencies = [ 2026 | "either", 2027 | "futures-util", 2028 | "thiserror", 2029 | "tokio", 2030 | ] 2031 | 2032 | [[package]] 2033 | name = "tokio-util" 2034 | version = "0.7.11" 2035 | source = "registry+https://github.com/rust-lang/crates.io-index" 2036 | checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" 2037 | dependencies = [ 2038 | "bytes", 2039 | "futures-core", 2040 | "futures-sink", 2041 | "pin-project-lite", 2042 | "tokio", 2043 | ] 2044 | 2045 | [[package]] 2046 | name = "toml" 2047 | version = "0.8.13" 2048 | source = "registry+https://github.com/rust-lang/crates.io-index" 2049 | checksum = "a4e43f8cc456c9704c851ae29c67e17ef65d2c30017c17a9765b89c382dc8bba" 2050 | dependencies = [ 2051 | "serde", 2052 | "serde_spanned", 2053 | "toml_datetime", 2054 | "toml_edit", 2055 | ] 2056 | 2057 | [[package]] 2058 | name = "toml_datetime" 2059 | version = "0.6.6" 2060 | source = "registry+https://github.com/rust-lang/crates.io-index" 2061 | checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" 2062 | dependencies = [ 2063 | "serde", 2064 | ] 2065 | 2066 | [[package]] 2067 | name = "toml_edit" 2068 | version = "0.22.13" 2069 | source = "registry+https://github.com/rust-lang/crates.io-index" 2070 | checksum = "c127785850e8c20836d49732ae6abfa47616e60bf9d9f57c43c250361a9db96c" 2071 | dependencies = [ 2072 | "indexmap 2.2.6", 2073 | "serde", 2074 | "serde_spanned", 2075 | "toml_datetime", 2076 | "winnow", 2077 | ] 2078 | 2079 | [[package]] 2080 | name = "tower-service" 2081 | version = "0.3.2" 2082 | source = "registry+https://github.com/rust-lang/crates.io-index" 2083 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 2084 | 2085 | [[package]] 2086 | name = "tracing" 2087 | version = "0.1.40" 2088 | source = "registry+https://github.com/rust-lang/crates.io-index" 2089 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 2090 | dependencies = [ 2091 | "pin-project-lite", 2092 | "tracing-attributes", 2093 | "tracing-core", 2094 | ] 2095 | 2096 | [[package]] 2097 | name = "tracing-attributes" 2098 | version = "0.1.27" 2099 | source = "registry+https://github.com/rust-lang/crates.io-index" 2100 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 2101 | dependencies = [ 2102 | "proc-macro2", 2103 | "quote", 2104 | "syn", 2105 | ] 2106 | 2107 | [[package]] 2108 | name = "tracing-core" 2109 | version = "0.1.32" 2110 | source = "registry+https://github.com/rust-lang/crates.io-index" 2111 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 2112 | dependencies = [ 2113 | "once_cell", 2114 | "valuable", 2115 | ] 2116 | 2117 | [[package]] 2118 | name = "tracing-log" 2119 | version = "0.1.4" 2120 | source = "registry+https://github.com/rust-lang/crates.io-index" 2121 | checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" 2122 | dependencies = [ 2123 | "log", 2124 | "once_cell", 2125 | "tracing-core", 2126 | ] 2127 | 2128 | [[package]] 2129 | name = "tracing-log" 2130 | version = "0.2.0" 2131 | source = "registry+https://github.com/rust-lang/crates.io-index" 2132 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 2133 | dependencies = [ 2134 | "log", 2135 | "once_cell", 2136 | "tracing-core", 2137 | ] 2138 | 2139 | [[package]] 2140 | name = "tracing-opentelemetry" 2141 | version = "0.17.4" 2142 | source = "registry+https://github.com/rust-lang/crates.io-index" 2143 | checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f" 2144 | dependencies = [ 2145 | "once_cell", 2146 | "opentelemetry 0.17.0", 2147 | "tracing", 2148 | "tracing-core", 2149 | "tracing-log 0.1.4", 2150 | "tracing-subscriber", 2151 | ] 2152 | 2153 | [[package]] 2154 | name = "tracing-opentelemetry" 2155 | version = "0.21.0" 2156 | source = "registry+https://github.com/rust-lang/crates.io-index" 2157 | checksum = "75327c6b667828ddc28f5e3f169036cb793c3f588d83bf0f262a7f062ffed3c8" 2158 | dependencies = [ 2159 | "once_cell", 2160 | "opentelemetry 0.20.0", 2161 | "opentelemetry_sdk", 2162 | "smallvec", 2163 | "tracing", 2164 | "tracing-core", 2165 | "tracing-log 0.1.4", 2166 | "tracing-subscriber", 2167 | ] 2168 | 2169 | [[package]] 2170 | name = "tracing-subscriber" 2171 | version = "0.3.18" 2172 | source = "registry+https://github.com/rust-lang/crates.io-index" 2173 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 2174 | dependencies = [ 2175 | "nu-ansi-term", 2176 | "sharded-slab", 2177 | "smallvec", 2178 | "thread_local", 2179 | "tracing-core", 2180 | "tracing-log 0.2.0", 2181 | ] 2182 | 2183 | [[package]] 2184 | name = "trauma" 2185 | version = "2.2.4" 2186 | source = "registry+https://github.com/rust-lang/crates.io-index" 2187 | checksum = "59ae7ce1c475d187abe9d40c6584286941aa4de07c0bff6873538f53297a843a" 2188 | dependencies = [ 2189 | "form_urlencoded", 2190 | "futures", 2191 | "indicatif", 2192 | "reqwest", 2193 | "reqwest-middleware", 2194 | "reqwest-retry", 2195 | "reqwest-tracing", 2196 | "task-local-extensions", 2197 | "thiserror", 2198 | "tokio", 2199 | "tracing", 2200 | "tracing-opentelemetry 0.21.0", 2201 | "tracing-subscriber", 2202 | ] 2203 | 2204 | [[package]] 2205 | name = "try-lock" 2206 | version = "0.2.5" 2207 | source = "registry+https://github.com/rust-lang/crates.io-index" 2208 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 2209 | 2210 | [[package]] 2211 | name = "typenum" 2212 | version = "1.17.0" 2213 | source = "registry+https://github.com/rust-lang/crates.io-index" 2214 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 2215 | 2216 | [[package]] 2217 | name = "unicase" 2218 | version = "2.7.0" 2219 | source = "registry+https://github.com/rust-lang/crates.io-index" 2220 | checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" 2221 | dependencies = [ 2222 | "version_check", 2223 | ] 2224 | 2225 | [[package]] 2226 | name = "unicode-bidi" 2227 | version = "0.3.15" 2228 | source = "registry+https://github.com/rust-lang/crates.io-index" 2229 | checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" 2230 | 2231 | [[package]] 2232 | name = "unicode-ident" 2233 | version = "1.0.12" 2234 | source = "registry+https://github.com/rust-lang/crates.io-index" 2235 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 2236 | 2237 | [[package]] 2238 | name = "unicode-normalization" 2239 | version = "0.1.23" 2240 | source = "registry+https://github.com/rust-lang/crates.io-index" 2241 | checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" 2242 | dependencies = [ 2243 | "tinyvec", 2244 | ] 2245 | 2246 | [[package]] 2247 | name = "unicode-width" 2248 | version = "0.1.12" 2249 | source = "registry+https://github.com/rust-lang/crates.io-index" 2250 | checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" 2251 | 2252 | [[package]] 2253 | name = "url" 2254 | version = "2.5.0" 2255 | source = "registry+https://github.com/rust-lang/crates.io-index" 2256 | checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" 2257 | dependencies = [ 2258 | "form_urlencoded", 2259 | "idna", 2260 | "percent-encoding", 2261 | ] 2262 | 2263 | [[package]] 2264 | name = "urlencoding" 2265 | version = "2.1.3" 2266 | source = "registry+https://github.com/rust-lang/crates.io-index" 2267 | checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" 2268 | 2269 | [[package]] 2270 | name = "utf8parse" 2271 | version = "0.2.1" 2272 | source = "registry+https://github.com/rust-lang/crates.io-index" 2273 | checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" 2274 | 2275 | [[package]] 2276 | name = "valuable" 2277 | version = "0.1.0" 2278 | source = "registry+https://github.com/rust-lang/crates.io-index" 2279 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 2280 | 2281 | [[package]] 2282 | name = "vcpkg" 2283 | version = "0.2.15" 2284 | source = "registry+https://github.com/rust-lang/crates.io-index" 2285 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 2286 | 2287 | [[package]] 2288 | name = "version_check" 2289 | version = "0.9.4" 2290 | source = "registry+https://github.com/rust-lang/crates.io-index" 2291 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2292 | 2293 | [[package]] 2294 | name = "void" 2295 | version = "1.0.2" 2296 | source = "registry+https://github.com/rust-lang/crates.io-index" 2297 | checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 2298 | 2299 | [[package]] 2300 | name = "walkdir" 2301 | version = "2.5.0" 2302 | source = "registry+https://github.com/rust-lang/crates.io-index" 2303 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 2304 | dependencies = [ 2305 | "same-file", 2306 | "winapi-util", 2307 | ] 2308 | 2309 | [[package]] 2310 | name = "want" 2311 | version = "0.3.1" 2312 | source = "registry+https://github.com/rust-lang/crates.io-index" 2313 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 2314 | dependencies = [ 2315 | "try-lock", 2316 | ] 2317 | 2318 | [[package]] 2319 | name = "wasi" 2320 | version = "0.11.0+wasi-snapshot-preview1" 2321 | source = "registry+https://github.com/rust-lang/crates.io-index" 2322 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2323 | 2324 | [[package]] 2325 | name = "wasm-bindgen" 2326 | version = "0.2.92" 2327 | source = "registry+https://github.com/rust-lang/crates.io-index" 2328 | checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" 2329 | dependencies = [ 2330 | "cfg-if", 2331 | "wasm-bindgen-macro", 2332 | ] 2333 | 2334 | [[package]] 2335 | name = "wasm-bindgen-backend" 2336 | version = "0.2.92" 2337 | source = "registry+https://github.com/rust-lang/crates.io-index" 2338 | checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" 2339 | dependencies = [ 2340 | "bumpalo", 2341 | "log", 2342 | "once_cell", 2343 | "proc-macro2", 2344 | "quote", 2345 | "syn", 2346 | "wasm-bindgen-shared", 2347 | ] 2348 | 2349 | [[package]] 2350 | name = "wasm-bindgen-futures" 2351 | version = "0.4.42" 2352 | source = "registry+https://github.com/rust-lang/crates.io-index" 2353 | checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" 2354 | dependencies = [ 2355 | "cfg-if", 2356 | "js-sys", 2357 | "wasm-bindgen", 2358 | "web-sys", 2359 | ] 2360 | 2361 | [[package]] 2362 | name = "wasm-bindgen-macro" 2363 | version = "0.2.92" 2364 | source = "registry+https://github.com/rust-lang/crates.io-index" 2365 | checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" 2366 | dependencies = [ 2367 | "quote", 2368 | "wasm-bindgen-macro-support", 2369 | ] 2370 | 2371 | [[package]] 2372 | name = "wasm-bindgen-macro-support" 2373 | version = "0.2.92" 2374 | source = "registry+https://github.com/rust-lang/crates.io-index" 2375 | checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" 2376 | dependencies = [ 2377 | "proc-macro2", 2378 | "quote", 2379 | "syn", 2380 | "wasm-bindgen-backend", 2381 | "wasm-bindgen-shared", 2382 | ] 2383 | 2384 | [[package]] 2385 | name = "wasm-bindgen-shared" 2386 | version = "0.2.92" 2387 | source = "registry+https://github.com/rust-lang/crates.io-index" 2388 | checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" 2389 | 2390 | [[package]] 2391 | name = "wasm-streams" 2392 | version = "0.4.0" 2393 | source = "registry+https://github.com/rust-lang/crates.io-index" 2394 | checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" 2395 | dependencies = [ 2396 | "futures-util", 2397 | "js-sys", 2398 | "wasm-bindgen", 2399 | "wasm-bindgen-futures", 2400 | "web-sys", 2401 | ] 2402 | 2403 | [[package]] 2404 | name = "wasm-timer" 2405 | version = "0.2.5" 2406 | source = "registry+https://github.com/rust-lang/crates.io-index" 2407 | checksum = "be0ecb0db480561e9a7642b5d3e4187c128914e58aa84330b9493e3eb68c5e7f" 2408 | dependencies = [ 2409 | "futures", 2410 | "js-sys", 2411 | "parking_lot", 2412 | "pin-utils", 2413 | "wasm-bindgen", 2414 | "wasm-bindgen-futures", 2415 | "web-sys", 2416 | ] 2417 | 2418 | [[package]] 2419 | name = "web-sys" 2420 | version = "0.3.69" 2421 | source = "registry+https://github.com/rust-lang/crates.io-index" 2422 | checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" 2423 | dependencies = [ 2424 | "js-sys", 2425 | "wasm-bindgen", 2426 | ] 2427 | 2428 | [[package]] 2429 | name = "winapi" 2430 | version = "0.3.9" 2431 | source = "registry+https://github.com/rust-lang/crates.io-index" 2432 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2433 | dependencies = [ 2434 | "winapi-i686-pc-windows-gnu", 2435 | "winapi-x86_64-pc-windows-gnu", 2436 | ] 2437 | 2438 | [[package]] 2439 | name = "winapi-i686-pc-windows-gnu" 2440 | version = "0.4.0" 2441 | source = "registry+https://github.com/rust-lang/crates.io-index" 2442 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2443 | 2444 | [[package]] 2445 | name = "winapi-util" 2446 | version = "0.1.8" 2447 | source = "registry+https://github.com/rust-lang/crates.io-index" 2448 | checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" 2449 | dependencies = [ 2450 | "windows-sys 0.52.0", 2451 | ] 2452 | 2453 | [[package]] 2454 | name = "winapi-x86_64-pc-windows-gnu" 2455 | version = "0.4.0" 2456 | source = "registry+https://github.com/rust-lang/crates.io-index" 2457 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2458 | 2459 | [[package]] 2460 | name = "windows-core" 2461 | version = "0.52.0" 2462 | source = "registry+https://github.com/rust-lang/crates.io-index" 2463 | checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" 2464 | dependencies = [ 2465 | "windows-targets 0.52.5", 2466 | ] 2467 | 2468 | [[package]] 2469 | name = "windows-sys" 2470 | version = "0.48.0" 2471 | source = "registry+https://github.com/rust-lang/crates.io-index" 2472 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2473 | dependencies = [ 2474 | "windows-targets 0.48.5", 2475 | ] 2476 | 2477 | [[package]] 2478 | name = "windows-sys" 2479 | version = "0.52.0" 2480 | source = "registry+https://github.com/rust-lang/crates.io-index" 2481 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2482 | dependencies = [ 2483 | "windows-targets 0.52.5", 2484 | ] 2485 | 2486 | [[package]] 2487 | name = "windows-targets" 2488 | version = "0.48.5" 2489 | source = "registry+https://github.com/rust-lang/crates.io-index" 2490 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 2491 | dependencies = [ 2492 | "windows_aarch64_gnullvm 0.48.5", 2493 | "windows_aarch64_msvc 0.48.5", 2494 | "windows_i686_gnu 0.48.5", 2495 | "windows_i686_msvc 0.48.5", 2496 | "windows_x86_64_gnu 0.48.5", 2497 | "windows_x86_64_gnullvm 0.48.5", 2498 | "windows_x86_64_msvc 0.48.5", 2499 | ] 2500 | 2501 | [[package]] 2502 | name = "windows-targets" 2503 | version = "0.52.5" 2504 | source = "registry+https://github.com/rust-lang/crates.io-index" 2505 | checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" 2506 | dependencies = [ 2507 | "windows_aarch64_gnullvm 0.52.5", 2508 | "windows_aarch64_msvc 0.52.5", 2509 | "windows_i686_gnu 0.52.5", 2510 | "windows_i686_gnullvm", 2511 | "windows_i686_msvc 0.52.5", 2512 | "windows_x86_64_gnu 0.52.5", 2513 | "windows_x86_64_gnullvm 0.52.5", 2514 | "windows_x86_64_msvc 0.52.5", 2515 | ] 2516 | 2517 | [[package]] 2518 | name = "windows_aarch64_gnullvm" 2519 | version = "0.48.5" 2520 | source = "registry+https://github.com/rust-lang/crates.io-index" 2521 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 2522 | 2523 | [[package]] 2524 | name = "windows_aarch64_gnullvm" 2525 | version = "0.52.5" 2526 | source = "registry+https://github.com/rust-lang/crates.io-index" 2527 | checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" 2528 | 2529 | [[package]] 2530 | name = "windows_aarch64_msvc" 2531 | version = "0.48.5" 2532 | source = "registry+https://github.com/rust-lang/crates.io-index" 2533 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 2534 | 2535 | [[package]] 2536 | name = "windows_aarch64_msvc" 2537 | version = "0.52.5" 2538 | source = "registry+https://github.com/rust-lang/crates.io-index" 2539 | checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" 2540 | 2541 | [[package]] 2542 | name = "windows_i686_gnu" 2543 | version = "0.48.5" 2544 | source = "registry+https://github.com/rust-lang/crates.io-index" 2545 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 2546 | 2547 | [[package]] 2548 | name = "windows_i686_gnu" 2549 | version = "0.52.5" 2550 | source = "registry+https://github.com/rust-lang/crates.io-index" 2551 | checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" 2552 | 2553 | [[package]] 2554 | name = "windows_i686_gnullvm" 2555 | version = "0.52.5" 2556 | source = "registry+https://github.com/rust-lang/crates.io-index" 2557 | checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" 2558 | 2559 | [[package]] 2560 | name = "windows_i686_msvc" 2561 | version = "0.48.5" 2562 | source = "registry+https://github.com/rust-lang/crates.io-index" 2563 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 2564 | 2565 | [[package]] 2566 | name = "windows_i686_msvc" 2567 | version = "0.52.5" 2568 | source = "registry+https://github.com/rust-lang/crates.io-index" 2569 | checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" 2570 | 2571 | [[package]] 2572 | name = "windows_x86_64_gnu" 2573 | version = "0.48.5" 2574 | source = "registry+https://github.com/rust-lang/crates.io-index" 2575 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 2576 | 2577 | [[package]] 2578 | name = "windows_x86_64_gnu" 2579 | version = "0.52.5" 2580 | source = "registry+https://github.com/rust-lang/crates.io-index" 2581 | checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" 2582 | 2583 | [[package]] 2584 | name = "windows_x86_64_gnullvm" 2585 | version = "0.48.5" 2586 | source = "registry+https://github.com/rust-lang/crates.io-index" 2587 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 2588 | 2589 | [[package]] 2590 | name = "windows_x86_64_gnullvm" 2591 | version = "0.52.5" 2592 | source = "registry+https://github.com/rust-lang/crates.io-index" 2593 | checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" 2594 | 2595 | [[package]] 2596 | name = "windows_x86_64_msvc" 2597 | version = "0.48.5" 2598 | source = "registry+https://github.com/rust-lang/crates.io-index" 2599 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 2600 | 2601 | [[package]] 2602 | name = "windows_x86_64_msvc" 2603 | version = "0.52.5" 2604 | source = "registry+https://github.com/rust-lang/crates.io-index" 2605 | checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" 2606 | 2607 | [[package]] 2608 | name = "winnow" 2609 | version = "0.6.8" 2610 | source = "registry+https://github.com/rust-lang/crates.io-index" 2611 | checksum = "c3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618d" 2612 | dependencies = [ 2613 | "memchr", 2614 | ] 2615 | 2616 | [[package]] 2617 | name = "winreg" 2618 | version = "0.50.0" 2619 | source = "registry+https://github.com/rust-lang/crates.io-index" 2620 | checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" 2621 | dependencies = [ 2622 | "cfg-if", 2623 | "windows-sys 0.48.0", 2624 | ] 2625 | 2626 | [[package]] 2627 | name = "zip" 2628 | version = "0.6.6" 2629 | source = "registry+https://github.com/rust-lang/crates.io-index" 2630 | checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" 2631 | dependencies = [ 2632 | "aes", 2633 | "byteorder", 2634 | "bzip2", 2635 | "constant_time_eq", 2636 | "crc32fast", 2637 | "crossbeam-utils", 2638 | "flate2", 2639 | "hmac", 2640 | "pbkdf2", 2641 | "sha1", 2642 | "time", 2643 | "zstd", 2644 | ] 2645 | 2646 | [[package]] 2647 | name = "zstd" 2648 | version = "0.11.2+zstd.1.5.2" 2649 | source = "registry+https://github.com/rust-lang/crates.io-index" 2650 | checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" 2651 | dependencies = [ 2652 | "zstd-safe", 2653 | ] 2654 | 2655 | [[package]] 2656 | name = "zstd-safe" 2657 | version = "5.0.2+zstd.1.5.2" 2658 | source = "registry+https://github.com/rust-lang/crates.io-index" 2659 | checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" 2660 | dependencies = [ 2661 | "libc", 2662 | "zstd-sys", 2663 | ] 2664 | 2665 | [[package]] 2666 | name = "zstd-sys" 2667 | version = "2.0.10+zstd.1.5.6" 2668 | source = "registry+https://github.com/rust-lang/crates.io-index" 2669 | checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa" 2670 | dependencies = [ 2671 | "cc", 2672 | "pkg-config", 2673 | ] 2674 | --------------------------------------------------------------------------------