├── .clippy.toml ├── risso_api ├── migrations │ ├── .gitkeep │ ├── 2018-10-14-150134_add-notifications │ │ ├── down.sql │ │ └── up.sql │ └── 2018-10-06-170256_create-db │ │ ├── down.sql │ │ └── up.sql ├── diesel.toml ├── src │ ├── defaults.toml │ ├── bin │ │ └── dump_isso_db.rs │ ├── config.rs │ ├── schema.rs │ ├── context.rs │ ├── logs.rs │ ├── dieselext.rs │ ├── models.rs │ └── lib.rs └── Cargo.toml ├── .gitignore ├── .travis.yml ├── .rustfmt.toml ├── Cargo.toml ├── .dockerignore ├── Dockerfile ├── risso_actix ├── Cargo.toml └── src │ ├── request_logger.rs │ ├── metrics.rs │ └── main.rs ├── README.md ├── Makefile ├── LICENSE.txt └── Cargo.lock /.clippy.toml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /risso_api/migrations/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /temp 2 | .idea 3 | *.iml 4 | target 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: rust 2 | cache: cargo 3 | rust: 4 | - stable 5 | -------------------------------------------------------------------------------- /.rustfmt.toml: -------------------------------------------------------------------------------- 1 | max_width = 120 2 | #report_todo = "Always" 3 | #report_fixme = "Always" 4 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | 3 | members = [ 4 | "risso_api", 5 | "risso_actix", 6 | ] 7 | -------------------------------------------------------------------------------- /risso_api/migrations/2018-10-14-150134_add-notifications/down.sql: -------------------------------------------------------------------------------- 1 | 2 | ALTER TABLE comments DROP COLUMN notification; 3 | -------------------------------------------------------------------------------- /risso_api/diesel.toml: -------------------------------------------------------------------------------- 1 | # For documentation on how to configure this file, 2 | # see diesel.rs/guides/configuring-diesel-cli 3 | 4 | [print_schema] 5 | file = "src/schema.rs" 6 | -------------------------------------------------------------------------------- /risso_api/migrations/2018-10-14-150134_add-notifications/up.sql: -------------------------------------------------------------------------------- 1 | 2 | -- Add a flag to notify posters of replies to their comment 3 | ALTER TABLE comments ADD COLUMN notification INTEGER NOT NULL DEFAULT 0; 4 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | # Ignore everything except the executable to reduce the amount of data sent to the Docker daemon 2 | # (the infamous "Sending build context to Docker daemon"). 3 | 4 | * 5 | !target/risso_actix-musl-release 6 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # We don't use a multi-stage build, as it prevents using a Docker volume 2 | # for the ~/.cargo cache (see Makefile) 3 | 4 | FROM scratch 5 | 6 | WORKDIR /risso 7 | COPY target/risso_actix-musl-release . 8 | CMD ["/risso/risso_actix"] 9 | -------------------------------------------------------------------------------- /risso_api/migrations/2018-10-06-170256_create-db/down.sql: -------------------------------------------------------------------------------- 1 | 2 | DROP TABLE comments; 3 | DROP TABLE preferences; 4 | DROP TABLE threads; 5 | 6 | 7 | 8 | SELECT comments.parent,count(*) 9 | FROM comments INNER JOIN threads ON 10 | threads.uri=? AND comments.tid=threads.id AND 11 | (? | comments.mode = ?) AND 12 | comments.created > ? 13 | GROUP BY comments.parent 14 | -------------------------------------------------------------------------------- /risso_api/src/defaults.toml: -------------------------------------------------------------------------------- 1 | [general] 2 | # default url for gravatar. {} is where the hash will be placed 3 | gravatar_url = "https://www.gravatar.com/avatar/{}?d=identicon" 4 | 5 | [database] 6 | db_path = "data/comments.db" 7 | min_connections = 1 # Keep resources low, but check at creation time 8 | max_connections = 10 9 | 10 | [smtp] 11 | # username = 12 | # password = 13 | host = "localhost" 14 | port = 25 15 | from = "risso@example.com" 16 | to = "blog-admin@example.com" 17 | 18 | [actix] 19 | listen_addr = "127.0.0.1:8080" 20 | allowed_origins = [] 21 | -------------------------------------------------------------------------------- /risso_actix/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | edition = "2018" 3 | name = "risso_actix" 4 | version = "0.1.0" 5 | description = "Actix-web server front-end to risso_api, a Rust clone of the ISSO comment server" 6 | authors = ["Sylvain Wallez "] 7 | license = "Apache-2.0" 8 | 9 | [dependencies] 10 | 11 | actix = "0.7" 12 | actix-web = "0.7" 13 | actix-web-requestid = "0.1.2" 14 | 15 | serde = "1.0.80" 16 | serde_derive = "1.0.80" 17 | 18 | failure = "0.1.3" 19 | lazy_static ="1.1" 20 | maplit = "1.0.1" 21 | num-traits = "0.2" 22 | 23 | futures = "0.1" 24 | 25 | slog = "2.4.1" 26 | slog-scope = "4.0.1" 27 | 28 | prometheus = "0.4.2" 29 | 30 | risso_api = { path = "../risso_api" } 31 | -------------------------------------------------------------------------------- /risso_api/migrations/2018-10-06-170256_create-db/up.sql: -------------------------------------------------------------------------------- 1 | 2 | CREATE TABLE IF NOT EXISTS comments ( 3 | tid REFERENCES threads(id), 4 | id INTEGER PRIMARY KEY, 5 | parent INTEGER, 6 | created FLOAT NOT NULL, 7 | modified FLOAT, 8 | mode INTEGER, 9 | remote_addr VARCHAR, 10 | text VARCHAR, 11 | author VARCHAR, 12 | email VARCHAR, 13 | website VARCHAR, 14 | likes INTEGER DEFAULT 0, 15 | dislikes INTEGER DEFAULT 0, 16 | voters BLOB NOT NULL 17 | ); 18 | 19 | CREATE TABLE IF NOT EXISTS preferences ( 20 | key VARCHAR PRIMARY KEY, value VARCHAR 21 | ); 22 | 23 | CREATE TABLE IF NOT EXISTS threads ( 24 | id INTEGER PRIMARY KEY, uri VARCHAR(256) UNIQUE, title VARCHAR(256) 25 | ); 26 | -------------------------------------------------------------------------------- /risso_api/src/bin/dump_isso_db.rs: -------------------------------------------------------------------------------- 1 | extern crate diesel; 2 | extern crate risso_api; 3 | use diesel::prelude::*; 4 | use diesel::sqlite::SqliteConnection; 5 | 6 | use risso_api::models::*; 7 | use risso_api::schema::*; 8 | //use crate::models::*; 9 | 10 | fn main() { 11 | let database_url = "temp/comments.db"; 12 | 13 | let cnx = SqliteConnection::establish(database_url).expect("Can't connect to database"); 14 | 15 | { 16 | use crate::comments::dsl::*; 17 | let all_comments = comments.load::(&cnx).expect("comments"); 18 | for comment in all_comments { 19 | println!("{:?}", comment); 20 | } 21 | } 22 | 23 | { 24 | use crate::threads::dsl::*; 25 | let all_threads = threads.load::(&cnx).expect("threads"); 26 | for thread in all_threads { 27 | println!("{:?}", thread); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /risso_api/src/config.rs: -------------------------------------------------------------------------------- 1 | //use crate::config_rs::*; 2 | use ::config::*; 3 | use std::env; 4 | 5 | /// Assemble the configuration from various sources: 6 | /// - built-in defaults 7 | /// - an optional TOML file from the `--config` command line argument 8 | /// - an optional `local.toml` file, for local development overrides 9 | pub fn load() -> Result { 10 | let mut s = Config::new(); 11 | 12 | // Load defaults 13 | s.merge(File::from_str(include_str!("defaults.toml"), FileFormat::Toml))?; 14 | 15 | // Find an optional "--config" command-line argument 16 | 17 | // Poor man's args parsing. Ok since we only have one, otherwise use the clap crate 18 | let mut args = env::args(); 19 | while let Some(arg) = args.next() { 20 | if arg == "--config" { 21 | break; 22 | } 23 | } 24 | 25 | if let Some(path) = args.next() { 26 | s.merge(File::with_name(&path))?; 27 | } 28 | 29 | // Load an optional local file (useful for development) 30 | s.merge(File::with_name("local").required(false))?; 31 | 32 | //s.try_into() 33 | Ok(s) 34 | } 35 | -------------------------------------------------------------------------------- /risso_api/src/schema.rs: -------------------------------------------------------------------------------- 1 | #![allow(proc_macro_derive_resolution_fallback)] 2 | 3 | use diesel::*; 4 | // Schema generated with `diesel print-schema` and hand-edited to remove lots of Nullable 5 | 6 | table! { 7 | preferences (key) { 8 | key -> Text, 9 | value -> Text, 10 | } 11 | } 12 | 13 | table! { 14 | threads (id) { 15 | id -> Integer, 16 | uri -> Text, // Unique 17 | title -> Text, // FIXME: check if it has to be nullable 18 | } 19 | } 20 | 21 | table! { 22 | comments (id) { 23 | #[sql_name = "tid"] 24 | thread_id -> Integer, 25 | id -> Integer, 26 | parent -> Nullable, 27 | created -> Double, // print_schema generates a Float 28 | modified -> Nullable, 29 | mode -> Integer, // status: 1 = valid, 2 = pending, # 4 = soft-deleted (cannot hard delete because of replies) 30 | remote_addr -> Text, 31 | text -> Text, 32 | author -> Nullable, 33 | email -> Nullable, 34 | website -> Nullable, 35 | likes -> Integer, 36 | dislikes -> Integer, 37 | notification -> Bool, 38 | voters -> Binary, // bloom_filter(remote_addr), initialized with poster's address so he can't vote on himself 39 | } 40 | } 41 | 42 | joinable!(comments -> threads (thread_id)); 43 | allow_tables_to_appear_in_same_query!(comments, threads); 44 | -------------------------------------------------------------------------------- /risso_api/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | edition = "2018" 3 | name = "risso_api" 4 | version = "0.1.0" 5 | description = "API implementation of a Rust clone of the ISSO comment server" 6 | authors = ["Sylvain Wallez "] 7 | license = "Apache-2.0" 8 | 9 | [dependencies] 10 | # Essentials 11 | failure = "0.1" 12 | lazy_static = "1.2" 13 | chrono = { version = "0.4", features = ["serde"] } 14 | num-traits = "0.2" 15 | maplit = "1.0" 16 | 17 | # Logging 18 | log = "0.4.6" 19 | slog = "2.4.1" 20 | env_logger = "0.5.13" 21 | slog-term = "2.4.0" 22 | slog-json = "2.2.0" 23 | slog-async = "2.3.0" 24 | slog-scope = "4.0.1" 25 | intern = "0.2.0" 26 | 27 | # The mighty serde and its minions 28 | serde = "1.0" 29 | serde_derive = "1.0" 30 | serde_json = "1.0" 31 | validator = "0.8" 32 | validator_derive = "0.8" 33 | 34 | # Async support 35 | futures = "0.1" 36 | tokio-threadpool = "0.1" 37 | tokio-executor = "0.1" 38 | 39 | # Database stuff 40 | diesel = { version = "1.3", features = ["sqlite", "r2d2"] } 41 | #diesel_codegen = "0.16.1" 42 | #diesel_codegen_syntex = "0.9.0" 43 | 44 | # Mardown & html handling 45 | ammonia = "1.2" # HTML sanitizer 46 | pulldown-cmark = "0.2" 47 | 48 | # Misc 49 | config = { version = "0.9", features = ["toml"] } 50 | prometheus = "0.4" 51 | 52 | sha1 = "0.6" 53 | md5 = "0.5" 54 | 55 | lettre = "0.8" 56 | lettre_email = "0.8" 57 | native-tls = "0.1" 58 | 59 | # Later 60 | #cache_2q = "0.10.0" 61 | #cached = "0.8.0" 62 | 63 | #[target.x86_64-unknown-linux-musl.dependencies] 64 | # See https://github.com/emk/rust-musl-builder#making-diesel-work 65 | #libsqlite3-sys = { version = "*", features = ["bundled"] } 66 | -------------------------------------------------------------------------------- /risso_actix/src/request_logger.rs: -------------------------------------------------------------------------------- 1 | use slog; 2 | 3 | use risso_api::logs::macros::*; 4 | 5 | use actix_web::{Error, FromRequest, HttpRequest}; 6 | use actix_web_requestid::RequestIDGetter; 7 | use std::ops::Deref; 8 | 9 | /// A `FromRequest` integrating `slog` with the `actix_request_id` crate: it resolves to a 10 | /// `slog::Logger` that has a `request_id` key/value pair to allow tracing a request in the log 11 | /// statements of code that contributed to processing it. 12 | /// 13 | /// The `scope()` method runs a closure in the context of the resquest logger. 14 | 15 | pub struct RequestLogger(slog::Logger); 16 | 17 | impl RequestLogger { 18 | /// Deconstruct to an inner value 19 | pub fn into_inner(self) -> slog::Logger { 20 | self.0 21 | } 22 | 23 | /// Execute code in the request's logging scope. Convenience wrapper around `slog_scope::scope()`. 24 | #[inline] 25 | pub fn scope(&self, f: SF) -> R 26 | where 27 | SF: FnOnce() -> R, 28 | { 29 | slog_scope::scope(&self.0, f) 30 | } 31 | } 32 | 33 | impl FromRequest for RequestLogger { 34 | type Config = (); 35 | type Result = Result; 36 | 37 | #[inline] 38 | fn from_request(req: &HttpRequest, _: &Self::Config) -> Self::Result { 39 | // String processing because request_id.0 is private 40 | let req_id = format!("{:?}", req.request_id()) 41 | .replace("RequestID(\"", "") 42 | .replace("\")", ""); 43 | 44 | // Return the current logger augmented with the request_id 45 | let new_log = slog_scope::logger().new(slog_o!("request_id" => req_id)); 46 | 47 | Ok(RequestLogger(new_log)) 48 | } 49 | } 50 | 51 | /// Allow direct access to `Logger` methods from a `RequestLogger`. 52 | /// 53 | impl Deref for RequestLogger { 54 | type Target = slog::Logger; 55 | 56 | fn deref(&self) -> &slog::Logger { 57 | &self.0 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Risso - a comment server for static websites 2 | 3 | [![Build Status](https://travis-ci.org/swallez/risso.svg?branch=master)](https://travis-ci.org/swallez/risso) 4 | 5 | Risso is a Rust port of [Isso](https://posativ.org/isso/), a self-hosted comment server. 6 | The name, obviously, is a combination of "**r**ust" and "isso" (which is itself an acronym). 7 | 8 | This is my playground to learn Rust and experiment web application development with 9 | the Rust ecosystem. 10 | 11 | **Risso is not yet functional**. It compiles successfully, but is still very much a **work in progress**. 12 | 13 | It is composed of several sub-projects: 14 | - `risso_api` is the heart of the system, providing the APIs as a set of functions, 15 | independent of the web environment. This separation allows to easily experiment with 16 | various web frameworks or even with [serverless](https://github.com/srijs/rust-aws-lambda) front-ends. 17 | 18 | - `risso_actix` exposes `risso_api` as an http service using [actix-web](https://actix.rs/). 19 | 20 | - `risso_admin` is empty for now, and is meant to be the admin front-end to moderate 21 | comments. To go full Rust, it will be target WebAssembly using [Yew](https://github.com/DenisKolodin/yew), 22 | a React-inspired front-end framework. 23 | 24 | ## Components & features 25 | 26 | Risso is the aggregation of many great crates from the Rust ecosystem. Rust comes with 27 | "batteries excluded", with a great but minimal standard library. Finding good 28 | batteries is key to be productive. Risso uses, among others: 29 | - web framework: actix 30 | - data validation: validator 31 | - database access / ORM: diesel 32 | - thread pools: tokio-threadpool 33 | - structured logs: slogs 34 | - metrics: prometheus 35 | - date calculations: chrono 36 | - futures for asynchronous programming (until it's built into the standard lib) 37 | - serialization/deserialization to about any format: serde 38 | - handling configurations: config 39 | - error handling: failure 40 | - markdown parsing & rendering: pulldown-cmark 41 | - html parsing & sanitization: html5ever & ammonia 42 | - smtp client: lettre 43 | 44 | ## License 45 | 46 | This project is licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0). 47 | -------------------------------------------------------------------------------- /risso_actix/src/metrics.rs: -------------------------------------------------------------------------------- 1 | //! Integration of the prometheus crate with Actix-Web. It provides a middleware to measure 2 | //! request processing time, and a http endpoint to publish the metrics. 3 | 4 | use actix_web::middleware::*; 5 | use actix_web::*; 6 | 7 | use prometheus::*; 8 | 9 | use std::cell::Cell; 10 | 11 | /// Actix-Web endpoint to dump prometheus metrics 12 | /// 13 | pub fn handler(_req: HttpRequest) -> actix_web::Result { 14 | use prometheus::Encoder; 15 | 16 | let encoder = prometheus::TextEncoder::new(); 17 | let metric_families = prometheus::gather(); 18 | 19 | let mut buffer = vec![]; 20 | encoder 21 | .encode(&metric_families, &mut buffer) 22 | .map(|_| HttpResponse::Ok().content_type("text/plain").body(buffer)) 23 | .map_err(|err| err.into()) 24 | } 25 | 26 | #[derive(Clone)] 27 | pub struct MiddlewareBuilder { 28 | histogram: HistogramVec, 29 | } 30 | 31 | impl MiddlewareBuilder { 32 | /// Creates the metrics builder by registering a new histogram for request metrics. 33 | /// Actual middlewares must be created using `build()`. 34 | pub fn builder() -> std::result::Result { 35 | let histogram_opts = HistogramOpts::new("req_time", "histo_help").subsystem("actix_web"); 36 | 37 | let histogram = HistogramVec::new(histogram_opts, &["status"]).unwrap(); 38 | 39 | register(Box::new(histogram.clone()))?; 40 | 41 | Ok(Self { histogram }) 42 | } 43 | 44 | pub fn build(&self) -> MetricsMiddleware { 45 | MetricsMiddleware { 46 | histogram: self.histogram.clone(), 47 | instant: Cell::new(None), 48 | } 49 | } 50 | } 51 | 52 | use std::time::{Duration, Instant}; 53 | 54 | /// Actix-Web metrics middleware. It collects response times for http requests, grouped by status 55 | /// code. 56 | /// 57 | /// It must be created using a `Builder` or `clone()`'d from another middleware, so that all 58 | /// instances share the same underlying histogram. 59 | /// 60 | #[allow(clippy::stutter)] 61 | #[derive(Clone)] 62 | pub struct MetricsMiddleware { 63 | histogram: HistogramVec, 64 | instant: Cell>, 65 | } 66 | 67 | #[inline] 68 | #[allow(clippy::cast_precision_loss)] 69 | fn duration_to_seconds(d: Duration) -> f64 { 70 | let nanos = f64::from(d.subsec_nanos()) / 1e9; 71 | d.as_secs() as f64 + nanos 72 | } 73 | 74 | impl Middleware for MetricsMiddleware { 75 | /// Called when request is ready. 76 | fn start(&self, _req: &HttpRequest) -> actix_web::Result { 77 | self.instant.set(Some(Instant::now())); 78 | 79 | Ok(Started::Done) 80 | } 81 | 82 | /// Called after body stream get sent to peer. 83 | fn finish(&self, _req: &HttpRequest, resp: &HttpResponse) -> Finished { 84 | if let Some(start) = self.instant.get() { 85 | let secs = duration_to_seconds(start.elapsed()); 86 | 87 | self.histogram 88 | .with_label_values(&[resp.status().as_str()]) 89 | .observe(secs); 90 | 91 | self.instant.set(None); 92 | } 93 | 94 | Finished::Done 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # 2 | # Run "make" to have a list of the main targets 3 | # 4 | 5 | # Rust compiler image - see https://github.com/clux/muslrust 6 | muslrust-img = clux/muslrust:1.30.0-stable 7 | 8 | # Rust-in-Docker invocation 9 | # The 'muslrust-cache' volume avoids downloading the dependencies at each build. 10 | # The 'risso-musl-target' volume caches the 'target' dir. We could also just mount '$PWD/target' but on 11 | # MacOS this makes the build unbearably slow. 12 | muslrust-builder := docker run --rm -it\ 13 | -v $(PWD):/volume:cached\ 14 | -v muslrust-cache:/root/.cargo\ 15 | -v risso-musl-target:/volume/target\ 16 | $(muslrust-img) 17 | 18 | help: 19 | @echo "Main targets:" 20 | @echo "- check: check code for errors (faster than 'build')" 21 | @echo "- lint: run the clippy linter" 22 | @echo "- deps-tree: print the dependency tree" 23 | @echo "- cloc: count lines of code" 24 | @echo "- docker-image: build the 'risso-actix' Docker image" 25 | @echo "- test: runs the tests" 26 | @echo "- doc: build the docs" 27 | @echo "- build: build the risso_actix binary" 28 | @echo "- release: build the optimized risso_actix binary" 29 | @echo "- reports: reports on license, outdated crates and security warnings" 30 | 31 | check: 32 | cargo check --all --all-targets 33 | 34 | lint: 35 | cargo clippy 36 | 37 | deps-tree: 38 | (cd risso_actix; cargo tree --no-dev-dependencies) 39 | 40 | cloc: 41 | cloc --vcs=git 42 | 43 | doc: 44 | cargo doc --no-deps 45 | 46 | clippy: 47 | cargo clippy --all-targets -- -D clippy::all -D clippy::pedantic 48 | 49 | test: 50 | cargo test 51 | 52 | build: 53 | cargo build --package risso_actix --bin risso_actix 54 | 55 | build-release: 56 | cargo build --package risso_actix --bin risso_actix --release 57 | 58 | musl-test: 59 | $(muslrust-builder) cargo test --release 60 | 61 | musl-build: musl-test 62 | $(muslrust-builder) sh -c "\ 63 | cargo build --package risso_actix --release --bin risso_actix && \ 64 | strip --only-keep-debug target/x86_64-unknown-linux-musl/release/risso_actix" 65 | # Create a dummy container for the purpose of copying the executable locally. 66 | docker container create --name musl-dummy -v risso-musl-target:/volume/target $(muslrust-img) 67 | docker cp musl-dummy:/volume/target/x86_64-unknown-linux-musl/release/risso_actix target/risso_actix-musl-release 68 | docker rm musl-dummy 69 | 70 | musl-clean: 71 | docker volume rm -f muslrust-cache 72 | docker volume rm -f risso-musl-target 73 | 74 | musl-shell: 75 | $(muslrust-builder) bash 76 | 77 | docker-image: musl-build 78 | docker build -t risso-actix . 79 | 80 | reports: 81 | @echo "--------------------------------------------------------------------------------" 82 | @echo " License report" 83 | @echo "--------------------------------------------------------------------------------" 84 | @cargo license 85 | @echo 86 | @echo "--------------------------------------------------------------------------------" 87 | @echo " Outdated crates" 88 | @echo "--------------------------------------------------------------------------------" 89 | @cargo outdated 90 | @echo 91 | @echo "--------------------------------------------------------------------------------" 92 | @echo " Security audit" 93 | @echo "--------------------------------------------------------------------------------" 94 | @cargo audit 95 | -------------------------------------------------------------------------------- /risso_api/src/context.rs: -------------------------------------------------------------------------------- 1 | #![allow(dead_code, deprecated)] 2 | 3 | // Republish diesel's manager so that server impls don't have to add it to their deps. 4 | pub use diesel::r2d2::ConnectionManager; 5 | use diesel::r2d2::Pool; 6 | use serde_derive::Deserialize; 7 | 8 | use futures::future::Future; 9 | 10 | use crate::logs::macros::*; 11 | 12 | #[derive(Deserialize)] 13 | struct ContextConfig { 14 | db_path: String, 15 | min_connections: u32, 16 | max_connections: u32, 17 | } 18 | 19 | /// Single location where choose the actual database backend we're using. 20 | /// TODO: add compile-time feature to choose between `SQLite`, `PG` and `MySQL` 21 | /// 22 | pub type Connection = diesel::sqlite::SqliteConnection; 23 | pub type DB = diesel::sqlite::Sqlite; 24 | 25 | /// Base type from which `ApiContext` objects can be built. It must be held by the main thread, as it 26 | /// contains the main thread pool object from which individual `Executors` can be obtained. 27 | /// Dropping `ApiContextBootstrap` drops the pool. 28 | /// 29 | pub struct ApiBuilder { 30 | pub cnx_pool: Pool>, 31 | pub thread_pool: tokio_threadpool::ThreadPool, 32 | pub registry: prometheus::Registry, 33 | } 34 | 35 | impl ApiBuilder { 36 | #[allow(clippy::new_ret_no_self)] 37 | pub fn new() -> Result { 38 | let config = crate::CONFIG.get::("database")?; 39 | 40 | info!( 41 | "Using database at {} with max {} connections.", 42 | config.db_path, config.max_connections 43 | ); 44 | 45 | let cnx_manager = ConnectionManager::::new(config.db_path); 46 | 47 | let cnx_pool = Pool::builder() 48 | .max_size(config.max_connections) 49 | .min_idle(Some(config.min_connections)) 50 | .build(cnx_manager)?; 51 | 52 | let thread_pool = tokio_threadpool::Builder::new() 53 | .name_prefix("risso-api") 54 | .keep_alive(Some(std::time::Duration::from_secs(30))) 55 | .pool_size(config.max_connections as usize) 56 | .build(); 57 | 58 | let registry = prometheus::Registry::new(); 59 | 60 | Ok(Self { 61 | cnx_pool, 62 | thread_pool, 63 | registry, 64 | }) 65 | } 66 | 67 | pub fn build(&self) -> ApiContext { 68 | ApiContext { 69 | cnx_pool: self.cnx_pool.clone(), 70 | executor: self.thread_pool.sender().clone(), 71 | } 72 | } 73 | } 74 | 75 | #[allow(clippy::stutter)] 76 | #[derive(Clone)] 77 | pub struct ApiContext { 78 | cnx_pool: Pool>, 79 | executor: tokio_threadpool::Sender, 80 | } 81 | 82 | impl ApiContext { 83 | // https://github.com/diesel-rs/diesel/issues/399#issuecomment-360535059 84 | 85 | /// Run a blocking operation on the database on the context's thread pool and return a future 86 | pub fn spawn_db(&self, f: F) -> impl Future 87 | where 88 | T: Send + 'static, 89 | E: std::error::Error + Send + Sync + 'static, 90 | F: FnOnce(&Connection) -> Result + Send + 'static, 91 | { 92 | use futures::sync::oneshot; 93 | 94 | let pool = self.cnx_pool.clone(); 95 | oneshot::spawn_fn( 96 | move || { 97 | let cnx = pool.get().map_err(failure::Error::from)?; 98 | f(&cnx).map_err(failure::Error::from) 99 | }, 100 | &self.executor, 101 | ) 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /risso_api/src/logs.rs: -------------------------------------------------------------------------------- 1 | use log; // see https://github.com/rust-lang/rust/issues/56398 2 | use slog; 3 | use slog_async; 4 | use slog_json; 5 | use slog_scope; 6 | use slog_term; 7 | 8 | pub mod macros { 9 | // Since slog also defines log's macros, we can't blindly import "slog::*" but always repeating 10 | // these imports is a pain. So just `use logs::macros::*` and you're all set. 11 | pub use log::{debug, error, info, trace, warn}; 12 | pub use slog::{slog_crit, slog_debug, slog_error, slog_info, slog_log, slog_o, slog_trace, slog_warn}; 13 | } 14 | 15 | /// Setup the slog logging framework and the log->slog bridge for crates that use log. 16 | /// 17 | /// The result contains the root logger and a slog-scope global logger guard for this root logger. 18 | /// The global logger is unset once the guard is dropped. 19 | /// 20 | pub fn setup_slog() -> (slog_scope::GlobalLoggerGuard, slog::Logger) { 21 | use slog::*; 22 | 23 | let decorator = slog_term::TermDecorator::new().force_color().build(); 24 | let _term_drain = slog_term::FullFormat::new(decorator).build(); 25 | 26 | let json_drain = slog_json::Json::default(std::io::stderr()); 27 | 28 | // Pick your format 29 | //let drain = term_drain; 30 | let drain = json_drain; 31 | 32 | // Display only info+ 33 | let drain = drain.filter_level(Level::Info); 34 | 35 | let drain = slog_async::Async::new(drain.fuse()).build().fuse(); 36 | 37 | let log = Logger::root( 38 | drain, 39 | slog_o!( 40 | "location" => FnValue(|info : &Record| { 41 | format!("{}:{}", info.module(), info.line()) 42 | }) 43 | ), 44 | ); 45 | 46 | // Bridge std log 47 | log::set_boxed_logger(Box::new(SlogStdLogger(log.clone()))).unwrap(); 48 | log::set_max_level(log::LevelFilter::max()); 49 | 50 | // Set slog default logger 51 | let guard = slog_scope::set_global_logger(log.clone()); 52 | 53 | (guard, log) 54 | } 55 | 56 | /// Bridge from log to slog. The slog-stdlog crate has not yet been updated to log 0.4 57 | /// (see ) 58 | /// 59 | struct SlogStdLogger(slog::Logger); 60 | 61 | impl SlogStdLogger { 62 | #[inline] 63 | pub fn log_to_slog_level(level: log::Level) -> slog::Level { 64 | match level { 65 | log::Level::Trace => slog::Level::Trace, 66 | log::Level::Debug => slog::Level::Debug, 67 | log::Level::Info => slog::Level::Info, 68 | log::Level::Warn => slog::Level::Warning, 69 | log::Level::Error => slog::Level::Error, 70 | } 71 | } 72 | } 73 | 74 | impl log::Log for SlogStdLogger { 75 | fn enabled(&self, metadata: &log::Metadata) -> bool { 76 | use slog::Drain; 77 | self.0.is_enabled(Self::log_to_slog_level(metadata.level())) 78 | } 79 | 80 | fn log(&self, r: &log::Record) { 81 | // log provides Option<&'a str> while slog expects &'static str 82 | // We can expect log's strings to be static, but we can't safely decide to coerce them 83 | // into static strings, so we use an interning pool. 84 | let as_static = |opt: Option<&str>| -> &'static str { 85 | use intern::Intern; 86 | match opt { 87 | None => "", 88 | Some(s) => s.intern(), 89 | } 90 | }; 91 | 92 | let s = slog::RecordStatic { 93 | location: &slog::RecordLocation { 94 | file: "", // Using 'module' is nicer, so save the interning time. 95 | line: r.line().unwrap_or(0), 96 | column: 0, 97 | function: "", 98 | module: as_static(r.module_path()), 99 | }, 100 | level: Self::log_to_slog_level(r.metadata().level()), 101 | tag: r.target(), 102 | }; 103 | 104 | self.0.log(&slog::Record::new(&s, r.args(), slog::BorrowedKV(&()))); 105 | } 106 | 107 | fn flush(&self) {} 108 | } 109 | -------------------------------------------------------------------------------- /risso_api/src/dieselext.rs: -------------------------------------------------------------------------------- 1 | #![allow(proc_macro_derive_resolution_fallback)] 2 | 3 | use chrono::prelude::*; 4 | use diesel::backend::Backend; 5 | use diesel::deserialize::{self, FromSql}; 6 | use diesel::expression::SqlLiteral; 7 | use diesel::serialize::{self, Output, ToSql}; 8 | use diesel::sql_types::BigInt; 9 | use diesel::sql_types::Double; 10 | use diesel::Expression; 11 | use num_traits::cast::ToPrimitive; 12 | use serde_derive::{Deserialize, Serialize}; 13 | 14 | use std; 15 | use std::io::Write; 16 | 17 | // See https://github.com/diesel-rs/diesel/issues/1781 18 | pub fn count_star() -> SqlLiteral { 19 | diesel::dsl::sql::("count(*)") 20 | } 21 | 22 | /// A wrapper around Chrono's `DataTime` to read the ISSO database, that encodes dates using 23 | /// a double containing fractional seconds since the Epoch (similar to what JavaScript does) 24 | 25 | #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, FromSqlRow, AsExpression, Serialize, Deserialize)] 26 | pub struct FloatDateTime(pub DateTime); 27 | 28 | impl FloatDateTime { 29 | pub fn from_f64(f: f64) -> Option { 30 | Some(FloatDateTime(Utc.from_utc_datetime(&NaiveDateTime::from_timestamp( 31 | f.to_i64()?, 32 | (f.fract() * 1_000_000_000.0).round().to_u32()?, 33 | )))) 34 | } 35 | 36 | pub fn to_f64(&self) -> f64 { 37 | (self.0.timestamp().to_f64().unwrap()) + (f64::from(self.0.nanosecond()) / 1_000_000_000.0) 38 | } 39 | } 40 | 41 | impl ToSql for FloatDateTime 42 | where 43 | f64: ToSql, 44 | DB: Backend, 45 | { 46 | fn to_sql(&self, out: &mut Output) -> serialize::Result { 47 | let f = self.to_f64(); 48 | ToSql::::to_sql(&f, out) 49 | } 50 | } 51 | 52 | impl FromSql for FloatDateTime 53 | where 54 | f64: FromSql, 55 | DB: Backend, 56 | { 57 | fn from_sql(value: Option<&::RawValue>) -> deserialize::Result { 58 | let f64_value = >::from_sql(value)?; 59 | Self::from_f64(f64_value).ok_or_else(|| "Can't convert f64 to date".into()) 60 | } 61 | } 62 | 63 | impl Expression for FloatDateTime { 64 | type SqlType = Double; 65 | } 66 | 67 | //----- New type links to original type 68 | // Could be automated using https://github.com/JelteF/derive_more 69 | 70 | impl From> for FloatDateTime { 71 | fn from(dt: DateTime) -> Self { 72 | FloatDateTime(dt) 73 | } 74 | } 75 | 76 | impl AsRef> for FloatDateTime { 77 | fn as_ref(&self) -> &DateTime { 78 | &self.0 79 | } 80 | } 81 | 82 | impl AsMut> for FloatDateTime { 83 | fn as_mut(&mut self) -> &mut DateTime { 84 | &mut self.0 85 | } 86 | } 87 | 88 | impl std::ops::Deref for FloatDateTime { 89 | type Target = DateTime; 90 | fn deref(&self) -> &Self::Target { 91 | &self.0 92 | } 93 | } 94 | 95 | impl std::ops::DerefMut for FloatDateTime { 96 | fn deref_mut(&mut self) -> &mut Self::Target { 97 | &mut self.0 98 | } 99 | } 100 | 101 | //-------------------------------------------------------------------------------------------------- 102 | // Additional Diesel "DoubleTime" type that would map to a Chrono time that would avoid the 103 | // newtype wrapper. Work in progress. 104 | 105 | //#[derive(SqlType)] 106 | //#[sqlite_type = "Double"] 107 | //pub struct DoubleTime; 108 | // 109 | //impl ToSql for FloatDateTime 110 | // where 111 | // f64: ToSql, 112 | // DB: Backend, 113 | //{ 114 | // fn to_sql(&self, out: &mut Output) -> serialize::Result { 115 | // let f = self.to_f64(); 116 | // ToSql::::to_sql(&f, out) 117 | // } 118 | //} 119 | // 120 | //impl FromSql for FloatDateTime 121 | // where 122 | // f64: FromSql, 123 | // DB: Backend, 124 | //{ 125 | // fn from_sql(value: Option<&::RawValue>) -> deserialize::Result { 126 | // let f64_value = >::from_sql(value)?; 127 | // Ok(FloatDateTime::from_f64(f64_value)) 128 | // } 129 | //} 130 | // 131 | 132 | #[cfg(test)] 133 | mod tests { 134 | 135 | use super::FloatDateTime; 136 | use chrono::prelude::*; 137 | 138 | #[test] 139 | fn to_from_f64() { 140 | let n = Utc::now(); 141 | let f = FloatDateTime(n).to_f64(); 142 | 143 | let n2 = FloatDateTime::from_f64(f).unwrap().0; 144 | let f2 = FloatDateTime(n2).to_f64(); 145 | 146 | // Verify that all values are within the same millisecond (can't check equality because 147 | // of rounding happening when converting float to/from integer). 148 | assert!((f - f2).abs() < 0.001); 149 | assert!((n - n2).num_milliseconds() == 0); 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /risso_api/src/models.rs: -------------------------------------------------------------------------------- 1 | #![allow(proc_macro_derive_resolution_fallback)] 2 | 3 | use crate::context; 4 | use crate::dieselext; 5 | use crate::dieselext::*; 6 | use crate::logs::macros::*; 7 | use crate::schema::*; 8 | 9 | use diesel::prelude::*; 10 | use diesel::result::QueryResult; 11 | use diesel::sql_types::Bool; 12 | 13 | use serde_derive::{Deserialize, Serialize}; 14 | 15 | use prometheus::Counter; 16 | 17 | /// isso [handles comment mode values in a weird way][1]: each possible mode is a bit, and selection 18 | /// happens by testing against a bitmask rather than using SQL 'IN'. 19 | /// 20 | /// Value 5 is used by default, selecting valid and soft-deleted comments. 21 | /// 22 | /// [1]: https://github.com/posativ/isso/blob/f2333d716d661a5ab1d0102b3f5890080267755a/isso/db/comments.py#L182 23 | 24 | pub enum CommentMode { 25 | Valid = 1, 26 | Pending = 2, 27 | SoftDeleted = 4, // cannot hard delete because of replies 28 | } 29 | 30 | impl CommentMode { 31 | pub fn mask(opt_mode: Option) -> diesel::expression::SqlLiteral { 32 | let mode = opt_mode.unwrap_or(5); 33 | diesel::dsl::sql::(&format!("({} | comments.mode) = {}", mode, mode)) 34 | } 35 | } 36 | 37 | #[derive(Queryable, Debug)] 38 | pub struct Preference { 39 | pub key: String, 40 | pub value: String, 41 | } 42 | 43 | #[derive(Clone, Queryable, Debug, Serialize, Deserialize)] 44 | pub struct Thread { 45 | pub id: i32, 46 | pub uri: String, 47 | pub title: String, 48 | } 49 | 50 | #[derive(Queryable, Debug, Serialize)] 51 | pub struct Comment { 52 | pub thread_id: i32, 53 | pub id: i32, 54 | pub parent: Option, 55 | pub created: FloatDateTime, 56 | pub modified: Option, 57 | pub mode: i32, 58 | pub remote_addr: String, 59 | pub text: String, 60 | pub author: Option, 61 | pub email: Option, 62 | pub website: Option, 63 | pub likes: i32, 64 | pub dislikes: i32, 65 | pub notification: bool, 66 | pub voters: Vec, 67 | } 68 | 69 | lazy_static! { 70 | static ref HTTP_COUNTER: Counter = register_counter!(opts!( 71 | "example_http_requests_total", 72 | "Total number of HTTP requests made.", 73 | labels! {"handler" => "all",} 74 | )) 75 | .unwrap(); 76 | } 77 | 78 | impl Comment { 79 | /// Return comments for `uri` with `mode`. 80 | #[allow(clippy::too_many_arguments)] 81 | pub fn fetch( 82 | cnx: &context::Connection, 83 | uri: String, 84 | mode: Option, 85 | after: f64, 86 | parent: Option, 87 | order_by: Option, 88 | asc: bool, 89 | limit: Option, 90 | ) -> QueryResult> { 91 | use crate::schema::comments; 92 | use crate::schema::threads; 93 | 94 | let mut q = comments::table 95 | .inner_join(threads::table) 96 | .select(comments::all_columns) 97 | .filter( 98 | threads::uri 99 | .eq(uri) 100 | .and(CommentMode::mask(mode)) 101 | .and(comments::created.gt(after)), 102 | ) 103 | .into_boxed(); 104 | 105 | q = match parent { 106 | None => q.filter(comments::parent.is_null()), 107 | Some(0) => q, // 'any' in the python version 108 | Some(id) => q.filter(comments::parent.eq(id)), 109 | }; 110 | 111 | q = if asc { 112 | // https://stackoverflow.com/a/48034647 113 | match &order_by.unwrap_or_else(|| String::from("id"))[..] { 114 | "created" => q.order(comments::created.asc()), 115 | "modified" => q.order(comments::modified.asc()), 116 | "likes" => q.order(comments::likes.asc()), 117 | "dislikes" => q.order(comments::dislikes.asc()), 118 | _ => q.order(comments::id.asc()), 119 | } 120 | } else { 121 | // FIXME: find a way to avoid this repetition... 122 | match &order_by.unwrap_or_else(|| String::from("id"))[..] { 123 | "created" => q.order(comments::created.desc()), 124 | "modified" => q.order(comments::modified.desc()), 125 | "likes" => q.order(comments::likes.desc()), 126 | "dislikes" => q.order(comments::dislikes.desc()), 127 | _ => q.order(comments::id.desc()), 128 | } 129 | }; 130 | 131 | q = match limit { 132 | None => q, 133 | Some(limit) => q.limit(limit), 134 | }; 135 | 136 | trace!("{:?}", diesel::debug_query::(&q)); 137 | 138 | q.load(cnx) 139 | } 140 | 141 | /// Return comment count for main thread and all reply threads for one url. 142 | pub fn reply_count( 143 | cnx: &context::Connection, 144 | uri: String, 145 | mode: Option, 146 | after: f64, 147 | ) -> QueryResult, i64)>> { 148 | let stmt = comments::table 149 | .inner_join(threads::table) 150 | .select((comments::parent, dieselext::count_star())) 151 | .filter( 152 | threads::uri 153 | .eq(uri) 154 | .and(CommentMode::mask(mode)) 155 | .and(comments::created.gt(after)), 156 | ) 157 | .group_by(comments::parent); 158 | 159 | trace!("{:?}", diesel::debug_query::(&stmt)); 160 | 161 | stmt.load(cnx) 162 | } 163 | } 164 | -------------------------------------------------------------------------------- /risso_actix/src/main.rs: -------------------------------------------------------------------------------- 1 | // Clippy complains about `State` that could be passed by reference, but actix-web requires it to 2 | // be passed by value 3 | #![allow(clippy::needless_pass_by_value)] 4 | 5 | use serde_derive::Deserialize; 6 | 7 | mod metrics; 8 | mod request_logger; 9 | 10 | use actix_web::http::header; 11 | use actix_web::http::Method; 12 | use actix_web::middleware::cors; 13 | use actix_web::{server, App, AsyncResponder, HttpRequest, HttpResponse, Json, Path, Query, Responder, State}; 14 | use std::sync::Once; 15 | 16 | use risso_api::context::*; 17 | use risso_api::logs; 18 | use risso_api::logs::macros::*; 19 | 20 | use futures::prelude::*; 21 | 22 | use crate::request_logger::RequestLogger; 23 | 24 | fn unsubscribe(state: State, path: Path<(String, String, String)>) -> impl Responder { 25 | let (id, email, key) = path.into_inner(); 26 | 27 | risso_api::unsubscribe(&state, id, email, key).map(Json).responder() 28 | } 29 | 30 | pub fn view(id: Path, req: HttpRequest) -> impl Responder { 31 | let plain = req.query().contains_key("plain"); 32 | 33 | format!( 34 | "id={:?}, match_id={:?}, plain={:?}, matchInfo={:?}", 35 | id, 36 | req.match_info().get("id"), 37 | plain, 38 | req.match_info() 39 | ) 40 | } 41 | 42 | #[derive(Deserialize)] 43 | pub struct NewCommentParams { 44 | pub uri: String, 45 | } 46 | 47 | pub fn new_comment( 48 | _log: RequestLogger, 49 | state: State, 50 | req: Query, 51 | body: Json, 52 | ) -> impl Responder { 53 | risso_api::new_comment(&state, req.into_inner().uri, body.into_inner()) 54 | .map(Json) 55 | .responder() 56 | } 57 | 58 | pub fn fetch(log: RequestLogger, state: State, req: Query) -> impl Responder { 59 | slog_info!(log, "Fetching comments"); 60 | 61 | risso_api::fetch(&state, req.into_inner()).map(Json).responder() 62 | } 63 | 64 | //-------------------------------------------------------------------------------------------------- 65 | 66 | #[derive(Deserialize)] 67 | pub struct ActixConfig { 68 | listen_addr: String, 69 | allowed_origins: Vec, 70 | } 71 | 72 | pub fn main() -> Result<(), failure::Error> { 73 | let (_guard, _log) = logs::setup_slog(); 74 | 75 | info!("Starting..."); 76 | 77 | let config = risso_api::CONFIG.get::("actix")?; 78 | 79 | let listen_addr = config.listen_addr; 80 | let allowed_origins = config.allowed_origins; 81 | 82 | let api_builder = ApiBuilder::new()?; 83 | let api = api_builder.build(); 84 | 85 | let metrics_builder = metrics::MiddlewareBuilder::builder()?; 86 | 87 | let srv = server::new(move || { 88 | App::with_state(api.clone()) 89 | .route("/", Method::GET, fetch) 90 | .route("/new", Method::POST, new_comment) 91 | .route("/count", Method::GET, get_counts) 92 | .route("/counts", Method::POST, post_counts) 93 | .route("/feed", Method::GET, feed) 94 | .route("/id/{id}", Method::GET, view) 95 | .route("/id/{id}/unsubscribe/{email}/{key}", Method::GET, unsubscribe) 96 | .route( 97 | "/id/{id}/{action:(edit|delete|activate)}/{key}", 98 | Method::GET, 99 | comment_action, 100 | ) 101 | .route( 102 | "/id/{id}/{action:(edit|delete|activate)}/{key}", 103 | Method::POST, 104 | comment_action, 105 | ) 106 | .route("/id/{id}/like", Method::POST, like) 107 | .route("/id/{id}/dislike", Method::POST, dislike) 108 | .route("/preview", Method::POST, preview) 109 | .route("/admin", Method::GET, admin) 110 | .route("/metrics", Method::GET, metrics::handler) 111 | .middleware(metrics_builder.build()) 112 | .middleware(build_cors(&allowed_origins)) 113 | .middleware(actix_web_requestid::RequestIDHeader) 114 | }); 115 | 116 | srv.bind(listen_addr)?.run(); 117 | 118 | Ok(()) 119 | } 120 | 121 | fn build_cors(origins: &[String]) -> cors::Cors { 122 | static CHECK: Once = Once::new(); 123 | CHECK.call_once(|| { 124 | if origins.is_empty() { 125 | warn!("No CORS origins set. Make sure you configure 'actix.allowed_origins'"); 126 | } 127 | }); 128 | 129 | let mut cors = cors::Cors::build(); 130 | 131 | for origin in origins { 132 | cors.allowed_origin(&origin); 133 | } 134 | 135 | cors.allowed_headers(vec![header::AUTHORIZATION, header::ACCEPT, header::CONTENT_TYPE]) 136 | .max_age(3600); 137 | 138 | cors.finish() 139 | } 140 | 141 | //-------------------------------------------------------------------------------------------------- 142 | // Stubs 143 | 144 | fn todo() -> HttpResponse { 145 | HttpResponse::NotImplemented().body("Not implemented yet!") 146 | } 147 | 148 | fn get_counts(_state: State) -> HttpResponse { 149 | todo() 150 | } 151 | 152 | fn post_counts(_state: State) -> HttpResponse { 153 | todo() 154 | } 155 | 156 | fn feed(_state: State) -> HttpResponse { 157 | todo() 158 | } 159 | 160 | fn comment_action(_state: State) -> HttpResponse { 161 | todo() 162 | } 163 | 164 | fn like(_state: State) -> HttpResponse { 165 | todo() 166 | } 167 | 168 | fn dislike(_state: State) -> HttpResponse { 169 | todo() 170 | } 171 | 172 | fn preview(_state: State) -> HttpResponse { 173 | todo() 174 | } 175 | 176 | fn admin(_state: State) -> HttpResponse { 177 | todo() 178 | } 179 | -------------------------------------------------------------------------------- /risso_api/src/lib.rs: -------------------------------------------------------------------------------- 1 | #![allow(dead_code, deprecated)] 2 | 3 | // Some crates still need pre-2018 macro_use either because their macros are private or 4 | // because of name mismatch. 5 | #[macro_use] 6 | extern crate prometheus; 7 | #[macro_use] 8 | extern crate validator_derive; 9 | #[macro_use] 10 | extern crate diesel; 11 | #[macro_use] 12 | extern crate lazy_static; 13 | 14 | use serde_derive::{Deserialize, Serialize}; 15 | 16 | //use config as config_rs; // rename it as we have our own 'config' module 17 | 18 | use chrono::prelude::*; 19 | 20 | use futures::future::Future; 21 | 22 | use crate::context::ApiContext; 23 | 24 | use validator::Validate; 25 | 26 | mod config; 27 | pub mod context; 28 | pub mod dieselext; 29 | pub mod logs; 30 | pub mod models; 31 | pub mod schema; 32 | 33 | lazy_static! { 34 | /// Global configuration object. Each module can pick its own section in the configuration. 35 | pub static ref CONFIG: ::config::Config = crate::config::load().unwrap(); 36 | 37 | /// General configurations (private to this crate) 38 | static ref GENERAL_CONFIG: GeneralConfig = CONFIG.get("general").unwrap(); 39 | 40 | /// General configurations (private to this crate) 41 | static ref SMTP_CONFIG: SmtpConfig = CONFIG.get("smtp").unwrap(); 42 | 43 | } 44 | 45 | // newtype: use defer to pull wrapped type's methods 46 | // https://doc.rust-lang.org/book/second-edition/ch19-03-advanced-traits.html#using-the-newtype-pattern-to-implement-external-traits-on-external-types 47 | 48 | pub type ThreadId = i32; 49 | pub type CommentId = i32; 50 | 51 | #[derive(Deserialize)] 52 | struct GeneralConfig { 53 | gravatar_url: String, 54 | } 55 | 56 | #[derive(Deserialize)] 57 | struct SmtpConfig { 58 | username: Option, 59 | password: Option, 60 | host: String, 61 | port: i32, 62 | to: String, 63 | from: String, 64 | } 65 | 66 | /// A boxed future returning a generic result and a `failure::Error`. Shortcut to simplify return statements. 67 | /// Boxed futures allow returning various Future implementations from a function. 68 | type BoxFuture = Box>; 69 | 70 | /// Validate an object that implement `validator::Validate` and return a boxed future error 71 | /// if validation failed. 72 | /// 73 | /// Typical usage is `if let Some(err) = validate(&v) { return err; }` or using the `validate!` macro. 74 | /// 75 | pub fn validate(v: &T) -> Option> { 76 | if let Err(e) = v.validate() { 77 | Some(futures::failed(e.into()).boxed()) 78 | } else { 79 | None 80 | } 81 | } 82 | 83 | /// Convenience macro to validate a set of objects that implement `validator::Validate` and return 84 | /// a boxed future error if validation failed. 85 | /// 86 | /// Usage: `validate!(foo, bar, baz);` 87 | /// 88 | macro_rules! validate { 89 | ( $( $x:expr ),* ) => { 90 | $( if let Some(e) = validate($x) { return e; } )* 91 | } 92 | } 93 | 94 | //-------------------------------------------------------------------------------------------------- 95 | // Common api structures 96 | 97 | #[derive(Serialize)] 98 | pub struct CommentResponse { 99 | id: CommentId, 100 | parent: Option, 101 | text: String, 102 | author: Option, 103 | website: Option, 104 | mode: i32, 105 | created: DateTime, 106 | modified: Option>, 107 | likes: i32, 108 | dislikes: i32, 109 | hash: String, 110 | gravatar_image: String, 111 | } 112 | 113 | //-------------------------------------------------------------------------------------------------- 114 | // New comment 115 | 116 | #[derive(Clone, Deserialize, Validate)] 117 | pub struct NewComment { 118 | author: Option, 119 | email: Option, 120 | text: String, 121 | parent: Option, 122 | website: Option, 123 | } 124 | 125 | pub fn new_comment(_ctx: &ApiContext, uri: String, req: NewComment) -> BoxFuture { 126 | validate!(&req); 127 | drop(uri); 128 | drop(req); 129 | 130 | unimplemented!() 131 | } 132 | 133 | /// Sanitize html 134 | /// 135 | /// ```rust 136 | /// use risso_api::sanitize_html; 137 | /// 138 | /// assert_eq!(sanitize_html("foo"), "foo".to_owned()); 139 | /// ``` 140 | /// 141 | pub fn sanitize_html(html: &str) -> String { 142 | // See https://posativ.org/isso/docs/configuration/server/#markup 143 | 144 | let mut sanitizer = ammonia::Builder::default(); 145 | 146 | sanitizer.add_tags( 147 | vec![ 148 | "a", 149 | "blockquote", 150 | "br", 151 | "code", 152 | "del", 153 | "em", 154 | "h1", 155 | "h2", 156 | "h3", 157 | "h4", 158 | "h5", 159 | "h6", 160 | "hr", 161 | "img", 162 | "ins", 163 | "li", 164 | "ol", 165 | "p", 166 | "pre", 167 | "strong", 168 | "table", 169 | "tbody", 170 | "td", 171 | "th", 172 | "thead", 173 | "ul", 174 | ] 175 | .into_iter(), 176 | ); 177 | 178 | sanitizer.clean(html).to_string() 179 | } 180 | 181 | pub fn send_new_comment_email(title: &str, _comment: &NewComment) -> Result<(), failure::Error> { 182 | use lettre::*; 183 | use lettre_email::EmailBuilder; 184 | use native_tls::TlsConnector; 185 | 186 | let email = EmailBuilder::new() 187 | .from(SMTP_CONFIG.from.clone()) 188 | .to(SMTP_CONFIG.to.clone()) 189 | .subject(format!("New comment on {}", title)) 190 | .text("foo") 191 | .build()?; 192 | 193 | let tls_parameters = ClientTlsParameters::new(String::from("foo"), TlsConnector::builder()?.build()?); 194 | let mut mailer = 195 | //SmtpTransport::builder_unencrypted_localhost()?.build(); 196 | SmtpTransport::builder("blah", ClientSecurity::Wrapper(tls_parameters))?.build(); 197 | 198 | mailer.send(&email).map(|_| ()).map_err(|err| err.into()) 199 | } 200 | 201 | //-------------------------------------------------------------------------------------------------- 202 | // Fetch 203 | 204 | #[derive(Clone, Debug, Deserialize, Validate)] 205 | pub struct FetchRequest { 206 | /// The URI of the thread to gets comments from. 207 | #[validate(length(max = "1024"))] 208 | uri: String, 209 | parent: Option, 210 | limit: Option, 211 | nested_limit: Option, 212 | after: Option>, 213 | plain: Option, 214 | } 215 | 216 | impl FetchRequest { 217 | pub fn is_plain(&self) -> bool { 218 | // As defined in the Isso docs 219 | self.plain.unwrap_or(0) == 1 220 | } 221 | } 222 | 223 | #[derive(Serialize)] 224 | pub struct FetchResponse { 225 | id: i32, 226 | total_replies: i32, 227 | hidden_replies: i32, 228 | replies: Vec, 229 | } 230 | 231 | pub fn fetch(ctx: &ApiContext, req: FetchRequest) -> BoxFuture> { 232 | validate!(&req); 233 | 234 | let _root_id = req.parent; 235 | let plain = req.is_plain(); 236 | 237 | let after: f64 = req 238 | .after 239 | .map_or(0.0_f64, |date| dieselext::FloatDateTime(date).to_f64()); 240 | 241 | let req1 = req.clone(); 242 | let reply_counts = ctx.spawn_db(move |cnx| models::Comment::reply_count(cnx, req1.uri, None, after)); 243 | 244 | // comments 245 | let root_list = 246 | ctx.spawn_db(move |cnx| models::Comment::fetch(cnx, req.uri, None, after, req.parent, None, true, req.limit)); 247 | 248 | reply_counts 249 | .join(root_list) 250 | .map(move |(_reply_counts, root_list)| process_fetched_list(&root_list, plain)) 251 | .boxed() 252 | } 253 | 254 | fn process_fetched_list(list: &[models::Comment], plain: bool) -> Vec { 255 | list.iter() 256 | .map(|item| { 257 | let mut digest = sha1::Sha1::new(); 258 | digest.update(item.email.as_ref().unwrap_or(&item.remote_addr).as_bytes()); 259 | 260 | // Fallback on ip-address for the gravatar, for a somewhat stable image 261 | let email_md5 = format!("{:x}", md5::compute(item.email.as_ref().unwrap_or(&item.remote_addr))); 262 | let gravatar_image = GENERAL_CONFIG.gravatar_url.replace("{}", &email_md5); 263 | 264 | let text = if plain { 265 | item.text.clone() 266 | } else { 267 | let md_parser = pulldown_cmark::Parser::new(&item.text); 268 | let mut html = String::new(); 269 | pulldown_cmark::html::push_html(&mut html, md_parser); 270 | html 271 | }; 272 | 273 | CommentResponse { 274 | id: item.id, 275 | parent: item.parent, 276 | text, 277 | author: item.author.clone(), 278 | website: item.website.clone(), 279 | mode: item.mode, 280 | created: item.created.0, 281 | modified: item.modified.map(|d| d.0), 282 | likes: item.likes, 283 | dislikes: item.dislikes, 284 | 285 | hash: digest.digest().to_string(), 286 | gravatar_image, 287 | } 288 | }) 289 | .collect() 290 | } 291 | 292 | //-------------------------------------------------------------------------------------------------- 293 | // Unsubscribe 294 | 295 | pub fn unsubscribe2(_ctx: &ApiContext) -> BoxFuture { 296 | futures::done(Err(failure::err_msg("Not implemented yet"))).boxed() 297 | } 298 | 299 | pub fn unsubscribe(_ctx: &ApiContext, id: String, email: String, key: String) -> BoxFuture<()> { 300 | drop(id); // make clippy happy until we consume these 301 | drop(email); 302 | drop(key); 303 | futures::done(Err(failure::err_msg("Not implemented yet"))).boxed() 304 | } 305 | 306 | #[cfg(test)] 307 | mod tests { 308 | use futures::Future; 309 | use validator::Validate; 310 | 311 | #[derive(Validate)] 312 | struct Address { 313 | #[validate(email)] 314 | email: String, 315 | } 316 | 317 | #[test] 318 | fn validate_should_succeed() { 319 | let addr = Address { 320 | email: String::from("foo@bar.com"), 321 | }; 322 | 323 | assert!(super::validate::(&addr).is_none()); 324 | } 325 | 326 | #[test] 327 | fn validate_should_fail() { 328 | let addr = Address { 329 | email: String::from("foo"), 330 | }; 331 | 332 | let opt_future = super::validate::(&addr); 333 | assert!(opt_future.is_some()); 334 | 335 | let result = opt_future.unwrap().wait(); 336 | assert!(result.is_err()); 337 | } 338 | 339 | #[test] 340 | #[should_panic] 341 | fn demonstrate_should_panic() { 342 | let x: Option = None; 343 | 344 | x.unwrap(); 345 | } 346 | } 347 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "actix" 3 | version = "0.7.9" 4 | source = "registry+https://github.com/rust-lang/crates.io-index" 5 | dependencies = [ 6 | "actix_derive 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 7 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 8 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 9 | "crossbeam-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 10 | "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 11 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 12 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 13 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 14 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 15 | "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 16 | "smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 17 | "tokio 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 18 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 19 | "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 20 | "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 21 | "tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 22 | "tokio-signal 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 23 | "tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 24 | "tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 25 | "trust-dns-proto 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 26 | "trust-dns-resolver 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", 27 | "uuid 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", 28 | ] 29 | 30 | [[package]] 31 | name = "actix-net" 32 | version = "0.2.6" 33 | source = "registry+https://github.com/rust-lang/crates.io-index" 34 | dependencies = [ 35 | "actix 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", 36 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 37 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 38 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 39 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 40 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 41 | "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 42 | "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 43 | "tokio 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 44 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 45 | "tokio-current-thread 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 46 | "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 47 | "tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 48 | "tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 49 | "tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 50 | "tower-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 51 | "trust-dns-resolver 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", 52 | ] 53 | 54 | [[package]] 55 | name = "actix-web" 56 | version = "0.7.16" 57 | source = "registry+https://github.com/rust-lang/crates.io-index" 58 | dependencies = [ 59 | "actix 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", 60 | "actix-net 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 61 | "askama_escape 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 62 | "base64 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 63 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 64 | "brotli2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 65 | "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 66 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 67 | "cookie 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", 68 | "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 69 | "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 70 | "flate2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 71 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 72 | "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 73 | "h2 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 74 | "http 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 75 | "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 76 | "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 77 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 78 | "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 79 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 80 | "mime 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", 81 | "mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)", 82 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 83 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 84 | "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 85 | "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 86 | "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 87 | "rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", 88 | "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 89 | "serde 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 90 | "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", 91 | "serde_urlencoded 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", 92 | "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 93 | "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 94 | "smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 95 | "time 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 96 | "tokio 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 97 | "tokio-current-thread 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 98 | "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 99 | "tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 100 | "tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 101 | "tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 102 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 103 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 104 | ] 105 | 106 | [[package]] 107 | name = "actix-web-requestid" 108 | version = "0.1.2" 109 | source = "registry+https://github.com/rust-lang/crates.io-index" 110 | dependencies = [ 111 | "actix-web 0.7.16 (registry+https://github.com/rust-lang/crates.io-index)", 112 | "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", 113 | ] 114 | 115 | [[package]] 116 | name = "actix_derive" 117 | version = "0.3.2" 118 | source = "registry+https://github.com/rust-lang/crates.io-index" 119 | dependencies = [ 120 | "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", 121 | "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", 122 | "syn 0.15.23 (registry+https://github.com/rust-lang/crates.io-index)", 123 | ] 124 | 125 | [[package]] 126 | name = "adler32" 127 | version = "1.0.3" 128 | source = "registry+https://github.com/rust-lang/crates.io-index" 129 | 130 | [[package]] 131 | name = "aho-corasick" 132 | version = "0.6.9" 133 | source = "registry+https://github.com/rust-lang/crates.io-index" 134 | dependencies = [ 135 | "memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 136 | ] 137 | 138 | [[package]] 139 | name = "ammonia" 140 | version = "1.2.0" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | dependencies = [ 143 | "html5ever 0.22.5 (registry+https://github.com/rust-lang/crates.io-index)", 144 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 145 | "maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 146 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 147 | "tendril 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 148 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 149 | ] 150 | 151 | [[package]] 152 | name = "antidote" 153 | version = "1.0.0" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | 156 | [[package]] 157 | name = "arc-swap" 158 | version = "0.3.6" 159 | source = "registry+https://github.com/rust-lang/crates.io-index" 160 | 161 | [[package]] 162 | name = "arrayref" 163 | version = "0.3.5" 164 | source = "registry+https://github.com/rust-lang/crates.io-index" 165 | 166 | [[package]] 167 | name = "arrayvec" 168 | version = "0.4.9" 169 | source = "registry+https://github.com/rust-lang/crates.io-index" 170 | dependencies = [ 171 | "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 172 | ] 173 | 174 | [[package]] 175 | name = "askama_escape" 176 | version = "0.1.0" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | 179 | [[package]] 180 | name = "atty" 181 | version = "0.2.11" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | dependencies = [ 184 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 185 | "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 186 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 187 | ] 188 | 189 | [[package]] 190 | name = "autocfg" 191 | version = "0.1.1" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | 194 | [[package]] 195 | name = "backtrace" 196 | version = "0.3.13" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | dependencies = [ 199 | "autocfg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 200 | "backtrace-sys 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", 201 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 202 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 203 | "rustc-demangle 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 204 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 205 | ] 206 | 207 | [[package]] 208 | name = "backtrace-sys" 209 | version = "0.1.26" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | dependencies = [ 212 | "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", 213 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 214 | ] 215 | 216 | [[package]] 217 | name = "base64" 218 | version = "0.9.3" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | dependencies = [ 221 | "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 222 | "safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 223 | ] 224 | 225 | [[package]] 226 | name = "base64" 227 | version = "0.10.0" 228 | source = "registry+https://github.com/rust-lang/crates.io-index" 229 | dependencies = [ 230 | "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 231 | ] 232 | 233 | [[package]] 234 | name = "bitflags" 235 | version = "0.9.1" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | 238 | [[package]] 239 | name = "bitflags" 240 | version = "1.0.4" 241 | source = "registry+https://github.com/rust-lang/crates.io-index" 242 | 243 | [[package]] 244 | name = "block-buffer" 245 | version = "0.3.3" 246 | source = "registry+https://github.com/rust-lang/crates.io-index" 247 | dependencies = [ 248 | "arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", 249 | "byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 250 | ] 251 | 252 | [[package]] 253 | name = "brotli-sys" 254 | version = "0.3.2" 255 | source = "registry+https://github.com/rust-lang/crates.io-index" 256 | dependencies = [ 257 | "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", 258 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 259 | ] 260 | 261 | [[package]] 262 | name = "brotli2" 263 | version = "0.3.2" 264 | source = "registry+https://github.com/rust-lang/crates.io-index" 265 | dependencies = [ 266 | "brotli-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 267 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 268 | ] 269 | 270 | [[package]] 271 | name = "bufstream" 272 | version = "0.1.4" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | 275 | [[package]] 276 | name = "build_const" 277 | version = "0.2.1" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | 280 | [[package]] 281 | name = "byte-tools" 282 | version = "0.2.0" 283 | source = "registry+https://github.com/rust-lang/crates.io-index" 284 | 285 | [[package]] 286 | name = "byteorder" 287 | version = "1.2.7" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | 290 | [[package]] 291 | name = "bytes" 292 | version = "0.4.11" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | dependencies = [ 295 | "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 296 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 297 | ] 298 | 299 | [[package]] 300 | name = "cc" 301 | version = "1.0.28" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | 304 | [[package]] 305 | name = "cfg-if" 306 | version = "0.1.6" 307 | source = "registry+https://github.com/rust-lang/crates.io-index" 308 | 309 | [[package]] 310 | name = "chrono" 311 | version = "0.4.6" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | dependencies = [ 314 | "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", 315 | "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 316 | "serde 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 317 | "time 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 318 | ] 319 | 320 | [[package]] 321 | name = "cloudabi" 322 | version = "0.0.3" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | dependencies = [ 325 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 326 | ] 327 | 328 | [[package]] 329 | name = "config" 330 | version = "0.9.1" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | dependencies = [ 333 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 334 | "nom 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 335 | "rust-ini 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", 336 | "serde 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 337 | "serde-hjson 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", 338 | "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", 339 | "toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", 340 | "yaml-rust 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 341 | ] 342 | 343 | [[package]] 344 | name = "constant_time_eq" 345 | version = "0.1.3" 346 | source = "registry+https://github.com/rust-lang/crates.io-index" 347 | 348 | [[package]] 349 | name = "cookie" 350 | version = "0.11.0" 351 | source = "registry+https://github.com/rust-lang/crates.io-index" 352 | dependencies = [ 353 | "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", 354 | "ring 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)", 355 | "time 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 356 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 357 | ] 358 | 359 | [[package]] 360 | name = "core-foundation" 361 | version = "0.2.3" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | dependencies = [ 364 | "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 365 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 366 | ] 367 | 368 | [[package]] 369 | name = "core-foundation-sys" 370 | version = "0.2.3" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | dependencies = [ 373 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 374 | ] 375 | 376 | [[package]] 377 | name = "crc" 378 | version = "1.8.1" 379 | source = "registry+https://github.com/rust-lang/crates.io-index" 380 | dependencies = [ 381 | "build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 382 | ] 383 | 384 | [[package]] 385 | name = "crc32fast" 386 | version = "1.1.2" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | dependencies = [ 389 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 390 | ] 391 | 392 | [[package]] 393 | name = "crossbeam" 394 | version = "0.6.0" 395 | source = "registry+https://github.com/rust-lang/crates.io-index" 396 | dependencies = [ 397 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 398 | "crossbeam-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 399 | "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", 400 | "crossbeam-epoch 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 401 | "crossbeam-utils 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", 402 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 403 | "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 404 | "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 405 | ] 406 | 407 | [[package]] 408 | name = "crossbeam-channel" 409 | version = "0.3.4" 410 | source = "registry+https://github.com/rust-lang/crates.io-index" 411 | dependencies = [ 412 | "crossbeam-epoch 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 413 | "crossbeam-utils 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", 414 | "parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 415 | "rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", 416 | "smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 417 | ] 418 | 419 | [[package]] 420 | name = "crossbeam-deque" 421 | version = "0.6.3" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | dependencies = [ 424 | "crossbeam-epoch 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 425 | "crossbeam-utils 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", 426 | ] 427 | 428 | [[package]] 429 | name = "crossbeam-epoch" 430 | version = "0.7.0" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | dependencies = [ 433 | "arrayvec 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)", 434 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 435 | "crossbeam-utils 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", 436 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 437 | "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 438 | "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 439 | ] 440 | 441 | [[package]] 442 | name = "crossbeam-utils" 443 | version = "0.6.3" 444 | source = "registry+https://github.com/rust-lang/crates.io-index" 445 | dependencies = [ 446 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 447 | ] 448 | 449 | [[package]] 450 | name = "crypto-mac" 451 | version = "0.6.2" 452 | source = "registry+https://github.com/rust-lang/crates.io-index" 453 | dependencies = [ 454 | "constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 455 | "generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 456 | ] 457 | 458 | [[package]] 459 | name = "diesel" 460 | version = "1.3.3" 461 | source = "registry+https://github.com/rust-lang/crates.io-index" 462 | dependencies = [ 463 | "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 464 | "diesel_derives 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 465 | "libsqlite3-sys 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", 466 | "r2d2 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", 467 | ] 468 | 469 | [[package]] 470 | name = "diesel_derives" 471 | version = "1.3.0" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | dependencies = [ 474 | "proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 475 | "quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", 476 | "syn 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)", 477 | ] 478 | 479 | [[package]] 480 | name = "digest" 481 | version = "0.7.6" 482 | source = "registry+https://github.com/rust-lang/crates.io-index" 483 | dependencies = [ 484 | "generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 485 | ] 486 | 487 | [[package]] 488 | name = "dtoa" 489 | version = "0.4.3" 490 | source = "registry+https://github.com/rust-lang/crates.io-index" 491 | 492 | [[package]] 493 | name = "email" 494 | version = "0.0.20" 495 | source = "registry+https://github.com/rust-lang/crates.io-index" 496 | dependencies = [ 497 | "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", 498 | "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 499 | "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 500 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 501 | "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 502 | "time 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 503 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 504 | ] 505 | 506 | [[package]] 507 | name = "encoding" 508 | version = "0.2.33" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | dependencies = [ 511 | "encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", 512 | "encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", 513 | "encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", 514 | "encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", 515 | "encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", 516 | ] 517 | 518 | [[package]] 519 | name = "encoding-index-japanese" 520 | version = "1.20141219.5" 521 | source = "registry+https://github.com/rust-lang/crates.io-index" 522 | dependencies = [ 523 | "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 524 | ] 525 | 526 | [[package]] 527 | name = "encoding-index-korean" 528 | version = "1.20141219.5" 529 | source = "registry+https://github.com/rust-lang/crates.io-index" 530 | dependencies = [ 531 | "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 532 | ] 533 | 534 | [[package]] 535 | name = "encoding-index-simpchinese" 536 | version = "1.20141219.5" 537 | source = "registry+https://github.com/rust-lang/crates.io-index" 538 | dependencies = [ 539 | "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 540 | ] 541 | 542 | [[package]] 543 | name = "encoding-index-singlebyte" 544 | version = "1.20141219.5" 545 | source = "registry+https://github.com/rust-lang/crates.io-index" 546 | dependencies = [ 547 | "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 548 | ] 549 | 550 | [[package]] 551 | name = "encoding-index-tradchinese" 552 | version = "1.20141219.5" 553 | source = "registry+https://github.com/rust-lang/crates.io-index" 554 | dependencies = [ 555 | "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 556 | ] 557 | 558 | [[package]] 559 | name = "encoding_index_tests" 560 | version = "0.1.4" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | 563 | [[package]] 564 | name = "env_logger" 565 | version = "0.5.13" 566 | source = "registry+https://github.com/rust-lang/crates.io-index" 567 | dependencies = [ 568 | "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 569 | "humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 570 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 571 | "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 572 | "termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 573 | ] 574 | 575 | [[package]] 576 | name = "error-chain" 577 | version = "0.8.1" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | dependencies = [ 580 | "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", 581 | ] 582 | 583 | [[package]] 584 | name = "failure" 585 | version = "0.1.3" 586 | source = "registry+https://github.com/rust-lang/crates.io-index" 587 | dependencies = [ 588 | "backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)", 589 | "failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 590 | ] 591 | 592 | [[package]] 593 | name = "failure_derive" 594 | version = "0.1.3" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | dependencies = [ 597 | "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", 598 | "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", 599 | "syn 0.15.23 (registry+https://github.com/rust-lang/crates.io-index)", 600 | "synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", 601 | ] 602 | 603 | [[package]] 604 | name = "flate2" 605 | version = "1.0.6" 606 | source = "registry+https://github.com/rust-lang/crates.io-index" 607 | dependencies = [ 608 | "crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 609 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 610 | "miniz-sys 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", 611 | "miniz_oxide_c_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 612 | ] 613 | 614 | [[package]] 615 | name = "fnv" 616 | version = "1.0.6" 617 | source = "registry+https://github.com/rust-lang/crates.io-index" 618 | 619 | [[package]] 620 | name = "foreign-types" 621 | version = "0.3.2" 622 | source = "registry+https://github.com/rust-lang/crates.io-index" 623 | dependencies = [ 624 | "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 625 | ] 626 | 627 | [[package]] 628 | name = "foreign-types-shared" 629 | version = "0.1.1" 630 | source = "registry+https://github.com/rust-lang/crates.io-index" 631 | 632 | [[package]] 633 | name = "fuchsia-zircon" 634 | version = "0.3.3" 635 | source = "registry+https://github.com/rust-lang/crates.io-index" 636 | dependencies = [ 637 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 638 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 639 | ] 640 | 641 | [[package]] 642 | name = "fuchsia-zircon-sys" 643 | version = "0.3.3" 644 | source = "registry+https://github.com/rust-lang/crates.io-index" 645 | 646 | [[package]] 647 | name = "futf" 648 | version = "0.1.4" 649 | source = "registry+https://github.com/rust-lang/crates.io-index" 650 | dependencies = [ 651 | "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 652 | "new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 653 | ] 654 | 655 | [[package]] 656 | name = "futures" 657 | version = "0.1.25" 658 | source = "registry+https://github.com/rust-lang/crates.io-index" 659 | 660 | [[package]] 661 | name = "futures-cpupool" 662 | version = "0.1.8" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | dependencies = [ 665 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 666 | "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 667 | ] 668 | 669 | [[package]] 670 | name = "generic-array" 671 | version = "0.9.0" 672 | source = "registry+https://github.com/rust-lang/crates.io-index" 673 | dependencies = [ 674 | "typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", 675 | ] 676 | 677 | [[package]] 678 | name = "getopts" 679 | version = "0.2.18" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | dependencies = [ 682 | "unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 683 | ] 684 | 685 | [[package]] 686 | name = "h2" 687 | version = "0.1.14" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | dependencies = [ 690 | "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 691 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 692 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 693 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 694 | "http 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 695 | "indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 696 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 697 | "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 698 | "string 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 699 | "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 700 | ] 701 | 702 | [[package]] 703 | name = "hex" 704 | version = "0.3.2" 705 | source = "registry+https://github.com/rust-lang/crates.io-index" 706 | 707 | [[package]] 708 | name = "hmac" 709 | version = "0.6.3" 710 | source = "registry+https://github.com/rust-lang/crates.io-index" 711 | dependencies = [ 712 | "crypto-mac 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 713 | "digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", 714 | ] 715 | 716 | [[package]] 717 | name = "hostname" 718 | version = "0.1.5" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | dependencies = [ 721 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 722 | "winutil 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 723 | ] 724 | 725 | [[package]] 726 | name = "html5ever" 727 | version = "0.22.5" 728 | source = "registry+https://github.com/rust-lang/crates.io-index" 729 | dependencies = [ 730 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 731 | "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 732 | "markup5ever 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)", 733 | "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", 734 | "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", 735 | "syn 0.15.23 (registry+https://github.com/rust-lang/crates.io-index)", 736 | ] 737 | 738 | [[package]] 739 | name = "http" 740 | version = "0.1.14" 741 | source = "registry+https://github.com/rust-lang/crates.io-index" 742 | dependencies = [ 743 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 744 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 745 | "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 746 | ] 747 | 748 | [[package]] 749 | name = "httparse" 750 | version = "1.3.3" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | 753 | [[package]] 754 | name = "humantime" 755 | version = "1.2.0" 756 | source = "registry+https://github.com/rust-lang/crates.io-index" 757 | dependencies = [ 758 | "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 759 | ] 760 | 761 | [[package]] 762 | name = "idna" 763 | version = "0.1.5" 764 | source = "registry+https://github.com/rust-lang/crates.io-index" 765 | dependencies = [ 766 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 767 | "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", 768 | "unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 769 | ] 770 | 771 | [[package]] 772 | name = "if_chain" 773 | version = "0.1.3" 774 | source = "registry+https://github.com/rust-lang/crates.io-index" 775 | 776 | [[package]] 777 | name = "indexmap" 778 | version = "1.0.2" 779 | source = "registry+https://github.com/rust-lang/crates.io-index" 780 | 781 | [[package]] 782 | name = "intern" 783 | version = "0.2.0" 784 | source = "registry+https://github.com/rust-lang/crates.io-index" 785 | dependencies = [ 786 | "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 787 | "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 788 | ] 789 | 790 | [[package]] 791 | name = "iovec" 792 | version = "0.1.2" 793 | source = "registry+https://github.com/rust-lang/crates.io-index" 794 | dependencies = [ 795 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 796 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 797 | ] 798 | 799 | [[package]] 800 | name = "ipconfig" 801 | version = "0.1.9" 802 | source = "registry+https://github.com/rust-lang/crates.io-index" 803 | dependencies = [ 804 | "error-chain 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 805 | "socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 806 | "widestring 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 807 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 808 | "winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 809 | ] 810 | 811 | [[package]] 812 | name = "isatty" 813 | version = "0.1.9" 814 | source = "registry+https://github.com/rust-lang/crates.io-index" 815 | dependencies = [ 816 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 817 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 818 | "redox_syscall 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)", 819 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 820 | ] 821 | 822 | [[package]] 823 | name = "itoa" 824 | version = "0.4.3" 825 | source = "registry+https://github.com/rust-lang/crates.io-index" 826 | 827 | [[package]] 828 | name = "kernel32-sys" 829 | version = "0.2.2" 830 | source = "registry+https://github.com/rust-lang/crates.io-index" 831 | dependencies = [ 832 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 833 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 834 | ] 835 | 836 | [[package]] 837 | name = "language-tags" 838 | version = "0.2.2" 839 | source = "registry+https://github.com/rust-lang/crates.io-index" 840 | 841 | [[package]] 842 | name = "lazy_static" 843 | version = "0.2.11" 844 | source = "registry+https://github.com/rust-lang/crates.io-index" 845 | 846 | [[package]] 847 | name = "lazy_static" 848 | version = "1.2.0" 849 | source = "registry+https://github.com/rust-lang/crates.io-index" 850 | 851 | [[package]] 852 | name = "lazycell" 853 | version = "1.2.1" 854 | source = "registry+https://github.com/rust-lang/crates.io-index" 855 | 856 | [[package]] 857 | name = "lettre" 858 | version = "0.8.3" 859 | source = "registry+https://github.com/rust-lang/crates.io-index" 860 | dependencies = [ 861 | "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", 862 | "bufstream 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 863 | "hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 864 | "hmac 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", 865 | "hostname 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 866 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 867 | "md-5 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 868 | "native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 869 | "nom 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 870 | "serde 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 871 | "serde_derive 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 872 | "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", 873 | ] 874 | 875 | [[package]] 876 | name = "lettre_email" 877 | version = "0.8.3" 878 | source = "registry+https://github.com/rust-lang/crates.io-index" 879 | dependencies = [ 880 | "base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", 881 | "email 0.0.20 (registry+https://github.com/rust-lang/crates.io-index)", 882 | "lettre 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", 883 | "mime 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", 884 | "time 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", 885 | "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", 886 | ] 887 | 888 | [[package]] 889 | name = "libc" 890 | version = "0.2.45" 891 | source = "registry+https://github.com/rust-lang/crates.io-index" 892 | 893 | [[package]] 894 | name = "libsqlite3-sys" 895 | version = "0.9.3" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | dependencies = [ 898 | "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", 899 | "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 900 | ] 901 | 902 | [[package]] 903 | name = "linked-hash-map" 904 | version = "0.3.0" 905 | source = "registry+https://github.com/rust-lang/crates.io-index" 906 | dependencies = [ 907 | "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", 908 | "serde_test 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", 909 | ] 910 | 911 | [[package]] 912 | name = "linked-hash-map" 913 | version = "0.4.2" 914 | source = "registry+https://github.com/rust-lang/crates.io-index" 915 | 916 | [[package]] 917 | name = "linked-hash-map" 918 | version = "0.5.1" 919 | source = "registry+https://github.com/rust-lang/crates.io-index" 920 | 921 | [[package]] 922 | name = "lock_api" 923 | version = "0.1.5" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | dependencies = [ 926 | "owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 927 | "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 928 | ] 929 | 930 | [[package]] 931 | name = "log" 932 | version = "0.4.6" 933 | source = "registry+https://github.com/rust-lang/crates.io-index" 934 | dependencies = [ 935 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 936 | ] 937 | 938 | [[package]] 939 | name = "lru-cache" 940 | version = "0.1.1" 941 | source = "registry+https://github.com/rust-lang/crates.io-index" 942 | dependencies = [ 943 | "linked-hash-map 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 944 | ] 945 | 946 | [[package]] 947 | name = "mac" 948 | version = "0.1.1" 949 | source = "registry+https://github.com/rust-lang/crates.io-index" 950 | 951 | [[package]] 952 | name = "maplit" 953 | version = "1.0.1" 954 | source = "registry+https://github.com/rust-lang/crates.io-index" 955 | 956 | [[package]] 957 | name = "markup5ever" 958 | version = "0.7.5" 959 | source = "registry+https://github.com/rust-lang/crates.io-index" 960 | dependencies = [ 961 | "phf 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", 962 | "phf_codegen 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", 963 | "serde 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 964 | "serde_derive 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 965 | "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", 966 | "string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", 967 | "string_cache_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 968 | "tendril 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 969 | ] 970 | 971 | [[package]] 972 | name = "matches" 973 | version = "0.1.8" 974 | source = "registry+https://github.com/rust-lang/crates.io-index" 975 | 976 | [[package]] 977 | name = "md-5" 978 | version = "0.7.0" 979 | source = "registry+https://github.com/rust-lang/crates.io-index" 980 | dependencies = [ 981 | "block-buffer 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 982 | "byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 983 | "digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)", 984 | ] 985 | 986 | [[package]] 987 | name = "md5" 988 | version = "0.5.0" 989 | source = "registry+https://github.com/rust-lang/crates.io-index" 990 | 991 | [[package]] 992 | name = "memchr" 993 | version = "2.1.2" 994 | source = "registry+https://github.com/rust-lang/crates.io-index" 995 | dependencies = [ 996 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 997 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 998 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 999 | ] 1000 | 1001 | [[package]] 1002 | name = "memoffset" 1003 | version = "0.2.1" 1004 | source = "registry+https://github.com/rust-lang/crates.io-index" 1005 | 1006 | [[package]] 1007 | name = "mime" 1008 | version = "0.3.12" 1009 | source = "registry+https://github.com/rust-lang/crates.io-index" 1010 | dependencies = [ 1011 | "unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1012 | ] 1013 | 1014 | [[package]] 1015 | name = "mime_guess" 1016 | version = "2.0.0-alpha.6" 1017 | source = "registry+https://github.com/rust-lang/crates.io-index" 1018 | dependencies = [ 1019 | "mime 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)", 1020 | "phf 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", 1021 | "phf_codegen 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", 1022 | "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1023 | ] 1024 | 1025 | [[package]] 1026 | name = "miniz-sys" 1027 | version = "0.1.11" 1028 | source = "registry+https://github.com/rust-lang/crates.io-index" 1029 | dependencies = [ 1030 | "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", 1031 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1032 | ] 1033 | 1034 | [[package]] 1035 | name = "miniz_oxide" 1036 | version = "0.2.0" 1037 | source = "registry+https://github.com/rust-lang/crates.io-index" 1038 | dependencies = [ 1039 | "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 1040 | ] 1041 | 1042 | [[package]] 1043 | name = "miniz_oxide_c_api" 1044 | version = "0.2.0" 1045 | source = "registry+https://github.com/rust-lang/crates.io-index" 1046 | dependencies = [ 1047 | "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", 1048 | "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", 1049 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1050 | "miniz_oxide 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1051 | ] 1052 | 1053 | [[package]] 1054 | name = "mio" 1055 | version = "0.6.16" 1056 | source = "registry+https://github.com/rust-lang/crates.io-index" 1057 | dependencies = [ 1058 | "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 1059 | "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 1060 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1061 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1062 | "lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1063 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1064 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1065 | "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1066 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 1067 | "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 1068 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 1069 | ] 1070 | 1071 | [[package]] 1072 | name = "mio-uds" 1073 | version = "0.6.7" 1074 | source = "registry+https://github.com/rust-lang/crates.io-index" 1075 | dependencies = [ 1076 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1077 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1078 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 1079 | ] 1080 | 1081 | [[package]] 1082 | name = "miow" 1083 | version = "0.2.1" 1084 | source = "registry+https://github.com/rust-lang/crates.io-index" 1085 | dependencies = [ 1086 | "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1087 | "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 1088 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 1089 | "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", 1090 | ] 1091 | 1092 | [[package]] 1093 | name = "native-tls" 1094 | version = "0.1.5" 1095 | source = "registry+https://github.com/rust-lang/crates.io-index" 1096 | dependencies = [ 1097 | "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 1098 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1099 | "openssl 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)", 1100 | "schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", 1101 | "security-framework 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 1102 | "security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 1103 | "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", 1104 | ] 1105 | 1106 | [[package]] 1107 | name = "net2" 1108 | version = "0.2.33" 1109 | source = "registry+https://github.com/rust-lang/crates.io-index" 1110 | dependencies = [ 1111 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1112 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1113 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1114 | ] 1115 | 1116 | [[package]] 1117 | name = "new_debug_unreachable" 1118 | version = "1.0.1" 1119 | source = "registry+https://github.com/rust-lang/crates.io-index" 1120 | dependencies = [ 1121 | "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 1122 | ] 1123 | 1124 | [[package]] 1125 | name = "nodrop" 1126 | version = "0.1.13" 1127 | source = "registry+https://github.com/rust-lang/crates.io-index" 1128 | 1129 | [[package]] 1130 | name = "nom" 1131 | version = "4.1.1" 1132 | source = "registry+https://github.com/rust-lang/crates.io-index" 1133 | dependencies = [ 1134 | "memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1135 | ] 1136 | 1137 | [[package]] 1138 | name = "num-integer" 1139 | version = "0.1.39" 1140 | source = "registry+https://github.com/rust-lang/crates.io-index" 1141 | dependencies = [ 1142 | "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 1143 | ] 1144 | 1145 | [[package]] 1146 | name = "num-traits" 1147 | version = "0.1.43" 1148 | source = "registry+https://github.com/rust-lang/crates.io-index" 1149 | dependencies = [ 1150 | "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 1151 | ] 1152 | 1153 | [[package]] 1154 | name = "num-traits" 1155 | version = "0.2.6" 1156 | source = "registry+https://github.com/rust-lang/crates.io-index" 1157 | 1158 | [[package]] 1159 | name = "num_cpus" 1160 | version = "1.9.0" 1161 | source = "registry+https://github.com/rust-lang/crates.io-index" 1162 | dependencies = [ 1163 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1164 | ] 1165 | 1166 | [[package]] 1167 | name = "openssl" 1168 | version = "0.9.24" 1169 | source = "registry+https://github.com/rust-lang/crates.io-index" 1170 | dependencies = [ 1171 | "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 1172 | "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", 1173 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1174 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1175 | "openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)", 1176 | ] 1177 | 1178 | [[package]] 1179 | name = "openssl-sys" 1180 | version = "0.9.40" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | dependencies = [ 1183 | "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", 1184 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1185 | "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", 1186 | "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 1187 | ] 1188 | 1189 | [[package]] 1190 | name = "owning_ref" 1191 | version = "0.4.0" 1192 | source = "registry+https://github.com/rust-lang/crates.io-index" 1193 | dependencies = [ 1194 | "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1195 | ] 1196 | 1197 | [[package]] 1198 | name = "parking_lot" 1199 | version = "0.6.4" 1200 | source = "registry+https://github.com/rust-lang/crates.io-index" 1201 | dependencies = [ 1202 | "lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1203 | "parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", 1204 | ] 1205 | 1206 | [[package]] 1207 | name = "parking_lot" 1208 | version = "0.7.0" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | dependencies = [ 1211 | "lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1212 | "parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1213 | ] 1214 | 1215 | [[package]] 1216 | name = "parking_lot_core" 1217 | version = "0.3.1" 1218 | source = "registry+https://github.com/rust-lang/crates.io-index" 1219 | dependencies = [ 1220 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1221 | "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", 1222 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1223 | "smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 1224 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1225 | ] 1226 | 1227 | [[package]] 1228 | name = "parking_lot_core" 1229 | version = "0.4.0" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | dependencies = [ 1232 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1233 | "rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", 1234 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1235 | "smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 1236 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1237 | ] 1238 | 1239 | [[package]] 1240 | name = "percent-encoding" 1241 | version = "1.0.1" 1242 | source = "registry+https://github.com/rust-lang/crates.io-index" 1243 | 1244 | [[package]] 1245 | name = "phf" 1246 | version = "0.7.23" 1247 | source = "registry+https://github.com/rust-lang/crates.io-index" 1248 | dependencies = [ 1249 | "phf_shared 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", 1250 | ] 1251 | 1252 | [[package]] 1253 | name = "phf_codegen" 1254 | version = "0.7.23" 1255 | source = "registry+https://github.com/rust-lang/crates.io-index" 1256 | dependencies = [ 1257 | "phf_generator 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", 1258 | "phf_shared 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", 1259 | ] 1260 | 1261 | [[package]] 1262 | name = "phf_generator" 1263 | version = "0.7.23" 1264 | source = "registry+https://github.com/rust-lang/crates.io-index" 1265 | dependencies = [ 1266 | "phf_shared 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", 1267 | "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", 1268 | ] 1269 | 1270 | [[package]] 1271 | name = "phf_shared" 1272 | version = "0.7.23" 1273 | source = "registry+https://github.com/rust-lang/crates.io-index" 1274 | dependencies = [ 1275 | "siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1276 | "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1277 | ] 1278 | 1279 | [[package]] 1280 | name = "pkg-config" 1281 | version = "0.3.14" 1282 | source = "registry+https://github.com/rust-lang/crates.io-index" 1283 | 1284 | [[package]] 1285 | name = "precomputed-hash" 1286 | version = "0.1.1" 1287 | source = "registry+https://github.com/rust-lang/crates.io-index" 1288 | 1289 | [[package]] 1290 | name = "proc-macro2" 1291 | version = "0.3.8" 1292 | source = "registry+https://github.com/rust-lang/crates.io-index" 1293 | dependencies = [ 1294 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1295 | ] 1296 | 1297 | [[package]] 1298 | name = "proc-macro2" 1299 | version = "0.4.24" 1300 | source = "registry+https://github.com/rust-lang/crates.io-index" 1301 | dependencies = [ 1302 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1303 | ] 1304 | 1305 | [[package]] 1306 | name = "prometheus" 1307 | version = "0.4.2" 1308 | source = "registry+https://github.com/rust-lang/crates.io-index" 1309 | dependencies = [ 1310 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1311 | "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", 1312 | "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 1313 | "protobuf 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1314 | "quick-error 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1315 | "spin 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", 1316 | ] 1317 | 1318 | [[package]] 1319 | name = "protobuf" 1320 | version = "2.2.0" 1321 | source = "registry+https://github.com/rust-lang/crates.io-index" 1322 | 1323 | [[package]] 1324 | name = "pulldown-cmark" 1325 | version = "0.2.0" 1326 | source = "registry+https://github.com/rust-lang/crates.io-index" 1327 | dependencies = [ 1328 | "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", 1329 | "getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", 1330 | ] 1331 | 1332 | [[package]] 1333 | name = "quick-error" 1334 | version = "0.2.2" 1335 | source = "registry+https://github.com/rust-lang/crates.io-index" 1336 | 1337 | [[package]] 1338 | name = "quick-error" 1339 | version = "1.2.2" 1340 | source = "registry+https://github.com/rust-lang/crates.io-index" 1341 | 1342 | [[package]] 1343 | name = "quote" 1344 | version = "0.5.2" 1345 | source = "registry+https://github.com/rust-lang/crates.io-index" 1346 | dependencies = [ 1347 | "proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1348 | ] 1349 | 1350 | [[package]] 1351 | name = "quote" 1352 | version = "0.6.10" 1353 | source = "registry+https://github.com/rust-lang/crates.io-index" 1354 | dependencies = [ 1355 | "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", 1356 | ] 1357 | 1358 | [[package]] 1359 | name = "r2d2" 1360 | version = "0.8.3" 1361 | source = "registry+https://github.com/rust-lang/crates.io-index" 1362 | dependencies = [ 1363 | "antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 1364 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1365 | "scheduled-thread-pool 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1366 | ] 1367 | 1368 | [[package]] 1369 | name = "rand" 1370 | version = "0.4.3" 1371 | source = "registry+https://github.com/rust-lang/crates.io-index" 1372 | dependencies = [ 1373 | "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 1374 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1375 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1376 | ] 1377 | 1378 | [[package]] 1379 | name = "rand" 1380 | version = "0.5.5" 1381 | source = "registry+https://github.com/rust-lang/crates.io-index" 1382 | dependencies = [ 1383 | "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 1384 | "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 1385 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1386 | "rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1387 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1388 | ] 1389 | 1390 | [[package]] 1391 | name = "rand" 1392 | version = "0.6.1" 1393 | source = "registry+https://github.com/rust-lang/crates.io-index" 1394 | dependencies = [ 1395 | "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", 1396 | "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 1397 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1398 | "rand_chacha 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1399 | "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1400 | "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1401 | "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1402 | "rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1403 | "rand_xorshift 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1404 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1405 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1406 | ] 1407 | 1408 | [[package]] 1409 | name = "rand_chacha" 1410 | version = "0.1.0" 1411 | source = "registry+https://github.com/rust-lang/crates.io-index" 1412 | dependencies = [ 1413 | "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1414 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1415 | ] 1416 | 1417 | [[package]] 1418 | name = "rand_core" 1419 | version = "0.2.2" 1420 | source = "registry+https://github.com/rust-lang/crates.io-index" 1421 | dependencies = [ 1422 | "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1423 | ] 1424 | 1425 | [[package]] 1426 | name = "rand_core" 1427 | version = "0.3.0" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | 1430 | [[package]] 1431 | name = "rand_hc" 1432 | version = "0.1.0" 1433 | source = "registry+https://github.com/rust-lang/crates.io-index" 1434 | dependencies = [ 1435 | "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1436 | ] 1437 | 1438 | [[package]] 1439 | name = "rand_isaac" 1440 | version = "0.1.1" 1441 | source = "registry+https://github.com/rust-lang/crates.io-index" 1442 | dependencies = [ 1443 | "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1444 | ] 1445 | 1446 | [[package]] 1447 | name = "rand_pcg" 1448 | version = "0.1.1" 1449 | source = "registry+https://github.com/rust-lang/crates.io-index" 1450 | dependencies = [ 1451 | "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1452 | "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1453 | ] 1454 | 1455 | [[package]] 1456 | name = "rand_xorshift" 1457 | version = "0.1.0" 1458 | source = "registry+https://github.com/rust-lang/crates.io-index" 1459 | dependencies = [ 1460 | "rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1461 | ] 1462 | 1463 | [[package]] 1464 | name = "redox_syscall" 1465 | version = "0.1.44" 1466 | source = "registry+https://github.com/rust-lang/crates.io-index" 1467 | 1468 | [[package]] 1469 | name = "redox_termios" 1470 | version = "0.1.1" 1471 | source = "registry+https://github.com/rust-lang/crates.io-index" 1472 | dependencies = [ 1473 | "redox_syscall 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)", 1474 | ] 1475 | 1476 | [[package]] 1477 | name = "regex" 1478 | version = "1.1.0" 1479 | source = "registry+https://github.com/rust-lang/crates.io-index" 1480 | dependencies = [ 1481 | "aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", 1482 | "memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1483 | "regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", 1484 | "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1485 | "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 1486 | ] 1487 | 1488 | [[package]] 1489 | name = "regex-syntax" 1490 | version = "0.6.4" 1491 | source = "registry+https://github.com/rust-lang/crates.io-index" 1492 | dependencies = [ 1493 | "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1494 | ] 1495 | 1496 | [[package]] 1497 | name = "remove_dir_all" 1498 | version = "0.5.1" 1499 | source = "registry+https://github.com/rust-lang/crates.io-index" 1500 | dependencies = [ 1501 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1502 | ] 1503 | 1504 | [[package]] 1505 | name = "resolv-conf" 1506 | version = "0.6.1" 1507 | source = "registry+https://github.com/rust-lang/crates.io-index" 1508 | dependencies = [ 1509 | "hostname 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1510 | "quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1511 | ] 1512 | 1513 | [[package]] 1514 | name = "ring" 1515 | version = "0.13.5" 1516 | source = "registry+https://github.com/rust-lang/crates.io-index" 1517 | dependencies = [ 1518 | "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", 1519 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1520 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1521 | "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", 1522 | ] 1523 | 1524 | [[package]] 1525 | name = "risso_actix" 1526 | version = "0.1.0" 1527 | dependencies = [ 1528 | "actix 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", 1529 | "actix-web 0.7.16 (registry+https://github.com/rust-lang/crates.io-index)", 1530 | "actix-web-requestid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1531 | "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1532 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1533 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1534 | "maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1535 | "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 1536 | "prometheus 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1537 | "risso_api 0.1.0", 1538 | "serde 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 1539 | "serde_derive 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 1540 | "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 1541 | "slog-scope 4.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1542 | ] 1543 | 1544 | [[package]] 1545 | name = "risso_api" 1546 | version = "0.1.0" 1547 | dependencies = [ 1548 | "ammonia 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1549 | "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1550 | "config 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", 1551 | "diesel 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", 1552 | "env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)", 1553 | "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1554 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1555 | "intern 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1556 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1557 | "lettre 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", 1558 | "lettre_email 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", 1559 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1560 | "maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1561 | "md5 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", 1562 | "native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1563 | "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", 1564 | "prometheus 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1565 | "pulldown-cmark 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1566 | "serde 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 1567 | "serde_derive 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 1568 | "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", 1569 | "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 1570 | "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 1571 | "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1572 | "slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1573 | "slog-scope 4.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1574 | "slog-term 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 1575 | "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1576 | "tokio-threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1577 | "validator 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 1578 | "validator_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 1579 | ] 1580 | 1581 | [[package]] 1582 | name = "rust-ini" 1583 | version = "0.12.2" 1584 | source = "registry+https://github.com/rust-lang/crates.io-index" 1585 | 1586 | [[package]] 1587 | name = "rustc-demangle" 1588 | version = "0.1.11" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | 1591 | [[package]] 1592 | name = "rustc_version" 1593 | version = "0.2.3" 1594 | source = "registry+https://github.com/rust-lang/crates.io-index" 1595 | dependencies = [ 1596 | "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 1597 | ] 1598 | 1599 | [[package]] 1600 | name = "ryu" 1601 | version = "0.2.7" 1602 | source = "registry+https://github.com/rust-lang/crates.io-index" 1603 | 1604 | [[package]] 1605 | name = "safemem" 1606 | version = "0.3.0" 1607 | source = "registry+https://github.com/rust-lang/crates.io-index" 1608 | 1609 | [[package]] 1610 | name = "schannel" 1611 | version = "0.1.14" 1612 | source = "registry+https://github.com/rust-lang/crates.io-index" 1613 | dependencies = [ 1614 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1615 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1616 | ] 1617 | 1618 | [[package]] 1619 | name = "scheduled-thread-pool" 1620 | version = "0.2.0" 1621 | source = "registry+https://github.com/rust-lang/crates.io-index" 1622 | dependencies = [ 1623 | "antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 1624 | ] 1625 | 1626 | [[package]] 1627 | name = "scopeguard" 1628 | version = "0.3.3" 1629 | source = "registry+https://github.com/rust-lang/crates.io-index" 1630 | 1631 | [[package]] 1632 | name = "security-framework" 1633 | version = "0.1.16" 1634 | source = "registry+https://github.com/rust-lang/crates.io-index" 1635 | dependencies = [ 1636 | "core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1637 | "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1638 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1639 | "security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", 1640 | ] 1641 | 1642 | [[package]] 1643 | name = "security-framework-sys" 1644 | version = "0.1.16" 1645 | source = "registry+https://github.com/rust-lang/crates.io-index" 1646 | dependencies = [ 1647 | "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", 1648 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1649 | ] 1650 | 1651 | [[package]] 1652 | name = "semver" 1653 | version = "0.9.0" 1654 | source = "registry+https://github.com/rust-lang/crates.io-index" 1655 | dependencies = [ 1656 | "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", 1657 | ] 1658 | 1659 | [[package]] 1660 | name = "semver-parser" 1661 | version = "0.7.0" 1662 | source = "registry+https://github.com/rust-lang/crates.io-index" 1663 | 1664 | [[package]] 1665 | name = "serde" 1666 | version = "0.8.23" 1667 | source = "registry+https://github.com/rust-lang/crates.io-index" 1668 | 1669 | [[package]] 1670 | name = "serde" 1671 | version = "1.0.82" 1672 | source = "registry+https://github.com/rust-lang/crates.io-index" 1673 | 1674 | [[package]] 1675 | name = "serde-hjson" 1676 | version = "0.8.2" 1677 | source = "registry+https://github.com/rust-lang/crates.io-index" 1678 | dependencies = [ 1679 | "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", 1680 | "linked-hash-map 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1681 | "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", 1682 | "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1683 | "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", 1684 | ] 1685 | 1686 | [[package]] 1687 | name = "serde_derive" 1688 | version = "1.0.82" 1689 | source = "registry+https://github.com/rust-lang/crates.io-index" 1690 | dependencies = [ 1691 | "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", 1692 | "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", 1693 | "syn 0.15.23 (registry+https://github.com/rust-lang/crates.io-index)", 1694 | ] 1695 | 1696 | [[package]] 1697 | name = "serde_json" 1698 | version = "1.0.33" 1699 | source = "registry+https://github.com/rust-lang/crates.io-index" 1700 | dependencies = [ 1701 | "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 1702 | "ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 1703 | "serde 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 1704 | ] 1705 | 1706 | [[package]] 1707 | name = "serde_test" 1708 | version = "0.8.23" 1709 | source = "registry+https://github.com/rust-lang/crates.io-index" 1710 | dependencies = [ 1711 | "serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)", 1712 | ] 1713 | 1714 | [[package]] 1715 | name = "serde_urlencoded" 1716 | version = "0.5.4" 1717 | source = "registry+https://github.com/rust-lang/crates.io-index" 1718 | dependencies = [ 1719 | "dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 1720 | "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 1721 | "serde 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 1722 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 1723 | ] 1724 | 1725 | [[package]] 1726 | name = "sha1" 1727 | version = "0.6.0" 1728 | source = "registry+https://github.com/rust-lang/crates.io-index" 1729 | 1730 | [[package]] 1731 | name = "signal-hook" 1732 | version = "0.1.6" 1733 | source = "registry+https://github.com/rust-lang/crates.io-index" 1734 | dependencies = [ 1735 | "arc-swap 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1736 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1737 | ] 1738 | 1739 | [[package]] 1740 | name = "siphasher" 1741 | version = "0.2.3" 1742 | source = "registry+https://github.com/rust-lang/crates.io-index" 1743 | 1744 | [[package]] 1745 | name = "slab" 1746 | version = "0.4.1" 1747 | source = "registry+https://github.com/rust-lang/crates.io-index" 1748 | 1749 | [[package]] 1750 | name = "slog" 1751 | version = "2.4.1" 1752 | source = "registry+https://github.com/rust-lang/crates.io-index" 1753 | 1754 | [[package]] 1755 | name = "slog-async" 1756 | version = "2.3.0" 1757 | source = "registry+https://github.com/rust-lang/crates.io-index" 1758 | dependencies = [ 1759 | "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 1760 | "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", 1761 | "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1762 | ] 1763 | 1764 | [[package]] 1765 | name = "slog-json" 1766 | version = "2.3.0" 1767 | source = "registry+https://github.com/rust-lang/crates.io-index" 1768 | dependencies = [ 1769 | "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1770 | "serde 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 1771 | "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", 1772 | "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 1773 | ] 1774 | 1775 | [[package]] 1776 | name = "slog-scope" 1777 | version = "4.1.0" 1778 | source = "registry+https://github.com/rust-lang/crates.io-index" 1779 | dependencies = [ 1780 | "crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", 1781 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1782 | "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 1783 | ] 1784 | 1785 | [[package]] 1786 | name = "slog-term" 1787 | version = "2.4.0" 1788 | source = "registry+https://github.com/rust-lang/crates.io-index" 1789 | dependencies = [ 1790 | "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 1791 | "isatty 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1792 | "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 1793 | "term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 1794 | "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1795 | ] 1796 | 1797 | [[package]] 1798 | name = "smallvec" 1799 | version = "0.6.7" 1800 | source = "registry+https://github.com/rust-lang/crates.io-index" 1801 | dependencies = [ 1802 | "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", 1803 | ] 1804 | 1805 | [[package]] 1806 | name = "socket2" 1807 | version = "0.3.8" 1808 | source = "registry+https://github.com/rust-lang/crates.io-index" 1809 | dependencies = [ 1810 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 1811 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1812 | "redox_syscall 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)", 1813 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1814 | ] 1815 | 1816 | [[package]] 1817 | name = "spin" 1818 | version = "0.4.10" 1819 | source = "registry+https://github.com/rust-lang/crates.io-index" 1820 | 1821 | [[package]] 1822 | name = "stable_deref_trait" 1823 | version = "1.1.1" 1824 | source = "registry+https://github.com/rust-lang/crates.io-index" 1825 | 1826 | [[package]] 1827 | name = "string" 1828 | version = "0.1.2" 1829 | source = "registry+https://github.com/rust-lang/crates.io-index" 1830 | 1831 | [[package]] 1832 | name = "string_cache" 1833 | version = "0.7.3" 1834 | source = "registry+https://github.com/rust-lang/crates.io-index" 1835 | dependencies = [ 1836 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1837 | "new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1838 | "phf_shared 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", 1839 | "precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1840 | "serde 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 1841 | "string_cache_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", 1842 | "string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1843 | ] 1844 | 1845 | [[package]] 1846 | name = "string_cache_codegen" 1847 | version = "0.4.2" 1848 | source = "registry+https://github.com/rust-lang/crates.io-index" 1849 | dependencies = [ 1850 | "phf_generator 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", 1851 | "phf_shared 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)", 1852 | "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", 1853 | "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", 1854 | "string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", 1855 | ] 1856 | 1857 | [[package]] 1858 | name = "string_cache_shared" 1859 | version = "0.3.0" 1860 | source = "registry+https://github.com/rust-lang/crates.io-index" 1861 | 1862 | [[package]] 1863 | name = "syn" 1864 | version = "0.13.11" 1865 | source = "registry+https://github.com/rust-lang/crates.io-index" 1866 | dependencies = [ 1867 | "proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 1868 | "quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", 1869 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1870 | ] 1871 | 1872 | [[package]] 1873 | name = "syn" 1874 | version = "0.15.23" 1875 | source = "registry+https://github.com/rust-lang/crates.io-index" 1876 | dependencies = [ 1877 | "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", 1878 | "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", 1879 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1880 | ] 1881 | 1882 | [[package]] 1883 | name = "synstructure" 1884 | version = "0.10.1" 1885 | source = "registry+https://github.com/rust-lang/crates.io-index" 1886 | dependencies = [ 1887 | "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", 1888 | "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", 1889 | "syn 0.15.23 (registry+https://github.com/rust-lang/crates.io-index)", 1890 | "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 1891 | ] 1892 | 1893 | [[package]] 1894 | name = "take_mut" 1895 | version = "0.2.2" 1896 | source = "registry+https://github.com/rust-lang/crates.io-index" 1897 | 1898 | [[package]] 1899 | name = "tempdir" 1900 | version = "0.3.7" 1901 | source = "registry+https://github.com/rust-lang/crates.io-index" 1902 | dependencies = [ 1903 | "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 1904 | "remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 1905 | ] 1906 | 1907 | [[package]] 1908 | name = "tendril" 1909 | version = "0.4.1" 1910 | source = "registry+https://github.com/rust-lang/crates.io-index" 1911 | dependencies = [ 1912 | "futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1913 | "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1914 | "utf-8 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", 1915 | ] 1916 | 1917 | [[package]] 1918 | name = "term" 1919 | version = "0.5.1" 1920 | source = "registry+https://github.com/rust-lang/crates.io-index" 1921 | dependencies = [ 1922 | "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 1923 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1924 | ] 1925 | 1926 | [[package]] 1927 | name = "termcolor" 1928 | version = "1.0.4" 1929 | source = "registry+https://github.com/rust-lang/crates.io-index" 1930 | dependencies = [ 1931 | "wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 1932 | ] 1933 | 1934 | [[package]] 1935 | name = "termion" 1936 | version = "1.5.1" 1937 | source = "registry+https://github.com/rust-lang/crates.io-index" 1938 | dependencies = [ 1939 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1940 | "redox_syscall 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)", 1941 | "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1942 | ] 1943 | 1944 | [[package]] 1945 | name = "thread_local" 1946 | version = "0.3.6" 1947 | source = "registry+https://github.com/rust-lang/crates.io-index" 1948 | dependencies = [ 1949 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 1950 | ] 1951 | 1952 | [[package]] 1953 | name = "time" 1954 | version = "0.1.41" 1955 | source = "registry+https://github.com/rust-lang/crates.io-index" 1956 | dependencies = [ 1957 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 1958 | "redox_syscall 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)", 1959 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 1960 | ] 1961 | 1962 | [[package]] 1963 | name = "tokio" 1964 | version = "0.1.13" 1965 | source = "registry+https://github.com/rust-lang/crates.io-index" 1966 | dependencies = [ 1967 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1968 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1969 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 1970 | "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 1971 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 1972 | "tokio-current-thread 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1973 | "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 1974 | "tokio-fs 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", 1975 | "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1976 | "tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 1977 | "tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 1978 | "tokio-threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 1979 | "tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 1980 | "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 1981 | "tokio-uds 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", 1982 | ] 1983 | 1984 | [[package]] 1985 | name = "tokio-codec" 1986 | version = "0.1.1" 1987 | source = "registry+https://github.com/rust-lang/crates.io-index" 1988 | dependencies = [ 1989 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 1990 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 1991 | "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 1992 | ] 1993 | 1994 | [[package]] 1995 | name = "tokio-current-thread" 1996 | version = "0.1.4" 1997 | source = "registry+https://github.com/rust-lang/crates.io-index" 1998 | dependencies = [ 1999 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 2000 | "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 2001 | ] 2002 | 2003 | [[package]] 2004 | name = "tokio-executor" 2005 | version = "0.1.5" 2006 | source = "registry+https://github.com/rust-lang/crates.io-index" 2007 | dependencies = [ 2008 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 2009 | ] 2010 | 2011 | [[package]] 2012 | name = "tokio-fs" 2013 | version = "0.1.4" 2014 | source = "registry+https://github.com/rust-lang/crates.io-index" 2015 | dependencies = [ 2016 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 2017 | "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 2018 | "tokio-threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 2019 | ] 2020 | 2021 | [[package]] 2022 | name = "tokio-io" 2023 | version = "0.1.10" 2024 | source = "registry+https://github.com/rust-lang/crates.io-index" 2025 | dependencies = [ 2026 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 2027 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 2028 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 2029 | ] 2030 | 2031 | [[package]] 2032 | name = "tokio-reactor" 2033 | version = "0.1.7" 2034 | source = "registry+https://github.com/rust-lang/crates.io-index" 2035 | dependencies = [ 2036 | "crossbeam-utils 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", 2037 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 2038 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 2039 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 2040 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 2041 | "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 2042 | "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", 2043 | "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 2044 | "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 2045 | "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 2046 | ] 2047 | 2048 | [[package]] 2049 | name = "tokio-signal" 2050 | version = "0.2.7" 2051 | source = "registry+https://github.com/rust-lang/crates.io-index" 2052 | dependencies = [ 2053 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 2054 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 2055 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 2056 | "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 2057 | "signal-hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 2058 | "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 2059 | "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 2060 | "tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 2061 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 2062 | ] 2063 | 2064 | [[package]] 2065 | name = "tokio-tcp" 2066 | version = "0.1.2" 2067 | source = "registry+https://github.com/rust-lang/crates.io-index" 2068 | dependencies = [ 2069 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 2070 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 2071 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 2072 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 2073 | "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 2074 | "tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 2075 | ] 2076 | 2077 | [[package]] 2078 | name = "tokio-threadpool" 2079 | version = "0.1.9" 2080 | source = "registry+https://github.com/rust-lang/crates.io-index" 2081 | dependencies = [ 2082 | "crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", 2083 | "crossbeam-utils 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", 2084 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 2085 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 2086 | "num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", 2087 | "rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", 2088 | "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 2089 | ] 2090 | 2091 | [[package]] 2092 | name = "tokio-timer" 2093 | version = "0.2.8" 2094 | source = "registry+https://github.com/rust-lang/crates.io-index" 2095 | dependencies = [ 2096 | "crossbeam-utils 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)", 2097 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 2098 | "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", 2099 | "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 2100 | ] 2101 | 2102 | [[package]] 2103 | name = "tokio-udp" 2104 | version = "0.1.3" 2105 | source = "registry+https://github.com/rust-lang/crates.io-index" 2106 | dependencies = [ 2107 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 2108 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 2109 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 2110 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 2111 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 2112 | "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 2113 | "tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 2114 | ] 2115 | 2116 | [[package]] 2117 | name = "tokio-uds" 2118 | version = "0.2.4" 2119 | source = "registry+https://github.com/rust-lang/crates.io-index" 2120 | dependencies = [ 2121 | "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", 2122 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 2123 | "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 2124 | "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", 2125 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 2126 | "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", 2127 | "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 2128 | "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 2129 | "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 2130 | "tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 2131 | ] 2132 | 2133 | [[package]] 2134 | name = "toml" 2135 | version = "0.4.10" 2136 | source = "registry+https://github.com/rust-lang/crates.io-index" 2137 | dependencies = [ 2138 | "serde 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 2139 | ] 2140 | 2141 | [[package]] 2142 | name = "tower-service" 2143 | version = "0.1.0" 2144 | source = "registry+https://github.com/rust-lang/crates.io-index" 2145 | dependencies = [ 2146 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 2147 | ] 2148 | 2149 | [[package]] 2150 | name = "trust-dns-proto" 2151 | version = "0.5.0" 2152 | source = "registry+https://github.com/rust-lang/crates.io-index" 2153 | dependencies = [ 2154 | "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 2155 | "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 2156 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 2157 | "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 2158 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 2159 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 2160 | "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", 2161 | "smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 2162 | "socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 2163 | "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 2164 | "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 2165 | "tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 2166 | "tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 2167 | "tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 2168 | "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 2169 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 2170 | ] 2171 | 2172 | [[package]] 2173 | name = "trust-dns-proto" 2174 | version = "0.6.1" 2175 | source = "registry+https://github.com/rust-lang/crates.io-index" 2176 | dependencies = [ 2177 | "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", 2178 | "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 2179 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 2180 | "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 2181 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 2182 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 2183 | "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", 2184 | "smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 2185 | "socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", 2186 | "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 2187 | "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", 2188 | "tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", 2189 | "tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", 2190 | "tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 2191 | "tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 2192 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 2193 | ] 2194 | 2195 | [[package]] 2196 | name = "trust-dns-resolver" 2197 | version = "0.10.2" 2198 | source = "registry+https://github.com/rust-lang/crates.io-index" 2199 | dependencies = [ 2200 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 2201 | "failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 2202 | "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", 2203 | "ipconfig 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", 2204 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 2205 | "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", 2206 | "lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 2207 | "resolv-conf 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", 2208 | "smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", 2209 | "tokio 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", 2210 | "trust-dns-proto 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", 2211 | ] 2212 | 2213 | [[package]] 2214 | name = "typenum" 2215 | version = "1.10.0" 2216 | source = "registry+https://github.com/rust-lang/crates.io-index" 2217 | 2218 | [[package]] 2219 | name = "ucd-util" 2220 | version = "0.1.3" 2221 | source = "registry+https://github.com/rust-lang/crates.io-index" 2222 | 2223 | [[package]] 2224 | name = "unicase" 2225 | version = "1.4.2" 2226 | source = "registry+https://github.com/rust-lang/crates.io-index" 2227 | dependencies = [ 2228 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 2229 | ] 2230 | 2231 | [[package]] 2232 | name = "unicase" 2233 | version = "2.2.0" 2234 | source = "registry+https://github.com/rust-lang/crates.io-index" 2235 | dependencies = [ 2236 | "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 2237 | ] 2238 | 2239 | [[package]] 2240 | name = "unicode-bidi" 2241 | version = "0.3.4" 2242 | source = "registry+https://github.com/rust-lang/crates.io-index" 2243 | dependencies = [ 2244 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 2245 | ] 2246 | 2247 | [[package]] 2248 | name = "unicode-normalization" 2249 | version = "0.1.7" 2250 | source = "registry+https://github.com/rust-lang/crates.io-index" 2251 | 2252 | [[package]] 2253 | name = "unicode-width" 2254 | version = "0.1.5" 2255 | source = "registry+https://github.com/rust-lang/crates.io-index" 2256 | 2257 | [[package]] 2258 | name = "unicode-xid" 2259 | version = "0.1.0" 2260 | source = "registry+https://github.com/rust-lang/crates.io-index" 2261 | 2262 | [[package]] 2263 | name = "unreachable" 2264 | version = "1.0.0" 2265 | source = "registry+https://github.com/rust-lang/crates.io-index" 2266 | dependencies = [ 2267 | "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", 2268 | ] 2269 | 2270 | [[package]] 2271 | name = "untrusted" 2272 | version = "0.6.2" 2273 | source = "registry+https://github.com/rust-lang/crates.io-index" 2274 | 2275 | [[package]] 2276 | name = "url" 2277 | version = "1.7.2" 2278 | source = "registry+https://github.com/rust-lang/crates.io-index" 2279 | dependencies = [ 2280 | "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", 2281 | "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 2282 | "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", 2283 | "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", 2284 | ] 2285 | 2286 | [[package]] 2287 | name = "utf-8" 2288 | version = "0.7.4" 2289 | source = "registry+https://github.com/rust-lang/crates.io-index" 2290 | 2291 | [[package]] 2292 | name = "utf8-ranges" 2293 | version = "1.0.2" 2294 | source = "registry+https://github.com/rust-lang/crates.io-index" 2295 | 2296 | [[package]] 2297 | name = "uuid" 2298 | version = "0.6.5" 2299 | source = "registry+https://github.com/rust-lang/crates.io-index" 2300 | dependencies = [ 2301 | "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", 2302 | "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", 2303 | ] 2304 | 2305 | [[package]] 2306 | name = "uuid" 2307 | version = "0.7.1" 2308 | source = "registry+https://github.com/rust-lang/crates.io-index" 2309 | dependencies = [ 2310 | "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", 2311 | ] 2312 | 2313 | [[package]] 2314 | name = "validator" 2315 | version = "0.8.0" 2316 | source = "registry+https://github.com/rust-lang/crates.io-index" 2317 | dependencies = [ 2318 | "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", 2319 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 2320 | "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 2321 | "serde 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 2322 | "serde_derive 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)", 2323 | "serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)", 2324 | "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", 2325 | ] 2326 | 2327 | [[package]] 2328 | name = "validator_derive" 2329 | version = "0.8.0" 2330 | source = "registry+https://github.com/rust-lang/crates.io-index" 2331 | dependencies = [ 2332 | "if_chain 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", 2333 | "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", 2334 | "proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)", 2335 | "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)", 2336 | "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", 2337 | "syn 0.15.23 (registry+https://github.com/rust-lang/crates.io-index)", 2338 | "validator 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", 2339 | ] 2340 | 2341 | [[package]] 2342 | name = "vcpkg" 2343 | version = "0.2.6" 2344 | source = "registry+https://github.com/rust-lang/crates.io-index" 2345 | 2346 | [[package]] 2347 | name = "version_check" 2348 | version = "0.1.5" 2349 | source = "registry+https://github.com/rust-lang/crates.io-index" 2350 | 2351 | [[package]] 2352 | name = "void" 2353 | version = "1.0.2" 2354 | source = "registry+https://github.com/rust-lang/crates.io-index" 2355 | 2356 | [[package]] 2357 | name = "widestring" 2358 | version = "0.2.2" 2359 | source = "registry+https://github.com/rust-lang/crates.io-index" 2360 | 2361 | [[package]] 2362 | name = "winapi" 2363 | version = "0.2.8" 2364 | source = "registry+https://github.com/rust-lang/crates.io-index" 2365 | 2366 | [[package]] 2367 | name = "winapi" 2368 | version = "0.3.6" 2369 | source = "registry+https://github.com/rust-lang/crates.io-index" 2370 | dependencies = [ 2371 | "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 2372 | "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", 2373 | ] 2374 | 2375 | [[package]] 2376 | name = "winapi-build" 2377 | version = "0.1.1" 2378 | source = "registry+https://github.com/rust-lang/crates.io-index" 2379 | 2380 | [[package]] 2381 | name = "winapi-i686-pc-windows-gnu" 2382 | version = "0.4.0" 2383 | source = "registry+https://github.com/rust-lang/crates.io-index" 2384 | 2385 | [[package]] 2386 | name = "winapi-util" 2387 | version = "0.1.1" 2388 | source = "registry+https://github.com/rust-lang/crates.io-index" 2389 | dependencies = [ 2390 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 2391 | ] 2392 | 2393 | [[package]] 2394 | name = "winapi-x86_64-pc-windows-gnu" 2395 | version = "0.4.0" 2396 | source = "registry+https://github.com/rust-lang/crates.io-index" 2397 | 2398 | [[package]] 2399 | name = "wincolor" 2400 | version = "1.0.1" 2401 | source = "registry+https://github.com/rust-lang/crates.io-index" 2402 | dependencies = [ 2403 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 2404 | "winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 2405 | ] 2406 | 2407 | [[package]] 2408 | name = "winreg" 2409 | version = "0.5.1" 2410 | source = "registry+https://github.com/rust-lang/crates.io-index" 2411 | dependencies = [ 2412 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 2413 | ] 2414 | 2415 | [[package]] 2416 | name = "winutil" 2417 | version = "0.1.1" 2418 | source = "registry+https://github.com/rust-lang/crates.io-index" 2419 | dependencies = [ 2420 | "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", 2421 | ] 2422 | 2423 | [[package]] 2424 | name = "ws2_32-sys" 2425 | version = "0.2.1" 2426 | source = "registry+https://github.com/rust-lang/crates.io-index" 2427 | dependencies = [ 2428 | "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", 2429 | "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", 2430 | ] 2431 | 2432 | [[package]] 2433 | name = "yaml-rust" 2434 | version = "0.4.2" 2435 | source = "registry+https://github.com/rust-lang/crates.io-index" 2436 | dependencies = [ 2437 | "linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", 2438 | ] 2439 | 2440 | [metadata] 2441 | "checksum actix 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6c616db5fa4b0c40702fb75201c2af7f8aa8f3a2e2c1dda3b0655772aa949666" 2442 | "checksum actix-net 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8bebfbe6629e0131730746718c9e032b58f02c6ce06ed7c982b9fef6c8545acd" 2443 | "checksum actix-web 0.7.16 (registry+https://github.com/rust-lang/crates.io-index)" = "9c1ae55616ff06c1d011c4e7f16f443b825df72aaf1c75e97cdc43a4ab83a602" 2444 | "checksum actix-web-requestid 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ed0ed1e16256da7bb5ba357f1c05ef2348a790304801b86dfceb74d30af106c" 2445 | "checksum actix_derive 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4300e9431455322ae393d43a2ba1ef96b8080573c0fc23b196219efedfb6ba69" 2446 | "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" 2447 | "checksum aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9a933f4e58658d7b12defcf96dc5c720f20832deebe3e0a19efd3b6aaeeb9e" 2448 | "checksum ammonia 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a8b93ecb80665873703bf3b0a77f369c96b183d8e0afaf30a3ff5ff07dfc6409" 2449 | "checksum antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34fde25430d87a9388dadbe6e34d7f72a462c8b43ac8d309b42b0a8505d7e2a5" 2450 | "checksum arc-swap 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "5c5ed110e2537bdd3f5b9091707a8a5556a72ac49bbd7302ae0b28fdccb3246c" 2451 | "checksum arrayref 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0d382e583f07208808f6b1249e60848879ba3543f57c32277bf52d69c2f0f0ee" 2452 | "checksum arrayvec 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "d18513977c2d8261c448511c5c53dc66b26dfccbc3d4446672dea1e71a7d8a26" 2453 | "checksum askama_escape 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "719b48039ffac1564f67d70162109ba9341125cee0096a540e478355b3c724a7" 2454 | "checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652" 2455 | "checksum autocfg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4e5f34df7a019573fb8bdc7e24a2bfebe51a2a1d6bfdbaeccedb3c41fc574727" 2456 | "checksum backtrace 0.3.13 (registry+https://github.com/rust-lang/crates.io-index)" = "b5b493b66e03090ebc4343eb02f94ff944e0cbc9ac6571491d170ba026741eb5" 2457 | "checksum backtrace-sys 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "3fcce89e5ad5c8949caa9434501f7b55415b3e7ad5270cb88c75a8d35e8f1279" 2458 | "checksum base64 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "621fc7ecb8008f86d7fb9b95356cd692ce9514b80a86d85b397f32a22da7b9e2" 2459 | "checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" 2460 | "checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" 2461 | "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" 2462 | "checksum block-buffer 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a076c298b9ecdb530ed9d967e74a6027d6a7478924520acddcddc24c1c8ab3ab" 2463 | "checksum brotli-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4445dea95f4c2b41cde57cc9fee236ae4dbae88d8fcbdb4750fc1bb5d86aaecd" 2464 | "checksum brotli2 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0cb036c3eade309815c15ddbacec5b22c4d1f3983a774ab2eac2e3e9ea85568e" 2465 | "checksum bufstream 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "40e38929add23cdf8a366df9b0e088953150724bcbe5fc330b0d8eb3b328eec8" 2466 | "checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39" 2467 | "checksum byte-tools 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "560c32574a12a89ecd91f5e742165893f86e3ab98d21f8ea548658eb9eef5f40" 2468 | "checksum byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "94f88df23a25417badc922ab0f5716cc1330e87f71ddd9203b3a3ccd9cedf75d" 2469 | "checksum bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "40ade3d27603c2cb345eb0912aec461a6dec7e06a4ae48589904e808335c7afa" 2470 | "checksum cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4a8b715cb4597106ea87c7c84b2f1d452c7492033765df7f32651e66fcf749" 2471 | "checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" 2472 | "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" 2473 | "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" 2474 | "checksum config 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13490293b8a84cc82cd531da41adeae82cd9eaa40e926ac18865aa361f9c9f60" 2475 | "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" 2476 | "checksum cookie 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1465f8134efa296b4c19db34d909637cb2bf0f7aaf21299e23e18fa29ac557cf" 2477 | "checksum core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25bfd746d203017f7d5cbd31ee5d8e17f94b6521c7af77ece6c9e4b2d4b16c67" 2478 | "checksum core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "065a5d7ffdcbc8fa145d6f0746f3555025b9097a9e9cda59f7467abae670c78d" 2479 | "checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb" 2480 | "checksum crc32fast 1.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e91d5240c6975ef33aeb5f148f35275c25eda8e8a5f95abe421978b05b8bf192" 2481 | "checksum crossbeam 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ad4c7ea749d9fb09e23c5cb17e3b70650860553a0e2744e38446b1803bf7db94" 2482 | "checksum crossbeam-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5b2a9ea8f77c7f9efd317a8a5645f515d903a2d86ee14d2337a5facd1bd52c12" 2483 | "checksum crossbeam-deque 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "05e44b8cf3e1a625844d1750e1f7820da46044ff6d28f4d43e455ba3e5bb2c13" 2484 | "checksum crossbeam-epoch 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f10a4f8f409aaac4b16a5474fb233624238fcdeefb9ba50d5ea059aab63ba31c" 2485 | "checksum crossbeam-utils 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "41ee4864f4797060e52044376f7d107429ce1fb43460021b126424b7180ee21a" 2486 | "checksum crypto-mac 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7afa06d05a046c7a47c3a849907ec303504608c927f4e85f7bfff22b7180d971" 2487 | "checksum diesel 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "164080ac16a4d1d80a50f0a623e4ddef41cb2779eee85bcc76907d340dfc98cc" 2488 | "checksum diesel_derives 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "03bcaf77491f53e400d5ee3bdd57142ea4e1c47fe9217b3361ff9a76ca0e3d37" 2489 | "checksum digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "03b072242a8cbaf9c145665af9d250c59af3b958f83ed6824e13533cf76d5b90" 2490 | "checksum dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d301140eb411af13d3115f9a562c85cc6b541ade9dfa314132244aaee7489dd" 2491 | "checksum email 0.0.20 (registry+https://github.com/rust-lang/crates.io-index)" = "91549a51bb0241165f13d57fc4c72cef063b4088fb078b019ecbf464a45f22e4" 2492 | "checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" 2493 | "checksum encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" 2494 | "checksum encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" 2495 | "checksum encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" 2496 | "checksum encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" 2497 | "checksum encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" 2498 | "checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" 2499 | "checksum env_logger 0.5.13 (registry+https://github.com/rust-lang/crates.io-index)" = "15b0a4d2e39f8420210be8b27eeda28029729e2fd4291019455016c348240c38" 2500 | "checksum error-chain 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6930e04918388a9a2e41d518c25cf679ccafe26733fb4127dbf21993f2575d46" 2501 | "checksum failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6dd377bcc1b1b7ce911967e3ec24fa19c3224394ec05b54aa7b083d498341ac7" 2502 | "checksum failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "64c2d913fe8ed3b6c6518eedf4538255b989945c14c2a7d5cbff62a5e2120596" 2503 | "checksum flate2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2291c165c8e703ee54ef3055ad6188e3d51108e2ded18e9f2476e774fc5ad3d4" 2504 | "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" 2505 | "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 2506 | "checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 2507 | "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" 2508 | "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" 2509 | "checksum futf 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b" 2510 | "checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" 2511 | "checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" 2512 | "checksum generic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef25c5683767570c2bbd7deba372926a55eaae9982d7726ee2a1050239d45b9d" 2513 | "checksum getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0a7292d30132fb5424b354f5dc02512a86e4c516fe544bb7a25e7f266951b797" 2514 | "checksum h2 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "1ac030ae20dee464c5d0f36544d8b914a6bc606da44a57e052d2b0f5dae129e0" 2515 | "checksum hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" 2516 | "checksum hmac 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "733e1b3ac906631ca01ebb577e9bb0f5e37a454032b9036b5eaea4013ed6f99a" 2517 | "checksum hostname 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "21ceb46a83a85e824ef93669c8b390009623863b5c195d1ba747292c0c72f94e" 2518 | "checksum html5ever 0.22.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c213fa6a618dc1da552f54f85cba74b05d8e883c92ec4e89067736938084c26e" 2519 | "checksum http 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "02096a6d2c55e63f7fcb800690e4f889a25f6ec342e3adb4594e293b625215ab" 2520 | "checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" 2521 | "checksum humantime 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ca7e5f2e110db35f93b837c81797f3714500b81d517bf20c431b16d3ca4f114" 2522 | "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" 2523 | "checksum if_chain 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4bac95d9aa0624e7b78187d6fb8ab012b41d9f6f54b1bcb61e61c4845f8357ec" 2524 | "checksum indexmap 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7e81a7c05f79578dbc15793d8b619db9ba32b4577003ef3af1a91c416798c58d" 2525 | "checksum intern 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d25d63585b69160fa6dd5b904fe5f165ec4cd08d812c24883177f48a51da7aa" 2526 | "checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" 2527 | "checksum ipconfig 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "08f7eadeaf4b52700de180d147c4805f199854600b36faa963d91114827b2ffc" 2528 | "checksum isatty 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e31a8281fc93ec9693494da65fbf28c0c2aa60a2eaec25dc58e2f31952e95edc" 2529 | "checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" 2530 | "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 2531 | "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" 2532 | "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" 2533 | "checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" 2534 | "checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" 2535 | "checksum lettre 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ee8550a417eb6be10a95873b7cc64d4b2a9dc3fb94c3271570c1faa56f9e06ca" 2536 | "checksum lettre_email 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3c2fe21d1346ae9a1b50035fbaaae820e682348a2a526f3fe1da5d5f49919c83" 2537 | "checksum libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "2d2857ec59fadc0773853c664d2d18e7198e83883e7060b63c924cb077bd5c74" 2538 | "checksum libsqlite3-sys 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d3711dfd91a1081d2458ad2d06ea30a8755256e74038be2ad927d94e1c955ca8" 2539 | "checksum linked-hash-map 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d262045c5b87c0861b3f004610afd0e2c851e2908d08b6c870cbb9d5f494ecd" 2540 | "checksum linked-hash-map 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7860ec297f7008ff7a1e3382d7f7e1dcd69efc94751a2284bafc3d013c2aa939" 2541 | "checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e" 2542 | "checksum lock_api 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "62ebf1391f6acad60e5c8b43706dde4582df75c06698ab44511d15016bc2442c" 2543 | "checksum log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c84ec4b527950aa83a329754b01dbe3f58361d1c5efacd1f6d68c494d08a17c6" 2544 | "checksum lru-cache 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4d06ff7ff06f729ce5f4e227876cb88d10bc59cd4ae1e09fbb2bde15c850dc21" 2545 | "checksum mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" 2546 | "checksum maplit 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08cbb6b4fef96b6d77bfc40ec491b1690c779e77b05cd9f07f787ed376fd4c43" 2547 | "checksum markup5ever 0.7.5 (registry+https://github.com/rust-lang/crates.io-index)" = "897636f9850c3eef4905a5540683ed53dc9393860f0846cab2c2ddf9939862ff" 2548 | "checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 2549 | "checksum md-5 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9402eaae33a9e144ce18ef488a0e4ca19869673c7bcdbbfe2030fdc3f84211cd" 2550 | "checksum md5 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c1ad8b18d0b6ae54e03c9fe1f7dea2ee5f8e0115a87611316794be1bc51537f7" 2551 | "checksum memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "db4c41318937f6e76648f42826b1d9ade5c09cafb5aef7e351240a70f39206e9" 2552 | "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" 2553 | "checksum mime 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)" = "0a907b83e7b9e987032439a387e187119cddafc92d5c2aaeb1d92580a793f630" 2554 | "checksum mime_guess 2.0.0-alpha.6 (registry+https://github.com/rust-lang/crates.io-index)" = "30de2e4613efcba1ec63d8133f344076952090c122992a903359be5a4f99c3ed" 2555 | "checksum miniz-sys 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0300eafb20369952951699b68243ab4334f4b10a88f411c221d444b36c40e649" 2556 | "checksum miniz_oxide 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5ad30a47319c16cde58d0314f5d98202a80c9083b5f61178457403dfb14e509c" 2557 | "checksum miniz_oxide_c_api 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "28edaef377517fd9fe3e085c37d892ce7acd1fbeab9239c5a36eec352d8a8b7e" 2558 | "checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" 2559 | "checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" 2560 | "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" 2561 | "checksum native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f74dbadc8b43df7864539cedb7bc91345e532fdd913cfdc23ad94f4d2d40fbc0" 2562 | "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" 2563 | "checksum new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0cdc457076c78ab54d5e0d6fa7c47981757f1e34dc39ff92787f217dede586c4" 2564 | "checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" 2565 | "checksum nom 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9c349f68f25f596b9f44cf0e7c69752a5c633b0550c3ff849518bfba0233774a" 2566 | "checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" 2567 | "checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" 2568 | "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" 2569 | "checksum num_cpus 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5a69d464bdc213aaaff628444e99578ede64e9c854025aa43b9796530afa9238" 2570 | "checksum openssl 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)" = "a3605c298474a3aa69de92d21139fb5e2a81688d308262359d85cdd0d12a7985" 2571 | "checksum openssl-sys 0.9.40 (registry+https://github.com/rust-lang/crates.io-index)" = "1bb974e77de925ef426b6bc82fce15fd45bdcbeb5728bffcfc7cdeeb7ce1c2d6" 2572 | "checksum owning_ref 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49a4b8ea2179e6a2e27411d3bca09ca6dd630821cf6894c6c7c8467a8ee7ef13" 2573 | "checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" 2574 | "checksum parking_lot 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9723236a9525c757d9725b993511e3fc941e33f27751942232f0058298297edf" 2575 | "checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" 2576 | "checksum parking_lot_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "94c8c7923936b28d546dfd14d4472eaf34c99b14e1c973a32b3e6d4eb04298c9" 2577 | "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" 2578 | "checksum phf 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)" = "cec29da322b242f4c3098852c77a0ca261c9c01b806cae85a5572a1eb94db9a6" 2579 | "checksum phf_codegen 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)" = "7d187f00cd98d5afbcd8898f6cf181743a449162aeb329dcd2f3849009e605ad" 2580 | "checksum phf_generator 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)" = "03dc191feb9b08b0dc1330d6549b795b9d81aec19efe6b4a45aec8d4caee0c4b" 2581 | "checksum phf_shared 0.7.23 (registry+https://github.com/rust-lang/crates.io-index)" = "b539898d22d4273ded07f64a05737649dc69095d92cb87c7097ec68e3f150b93" 2582 | "checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" 2583 | "checksum precomputed-hash 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" 2584 | "checksum proc-macro2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1b06e2f335f48d24442b35a19df506a835fb3547bc3c06ef27340da9acf5cae7" 2585 | "checksum proc-macro2 0.4.24 (registry+https://github.com/rust-lang/crates.io-index)" = "77619697826f31a02ae974457af0b29b723e5619e113e9397b8b82c6bd253f09" 2586 | "checksum prometheus 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "760293453bee1de0a12987422d7c4885f7ee933e4417bb828ed23f7d05c3c390" 2587 | "checksum protobuf 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cbd08d128db199b1c6bb662e343d7d1a8f6d0060b411675766d88e5146a4bb38" 2588 | "checksum pulldown-cmark 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eef52fac62d0ea7b9b4dc7da092aa64ea7ec3d90af6679422d3d7e0e14b6ee15" 2589 | "checksum quick-error 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ac990ab4e038dd8481a5e3fd00641067fcfc674ad663f3222752ed5284e05d4" 2590 | "checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0" 2591 | "checksum quote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9949cfe66888ffe1d53e6ec9d9f3b70714083854be20fd5e271b232a017401e8" 2592 | "checksum quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "53fa22a1994bd0f9372d7a816207d8a2677ad0325b073f5c5332760f0fb62b5c" 2593 | "checksum r2d2 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5d746fc8a0dab19ccea7ff73ad535854e90ddb3b4b8cdce953dd5cd0b2e7bd22" 2594 | "checksum rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8356f47b32624fef5b3301c1be97e5944ecdd595409cc5da11d05f211db6cfbd" 2595 | "checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c" 2596 | "checksum rand 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ae9d223d52ae411a33cf7e54ec6034ec165df296ccd23533d671a28252b6f66a" 2597 | "checksum rand_chacha 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "771b009e3a508cb67e8823dda454aaa5368c7bc1c16829fb77d3e980440dd34a" 2598 | "checksum rand_core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1961a422c4d189dfb50ffa9320bf1f2a9bd54ecb92792fb9477f99a1045f3372" 2599 | "checksum rand_core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0905b6b7079ec73b314d4c748701f6931eb79fd97c668caa3f1899b22b32c6db" 2600 | "checksum rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" 2601 | "checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" 2602 | "checksum rand_pcg 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "086bd09a33c7044e56bb44d5bdde5a60e7f119a9e95b0775f545de759a32fe05" 2603 | "checksum rand_xorshift 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "effa3fcaa47e18db002bdde6060944b6d2f9cfd8db471c30e873448ad9187be3" 2604 | "checksum redox_syscall 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)" = "a84bcd297b87a545980a2d25a0beb72a1f490c31f0a9fde52fca35bfbb1ceb70" 2605 | "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" 2606 | "checksum regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37e7cbbd370869ce2e8dff25c7018702d10b21a20ef7135316f8daecd6c25b7f" 2607 | "checksum regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4e47a2ed29da7a9e1960e1639e7a982e6edc6d49be308a3b02daf511504a16d1" 2608 | "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" 2609 | "checksum resolv-conf 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c62bd95a41841efdf7fca2ae9951e64a8d8eae7e5da196d8ce489a2241491a92" 2610 | "checksum ring 0.13.5 (registry+https://github.com/rust-lang/crates.io-index)" = "2c4db68a2e35f3497146b7e4563df7d4773a2433230c5e4b448328e31740458a" 2611 | "checksum rust-ini 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ac66e816614e124a692b6ac1b8437237a518c9155a3aacab83a373982630c715" 2612 | "checksum rustc-demangle 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "01b90379b8664dd83460d59bdc5dd1fd3172b8913788db483ed1325171eab2f7" 2613 | "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 2614 | "checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" 2615 | "checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9" 2616 | "checksum schannel 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "0e1a231dc10abf6749cfa5d7767f25888d484201accbd919b66ab5413c502d56" 2617 | "checksum scheduled-thread-pool 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a2ff3fc5223829be817806c6441279c676e454cc7da608faf03b0ccc09d3889" 2618 | "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" 2619 | "checksum security-framework 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "dfa44ee9c54ce5eecc9de7d5acbad112ee58755239381f687e564004ba4a2332" 2620 | "checksum security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "5421621e836278a0b139268f36eee0dc7e389b784dc3f79d8f11aabadf41bead" 2621 | "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 2622 | "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 2623 | "checksum serde 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" 2624 | "checksum serde 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)" = "6fa52f19aee12441d5ad11c9a00459122bd8f98707cadf9778c540674f1935b6" 2625 | "checksum serde-hjson 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0b833c5ad67d52ced5f5938b2980f32a9c1c5ef047f0b4fb3127e7a423c76153" 2626 | "checksum serde_derive 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)" = "96a7f9496ac65a2db5929afa087b54f8fc5008dcfbe48a8874ed20049b0d6154" 2627 | "checksum serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)" = "c37ccd6be3ed1fdf419ee848f7c758eb31b054d7cd3ae3600e3bae0adf569811" 2628 | "checksum serde_test 0.8.23 (registry+https://github.com/rust-lang/crates.io-index)" = "110b3dbdf8607ec493c22d5d947753282f3bae73c0f56d322af1e8c78e4c23d5" 2629 | "checksum serde_urlencoded 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d48f9f99cd749a2de71d29da5f948de7f2764cc5a9d7f3c97e3514d4ee6eabf2" 2630 | "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" 2631 | "checksum signal-hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8941ae94fa73d0f73b422774b3a40a7195cecd88d1c090f4b37ade7dc795ab66" 2632 | "checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" 2633 | "checksum slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f9776d6b986f77b35c6cf846c11ad986ff128fe0b2b63a3628e3755e8d3102d" 2634 | "checksum slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e1a2eec401952cd7b12a84ea120e2d57281329940c3f93c2bf04f462539508e" 2635 | "checksum slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e544d16c6b230d84c866662fe55e31aacfca6ae71e6fc49ae9a311cb379bfc2f" 2636 | "checksum slog-json 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddc0d2aff1f8f325ef660d9a0eb6e6dcd20b30b3f581a5897f58bf42d061c37a" 2637 | "checksum slog-scope 4.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fb8490ed7795d9f147813515f8a62ab6c1d40c65edba8a73c414b63691f2769a" 2638 | "checksum slog-term 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5951a808c40f419922ee014c15b6ae1cd34d963538b57d8a4778b9ca3fff1e0b" 2639 | "checksum smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b73ea3738b47563803ef814925e69be00799a8c07420be8b996f8e98fb2336db" 2640 | "checksum socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d11a52082057d87cb5caa31ad812f4504b97ab44732cd8359df2e9ff9f48e7" 2641 | "checksum spin 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ceac490aa12c567115b40b7b7fceca03a6c9d53d5defea066123debc83c5dc1f" 2642 | "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" 2643 | "checksum string 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "98998cced76115b1da46f63388b909d118a37ae0be0f82ad35773d4a4bc9d18d" 2644 | "checksum string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25d70109977172b127fe834e5449e5ab1740b9ba49fa18a2020f509174f25423" 2645 | "checksum string_cache_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1eea1eee654ef80933142157fdad9dd8bc43cf7c74e999e369263496f04ff4da" 2646 | "checksum string_cache_shared 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc" 2647 | "checksum syn 0.13.11 (registry+https://github.com/rust-lang/crates.io-index)" = "14f9bf6292f3a61d2c716723fdb789a41bbe104168e6f496dc6497e531ea1b9b" 2648 | "checksum syn 0.15.23 (registry+https://github.com/rust-lang/crates.io-index)" = "9545a6a093a3f0bd59adb472700acc08cad3776f860f16a897dfce8c88721cbc" 2649 | "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" 2650 | "checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" 2651 | "checksum tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8" 2652 | "checksum tendril 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "707feda9f2582d5d680d733e38755547a3e8fb471e7ba11452ecfd9ce93a5d3b" 2653 | "checksum term 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5e6b677dd1e8214ea1ef4297f85dbcbed8e8cdddb561040cc998ca2551c37561" 2654 | "checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f" 2655 | "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" 2656 | "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" 2657 | "checksum time 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "847da467bf0db05882a9e2375934a8a55cffdc9db0d128af1518200260ba1f6c" 2658 | "checksum tokio 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "a7817d4c98cc5be21360b3b37d6036fe9b7aefa5b7a201b7b16ff33423822f7d" 2659 | "checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" 2660 | "checksum tokio-current-thread 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "331c8acc267855ec06eb0c94618dcbbfea45bed2d20b77252940095273fb58f6" 2661 | "checksum tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c117b6cf86bb730aab4834f10df96e4dd586eff2c3c27d3781348da49e255bde" 2662 | "checksum tokio-fs 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "60ae25f6b17d25116d2cba342083abe5255d3c2c79cb21ea11aa049c53bf7c75" 2663 | "checksum tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "7392fe0a70d5ce0c882c4778116c519bd5dbaa8a7c3ae3d04578b3afafdcda21" 2664 | "checksum tokio-reactor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "502b625acb4ee13cbb3b90b8ca80e0addd263ddacf6931666ef751e610b07fb5" 2665 | "checksum tokio-signal 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "dd6dc5276ea05ce379a16de90083ec80836440d5ef8a6a39545a3207373b8296" 2666 | "checksum tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ad235e9dadd126b2d47f6736f65aa1fdcd6420e66ca63f44177bc78df89f912" 2667 | "checksum tokio-threadpool 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "56c5556262383032878afad66943926a1d1f0967f17e94bd7764ceceb3b70e7f" 2668 | "checksum tokio-timer 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "4f37f0111d76cc5da132fe9bc0590b9b9cfd079bc7e75ac3846278430a299ff8" 2669 | "checksum tokio-udp 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "66268575b80f4a4a710ef83d087fdfeeabdce9b74c797535fbac18a2cb906e92" 2670 | "checksum tokio-uds 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "99ce87382f6c1a24b513a72c048b2c8efe66cb5161c9061d00bee510f08dc168" 2671 | "checksum toml 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "758664fc71a3a69038656bee8b6be6477d2a6c315a6b81f7081f591bffa4111f" 2672 | "checksum tower-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b32f72af77f1bfe3d3d4da8516a238ebe7039b51dd8637a09841ac7f16d2c987" 2673 | "checksum trust-dns-proto 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0838272e89f1c693b4df38dc353412e389cf548ceed6f9fd1af5a8d6e0e7cf74" 2674 | "checksum trust-dns-proto 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e33f29df428f112ffeda24b328b814b61d6916be29aa89f19bc3f684ba5437b8" 2675 | "checksum trust-dns-resolver 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "de630f95a192f793436ffae5137e88253cc4142a97d9a8e73c8d804fa85ddf0a" 2676 | "checksum typenum 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "612d636f949607bdf9b123b4a6f6d966dedf3ff669f7f045890d3a4a73948169" 2677 | "checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" 2678 | "checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" 2679 | "checksum unicase 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d3218ea14b4edcaccfa0df0a64a3792a2c32cc706f1b336e48867f9d3147f90" 2680 | "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" 2681 | "checksum unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6a0180bc61fc5a987082bfa111f4cc95c4caff7f9799f3e46df09163a937aa25" 2682 | "checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526" 2683 | "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" 2684 | "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" 2685 | "checksum untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "55cd1f4b4e96b46aeb8d4855db4a7a9bd96eeeb5c6a1ab54593328761642ce2f" 2686 | "checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" 2687 | "checksum utf-8 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bab35f71693630bb1953dce0f2bcd780e7cde025027124a202ac08a45ba25141" 2688 | "checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" 2689 | "checksum uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e1436e58182935dcd9ce0add9ea0b558e8a87befe01c1a301e6020aeb0876363" 2690 | "checksum uuid 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dab5c5526c5caa3d106653401a267fed923e7046f35895ffcb5ca42db64942e6" 2691 | "checksum validator 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "236a5eda3df2c877872e98dbc55d497d943792e6405d8fc65bd4f8a5e3b53c99" 2692 | "checksum validator_derive 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d360d6f5754972c0c1da14fb3d5580daa31aee566e1e45e2f8d3bf5950ecd3e9" 2693 | "checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" 2694 | "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" 2695 | "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 2696 | "checksum widestring 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7157704c2e12e3d2189c507b7482c52820a16dfa4465ba91add92f266667cadb" 2697 | "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 2698 | "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" 2699 | "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 2700 | "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2701 | "checksum winapi-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "afc5508759c5bf4285e61feb862b6083c8480aec864fa17a81fdec6f69b461ab" 2702 | "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2703 | "checksum wincolor 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "561ed901ae465d6185fa7864d63fbd5720d0ef718366c9a4dc83cf6170d7e9ba" 2704 | "checksum winreg 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a27a759395c1195c4cc5cda607ef6f8f6498f64e78f7900f5de0a127a424704a" 2705 | "checksum winutil 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7daf138b6b14196e3830a588acf1e86966c694d3e8fb026fb105b8b5dca07e6e" 2706 | "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 2707 | "checksum yaml-rust 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "95acf0db5515d07da9965ec0e0ba6cc2d825e2caeb7303b66ca441729801254e" 2708 | --------------------------------------------------------------------------------