├── .gitignore ├── README.md ├── Cargo.toml ├── src └── main.rs └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Simple Paxos Implementation 2 | 3 | ## How to run it 4 | 5 | Run the following commands in different terminals: 6 | 7 | ```bash 8 | cargo run -- --id 0 9 | cargo run -- --id 1 10 | cargo run -- --id 2 11 | ``` 12 | 13 | Send a propose to any of the nodes: 14 | 15 | ```bash 16 | curl -X POST http://0.0.0.0:8000/ -d "proposed value" 17 | ``` 18 | 19 | ## References 20 | 21 | - https://lamport.azurewebsites.net/pubs/paxos-simple.pdf 22 | - https://people.cs.rutgers.edu/~pxk/417/notes/paxos.html 23 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "paxos" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | anyhow = "1.0.68" 10 | axum = "0.6.4" 11 | axum-macros = "0.3.2" 12 | clap = { version = "4.1.4", features = ["derive"] } 13 | futures = "0.3.26" 14 | hyper = { version = "0.14.24", features = ["full"] } 15 | reqwest = { version = "0.11.14", features = ["json"] } 16 | serde = { version = "1.0.152", features = ["derive"] } 17 | serde_json = "1.0.91" 18 | tokio = { version = "1.25.0", features = ["full"] } 19 | tower = "0.4.13" 20 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::sync::Arc; 2 | use std::net::SocketAddr; 3 | use anyhow::{Result, anyhow}; 4 | use axum::{routing::post, Json, Extension}; 5 | use axum_macros::debug_handler; 6 | use clap::Parser; 7 | use tokio::sync::Mutex; 8 | 9 | #[derive(Parser, Debug)] 10 | struct Args { 11 | #[arg(long)] 12 | id: u64 13 | } 14 | 15 | #[tokio::main] 16 | async fn main() { 17 | let args = Args::parse(); 18 | 19 | let nodes = [ 20 | "0.0.0.0:8000", 21 | "0.0.0.0:8001", 22 | "0.0.0.0:8002" 23 | ]; 24 | 25 | let current_addr = nodes[args.id as usize]; 26 | 27 | let nodes: Vec<(u64, &'static str)> = nodes.into_iter() 28 | .enumerate() 29 | .filter(|(id, _)| *id as u64 != args.id) 30 | .map(|(id, addr)| (id as u64, addr)) 31 | .collect(); 32 | 33 | let config = Config::new(args.id, nodes); 34 | 35 | let paxos = Paxos::new(config); 36 | 37 | let router = axum::Router::new() 38 | .route("/", post(client_propose)) 39 | .route("/acceptor/handle-prepare-message", post(handle_prepare_message)) 40 | .route("/acceptor/handle-propose", post(handle_propose)) 41 | .layer(Extension(Arc::new(Mutex::new(paxos)))); 42 | 43 | println!("listening on {current_addr}"); 44 | 45 | axum::Server::bind(¤t_addr.parse().unwrap()) 46 | .serve(router.into_make_service()) 47 | .await 48 | .unwrap(); 49 | } 50 | 51 | #[debug_handler] 52 | async fn client_propose(Extension(paxos): Extension>>, value: String) -> Result { 53 | println!("Received propose with value<{value}>"); 54 | 55 | let mut paxos = paxos.lock().await; 56 | 57 | paxos.proposer 58 | .prepare(value.clone()).await 59 | .map_err(|err| err.to_string())?; 60 | 61 | Ok(format!("Accepted {value}")) 62 | } 63 | 64 | #[debug_handler] 65 | async fn handle_prepare_message(Extension(paxos): Extension>>, prepare_id: String) -> Result, String> { 66 | let mut paxos = paxos.lock().await; 67 | 68 | match paxos.acceptor.handle_prepare(prepare_id.parse::().map_err(|err| err.to_string())?) { 69 | Ok(promise) => Ok(Json(promise)), 70 | Err(err) => Err(err.to_string()) 71 | } 72 | } 73 | 74 | async fn handle_propose(Extension(paxos): Extension>>, Json(propose): Json) -> Result, String> { 75 | let mut paxos = paxos.lock().await; 76 | 77 | match paxos.acceptor.handle_propose(propose) { 78 | Ok(value) => Ok(Json(value)), 79 | Err(err) => Err(err.to_string()) 80 | } 81 | } 82 | 83 | 84 | #[derive(Clone, Debug)] 85 | pub struct Node { 86 | pub id: u64, 87 | pub addr: SocketAddr 88 | } 89 | 90 | impl Node { 91 | fn new(id: u64, addr: SocketAddr) -> Self { 92 | Self { id, addr } 93 | } 94 | 95 | fn endpoint(&self, path: &str) -> String { 96 | format!("http://{}/{}", self.addr, path.trim_start_matches('/')) 97 | } 98 | } 99 | 100 | #[derive(Clone, Debug)] 101 | pub struct Config { 102 | pub id: u64, 103 | pub nodes: Vec 104 | } 105 | 106 | impl Config { 107 | fn new(id: u64, addresses: Vec<(u64, &'static str)>) -> Self { 108 | let mut nodes = Vec::new(); 109 | 110 | for (id, addr) in addresses { 111 | nodes.push(Node::new(id, addr.parse().unwrap())); 112 | } 113 | 114 | Self { id, nodes } 115 | } 116 | } 117 | 118 | struct Paxos { 119 | pub proposer: Proposer, 120 | pub acceptor: Acceptor, 121 | } 122 | 123 | impl Paxos { 124 | fn new(config: Config) -> Self { 125 | Self { 126 | proposer: Proposer::new(config), 127 | acceptor: Acceptor::default() 128 | } 129 | } 130 | } 131 | 132 | pub struct Proposer { 133 | pub id: u64, 134 | pub config: Config, 135 | pub promises: Vec 136 | } 137 | 138 | impl Proposer { 139 | pub fn new(config: Config) -> Self { 140 | Self { 141 | id: 0, 142 | config, 143 | promises: Vec::new(), 144 | } 145 | } 146 | } 147 | 148 | impl Proposer { 149 | pub async fn prepare(&mut self, value: String) -> anyhow::Result<()> { 150 | self.id += 1; 151 | 152 | let client = reqwest::Client::new(); 153 | 154 | let reqs = self.config.nodes.iter().map(|node| { 155 | client.post(node.endpoint("/acceptor/handle-prepare-message")) 156 | .json(&self.id) 157 | .send() 158 | }); 159 | 160 | let result = futures::future::join_all(reqs).await; 161 | 162 | let mut promises = Vec::with_capacity(result.len()); 163 | 164 | for result in result.into_iter().flatten() { 165 | promises.push(result.json::().await?) 166 | } 167 | 168 | let majority = (self.config.nodes.len() / 2) + 1; 169 | 170 | if promises.len() + 1 < majority { 171 | return Err(anyhow!("didn't received promise from majority of acceptors")); 172 | } 173 | 174 | let accepted_promise = promises.into_iter() 175 | .filter(|Promise(value)| value.value.is_some()) 176 | .max_by_key(|Promise(value)| value.id); 177 | 178 | let has_accepted_value = accepted_promise.is_some(); 179 | 180 | let value = match accepted_promise { 181 | Some(value) => value.0.value.unwrap(), 182 | None => value 183 | }; 184 | 185 | let propose = Propose(Value { id: self.id, value: Some(value) }); 186 | 187 | let requests = self.config.nodes.iter().map(|node| { 188 | client.post(node.endpoint("/acceptor/handle-propose")) 189 | .json(&propose) 190 | .send() 191 | }); 192 | 193 | let responses = futures::future::join_all(requests).await; 194 | 195 | let mut accepted_values = Vec::with_capacity(responses.len()); 196 | 197 | for result in responses.into_iter().flatten() { 198 | accepted_values.push(result.json::().await?); 199 | } 200 | 201 | if accepted_values.len() + 1 < majority { 202 | return Err(anyhow!("value not accepted by majority")); 203 | } 204 | 205 | if has_accepted_value { 206 | return Err(anyhow!("already accepted another value")); 207 | } 208 | 209 | Ok(()) 210 | } 211 | } 212 | 213 | #[derive(Clone, serde::Deserialize, serde::Serialize)] 214 | pub struct Propose(pub Value); 215 | 216 | #[derive(Default)] 217 | pub struct Acceptor { 218 | max_id: u64, 219 | accepted_propose: Option, 220 | } 221 | 222 | impl Acceptor { 223 | pub fn handle_prepare(&mut self, prepare_id: u64) -> Result { 224 | if prepare_id < self.max_id { 225 | return Err(anyhow!("already accepted a propose with a higher id")); 226 | } 227 | 228 | self.max_id = prepare_id; 229 | 230 | if self.accepted_propose.is_some() { 231 | let value = self.accepted_propose.clone().unwrap().0.value; 232 | 233 | return Ok(Promise(Value { id: prepare_id, value })); 234 | } 235 | 236 | Ok(Promise(Value { id: prepare_id, value: None })) 237 | } 238 | 239 | 240 | pub fn handle_propose(&mut self, propose: Propose) -> Result { 241 | if self.max_id != propose.0.id { 242 | return Err(anyhow!("cannot accept propose with lower id")); 243 | } 244 | 245 | self.accepted_propose = Some(propose.clone()); 246 | 247 | Ok(propose.0) 248 | } 249 | } 250 | 251 | #[derive(serde::Serialize, serde::Deserialize)] 252 | pub struct Promise(pub Value); 253 | 254 | #[derive(Clone, serde::Deserialize, serde::Serialize)] 255 | pub struct Value { 256 | pub id: u64, 257 | pub value: Option, 258 | } 259 | -------------------------------------------------------------------------------- /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 = "anyhow" 7 | version = "1.0.68" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" 10 | 11 | [[package]] 12 | name = "async-trait" 13 | version = "0.1.64" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "1cd7fce9ba8c3c042128ce72d8b2ddbf3a05747efb67ea0313c635e10bda47a2" 16 | dependencies = [ 17 | "proc-macro2", 18 | "quote", 19 | "syn", 20 | ] 21 | 22 | [[package]] 23 | name = "autocfg" 24 | version = "1.1.0" 25 | source = "registry+https://github.com/rust-lang/crates.io-index" 26 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 27 | 28 | [[package]] 29 | name = "axum" 30 | version = "0.6.4" 31 | source = "registry+https://github.com/rust-lang/crates.io-index" 32 | checksum = "e5694b64066a2459918d8074c2ce0d5a88f409431994c2356617c8ae0c4721fc" 33 | dependencies = [ 34 | "async-trait", 35 | "axum-core", 36 | "bitflags", 37 | "bytes", 38 | "futures-util", 39 | "http", 40 | "http-body", 41 | "hyper", 42 | "itoa", 43 | "matchit", 44 | "memchr", 45 | "mime", 46 | "percent-encoding", 47 | "pin-project-lite", 48 | "rustversion", 49 | "serde", 50 | "serde_json", 51 | "serde_path_to_error", 52 | "serde_urlencoded", 53 | "sync_wrapper", 54 | "tokio", 55 | "tower", 56 | "tower-http", 57 | "tower-layer", 58 | "tower-service", 59 | ] 60 | 61 | [[package]] 62 | name = "axum-core" 63 | version = "0.3.2" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "1cae3e661676ffbacb30f1a824089a8c9150e71017f7e1e38f2aa32009188d34" 66 | dependencies = [ 67 | "async-trait", 68 | "bytes", 69 | "futures-util", 70 | "http", 71 | "http-body", 72 | "mime", 73 | "rustversion", 74 | "tower-layer", 75 | "tower-service", 76 | ] 77 | 78 | [[package]] 79 | name = "axum-macros" 80 | version = "0.3.2" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "9dbcf61bed07d554bd5c225cd07bc41b793eab63e79c6f0ceac7e1aed2f1c670" 83 | dependencies = [ 84 | "heck", 85 | "proc-macro2", 86 | "quote", 87 | "syn", 88 | ] 89 | 90 | [[package]] 91 | name = "base64" 92 | version = "0.21.0" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" 95 | 96 | [[package]] 97 | name = "bitflags" 98 | version = "1.3.2" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 101 | 102 | [[package]] 103 | name = "bumpalo" 104 | version = "3.12.0" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" 107 | 108 | [[package]] 109 | name = "bytes" 110 | version = "1.4.0" 111 | source = "registry+https://github.com/rust-lang/crates.io-index" 112 | checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" 113 | 114 | [[package]] 115 | name = "cc" 116 | version = "1.0.79" 117 | source = "registry+https://github.com/rust-lang/crates.io-index" 118 | checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" 119 | 120 | [[package]] 121 | name = "cfg-if" 122 | version = "1.0.0" 123 | source = "registry+https://github.com/rust-lang/crates.io-index" 124 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 125 | 126 | [[package]] 127 | name = "clap" 128 | version = "4.1.4" 129 | source = "registry+https://github.com/rust-lang/crates.io-index" 130 | checksum = "f13b9c79b5d1dd500d20ef541215a6423c75829ef43117e1b4d17fd8af0b5d76" 131 | dependencies = [ 132 | "bitflags", 133 | "clap_derive", 134 | "clap_lex", 135 | "is-terminal", 136 | "once_cell", 137 | "strsim", 138 | "termcolor", 139 | ] 140 | 141 | [[package]] 142 | name = "clap_derive" 143 | version = "4.1.0" 144 | source = "registry+https://github.com/rust-lang/crates.io-index" 145 | checksum = "684a277d672e91966334af371f1a7b5833f9aa00b07c84e92fbce95e00208ce8" 146 | dependencies = [ 147 | "heck", 148 | "proc-macro-error", 149 | "proc-macro2", 150 | "quote", 151 | "syn", 152 | ] 153 | 154 | [[package]] 155 | name = "clap_lex" 156 | version = "0.3.1" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | checksum = "783fe232adfca04f90f56201b26d79682d4cd2625e0bc7290b95123afe558ade" 159 | dependencies = [ 160 | "os_str_bytes", 161 | ] 162 | 163 | [[package]] 164 | name = "core-foundation" 165 | version = "0.9.3" 166 | source = "registry+https://github.com/rust-lang/crates.io-index" 167 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 168 | dependencies = [ 169 | "core-foundation-sys", 170 | "libc", 171 | ] 172 | 173 | [[package]] 174 | name = "core-foundation-sys" 175 | version = "0.8.3" 176 | source = "registry+https://github.com/rust-lang/crates.io-index" 177 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 178 | 179 | [[package]] 180 | name = "encoding_rs" 181 | version = "0.8.32" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" 184 | dependencies = [ 185 | "cfg-if", 186 | ] 187 | 188 | [[package]] 189 | name = "errno" 190 | version = "0.2.8" 191 | source = "registry+https://github.com/rust-lang/crates.io-index" 192 | checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" 193 | dependencies = [ 194 | "errno-dragonfly", 195 | "libc", 196 | "winapi", 197 | ] 198 | 199 | [[package]] 200 | name = "errno-dragonfly" 201 | version = "0.1.2" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" 204 | dependencies = [ 205 | "cc", 206 | "libc", 207 | ] 208 | 209 | [[package]] 210 | name = "fastrand" 211 | version = "1.8.0" 212 | source = "registry+https://github.com/rust-lang/crates.io-index" 213 | checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" 214 | dependencies = [ 215 | "instant", 216 | ] 217 | 218 | [[package]] 219 | name = "fnv" 220 | version = "1.0.7" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 223 | 224 | [[package]] 225 | name = "foreign-types" 226 | version = "0.3.2" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 229 | dependencies = [ 230 | "foreign-types-shared", 231 | ] 232 | 233 | [[package]] 234 | name = "foreign-types-shared" 235 | version = "0.1.1" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 238 | 239 | [[package]] 240 | name = "form_urlencoded" 241 | version = "1.1.0" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" 244 | dependencies = [ 245 | "percent-encoding", 246 | ] 247 | 248 | [[package]] 249 | name = "futures" 250 | version = "0.3.26" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84" 253 | dependencies = [ 254 | "futures-channel", 255 | "futures-core", 256 | "futures-executor", 257 | "futures-io", 258 | "futures-sink", 259 | "futures-task", 260 | "futures-util", 261 | ] 262 | 263 | [[package]] 264 | name = "futures-channel" 265 | version = "0.3.26" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" 268 | dependencies = [ 269 | "futures-core", 270 | "futures-sink", 271 | ] 272 | 273 | [[package]] 274 | name = "futures-core" 275 | version = "0.3.26" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" 278 | 279 | [[package]] 280 | name = "futures-executor" 281 | version = "0.3.26" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e" 284 | dependencies = [ 285 | "futures-core", 286 | "futures-task", 287 | "futures-util", 288 | ] 289 | 290 | [[package]] 291 | name = "futures-io" 292 | version = "0.3.26" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531" 295 | 296 | [[package]] 297 | name = "futures-macro" 298 | version = "0.3.26" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" 301 | dependencies = [ 302 | "proc-macro2", 303 | "quote", 304 | "syn", 305 | ] 306 | 307 | [[package]] 308 | name = "futures-sink" 309 | version = "0.3.26" 310 | source = "registry+https://github.com/rust-lang/crates.io-index" 311 | checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" 312 | 313 | [[package]] 314 | name = "futures-task" 315 | version = "0.3.26" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" 318 | 319 | [[package]] 320 | name = "futures-util" 321 | version = "0.3.26" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" 324 | dependencies = [ 325 | "futures-channel", 326 | "futures-core", 327 | "futures-io", 328 | "futures-macro", 329 | "futures-sink", 330 | "futures-task", 331 | "memchr", 332 | "pin-project-lite", 333 | "pin-utils", 334 | "slab", 335 | ] 336 | 337 | [[package]] 338 | name = "h2" 339 | version = "0.3.15" 340 | source = "registry+https://github.com/rust-lang/crates.io-index" 341 | checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" 342 | dependencies = [ 343 | "bytes", 344 | "fnv", 345 | "futures-core", 346 | "futures-sink", 347 | "futures-util", 348 | "http", 349 | "indexmap", 350 | "slab", 351 | "tokio", 352 | "tokio-util", 353 | "tracing", 354 | ] 355 | 356 | [[package]] 357 | name = "hashbrown" 358 | version = "0.12.3" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 361 | 362 | [[package]] 363 | name = "heck" 364 | version = "0.4.1" 365 | source = "registry+https://github.com/rust-lang/crates.io-index" 366 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 367 | 368 | [[package]] 369 | name = "hermit-abi" 370 | version = "0.2.6" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" 373 | dependencies = [ 374 | "libc", 375 | ] 376 | 377 | [[package]] 378 | name = "http" 379 | version = "0.2.8" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 382 | dependencies = [ 383 | "bytes", 384 | "fnv", 385 | "itoa", 386 | ] 387 | 388 | [[package]] 389 | name = "http-body" 390 | version = "0.4.5" 391 | source = "registry+https://github.com/rust-lang/crates.io-index" 392 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 393 | dependencies = [ 394 | "bytes", 395 | "http", 396 | "pin-project-lite", 397 | ] 398 | 399 | [[package]] 400 | name = "http-range-header" 401 | version = "0.3.0" 402 | source = "registry+https://github.com/rust-lang/crates.io-index" 403 | checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" 404 | 405 | [[package]] 406 | name = "httparse" 407 | version = "1.8.0" 408 | source = "registry+https://github.com/rust-lang/crates.io-index" 409 | checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" 410 | 411 | [[package]] 412 | name = "httpdate" 413 | version = "1.0.2" 414 | source = "registry+https://github.com/rust-lang/crates.io-index" 415 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 416 | 417 | [[package]] 418 | name = "hyper" 419 | version = "0.14.24" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "5e011372fa0b68db8350aa7a248930ecc7839bf46d8485577d69f117a75f164c" 422 | dependencies = [ 423 | "bytes", 424 | "futures-channel", 425 | "futures-core", 426 | "futures-util", 427 | "h2", 428 | "http", 429 | "http-body", 430 | "httparse", 431 | "httpdate", 432 | "itoa", 433 | "pin-project-lite", 434 | "socket2", 435 | "tokio", 436 | "tower-service", 437 | "tracing", 438 | "want", 439 | ] 440 | 441 | [[package]] 442 | name = "hyper-tls" 443 | version = "0.5.0" 444 | source = "registry+https://github.com/rust-lang/crates.io-index" 445 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 446 | dependencies = [ 447 | "bytes", 448 | "hyper", 449 | "native-tls", 450 | "tokio", 451 | "tokio-native-tls", 452 | ] 453 | 454 | [[package]] 455 | name = "idna" 456 | version = "0.3.0" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" 459 | dependencies = [ 460 | "unicode-bidi", 461 | "unicode-normalization", 462 | ] 463 | 464 | [[package]] 465 | name = "indexmap" 466 | version = "1.9.2" 467 | source = "registry+https://github.com/rust-lang/crates.io-index" 468 | checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" 469 | dependencies = [ 470 | "autocfg", 471 | "hashbrown", 472 | ] 473 | 474 | [[package]] 475 | name = "instant" 476 | version = "0.1.12" 477 | source = "registry+https://github.com/rust-lang/crates.io-index" 478 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 479 | dependencies = [ 480 | "cfg-if", 481 | ] 482 | 483 | [[package]] 484 | name = "io-lifetimes" 485 | version = "1.0.5" 486 | source = "registry+https://github.com/rust-lang/crates.io-index" 487 | checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3" 488 | dependencies = [ 489 | "libc", 490 | "windows-sys 0.45.0", 491 | ] 492 | 493 | [[package]] 494 | name = "ipnet" 495 | version = "2.7.1" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" 498 | 499 | [[package]] 500 | name = "is-terminal" 501 | version = "0.4.2" 502 | source = "registry+https://github.com/rust-lang/crates.io-index" 503 | checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189" 504 | dependencies = [ 505 | "hermit-abi", 506 | "io-lifetimes", 507 | "rustix", 508 | "windows-sys 0.42.0", 509 | ] 510 | 511 | [[package]] 512 | name = "itoa" 513 | version = "1.0.5" 514 | source = "registry+https://github.com/rust-lang/crates.io-index" 515 | checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" 516 | 517 | [[package]] 518 | name = "js-sys" 519 | version = "0.3.61" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" 522 | dependencies = [ 523 | "wasm-bindgen", 524 | ] 525 | 526 | [[package]] 527 | name = "lazy_static" 528 | version = "1.4.0" 529 | source = "registry+https://github.com/rust-lang/crates.io-index" 530 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 531 | 532 | [[package]] 533 | name = "libc" 534 | version = "0.2.139" 535 | source = "registry+https://github.com/rust-lang/crates.io-index" 536 | checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" 537 | 538 | [[package]] 539 | name = "linux-raw-sys" 540 | version = "0.1.4" 541 | source = "registry+https://github.com/rust-lang/crates.io-index" 542 | checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" 543 | 544 | [[package]] 545 | name = "lock_api" 546 | version = "0.4.9" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" 549 | dependencies = [ 550 | "autocfg", 551 | "scopeguard", 552 | ] 553 | 554 | [[package]] 555 | name = "log" 556 | version = "0.4.17" 557 | source = "registry+https://github.com/rust-lang/crates.io-index" 558 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 559 | dependencies = [ 560 | "cfg-if", 561 | ] 562 | 563 | [[package]] 564 | name = "matchit" 565 | version = "0.7.0" 566 | source = "registry+https://github.com/rust-lang/crates.io-index" 567 | checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" 568 | 569 | [[package]] 570 | name = "memchr" 571 | version = "2.5.0" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 574 | 575 | [[package]] 576 | name = "mime" 577 | version = "0.3.16" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 580 | 581 | [[package]] 582 | name = "mio" 583 | version = "0.8.5" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" 586 | dependencies = [ 587 | "libc", 588 | "log", 589 | "wasi", 590 | "windows-sys 0.42.0", 591 | ] 592 | 593 | [[package]] 594 | name = "native-tls" 595 | version = "0.2.11" 596 | source = "registry+https://github.com/rust-lang/crates.io-index" 597 | checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" 598 | dependencies = [ 599 | "lazy_static", 600 | "libc", 601 | "log", 602 | "openssl", 603 | "openssl-probe", 604 | "openssl-sys", 605 | "schannel", 606 | "security-framework", 607 | "security-framework-sys", 608 | "tempfile", 609 | ] 610 | 611 | [[package]] 612 | name = "num_cpus" 613 | version = "1.15.0" 614 | source = "registry+https://github.com/rust-lang/crates.io-index" 615 | checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" 616 | dependencies = [ 617 | "hermit-abi", 618 | "libc", 619 | ] 620 | 621 | [[package]] 622 | name = "once_cell" 623 | version = "1.17.0" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" 626 | 627 | [[package]] 628 | name = "openssl" 629 | version = "0.10.45" 630 | source = "registry+https://github.com/rust-lang/crates.io-index" 631 | checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1" 632 | dependencies = [ 633 | "bitflags", 634 | "cfg-if", 635 | "foreign-types", 636 | "libc", 637 | "once_cell", 638 | "openssl-macros", 639 | "openssl-sys", 640 | ] 641 | 642 | [[package]] 643 | name = "openssl-macros" 644 | version = "0.1.0" 645 | source = "registry+https://github.com/rust-lang/crates.io-index" 646 | checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" 647 | dependencies = [ 648 | "proc-macro2", 649 | "quote", 650 | "syn", 651 | ] 652 | 653 | [[package]] 654 | name = "openssl-probe" 655 | version = "0.1.5" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 658 | 659 | [[package]] 660 | name = "openssl-sys" 661 | version = "0.9.80" 662 | source = "registry+https://github.com/rust-lang/crates.io-index" 663 | checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7" 664 | dependencies = [ 665 | "autocfg", 666 | "cc", 667 | "libc", 668 | "pkg-config", 669 | "vcpkg", 670 | ] 671 | 672 | [[package]] 673 | name = "os_str_bytes" 674 | version = "6.4.1" 675 | source = "registry+https://github.com/rust-lang/crates.io-index" 676 | checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" 677 | 678 | [[package]] 679 | name = "parking_lot" 680 | version = "0.12.1" 681 | source = "registry+https://github.com/rust-lang/crates.io-index" 682 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 683 | dependencies = [ 684 | "lock_api", 685 | "parking_lot_core", 686 | ] 687 | 688 | [[package]] 689 | name = "parking_lot_core" 690 | version = "0.9.7" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" 693 | dependencies = [ 694 | "cfg-if", 695 | "libc", 696 | "redox_syscall", 697 | "smallvec", 698 | "windows-sys 0.45.0", 699 | ] 700 | 701 | [[package]] 702 | name = "paxos" 703 | version = "0.1.0" 704 | dependencies = [ 705 | "anyhow", 706 | "axum", 707 | "axum-macros", 708 | "clap", 709 | "futures", 710 | "hyper", 711 | "reqwest", 712 | "serde", 713 | "serde_json", 714 | "tokio", 715 | "tower", 716 | ] 717 | 718 | [[package]] 719 | name = "percent-encoding" 720 | version = "2.2.0" 721 | source = "registry+https://github.com/rust-lang/crates.io-index" 722 | checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" 723 | 724 | [[package]] 725 | name = "pin-project" 726 | version = "1.0.12" 727 | source = "registry+https://github.com/rust-lang/crates.io-index" 728 | checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" 729 | dependencies = [ 730 | "pin-project-internal", 731 | ] 732 | 733 | [[package]] 734 | name = "pin-project-internal" 735 | version = "1.0.12" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" 738 | dependencies = [ 739 | "proc-macro2", 740 | "quote", 741 | "syn", 742 | ] 743 | 744 | [[package]] 745 | name = "pin-project-lite" 746 | version = "0.2.9" 747 | source = "registry+https://github.com/rust-lang/crates.io-index" 748 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 749 | 750 | [[package]] 751 | name = "pin-utils" 752 | version = "0.1.0" 753 | source = "registry+https://github.com/rust-lang/crates.io-index" 754 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 755 | 756 | [[package]] 757 | name = "pkg-config" 758 | version = "0.3.26" 759 | source = "registry+https://github.com/rust-lang/crates.io-index" 760 | checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" 761 | 762 | [[package]] 763 | name = "proc-macro-error" 764 | version = "1.0.4" 765 | source = "registry+https://github.com/rust-lang/crates.io-index" 766 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 767 | dependencies = [ 768 | "proc-macro-error-attr", 769 | "proc-macro2", 770 | "quote", 771 | "syn", 772 | "version_check", 773 | ] 774 | 775 | [[package]] 776 | name = "proc-macro-error-attr" 777 | version = "1.0.4" 778 | source = "registry+https://github.com/rust-lang/crates.io-index" 779 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 780 | dependencies = [ 781 | "proc-macro2", 782 | "quote", 783 | "version_check", 784 | ] 785 | 786 | [[package]] 787 | name = "proc-macro2" 788 | version = "1.0.50" 789 | source = "registry+https://github.com/rust-lang/crates.io-index" 790 | checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" 791 | dependencies = [ 792 | "unicode-ident", 793 | ] 794 | 795 | [[package]] 796 | name = "quote" 797 | version = "1.0.23" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" 800 | dependencies = [ 801 | "proc-macro2", 802 | ] 803 | 804 | [[package]] 805 | name = "redox_syscall" 806 | version = "0.2.16" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" 809 | dependencies = [ 810 | "bitflags", 811 | ] 812 | 813 | [[package]] 814 | name = "remove_dir_all" 815 | version = "0.5.3" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 818 | dependencies = [ 819 | "winapi", 820 | ] 821 | 822 | [[package]] 823 | name = "reqwest" 824 | version = "0.11.14" 825 | source = "registry+https://github.com/rust-lang/crates.io-index" 826 | checksum = "21eed90ec8570952d53b772ecf8f206aa1ec9a3d76b2521c56c42973f2d91ee9" 827 | dependencies = [ 828 | "base64", 829 | "bytes", 830 | "encoding_rs", 831 | "futures-core", 832 | "futures-util", 833 | "h2", 834 | "http", 835 | "http-body", 836 | "hyper", 837 | "hyper-tls", 838 | "ipnet", 839 | "js-sys", 840 | "log", 841 | "mime", 842 | "native-tls", 843 | "once_cell", 844 | "percent-encoding", 845 | "pin-project-lite", 846 | "serde", 847 | "serde_json", 848 | "serde_urlencoded", 849 | "tokio", 850 | "tokio-native-tls", 851 | "tower-service", 852 | "url", 853 | "wasm-bindgen", 854 | "wasm-bindgen-futures", 855 | "web-sys", 856 | "winreg", 857 | ] 858 | 859 | [[package]] 860 | name = "rustix" 861 | version = "0.36.7" 862 | source = "registry+https://github.com/rust-lang/crates.io-index" 863 | checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03" 864 | dependencies = [ 865 | "bitflags", 866 | "errno", 867 | "io-lifetimes", 868 | "libc", 869 | "linux-raw-sys", 870 | "windows-sys 0.42.0", 871 | ] 872 | 873 | [[package]] 874 | name = "rustversion" 875 | version = "1.0.11" 876 | source = "registry+https://github.com/rust-lang/crates.io-index" 877 | checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" 878 | 879 | [[package]] 880 | name = "ryu" 881 | version = "1.0.12" 882 | source = "registry+https://github.com/rust-lang/crates.io-index" 883 | checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" 884 | 885 | [[package]] 886 | name = "schannel" 887 | version = "0.1.21" 888 | source = "registry+https://github.com/rust-lang/crates.io-index" 889 | checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" 890 | dependencies = [ 891 | "windows-sys 0.42.0", 892 | ] 893 | 894 | [[package]] 895 | name = "scopeguard" 896 | version = "1.1.0" 897 | source = "registry+https://github.com/rust-lang/crates.io-index" 898 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 899 | 900 | [[package]] 901 | name = "security-framework" 902 | version = "2.8.2" 903 | source = "registry+https://github.com/rust-lang/crates.io-index" 904 | checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" 905 | dependencies = [ 906 | "bitflags", 907 | "core-foundation", 908 | "core-foundation-sys", 909 | "libc", 910 | "security-framework-sys", 911 | ] 912 | 913 | [[package]] 914 | name = "security-framework-sys" 915 | version = "2.8.0" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" 918 | dependencies = [ 919 | "core-foundation-sys", 920 | "libc", 921 | ] 922 | 923 | [[package]] 924 | name = "serde" 925 | version = "1.0.152" 926 | source = "registry+https://github.com/rust-lang/crates.io-index" 927 | checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" 928 | dependencies = [ 929 | "serde_derive", 930 | ] 931 | 932 | [[package]] 933 | name = "serde_derive" 934 | version = "1.0.152" 935 | source = "registry+https://github.com/rust-lang/crates.io-index" 936 | checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" 937 | dependencies = [ 938 | "proc-macro2", 939 | "quote", 940 | "syn", 941 | ] 942 | 943 | [[package]] 944 | name = "serde_json" 945 | version = "1.0.91" 946 | source = "registry+https://github.com/rust-lang/crates.io-index" 947 | checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" 948 | dependencies = [ 949 | "itoa", 950 | "ryu", 951 | "serde", 952 | ] 953 | 954 | [[package]] 955 | name = "serde_path_to_error" 956 | version = "0.1.9" 957 | source = "registry+https://github.com/rust-lang/crates.io-index" 958 | checksum = "26b04f22b563c91331a10074bda3dd5492e3cc39d56bd557e91c0af42b6c7341" 959 | dependencies = [ 960 | "serde", 961 | ] 962 | 963 | [[package]] 964 | name = "serde_urlencoded" 965 | version = "0.7.1" 966 | source = "registry+https://github.com/rust-lang/crates.io-index" 967 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 968 | dependencies = [ 969 | "form_urlencoded", 970 | "itoa", 971 | "ryu", 972 | "serde", 973 | ] 974 | 975 | [[package]] 976 | name = "signal-hook-registry" 977 | version = "1.4.0" 978 | source = "registry+https://github.com/rust-lang/crates.io-index" 979 | checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" 980 | dependencies = [ 981 | "libc", 982 | ] 983 | 984 | [[package]] 985 | name = "slab" 986 | version = "0.4.7" 987 | source = "registry+https://github.com/rust-lang/crates.io-index" 988 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 989 | dependencies = [ 990 | "autocfg", 991 | ] 992 | 993 | [[package]] 994 | name = "smallvec" 995 | version = "1.10.0" 996 | source = "registry+https://github.com/rust-lang/crates.io-index" 997 | checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" 998 | 999 | [[package]] 1000 | name = "socket2" 1001 | version = "0.4.7" 1002 | source = "registry+https://github.com/rust-lang/crates.io-index" 1003 | checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" 1004 | dependencies = [ 1005 | "libc", 1006 | "winapi", 1007 | ] 1008 | 1009 | [[package]] 1010 | name = "strsim" 1011 | version = "0.10.0" 1012 | source = "registry+https://github.com/rust-lang/crates.io-index" 1013 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 1014 | 1015 | [[package]] 1016 | name = "syn" 1017 | version = "1.0.107" 1018 | source = "registry+https://github.com/rust-lang/crates.io-index" 1019 | checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" 1020 | dependencies = [ 1021 | "proc-macro2", 1022 | "quote", 1023 | "unicode-ident", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "sync_wrapper" 1028 | version = "0.1.2" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" 1031 | 1032 | [[package]] 1033 | name = "tempfile" 1034 | version = "3.3.0" 1035 | source = "registry+https://github.com/rust-lang/crates.io-index" 1036 | checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" 1037 | dependencies = [ 1038 | "cfg-if", 1039 | "fastrand", 1040 | "libc", 1041 | "redox_syscall", 1042 | "remove_dir_all", 1043 | "winapi", 1044 | ] 1045 | 1046 | [[package]] 1047 | name = "termcolor" 1048 | version = "1.2.0" 1049 | source = "registry+https://github.com/rust-lang/crates.io-index" 1050 | checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" 1051 | dependencies = [ 1052 | "winapi-util", 1053 | ] 1054 | 1055 | [[package]] 1056 | name = "tinyvec" 1057 | version = "1.6.0" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 1060 | dependencies = [ 1061 | "tinyvec_macros", 1062 | ] 1063 | 1064 | [[package]] 1065 | name = "tinyvec_macros" 1066 | version = "0.1.1" 1067 | source = "registry+https://github.com/rust-lang/crates.io-index" 1068 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1069 | 1070 | [[package]] 1071 | name = "tokio" 1072 | version = "1.25.0" 1073 | source = "registry+https://github.com/rust-lang/crates.io-index" 1074 | checksum = "c8e00990ebabbe4c14c08aca901caed183ecd5c09562a12c824bb53d3c3fd3af" 1075 | dependencies = [ 1076 | "autocfg", 1077 | "bytes", 1078 | "libc", 1079 | "memchr", 1080 | "mio", 1081 | "num_cpus", 1082 | "parking_lot", 1083 | "pin-project-lite", 1084 | "signal-hook-registry", 1085 | "socket2", 1086 | "tokio-macros", 1087 | "windows-sys 0.42.0", 1088 | ] 1089 | 1090 | [[package]] 1091 | name = "tokio-macros" 1092 | version = "1.8.2" 1093 | source = "registry+https://github.com/rust-lang/crates.io-index" 1094 | checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" 1095 | dependencies = [ 1096 | "proc-macro2", 1097 | "quote", 1098 | "syn", 1099 | ] 1100 | 1101 | [[package]] 1102 | name = "tokio-native-tls" 1103 | version = "0.3.0" 1104 | source = "registry+https://github.com/rust-lang/crates.io-index" 1105 | checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" 1106 | dependencies = [ 1107 | "native-tls", 1108 | "tokio", 1109 | ] 1110 | 1111 | [[package]] 1112 | name = "tokio-util" 1113 | version = "0.7.4" 1114 | source = "registry+https://github.com/rust-lang/crates.io-index" 1115 | checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" 1116 | dependencies = [ 1117 | "bytes", 1118 | "futures-core", 1119 | "futures-sink", 1120 | "pin-project-lite", 1121 | "tokio", 1122 | "tracing", 1123 | ] 1124 | 1125 | [[package]] 1126 | name = "tower" 1127 | version = "0.4.13" 1128 | source = "registry+https://github.com/rust-lang/crates.io-index" 1129 | checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" 1130 | dependencies = [ 1131 | "futures-core", 1132 | "futures-util", 1133 | "pin-project", 1134 | "pin-project-lite", 1135 | "tokio", 1136 | "tower-layer", 1137 | "tower-service", 1138 | "tracing", 1139 | ] 1140 | 1141 | [[package]] 1142 | name = "tower-http" 1143 | version = "0.3.5" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858" 1146 | dependencies = [ 1147 | "bitflags", 1148 | "bytes", 1149 | "futures-core", 1150 | "futures-util", 1151 | "http", 1152 | "http-body", 1153 | "http-range-header", 1154 | "pin-project-lite", 1155 | "tower", 1156 | "tower-layer", 1157 | "tower-service", 1158 | ] 1159 | 1160 | [[package]] 1161 | name = "tower-layer" 1162 | version = "0.3.2" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" 1165 | 1166 | [[package]] 1167 | name = "tower-service" 1168 | version = "0.3.2" 1169 | source = "registry+https://github.com/rust-lang/crates.io-index" 1170 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 1171 | 1172 | [[package]] 1173 | name = "tracing" 1174 | version = "0.1.37" 1175 | source = "registry+https://github.com/rust-lang/crates.io-index" 1176 | checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" 1177 | dependencies = [ 1178 | "cfg-if", 1179 | "log", 1180 | "pin-project-lite", 1181 | "tracing-core", 1182 | ] 1183 | 1184 | [[package]] 1185 | name = "tracing-core" 1186 | version = "0.1.30" 1187 | source = "registry+https://github.com/rust-lang/crates.io-index" 1188 | checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" 1189 | dependencies = [ 1190 | "once_cell", 1191 | ] 1192 | 1193 | [[package]] 1194 | name = "try-lock" 1195 | version = "0.2.4" 1196 | source = "registry+https://github.com/rust-lang/crates.io-index" 1197 | checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" 1198 | 1199 | [[package]] 1200 | name = "unicode-bidi" 1201 | version = "0.3.10" 1202 | source = "registry+https://github.com/rust-lang/crates.io-index" 1203 | checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" 1204 | 1205 | [[package]] 1206 | name = "unicode-ident" 1207 | version = "1.0.6" 1208 | source = "registry+https://github.com/rust-lang/crates.io-index" 1209 | checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" 1210 | 1211 | [[package]] 1212 | name = "unicode-normalization" 1213 | version = "0.1.22" 1214 | source = "registry+https://github.com/rust-lang/crates.io-index" 1215 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 1216 | dependencies = [ 1217 | "tinyvec", 1218 | ] 1219 | 1220 | [[package]] 1221 | name = "url" 1222 | version = "2.3.1" 1223 | source = "registry+https://github.com/rust-lang/crates.io-index" 1224 | checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" 1225 | dependencies = [ 1226 | "form_urlencoded", 1227 | "idna", 1228 | "percent-encoding", 1229 | ] 1230 | 1231 | [[package]] 1232 | name = "vcpkg" 1233 | version = "0.2.15" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1236 | 1237 | [[package]] 1238 | name = "version_check" 1239 | version = "0.9.4" 1240 | source = "registry+https://github.com/rust-lang/crates.io-index" 1241 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1242 | 1243 | [[package]] 1244 | name = "want" 1245 | version = "0.3.0" 1246 | source = "registry+https://github.com/rust-lang/crates.io-index" 1247 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 1248 | dependencies = [ 1249 | "log", 1250 | "try-lock", 1251 | ] 1252 | 1253 | [[package]] 1254 | name = "wasi" 1255 | version = "0.11.0+wasi-snapshot-preview1" 1256 | source = "registry+https://github.com/rust-lang/crates.io-index" 1257 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1258 | 1259 | [[package]] 1260 | name = "wasm-bindgen" 1261 | version = "0.2.84" 1262 | source = "registry+https://github.com/rust-lang/crates.io-index" 1263 | checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" 1264 | dependencies = [ 1265 | "cfg-if", 1266 | "wasm-bindgen-macro", 1267 | ] 1268 | 1269 | [[package]] 1270 | name = "wasm-bindgen-backend" 1271 | version = "0.2.84" 1272 | source = "registry+https://github.com/rust-lang/crates.io-index" 1273 | checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" 1274 | dependencies = [ 1275 | "bumpalo", 1276 | "log", 1277 | "once_cell", 1278 | "proc-macro2", 1279 | "quote", 1280 | "syn", 1281 | "wasm-bindgen-shared", 1282 | ] 1283 | 1284 | [[package]] 1285 | name = "wasm-bindgen-futures" 1286 | version = "0.4.34" 1287 | source = "registry+https://github.com/rust-lang/crates.io-index" 1288 | checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" 1289 | dependencies = [ 1290 | "cfg-if", 1291 | "js-sys", 1292 | "wasm-bindgen", 1293 | "web-sys", 1294 | ] 1295 | 1296 | [[package]] 1297 | name = "wasm-bindgen-macro" 1298 | version = "0.2.84" 1299 | source = "registry+https://github.com/rust-lang/crates.io-index" 1300 | checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" 1301 | dependencies = [ 1302 | "quote", 1303 | "wasm-bindgen-macro-support", 1304 | ] 1305 | 1306 | [[package]] 1307 | name = "wasm-bindgen-macro-support" 1308 | version = "0.2.84" 1309 | source = "registry+https://github.com/rust-lang/crates.io-index" 1310 | checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" 1311 | dependencies = [ 1312 | "proc-macro2", 1313 | "quote", 1314 | "syn", 1315 | "wasm-bindgen-backend", 1316 | "wasm-bindgen-shared", 1317 | ] 1318 | 1319 | [[package]] 1320 | name = "wasm-bindgen-shared" 1321 | version = "0.2.84" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" 1324 | 1325 | [[package]] 1326 | name = "web-sys" 1327 | version = "0.3.61" 1328 | source = "registry+https://github.com/rust-lang/crates.io-index" 1329 | checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" 1330 | dependencies = [ 1331 | "js-sys", 1332 | "wasm-bindgen", 1333 | ] 1334 | 1335 | [[package]] 1336 | name = "winapi" 1337 | version = "0.3.9" 1338 | source = "registry+https://github.com/rust-lang/crates.io-index" 1339 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1340 | dependencies = [ 1341 | "winapi-i686-pc-windows-gnu", 1342 | "winapi-x86_64-pc-windows-gnu", 1343 | ] 1344 | 1345 | [[package]] 1346 | name = "winapi-i686-pc-windows-gnu" 1347 | version = "0.4.0" 1348 | source = "registry+https://github.com/rust-lang/crates.io-index" 1349 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1350 | 1351 | [[package]] 1352 | name = "winapi-util" 1353 | version = "0.1.5" 1354 | source = "registry+https://github.com/rust-lang/crates.io-index" 1355 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 1356 | dependencies = [ 1357 | "winapi", 1358 | ] 1359 | 1360 | [[package]] 1361 | name = "winapi-x86_64-pc-windows-gnu" 1362 | version = "0.4.0" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1365 | 1366 | [[package]] 1367 | name = "windows-sys" 1368 | version = "0.42.0" 1369 | source = "registry+https://github.com/rust-lang/crates.io-index" 1370 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 1371 | dependencies = [ 1372 | "windows_aarch64_gnullvm", 1373 | "windows_aarch64_msvc", 1374 | "windows_i686_gnu", 1375 | "windows_i686_msvc", 1376 | "windows_x86_64_gnu", 1377 | "windows_x86_64_gnullvm", 1378 | "windows_x86_64_msvc", 1379 | ] 1380 | 1381 | [[package]] 1382 | name = "windows-sys" 1383 | version = "0.45.0" 1384 | source = "registry+https://github.com/rust-lang/crates.io-index" 1385 | checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" 1386 | dependencies = [ 1387 | "windows-targets", 1388 | ] 1389 | 1390 | [[package]] 1391 | name = "windows-targets" 1392 | version = "0.42.1" 1393 | source = "registry+https://github.com/rust-lang/crates.io-index" 1394 | checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" 1395 | dependencies = [ 1396 | "windows_aarch64_gnullvm", 1397 | "windows_aarch64_msvc", 1398 | "windows_i686_gnu", 1399 | "windows_i686_msvc", 1400 | "windows_x86_64_gnu", 1401 | "windows_x86_64_gnullvm", 1402 | "windows_x86_64_msvc", 1403 | ] 1404 | 1405 | [[package]] 1406 | name = "windows_aarch64_gnullvm" 1407 | version = "0.42.1" 1408 | source = "registry+https://github.com/rust-lang/crates.io-index" 1409 | checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" 1410 | 1411 | [[package]] 1412 | name = "windows_aarch64_msvc" 1413 | version = "0.42.1" 1414 | source = "registry+https://github.com/rust-lang/crates.io-index" 1415 | checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" 1416 | 1417 | [[package]] 1418 | name = "windows_i686_gnu" 1419 | version = "0.42.1" 1420 | source = "registry+https://github.com/rust-lang/crates.io-index" 1421 | checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" 1422 | 1423 | [[package]] 1424 | name = "windows_i686_msvc" 1425 | version = "0.42.1" 1426 | source = "registry+https://github.com/rust-lang/crates.io-index" 1427 | checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" 1428 | 1429 | [[package]] 1430 | name = "windows_x86_64_gnu" 1431 | version = "0.42.1" 1432 | source = "registry+https://github.com/rust-lang/crates.io-index" 1433 | checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" 1434 | 1435 | [[package]] 1436 | name = "windows_x86_64_gnullvm" 1437 | version = "0.42.1" 1438 | source = "registry+https://github.com/rust-lang/crates.io-index" 1439 | checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" 1440 | 1441 | [[package]] 1442 | name = "windows_x86_64_msvc" 1443 | version = "0.42.1" 1444 | source = "registry+https://github.com/rust-lang/crates.io-index" 1445 | checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" 1446 | 1447 | [[package]] 1448 | name = "winreg" 1449 | version = "0.10.1" 1450 | source = "registry+https://github.com/rust-lang/crates.io-index" 1451 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 1452 | dependencies = [ 1453 | "winapi", 1454 | ] 1455 | --------------------------------------------------------------------------------